强化学习基本方法(一)

来源:互联网 发布:单片机智能车 编辑:程序博客网 时间:2024/05/16 20:30

1.基本概念

1.1.强化学习是什么

在机器学习领域一般将机器学习划分为三大类型:有监督学习,无监督学习和强化学习。有监督学习和无监督学习都主要是为了解决分类问题,而强化学习比较特殊,强化学习的目的是为了研究策略,比如让机器人自主的学会如何把花养好,如何在一个未知环境进行探索等。
强化学习的核心问题在于通过研究各种不同策略的价值并给予评价,来自主选择最优策略。策略,即是决策层对于不同的状态所作出的不同反应。以种花而言,看到花处于枯萎的状态,就要施加浇水的动作,看到花叶子变黄的状态,就应当加以施肥的动作。状态在施加不同动作之后,就可能向各个其他状态转移,所以强化学习是在一个高动态的,高复杂性的环境中寻找最佳选择的一种算法。
在程序流程进行时,主要有以下几个方面需要解决:

  • 需要了解各个状态和动作之间的转移关系
    • 实际应用中,我们很难知道在某一个状态施加某动作之后,转移到下一个状态的概率。比如在花枯萎的时候,浇水也不一定会让花恢复健康,可能花还会继续枯萎,甚至死亡。但是我们并不是很容易知道这样的转移概率是多少,是P|的概率大呢,还是P|的概率更大。这些都需要实际应用中的样本来说明。
  • 需要正确评价各个执行动作的优劣
    • 即使知晓了状态-动作之间的转移关系,为了达到目标,应该以什么准则去评价在不同状态下选择的动作呢(我们将其称之为策略的评估)。一般我们采用状态收益函数和状态-动作收益函数作为评价的标准。在后文中我们会详细说明。

在了解了强化学习的基本思想之后,我们需要探寻的就是具体如何去进行学习了。

1.2.基本记号

在强化学习中,每一个状态一般用s表示,转移概率用p表示,每个状态的收益用r表示,这样,一个普通的状态转换对就可以表示为:<s,p,s,r>,这表示状态s以p的概率转移到状态s’并且得到数值为r的收益。这描述的是一个自然的,无人为干涉的过程,状态之间的转换都是自然发生的,这样的话,我们就没有讨论的意义了,所以,我们加上了a来表示不同状态下才去的动作(人为干涉),从而让我们的状态对变成<s,a,p,s,r>这样,实际上每一个p所代表的就是特定状态特定动作的转移概率p(s|s,a)了。在了解了基本记号之后,就可以去设计一个收益方程来评价状态-动作对了。

2.已知状态-动作转移概率

首先,我们来研究一个简单的环境,我们知道状态,假设整个环境中的<s,a,p,s,r>都是已知的

2.1.状态收益评价函数

该如何评价各个状态的价值呢。比如,我们的目标是如何让花健康的活下去,那花枯萎的状态和花死亡的状态价值显然是不同的,一般来说,我们的学习过程通常都会有一个到若干和目标状态(比如植物开花)以及若干个避免状态(比如植物死亡),显然,越接近目标状态的状态越有价值,越接近避免状态的状态越应该避免。这个又是如何衡量的呢,我们先不加证明的写出状态价值函数的Bellman方程:

Vπ(s)=ssp(s|s,π(s))[r(s|s,π(s))+γVπ(s)]=Eπ[r(s|s,π(s))+γVπ(s)]

哇,这么长一个方程,到底该如何理解呢。其实很简单,就会求期望!我们把最后一部分拆开,它就是这样的样子:
Vπ(s)=E(r(s|s,π(s)))+γEπ[Vπ(s)]

这表示在π策略的作用下,状态s的价值V(s)可以表示为s转换到s’的状态转换收益的期望以及下一个状态的价值函数期望的和。
例子的话可以去参考下:http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching_files/MDP.pdf P21 给出的例子,并没有必要把它再呈现一遍。
在这里我需要提醒两点:

2.1.1.状态收益的后向传递

实际的计算中我们并没有将Vπ(s)继续展开到下个状态计算。因为那样的话,每一次的计算公式都会因为嵌套而变得极其冗余。实际上我们只使用当前计算得到的下一个状态的状态收益作为真值计算(不管它是不是真的正确)。在程序初期,由于每个状态的收益值都不知道,我们一般是将其全部初始化为0的。这时候你可能会说:全部都是0,那不是每个状态的收益就只有一个简单的一阶转换收益了吗,那样不就不正确吗。是的,一开始的确我们只能得到下一个状态的一阶转换收益,但是在我们不断迭代的过程中,我们会发现这个收益逐渐会被“传递”到前一状态去。
让我们来看这个例子,假如有状态链:

ABCD

其中C→D状态收益是100,D为目标状态,其他状态的收益都是0,那么应用上面的公式有:
V(C)=V(D)+100=100

V(B)=V(C)+0=0

继续进行迭代:
V(C)=V(D)+100=100

V(B)=V(C)+0=100

可以发现,C→D的收益,经过迭代渐渐变成了B的状态价值,而且这个状态价值在这个网络还会无损耗的往回传递!可是问题来了,这样算的话,ABC三个状态价值都是100,也就是说这三个状态是没有区别的?

2.1.2.状态衰减系数

为了解决这个问题,公式里面那个很碍眼的γ就派上用场了,γ的取值一般在0~1之间,被称之为状态衰减系数,这个系数是为了状态价值在反向传播的时候不会让这个状态价值无限无损耗的传递下(这样各个状态价值就没有区别了)去而设置的。比如我们设置这个参数为0.8,那么就有:

V(C)=0.8V(D)+100=100

V(B)=0.8V(C)+0=0

继续进行迭代:
V(C)=0.8V(D)+100=100

V(B)=0.8V(C)+0=80

这样,最终A状态的价值就是64,B为80,C是100。几个状态之间的区别立马就显现出来了。

0 1