理解强化学习知识之策略梯度
策略梯度简述
为什么要引入策略梯度,它的优缺点?
策略目标函数
怎么优化目标函数---得到策略梯度
关于策略的设计
基于蒙特卡洛的策略梯度--REINFORCE算法
降低方差---为策略梯度添加常数基线b
策略梯度简述
先上一个图:
在之前的文章,我们讲过说强化学习的分类可以分为以值函数为中心的和以策略为中心的,如上图,当然他们是有交叉的,也就是actor-critic,这类算法之后的文章会讲。我们知道基于价值函数的方法就是通过计算每一个状态动作的价值,然后选择价值最大的策略执行。其实,这是一种比较间接的做法,因为我们要的是最优的策略,这是我们最终的目的,而之前我们是通过先求值函数,然后用贪婪,Ɛ-贪婪的方式再来求策略。
现在,换一种思路,首先我们用直接的方式,直接参数化策略本身,同时参数化的策略得到一个策略函数:
上式将策略函数理解成参数化的策略函数
。策略函数确定了在给定的状态和一定的参数设置下,采取任何可能行为的概率。也就是说,策略搜索是将策略进行参数化即
,可以类比值函数的近似思想,之前我们用线性非线性的方式对值函数进行逼近求解,那同样的,我们也可以利用线性或非线性(如神经网络)对策略进行求解。
然后就是为了寻找最优的参数
,确定强化学习的目标函数,这里我们直接说明是累积回报的期望
,也就是在优化之前我们说的参数化策略的参数时也是用到值函数的,优化的目标函数也是和值函数之间相关的,具体下面讲述。
最后我们要做的是利用参数化的策略函数,通过调整这些参数来得到一个较优策略,遵循这个策略产生的行为将得到较多的奖励。具体的机制是设计一个目标函数,对其使用梯度上升(Gradient Ascent)算法优化参数以最大化奖励。
注意:在值函数的方法中,我们迭代计算的是值函数,然后根据值函数对策略进行改进;而在策略搜索方法中,我们直接对策略进行迭代计算,也就是迭代更新参数值,直到累积回报的期望最大,此时的参数所对应的策略为最优策略。
为什么要引入策略梯度,它有什么优缺点?
引入参数化策略的目的是为了解决大规模问题。在大规模的问题里,把每一个状态严格的独立出来指出某个状态下应该执行某个行为是不太可能的。因此我们需要参数化,用少量的参数来合理近似实际的函数。同时,在很多方面,策略梯度有其优势和优点:
基于值函数的方法(Q-learning, SARSA等等经典强化学习研究的大部分算法)存在策略退化问题,即值函数估计已经很准确了,但通过值函数得到的策略仍然不是最优。这一现象类似于监督学习中通过后验概率来分类,后验概率估计的精度很高,但得到的分类仍然可能是错的。尤其是当强化学习使用值函数近似时,策略退化现象非常常见。可见 Tutorial on Reinforcement Learning slides中的例子。Policy Gradient不会出现策略退化现象,其目标表达更直接,求解方法更现代。
能够能够直接求解stochastic policy,也就是能够学到一些随机策略。
基于策略的学习可能会具有更好的收敛性,这是因为基于策略的学习虽然每次只改善一点点,但总是朝着好的方向在改善;而价值函数在后期可能会一直围绕最优价值函数持续小的震荡而不收敛,同时有时候求解值函数非常复杂。
在对于那些拥有高维度或连续状态空间来说,使用基于价值函数的学习在得到价值函数后,制定策略时,需要比较各种行为对应的价值大小,这样如果行为空间维度较高或者是连续的,则从中比较得出一个有最大价值函数的行为这个过程就变得不实际了,但策略梯度能直接适用高维或者连续行为动作空间的强化学习情景。
当然,有优点就有缺点和不足:
原始基于策略的学习效率不够高,还有较高的变异性(方差,Variance)。因为基于价值函数的策略决定每次都是推促个体去选择一个最大价值的行为;但是基于策略的,更多的时候策略的选择时仅会在策略某一参数梯度上移动一点点,使得整个的学习比较平滑,因此不够高效。同时当评估单个策略并不充分时,方差较大。
策略梯度在求解梯度时也是需要值函数的来引导的,有时候当值函数没有设计好时,会使得效果变得很差,同时,使用随机策略时需要采样的数量较大。
策略搜索的方法容易收敛到局部最小值。
在具体解决问题时,需要评估问题的特点来决定是主要使用基于价值的学习还是基于策略的学习。
策略目标函数
现在具体的讲下怎么确定在优化参数时的优化目标。回顾之前的定理:所有的最优策略有相同的最优价值函数,也就是找到最优值函数,就能对应找到最好策略。那反过来也就是说,要的到最优的策略就是要尽可能获得更多的奖励。
而将策略表达成参数θ的目标函数,有如下几种形式,start value是针对拥有起始状态的情况下求起始状态
获得的奖励,average value针对不存在起始状态而且停止状态也不固定的情况,在这些可能的状态上计算平均获得的奖励。 Average reward per time-step为每一个时间步长在各种情况下所能得到的平均奖励。
Start value:在能够产生完整Episode的环境下,也就是在个体可以到达终止状态时,我们可以用这样一个值来衡量整个策略的优劣:从某状态s1算起知道终止状态个体获得的累计奖励。这个值称为start value.。这个数值的意思是说:如果个体总是从某个状态s1开始,或者以一定的概率分布从s1开始,那么从该状态开始到Episode结束个体将会得到怎样的最终奖励。这个时候算法真正关心的是:找到一个策略,当把个体放在这个状态s1让它执行当前的策略,能够获得start value的奖励,并使得这个start value最大化:
Average Value:对于连续环境条件,不存在一个开始状态,这个时候可以使用 average value。意思是 考虑我们个体在某时刻处在某状态下的概率,也就是个体在该时刻的状态分布,针对每个可能的状态计算从该时刻开始一直持续与环境交互下去能够得到的奖励,按该时刻各状态的概率分布求和,其中
是在当前策略下马尔科夫链的关于状态的一个静态分布:
Average reward per time-step:使用每一个时间步长在各种情况下所能得到的平均奖励,也就是说在一个确定的时间步长里,查看个体出于所有状态的可能性,然后每一种状态下采取所有行为能够得到的即时奖励,所有奖励按概率求和的方式得到:
怎么优化目标函数---得到策略梯度
之前我们分析了策略目标函数,现在按照套路就是优化策略参数然后使得目标函数值最大化。也就是说现在要解决策略梯度的优化问题,找到参数θ来最大化目标函数。而一般的,我们随机梯度的方式来解决,怎么得到其梯度呢?如下:
先考虑一个简单的单步MDP问题:从一个分布
中采样得到一个状态s,从s开始,采取一个行为a,得到即时奖励
然后终止。整个MDP只有一个状态、行为、即时奖励。在这个MDP过程中,如何最大化奖励?
由于是单步过程,因此三种目标函数的形式是一样的:
相应的梯度是:
注意:其实要用log的主要原因就是我们用到了极大似然的方式来求解,一个是比较好算,第二是这样才不会造成计算的溢出。
可以看出目标函数的梯度等于策略函数对数梯度与即时奖励两部分乘积的期望,而根据之前的介绍,这两部分都是较为容易确定的。因此参数的更新就变得容易了。一个问题是单步MDP的情况是否适用于多步MDP呢?
答案是肯定的。我们有如下定理:对于任何可微的策略
,对于任何策略的目标函数
,
或者
,策略梯度都是一样的,也就如下图所示:
所以,现在我们得到所有形式的目标函数所对应的策略梯度是一样的,注意这里有两个部分组成,一个是策略函数的log形式,一个是引导奖励。之后我们分开来讨论,第一部分是参数化直接得到的,下面会讲策略的设计。第二部分可以直接用即时奖励来计算,也可以用值函数近似,也就是AC算法。之后会讲。
现在换一种角度来理解策略梯度,我们可以构造一个损失函数如下:
这个损失函数,怎么理解呢?举个简单的AlphaGo的例子。对于AlphaGo而言,f(s,a)就是最后的结果。也就是一盘棋中,如果这盘棋赢了,那么这盘棋下的每一步都是认为是好的,如果输了,那么都认为是不好的。好的f(s,a)就是1,不好的就-1。所以在这里,如果a被认为是好的,那么目标就是最大化这个好的动作的概率,反之亦然。
f(s,a)不仅仅可以作为动作的评价指标,还可以作为目标函数,而对应上面三种不同形式。就如同AlphaGo,评价指标就是赢或者输,而目标就是结果赢。这和之前分析的目标完全没有冲突。因此,我们可以利用评价指标f(s,a)来优化Policy,同时在优化的同时优化了f(s,a).那么问题就变成对f(s,a)求关于参数的梯度。注意:下面的f(x)即是奖励函数f(s,a)
从公式得到的结论可以看到正好和上面分析得到的目标函数的梯度一致,也是由那两部分构成。所以,结论就是,目标函数还是通过奖励决定的,这里奖励可以有三种角度的形式(上一节所讲),但求出的导数是一致的。
关于策略的设计
之前我们说策略梯度由两个部分组成,现在我们先讲第一部分,也就是策略函数log形式的导数。强化学习有两种基本情况,也就是策略是离散的或者是连续的。具体来说:
对于离散的强化学习场景。我们从状态抽取状态特征向量
。和价值函数近似,我们让
特征向量一共有 |A| 部分,分别对应不同的动作。在
特征向量, a 动作对应位置放
特征,其他动作对应位置为 0。设定参数
。
其中
表示遇到状态特征
采取动作 a 的概率。策略用了著名的 Softmax 函数,因此也被称为 softmax 策略。容易求得 Softmax 函数对数的梯度。
这里可以理解为:其中第一项是当前输入特征向量,第二项是输入特征向量的期望,如果当前输入特征向量出现次数多而且表现比较好,但是距离期望比较远,那么就需要调整policy来更加趋近于当前特征向量,这个差值代表了当前特征向量与期望之差,距离远调整的就多,距离近调整的就少。
对于连续的强化学习场景。在连续强化学习场景下,我们也是从状态抽取状态特征向量
,然后设定一个参数向量
,然后用特征和参数计算不同动作的概率。
其中动作 a 是一个实数值。策略用了标准差为 1 的高斯分布,因此该策略被称为高斯策略。容易求得高斯策略的对数梯度。
对于高斯策略,有另外一种解释,也就是如下图:
对于左边的图,高斯分布下的一些采样(蓝点),针对每一个蓝点也画出了根据高斯分布均值得到的概率对数的梯度。箭头指示的方向是能够增加该采样点采样概率的分布的均值(对于高斯分布来说,是等值线的中心点)移动的方向;对于中间的图:大多数采样点对应的策略梯度的第一部分(也就是对数策略的导数或者说score function)的值是-1,除了一小块区域是+1,此时箭头用不同颜色表示,在随后的更新中,我们将要把所有绿色的值和负的红色值进行平均来更新分布参数(均值);对于右边的图:参数更新后,绿色箭头的方向和红色箭头的反方向推动了行程均值朝着左下方移动的新的高斯分布,从这个新分布的采样将会按照预期有一个较高的数值。
基于蒙特卡洛的策略梯度--REINFORCE算法
之前的讲述基本说明了策略梯度的推导和其他需要注意的知识点。现在讲述下具体算法:假设
是可微的,那就像在优化值函数,只是这里θ不是值函数的参数,而是policy的参数,我们用目标函数对参数求导,便可以得到:
第一项衡量了policy朝当前选择(某个状态+某个动作)偏移的程度,第二项衡量了当前选择的好坏(注意:这里的第二部分是有很多形式的,不同的形式代表不同的策略梯度,具体在之后讲解)。我们可以根据上的策略梯度推导出Monte-Carlo Policy Gradient的形式。其他不变。只是gradient中的动作值函数取值用执行过程中的return(
)来代替。
下面给出具体基于蒙特卡洛的策略梯度的REINFORCE算法伪代码:
然后,还一种思路进行理解,也就是log(Policy)*V的物理意义:log(Policy(s,a))*V
中的 log(Policy(s,a))
表示在 状态 s
对所选动作 a
的吃惊度, 如果 Policy(s,a)
概率越小, 反向的 log(Policy(s,a))
(即 -log(P)
) 反而越大. 如果在 Policy(s,a)
很小的情况下, 拿到了一个 大的 R
, 也就是 大的 V
, 那 -log(Policy(s, a))*V
就更大, 表示更吃惊, (我选了一个不常选的动作, 却发现原来它能得到了一个好的 reward, 那我就得对我这次的参数进行一个大幅修改)。
注意:物理意义参照了莫烦python的blog
降低方差---为策略梯度添加常数基线b
在之前我们讲策略梯度的优缺点的时候,我们说策略梯度具有高方差的缺点,所有在文章的最后,我们讲下以在回报中引入常数基线b的方式来减小方差。
之前我们知道策略参数化后优化目标函数得到的一致策略梯度为,其中
表示一次采样的轨迹。
现在在回报中引入常数基线b,也就变成了:
我们要求这一函数仅与状态有关,与行为无关,其不改变梯度本身,证明如下:
上面的式子中,策略概率函数对数的梯度与基线b乘积的期望等于策略概率函数梯度与B的乘积对所有状态及行为分布求和的形式,这步推导主要是根据期望的定义,然后根据log函数的性质去除log,再之后求和则变成:策略函数针对所有行为的求和,这一求和根据策略函数的定义肯定是1,而常数的梯度是0。因此总的结果等于0 。
然后,我们就可以求使得策略梯度的方差最小时的基线b
令
,则方差为:
方差最小处,方差对b的导数为零,即:
其中
与b无关。
将X带入,最后得到:
对于降低方差的部分现在讲的比较粗略,之后有机会再补充,大家也可以看下其他相关论文资料。然后对于策略梯度的改进算法,比如AC,TRPO什么的,期待下期!
编辑于 2018-01-03