【RL】策略梯度的训练技巧
一 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)=5 r(τ)=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=0
Ew[∇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
b
b ,其实是不会影响策略梯度的求值的。
从直观上来说, b b b应该取值为 r ( τ ) r(\tau) r(τ)的均值,这可以使得 r ( τ ) − b r(\tau)-b r(τ)−b的平方和最小。并且这样可以使得“比较好的”轨道 τ \tau τ对应的权重 r ( τ ) − b r(\tau)-b r(τ)−b都是正数,而“比较差的”轨道 τ \tau τ对应的权重 r ( τ ) r(\tau) r(τ)是负数。但是,这并不意味着估计的均方误差最小。如果经过严格的数学推理,我们会发现其实 b b b不是取 r ( τ ) r(\tau) r(τ)的均值,而是取 r ( τ ) r(\tau) r(τ)关于对应梯度大小的加权均值时候,估计的均方误差最小。不过在实践中人们发现,将 b b b取为 r ( τ ) r(\tau) r(τ)的均值,虽然不能达到“均方误差最小”,但是计算比较简单,效果也相当不错,而且“赏罚分明”,比较符合人们的直观。所以人们一般就将 b b b取为所有 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
x
x对应的
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-\epsilon 1−ϵ的概率按照 a r g m a x Q ( s , a ) argmaxQ(s, a) argmaxQ(s,a)选择 a a a,而以 ϵ \epsilon ϵ的概率随机选择一个 a a a;另一种方式叫做Boltzmann Exploration,即按照 exp ( Q ( s , a ) ) \exp(Q(s, a)) exp(Q(s,a))归一化后的概率产生 a a a。这两种方法都可以为数据集增加多样性,不过后一种方法的性能要比前者更鲁棒,因为它充分地考虑了所有不同 a a a之间的优劣,让 Q ( s , a ) Q(s, a) Q(s,a)更高的 a a a更容易被选中。
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 a a,做出决策,则得到 τ \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
s
s时,策略网络输出的
a
a
a的概率分布的熵。若
a
a
a的概率分布越均匀,则熵越大。对不同的
s
s
s,策略网络输出的
a
a
a的分布不同,熵函数自然也不同,所以熵函数是一个关于
s
s
s的函数,将其记为
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 s
Ew(H(s))=∫sPw(s)H(s)ds
策略的熵越大,说明它决策中
(
s
,
a
)
(s, a)
(s,a)的丰富度越高,用它决策出来的
τ
\tau
τ就越多样。
在基本的policy gradient中,我们迭代地让 w w w沿着 ∇ w J ( w ) \nabla_wJ(w) ∇wJ(w)的方向更新,以谋求获得更大的 J ( w ) J(w) J(w)。现在,我们修改一下,让 w w w沿着 ∇ 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 α才能找出其最佳的取值。