一 r ( τ ) r(\tau)r(τ)的baseline
毫无疑问, r ( τ ) r(\tau)r(τ)代表着轨道τ \tauτ的好坏。按照我们推导出来的policy gradient的式子,r ( τ ) r(\tau)r(τ)大于0的时候,训练会使得这个轨道上涉及的所有π w ( a i ∣ s i ) \pi_{w}\left(a_{i} \mid s_{i}\right)πw(ai∣si)增加。这说明,如果τ \tauτ是一条比较好的轨道,则我们应该“充分学习成功的经验”,让τ \tauτ涉及到的每一次决策( s i , a i ) (s_i, a_i)(si,ai)的概率都增大;同理,当r ( τ ) r(\tau)r(τ)小于0的时候,训练会使得这个轨道上所有π w ( a i ∣ s i ) \pi_{w}\left(a_{i} \mid s_{i}\right)πw(ai∣si)概率减少。这是因为τ \tauτ是一条比较失败的轨道,所以我们应该“避免重蹈覆辙”,让τ \tauτ涉及的每一次决策( s i , a i ) (s_i, a_i)(si,ai)的概率都减少。从训练的公式上看,我们能够实现上述目的。从直觉上说,上述的目的也是合情合理的。这令我们非常满意。
但是,我们现在要考虑下面的情况:假设我们的MDP所定义的τ \tauτ都是大于0的,则所有r ( τ ) r(\tau)r(τ)都应该是正的,只有大和小的分别,没有正和负的分别。在 r ( τ ) r(\tau)r(τ)比较小的时候τ \tauτ包含着“失败的经验”(例如贪吃蛇游戏中, r ( τ ) r(\tau)r(τ)用游戏结束时蛇的长度来表示,那么 r ( τ ) = 5 r(\tau)=5r(τ)=5是一个很差的结果)。
现在的问题是:如果我们坚持用r ( τ ) r(\tau)r(τ)来训练,就会出现“学习失败经验”的情况,似乎“不合情理”;而如果对r ( τ ) r(\tau)r(τ)进行调整,就与我们推导的策略梯度的公式有所偏差,不知会不会出现错误。这个问题应该如何解释呢?
但是,如果我们采样了许多τ \tauτ,其中的r ( τ ) r(\tau)r(τ)有大有小、全部大于0。我们用这些数据训练的效果就完全等同于将较小的r ( τ ) r(\tau)r(τ)变成负数,将较大的r ( τ ) r(\tau)r(τ)变成小一些的正数。这就好像用r ( τ ) r(\tau)r(τ)减去自己的均值再去进行训练一样。
我们的策略梯度是:∇ w J ( w ) = E w [ ∇ w log ( P w ( τ ) ) r ( τ ) ] \nabla_{w} J(w)=E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) r(\tau)\right]∇wJ(w)=Ew[∇wlog(Pw(τ))r(τ)]
如果改变r ( τ ) r(\tau)r(τ),给他加一个常数:
E w [ ∇ w log ( P w ( τ ) ) ( r ( τ ) + b ) ] = E w [ ∇ w log ( P w ( τ ) ) r ( τ ) ] + E w [ ∇ w log ( P w ( τ ) ) b ] E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) (r(\tau)+b)\right]=E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) r(\tau)\right]+E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) b\right]Ew[∇wlog(Pw(τ))(r(τ)+b)]=Ew[∇wlog(Pw(τ))r(τ)]+Ew[∇wlog(Pw(τ))b]
而E w [ ∇ w log ( P w ( τ ) ) b ] = ∫ t a u ∇ w P w ( τ ) b d τ = b ∇ w ∫ τ P w ( τ ) d τ = 0 E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) b\right]=\int_{t a u} \nabla_{w} P_{w}(\tau) b d \tau=b \nabla_{w} \int_{\tau} P_{w}(\tau) d \tau=0Ew[∇wlog(Pw(τ))b]=∫tau∇wPw(τ)bdτ=b∇w∫τPw(τ)dτ=0
所以得到:
∇ w J ( w ) = E w [ ∇ w log ( P w ( τ ) ) ( r ( τ ) + b ) ] \nabla_{w} J(w) = E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) (r(\tau)+b)\right]∇wJ(w)=Ew[∇wlog(Pw(τ))(r(τ)+b)]
这启发我们,如果将所有轨道对应的奖励总和r ( τ ) r(\tau)r(τ)(即训练时的“权重”)同时增加一个常数b bb ,其实是不会影响策略梯度的求值的。
从直观上来说,b bb应该取值为r ( τ ) r(\tau)r(τ)的均值,这可以使得r ( τ ) − b r(\tau)-br(τ)−b的平方和最小。并且这样可以使得“比较好的”轨道τ \tauτ对应的权重r ( τ ) − b r(\tau)-br(τ)−b都是正数,而“比较差的”轨道τ \tauτ对应的权重r ( τ ) r(\tau)r(τ)是负数。但是,这并不意味着估计的均方误差最小。如果经过严格的数学推理,我们会发现其实b bb不是取r ( τ ) r(\tau)r(τ)的均值,而是取r ( τ ) r(\tau)r(τ)关于对应梯度大小的加权均值时候,估计的均方误差最小。不过在实践中人们发现,将b bb取为r ( τ ) r(\tau)r(τ)的均值,虽然不能达到“均方误差最小”,但是计算比较简单,效果也相当不错,而且“赏罚分明”,比较符合人们的直观。所以人们一般就将b bb取为所有r ( τ ) r(\tau)r(τ)的均值。这也就是说,在训练时,我们一般先对采样出的所有轨道的r ( τ ) r(\tau)r(τ)进行中心化,然后再求其均值以用来估计策略梯度。
二 Experience Replay
policy gradient显然是一个on-policy的算法。换言之,我们必须用当前策略产生的数据,才能训练改善当前的策略。
在DQN中,由于DQN具有off-policy的特性,它可以采用experience replay,将所有训练中产生的( s , a , r , s ′ ) \left(s, a, r, s^{\prime}\right)(s,a,r,s′)数据集都记录下来,放在一个记忆库中。每次训练的时候,都可以从中随机抽取出一个batch来训练。此举有很多好处,例如提高数据的利用率、减少产生数据的成本,打断同一个batch数据集前后关联程度、增加训练集之间独立性等等。如果策略梯度算法必须每一步产生大量数据,而只用来训练一次就丢掉,无疑太过浪费了。所以,我们的问题是,在策略梯度算法中,如何才能正确利用过去的数据呢?
策略梯度公式唯一妨碍我们采用off-policy的地方就只有一个,那就是τ i \tau_iτi不服从P w ( τ ) P_w(\tau)Pw(τ)分布。
化简一下我们的问题,我们想求的是E x ∼ p ( x ) [ f ( x ) ] E_{x \sim p(x)}[f(x)]Ex∼p(x)[f(x)] ,但我们只有一组x ∼ q ( x ) x \sim q(x)x∼q(x)的样本,我们掌握f ( x ) f(x)f(x)的计算方法,并且也掌握p ( x ) p(x)p(x)与q ( x ) q(x)q(x)的表达式。唯一的问题就是p ( x ) p(x)p(x)与q ( x ) q(x)q(x)是不同的概率密度函数。注意如下的公式:
E x ∼ p ( x ) [ f ( x ) ] = ∫ x p ( x ) f ( x ) d x = ∫ x q ( x ) p ( x ) q ( x ) f ( x ) d x = E x ∼ q ( x ) [ p ( x ) q ( x ) f ( x ) ] E_{x \sim p(x)}[f(x)]=\int_{x} p(x) f(x) d x=\int_{x} q(x) \frac{p(x)}{q(x)} f(x) d x=E_{x \sim q(x)}\left[\frac{p(x)}{q(x)} f(x)\right]Ex∼p(x)[f(x)]=∫xp(x)f(x)dx=∫xq(x)q(x)p(x)f(x)dx=Ex∼q(x)[q(x)p(x)f(x)]
这也就是说,如果我们对当前这组样本x xx对应的p ( x ) q ( x ) f ( x ) \frac{p(x)}{q(x)} f(x)q(x)p(x)f(x)求均值,就可以得到E x ∼ p ( x ) [ f ( x ) ] E_{x \sim p(x)}[f(x)]Ex∼p(x)[f(x)]的一个无偏估计。
上述的方法被称为“重要性蒙特卡洛方法”。即通过为每个样本增加一个“重要性权重”p ( x ) q ( x ) \frac{p(x)}{q(x)}q(x)p(x),使得本来服从q ( x ) q(x)q(x)分布的一组样本可以被“强行改成”服从于p ( x ) p(x)p(x)分布的样本。这样一来,就可以计算我们手头上没有样本的分布所对应的期望了。以下的图片展示为什么我们可以通过改变样本的“重要性权重”达到改变样本分布的目的。要注意的是,左图中的黑点位置在右图中位置没有移动,只是按照不同权重变成了不同大小的红点,其对应的分布也发生了改变。
所有基于策略的方法都天然地是on-policy的算法。为了将其off-policy的训练,提升性能,我们都需要采取类似于重要性采样的方法。
三 Exploration
在DQN中,exploration可以增加数据集的多样性,使得算法更加鲁棒。主要有两种exploration方法,一种ϵ − \epsilon-ϵ− greedy,即以1 − ϵ 1-\epsilon1−ϵ的概率按照a r g m a x Q ( s , a ) argmaxQ(s, a)argmaxQ(s,a)选择a aa,而以ϵ \epsilonϵ的概率随机选择一个a aa;另一种方式叫做Boltzmann Exploration,即按照exp ( Q ( s , a ) ) \exp(Q(s, a))exp(Q(s,a))归一化后的概率产生a aa。这两种方法都可以为数据集增加多样性,不过后一种方法的性能要比前者更鲁棒,因为它充分地考虑了所有不同a aa之间的优劣,让Q ( s , a ) Q(s, a)Q(s,a)更高的a aa更容易被选中。
policy gradient算法和DQN是完全不同的。它不是要估计某个“客观的价值”,而是要直接输出“最佳的策略”。所以,它不会像DQN一样存在“局部收敛”的问题。但是,在迭代中我们要随机采样很多τ i \tau_iτi ,求出∇ w log P w ( τ i ) r ( τ i ) \nabla_{w} \log P_{w}\left(\tau_{i}\right) r\left(\tau_{i}\right)∇wlogPw(τi)r(τi)的平均值,以估计policy gradient E w ( ∇ w log P w ( τ ) r ( τ ) ) E_{w}\left(\nabla_{w} \log P_{w}(\tau) r(\tau)\right)Ew(∇wlogPw(τ)r(τ)) 。如果我们采样出来的τ \tauτ不够多样,则估计的policy gradient肯定会不够准确。换句话说,我们希望P w ( τ ) P_w(\tau)Pw(τ)的分布更加“平均”一些,这样,通过蒙特卡洛方法对P w ( τ ) P_w(\tau)Pw(τ)求期望才会更加准确。从这个角度说,一定程度的explore对于训练策略网络也是很重要的。
策略网络天然就具有explore的方式——它输出的本来就是π w ( a ∣ s ) \pi_{w}(a \mid s)πw(a∣s)的概率,我们让Agent按照这个概率分布去随机抽样a aa,做出决策,则得到τ \tauτ自然是具有多样性的。但是随着训练的进行,某些( s , a ) (s, a)(s,a)的π w ( a ∣ s ) \pi_{w}(a \mid s)πw(a∣s)趋于1,这样一来τ \tauτ的多样性也大大的减少了。归根结底,这是因为我们并没有显式地去定义如何增加τ \tauτ的多样性,我们应该对多样性进行一个严格的定义,并显式地去增加它。
我们定义熵函数H ( s ) = Σ a π v o ( s , a ) log ( π w ( s , a ) ) H(s)=\Sigma_{a} \pi_{v o}(s, a) \log \left(\pi_{w}(s, a)\right)H(s)=Σaπvo(s,a)log(πw(s,a)),表示面对输入状态s ss时,策略网络输出的a aa的概率分布的熵。若a aa的概率分布越均匀,则熵越大。对不同的s ss,策略网络输出的a aa的分布不同,熵函数自然也不同,所以熵函数是一个关于s ss的函数,将其记为H ( s ) H(s)H(s)。我们定义策略的熵为不同状态下熵的期望值,即:
E w ( H ( s ) ) = ∫ s P w ( s ) H ( s ) d s E_{w}(H(s))=\int_{s} P_{w}(s) H(s) d sEw(H(s))=∫sPw(s)H(s)ds
策略的熵越大,说明它决策中( s , a ) (s, a)(s,a)的丰富度越高,用它决策出来的τ \tauτ就越多样。
在基本的policy gradient中,我们迭代地让w ww沿着∇ w J ( w ) \nabla_wJ(w)∇wJ(w)的方向更新,以谋求获得更大的J ( w ) J(w)J(w)。现在,我们修改一下,让w ww沿着∇ w [ J ( w ) + α E w ( H ( s ) ) ] \nabla_{w}\left[J(w)+\alpha E_{w}(H(s))\right]∇w[J(w)+αEw(H(s))]的方向更新,意思是我们既要考虑增大总的奖励 J ( w ) J(w)J(w),也要同时考虑让策略具有更大的熵、让它决策更具有多样性。这就好像是在说,我们要多为自己的人生保留无限的可能性,不要过早地把自己给限定死了。α \alphaα是一个惩罚系数,表示我们对于“决策多样性”的重视程度。α \alphaα越高,就代表我们越重视多种不同的经验,越会努力去尝试让自己人生丰富多彩。它与机器学习中的正则项系数有一定相似性,相当于超参数。要多调试一下不同的α \alphaα才能找出其最佳的取值。