强化学习策略梯度
本文是一篇学习笔记,主要参考 OpenAI SpiningUp 文档和李宏毅老师的强化学习课程。
本文将首先推导强化学习策略梯度最简单的形式,然后对这个最简形式进行一些改造优化,最终得到我们实际中使用的标准策略梯度实现。
推导最简单的策略梯度
推导思路
我们这里考虑一个随机的、参数化的策略 π θ \pi_\theta πθ,我们的目标是最大化期望回报 J ( π θ ) = E τ ∼ π θ [ R ( τ ) ] J(\pi_\theta)=\mathbb{E}_{\tau\sim\pi_\theta}[R(\tau)] J(πθ)=Eτ∼πθ[R(τ)]。期望回报 J ( π θ ) J(\pi_\theta) J(πθ) 是指按照特定的策略 π θ \pi_\theta πθ 采取动作所得到的最终累积回报的期望,最大化这个期望回报是强化学习的终极目标。
要注意,我们要最大化的是整个轨迹 τ \tau τ 的期望回报 R ( τ ) R(\tau) R(τ),而非某个单步的奖励 r t r_t rt,这是因为强化学习的终极目标应当是最终整体任务的结果,而非单步的奖励。
想象在电子游戏中,我们操作战斗机有左右移动和开火三个动作,移动到合适的位置并开火会得到更高的分数,但是移动这个单步动作本身是不会得到任何分数的,如果以单步的奖励为优化目标,战斗机就永远不会移动,而只能站在原地开火了,这显然不是我们想要的。在围棋、电子游戏等多个强化学习的应用场景中都是这样的,这也称为奖励延迟(reward delay)问题。
我们希望通过梯度上升来优化策略,其形如:
θ
k
+
1
=
θ
k
+
α
∇
θ
J
(
π
θ
)
∣
θ
k
\theta_{k+1}=\theta_k+\alpha\nabla_\theta J(\pi_\theta)|_{\theta_k} \notag \\
θk+1=θk+α∇θJ(πθ)∣θk
策略的期望回报
J
J
J 关于参数
θ
\theta
θ 的梯度
∇
θ
J
(
π
θ
)
\nabla_\theta J(\pi_\theta)
∇θJ(πθ) 就称为策略梯度(Policy Gradient),以这种方式优化策略的算法被称为策略梯度算法,比如 Vanilla Policy Gradient、TRPO、PPO 这些一般都被称为策略梯度算法(虽然这么说稍微有点不准确)。
要实际使用这个算法,我们需要一个可以进行数值计算的策略梯度的表达式。这包括两个步骤:1)推导出策略梯度的解析解,这个解应当是一个期望的形式,2)通过有限数量的智能体-环境交互的数据,计算该期望值的样本估计。
推导过程
首先,我们给出轨迹 τ \tau τ 的概率。轨迹 τ \tau τ 是指在给定初始状态 s 0 s_0 s0 的情况下,智能体 π θ \pi_\theta πθ 根据状态采样出动作,环境根据当前状态和动作转移到新的状态,并给出一定的奖励,这样不断循环往复,直至终止状态 s T s_T sT,最终得到的状态-动作-奖励序列,就是轨迹 τ = { s 0 , a 0 , r 0 , s 1 , a 1 , r 1 , … , s T , a T , r T } \tau=\{s_0,a_0,r_0,s_1,a_1,r_1,\dots,s_T,a_T,r_T\} τ={s0,a0,r0,s1,a1,r1,…,sT,aT,rT}。
由于我们考虑的是随机的参数化策略
π
θ
\pi_\theta
πθ,所以每一个轨迹
τ
\tau
τ 都是有可能被采样出来的。现在我们写出给定策略
π
θ
\pi_\theta
πθ,轨迹
τ
\tau
τ 被采样出来的概率,就是按照上面的描述进行转移概率的累乘:
P
(
τ
∣
θ
)
=
ρ
0
(
s
0
)
∏
t
=
0
T
P
(
s
t
+
1
∣
s
t
,
a
t
)
π
θ
(
a
t
∣
s
t
)
(1)
P(\tau|\theta)=\rho_0(s_0)\prod_{t=0}^T P(s_{t+1}|s_t,a_t)\pi_\theta(a_t|s_t) \tag{1} \\
P(τ∣θ)=ρ0(s0)t=0∏TP(st+1∣st,at)πθ(at∣st)(1)
然后,对轨迹
τ
\tau
τ 的概率进行一番处理,取对数并求关于参数
θ
\theta
θ 的梯度:
P
(
τ
∣
θ
)
=
ρ
0
(
s
0
)
∏
t
=
0
T
P
(
s
t
+
1
∣
s
t
,
a
t
)
π
θ
(
a
t
∣
s
t
)
log
P
(
τ
∣
θ
)
=
log
ρ
0
(
s
0
)
+
∑
t
=
0
T
(
log
P
(
s
t
+
1
∣
s
t
,
a
t
)
+
log
π
θ
(
a
t
∣
s
t
)
)
取对数
∇
θ
log
P
(
τ
∣
θ
)
=
∇
θ
log
ρ
0
(
s
0
)
+
∑
t
=
0
T
(
∇
θ
log
P
(
s
t
+
1
∣
s
t
,
a
t
)
+
∇
θ
log
π
θ
(
a
t
∣
s
t
)
)
对
θ
求梯度
∇
θ
log
P
(
τ
∣
θ
)
=
0
+
∑
t
=
0
T
(
0
+
∇
θ
log
π
θ
(
a
t
∣
s
t
)
)
=
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
)
P
和
ρ
0
都与
θ
无关,因此梯度为
0
\begin{aligned} P(\tau|\theta)&=\rho_0(s_0)\prod_{t=0}^T P(s_{t+1}|s_t,a_t)\pi_\theta(a_t|s_t) \\ \log P(\tau|\theta)&=\log\rho_0(s_0)+\sum_{t=0}^T(\log P(s_{t+1}|s_t,a_t)+\log\pi_\theta(a_t|s_t)) \quad 取对数 \\ \nabla_\theta\log P(\tau|\theta)&=\nabla_\theta\log\rho_0(s_0)+\sum_{t=0}^T(\nabla_\theta\log P(s_{t+1}|s_t,a_t)+\nabla_\theta\log\pi_\theta(a_t|s_t)) \quad 对\ \theta\ 求梯度 \\ \nabla_\theta \log P(\tau|\theta)&=0+\sum_{t=0}^T(0+\nabla_\theta\log\pi_\theta(a_t|s_t))=\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)) \quad P\ 和\ \rho_0\ 都与\ \theta\ 无关,因此梯度为\ 0 \end{aligned} \notag \\
P(τ∣θ)logP(τ∣θ)∇θlogP(τ∣θ)∇θlogP(τ∣θ)=ρ0(s0)t=0∏TP(st+1∣st,at)πθ(at∣st)=logρ0(s0)+t=0∑T(logP(st+1∣st,at)+logπθ(at∣st))取对数=∇θlogρ0(s0)+t=0∑T(∇θlogP(st+1∣st,at)+∇θlogπθ(at∣st))对 θ 求梯度=0+t=0∑T(0+∇θlogπθ(at∣st))=t=0∑T∇θlogπθ(at∣st))P 和 ρ0 都与 θ 无关,因此梯度为 0
至此我们得到:
∇
θ
log
P
(
τ
∣
θ
)
=
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
)
(2)
\nabla_\theta\log P(\tau|\theta)=\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)) \tag{2} \\
∇θlogP(τ∣θ)=t=0∑T∇θlogπθ(at∣st))(2)
这个结果先放在这里,下面会用。
正式推导策略梯度
∇
θ
J
(
π
t
θ
)
\nabla_\theta J(\pi_t\theta)
∇θJ(πtθ):
∇
θ
J
(
π
θ
)
=
∇
θ
E
τ
∼
π
θ
[
R
(
τ
)
]
目标是最大化期望回报
=
∇
θ
∫
τ
P
(
τ
∣
θ
)
R
(
τ
)
期望的定义展开
=
∫
τ
∇
θ
P
(
τ
∣
θ
)
R
(
τ
)
求梯度拿进来
=
∫
τ
P
(
τ
∣
θ
)
∇
θ
log
P
(
τ
∣
θ
)
R
(
τ
)
对数导数形式变换技巧,这个形式变换在机器学习推导中很常用
=
E
τ
∼
π
θ
[
∇
θ
log
P
(
τ
∣
θ
)
R
(
τ
)
]
再转换回期望的形式
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
R
(
τ
)
]
将上面式
(
2
)
的推导结果代入
\begin{aligned} \nabla_\theta J(\pi_\theta)&=\nabla_\theta\mathbb{E}_{\tau\sim\pi_\theta}[R(\tau)] \quad 目标是最大化期望回报 \\ &=\nabla_\theta\int_\tau P(\tau|\theta)R(\tau) \quad 期望的定义展开 \\ &=\int_\tau\nabla_\theta P(\tau|\theta)R(\tau) \quad 求梯度拿进来 \\ &=\int_\tau P(\tau|\theta)\nabla_\theta\log P(\tau|\theta)R(\tau) \quad 对数导数形式变换技巧,这个形式变换在机器学习推导中很常用 \\ &=\mathbb{E}_{\tau\sim\pi_\theta}[\nabla_\theta\log P(\tau|\theta)R(\tau)] \quad 再转换回期望的形式 \\ \nabla_\theta J(\pi_\theta)&=\mathbb{E}_{\tau\sim\pi_\theta}\left[\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)R(\tau)\right] \quad 将上面式(2)的推导结果代入 \end{aligned} \notag \\
∇θJ(πθ)∇θJ(πθ)=∇θEτ∼πθ[R(τ)]目标是最大化期望回报=∇θ∫τP(τ∣θ)R(τ)期望的定义展开=∫τ∇θP(τ∣θ)R(τ)求梯度拿进来=∫τP(τ∣θ)∇θlogP(τ∣θ)R(τ)对数导数形式变换技巧,这个形式变换在机器学习推导中很常用=Eτ∼πθ[∇θlogP(τ∣θ)R(τ)]再转换回期望的形式=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)R(τ)]将上面式(2)的推导结果代入
对数导数形式变换技巧,这个形式在机器学习推导中很常用,其实就是逆用对数函数的链式求导。
1 f ( x ) d f ( x ) d x = d log ( f ( x ) ) d x \frac{1}{f(x)}\frac{df(x)}{dx}=\frac{d\log(f(x))}{dx} \notag \\ f(x)1dxdf(x)=dxdlog(f(x))
这样,我们就得到了策略的性能
J
J
J 关于参数
θ
\theta
θ 的梯度
∇
θ
J
(
π
θ
)
\nabla_\theta J(\pi_\theta)
∇θJ(πθ) ,即策略梯度的表达式:
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
R
(
τ
)
]
(3)
\nabla_\theta J(\pi_\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\left[\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)R(\tau)\right] \tag{3} \\
∇θJ(πθ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)R(τ)](3)
这是一个期望的形式,由于穷尽所有的轨迹
τ
\tau
τ 是不可能的,所以我们从分布
π
θ
\pi_\theta
πθ 中采样
N
N
N 个轨迹
τ
\tau
τ,来使用这些样本的均值对其进行近似。具体来说,我们可以不断让智能体根据参数化策略
π
θ
\pi_\theta
πθ 进行行动来得到一个轨迹
τ
\tau
τ (rollout),并最终构建出一个包含
N
N
N 条轨迹的数据集
D
=
{
τ
i
}
i
=
1
,
…
,
N
\mathcal{D}=\{\tau_i\}_{i=1,\dots,N}
D={τi}i=1,…,N。即我们用
N
N
N 次采样得到的
N
N
N 条数据
{
τ
i
}
i
=
1
,
…
,
N
\{\tau_i\}_{i=1,\dots,N}
{τi}i=1,…,N 来近似对所有轨迹的穷举(式中红色部分)。然后根据下式来估计策略梯度:
g
^
=
1
N
∑
τ
∈
D
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
R
(
τ
)
≈
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
R
(
τ
)
]
\hat{g}=\textcolor{red}{\frac{1}{N}\sum_{\tau\in\mathcal{D}}}\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)R(\tau)\approx\textcolor{red}{\mathbb{E}_{\tau\sim\pi_\theta}}\left[\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)R(\tau)\right] \notag \\
g^=N1τ∈D∑t=0∑T∇θlogπθ(at∣st)R(τ)≈Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)R(τ)]
这就是策略梯度的最简可计算形式了。式中的
R
(
τ
)
R(\tau)
R(τ) 是轨迹
τ
\tau
τ 得到的最终回报,这是由环境决定的,它的计算过程通常是我们所未知的(model-free),不过没有关系,我们计算关于参数
θ
\theta
θ 的微分不需要知道它是怎么算出来的,只要知道它的值就行。因此我们只要能够将策略
π
θ
\pi_\theta
πθ 表示成一种可微的形式,即可以计算
∇
θ
log
π
θ
(
a
t
∣
s
t
)
\nabla_\theta\log\pi_\theta(a_t|s_t)
∇θlogπθ(at∣st),并且可以不断在环境中运行这个策略从而收集到轨迹数据集
D
\mathcal{D}
D,我们就可以计算策略梯度,并通过梯度上升来更新参数
θ
\theta
θ 了。
注意我们考虑随机性的策略和环境状态转移函数,这两个地方的随机性导致:对于同一个策略 π θ \pi_\theta πθ 进行多次采样得到的轨迹 τ \tau τ 是不同的。
分析与讨论
我们对推导结果进行分析和讨论,提供一些直觉上的理解。
观察这个最终的式子 (3),我们可以理解为:在根据当前策略 π θ \pi_\theta πθ 采样出的 N N N 条轨迹的经验数据上,模型需要调整策略 π \pi π 的参数 θ \theta θ ,来使得:如果整个 episode 的累积回报 R ( τ ) R(\tau) R(τ) 比较高,就让产生这个轨迹 τ \tau τ 的各个动作 a t a_t at 出现的概率 π θ ( a t ∣ s t ) \pi_\theta(a_t|s_t) πθ(at∣st) 更高,如果 R ( τ ) R(\tau) R(τ) 比较小,就让轨迹中各个动作出现的概率更低。
最终的形式上,出现了一个对数 log \log log,这看起来似乎不太自然。我们知道实际上有 ∇ θ log π θ ( a t ∣ s t ) = ∇ θ π θ ( a t ∣ s t ) π θ ( a t ∣ s t ) \nabla_\theta\log\pi_\theta(a_t|s_t)=\frac{\nabla_\theta\pi_\theta(a_t|s_t)}{\pi_\theta(a_t|s_t)} ∇θlogπθ(at∣st)=πθ(at∣st)∇θπθ(at∣st),如果是要提高回报 R ( τ ) R(\tau) R(τ) 较高的轨迹 τ \tau τ 被采样出来的概率,似乎我们只要提高对应参数化策略 π θ \pi_\theta πθ 的概率就可以了,也就是分子部分。那最终形式中这个多出来的分母部分有何意义呢?其实,这里除一个 π θ ( a t ∣ s t ) \pi_\theta(a_t|s_t) πθ(at∣st) 可以理解为用概率对梯度进行了一个归一化。因为在训练的不充分的时候,很多不是最优的动作也会被采样出来,如果他们被采样的次数很多的话,模型也会试图增大他们的概率。而有了这个概率归一化,就能避免模型偏好采样过程中出现概率比较高的动作。
同样由于采样可能不充分的问题,当 R ( τ ) R(\tau) R(τ) 都是正值的时候,也会对没有被采样到(但可能更好)的动作不太友好,因此,策略梯度在实际做的时候通常还会减去一个 baseline,这一点很重要,下面也会提到。
李宏毅老师在课程中提供了一个新的视角来看策略梯度的形式:将策略梯度与交叉熵分类对比理解。我们知道,分类任务要最小化交叉熵损失函数:
L
=
−
∑
i
=
1
k
y
^
i
log
y
i
\mathcal{L}=-\sum_{i=1}^k\hat{y}_i\log y_i \notag \\
L=−i=1∑ky^ilogyi
其中
k
k
k 是类别数,
y
^
i
,
y
i
\hat{y}_i,y_i
y^i,yi 分别是 gt 和 pred。
y
^
i
\hat{y}_i
y^i 是一个 one-hot 编码的向量,只有正确的那一维(不妨设为 0)为 1,其他维度均为 0。那么,对于标签为 0 的样本
x
x
x,分类的交叉熵损失函数实际就是要最大化
log
P
θ
(
y
0
∣
x
)
\log P_\theta(y_0|x)
logPθ(y0∣x) ,即对于给定输入
x
x
x,要让输出为
y
0
y_0
y0 的概率最高。这个形式就和我们刚推导出的策略梯度很接近了,区别就在于策略梯度还多乘了一个累积回报
R
(
τ
)
R(\tau)
R(τ)。也就是说,策略梯度可以看作是一个奖励加权的分类任务。累积越高的 action,权重越高。这也能解释我们上面提到的最好是要减掉一个 baseline,避免结果全是正的,否则模型会最大化(只是权重不同)所有采样到的动作出现的概率,导致前期未能被采样到(但可能更好)的 action 一直被打压。
代码
spining up 给出了最简的策略梯度代码示例,非常简洁,一共只有 128 行,推荐详细阅读一下。
这里重点提一下关于强化学习中实现的 “loss”。尽管我们把他称为 “损失函数”,但它并不是监督学习中通常意义上的损失函数。它与常规的损失函数有两个主要区别:
- 数据分布依赖于参数。损失函数通常定义在一个固定的、独立于我们希望优化的参数的数据分布上。而在这里,数据必须基于最近的策略进行采样(on policy)。
- 不衡量性能。损失函数通常能反映我们的模型是否在变好。但在强化学习这里,我们唯一关心的是期望回报 J J J,但是损失函数,即使从期望的角度来说,也并不能近似期望回报。这个 “损失函数” 只是我们根据期望回报的反馈设计的模型参数的梯度更新方向。
优化策略梯度
上一节中,我们已经推导出了最简策略梯度的形式。接下来,我们将对其进行改造优化,最终得到我们实际中使用的标准策略梯度实现。
reward-to-go
在我们以上的推导中,策略梯度是根据整个轨迹 τ \tau τ 的最终总回报 R ( τ ) R(\tau) R(τ) 了来进行优化。但这里其实有个问题,某个动作之前获得的奖励应该与该动作的好坏无关,我们应该只根据其后发生的奖励来优化动作。
这个直觉的想法在数学上也能表示出来。具体来说,我们可以将策略梯度可以写为以下形式:
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
∑
t
′
=
t
T
R
(
s
t
′
,
a
t
′
,
s
t
′
+
1
)
]
\nabla_\theta J(\pi_\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\left[\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)\sum_{t'=t}^{T}R(s_{t'},a_{t'},s_{t'+1})\right] \notag \\
∇θJ(πθ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)t′=t∑TR(st′,at′,st′+1)]
这样,一个动作就只会根据它被采取后获得的奖励进行优化。我们将这种策略梯度的形式称为 “reward-to-go policy gradient”,它是基于轨迹中某一点之后的奖励总和(称为该点处的 “reward-to-go”):
R
^
t
=
∑
t
′
=
t
T
R
(
s
t
′
,
a
t
′
,
s
t
′
+
1
)
\hat{R}_t=\sum_{t'=t}^TR(s_{t'},a_{t'},s_{t'+1}) \notag \\
R^t=t′=t∑TR(st′,at′,st′+1)
EGLP定理策略梯度中的基线(baseline)
本节中我们将首先推导 EGLP (Expected Grad-Log-Prob)定理,然后介绍它在策略梯度理论中的一个应用:基线。
EGLP 定理及推导
EGLP 定理描述如下:记
P
θ
P_\theta
Pθ 是关于随机变量
x
x
x 的参数化概率分布,那么有:
E
x
∼
P
θ
[
∇
θ
log
P
θ
(
x
)
]
=
0
\mathbb{E}_{x\sim P_\theta}[\nabla_\theta\log P_\theta(x)]=0 \notag \\
Ex∼Pθ[∇θlogPθ(x)]=0
证明如下:
首先我们知道概率具有归一性:
∫
x
P
θ
(
x
)
=
1
\int_x P_\theta(x)=1 \notag \\
∫xPθ(x)=1
对两边关于
x
x
x 求梯度:
∇
θ
∫
x
P
θ
(
x
)
=
∇
θ
1
=
0
\nabla_\theta\int_xP_\theta(x)=\nabla_\theta1=0 \notag
∇θ∫xPθ(x)=∇θ1=0
再根据链式法则进行对上面用过的数导数形式变换:
0
=
∇
θ
∫
x
P
θ
(
x
)
=
∫
x
∇
θ
P
θ
(
x
)
=
∫
x
P
θ
∇
θ
log
P
θ
(
x
)
0
=
E
x
∼
P
θ
[
∇
θ
log
P
θ
(
x
)
]
\begin{aligned} 0&=\nabla_\theta\int_xP_\theta(x) \\ &=\int_x\nabla_\theta P_\theta(x) \\ &=\int_x P_\theta\nabla_\theta\log P_\theta(x) \\ 0&=\mathbb{E}_{x\sim P_\theta}[\nabla_\theta\log P_\theta(x)] \end{aligned} \notag \\
00=∇θ∫xPθ(x)=∫x∇θPθ(x)=∫xPθ∇θlogPθ(x)=Ex∼Pθ[∇θlogPθ(x)]
基线 baseline
EGLP 定理的一个直接推论是:对于任意关于状态的函数
b
b
b,有:
E
a
t
∼
π
θ
[
∇
θ
log
π
θ
(
a
t
∣
s
t
)
b
(
s
t
)
]
=
0
\mathbb{E}_{a_t\sim\pi_\theta}[\nabla_\theta\log\pi_\theta(a_t|s_t)b(s_t)]=0 \notag \\
Eat∼πθ[∇θlogπθ(at∣st)b(st)]=0
这种期望形式的项的结果是 0。也就是说,我们可以在策略梯度的表达式中添加或减去任意数量的此类项,而不会改变其期望值(但是会影响方差):
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
(
∑
t
′
=
t
T
R
(
s
t
′
,
a
t
′
,
s
t
′
+
1
)
−
b
(
s
t
)
)
]
(4)
\nabla_\theta J(\pi_\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\left[\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)\left(\sum_{t'=t}^TR(s_{t'},a_{t'},s_{t'+1})-b(s_t)\right)\right] \tag{4} \\
∇θJ(πθ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)(t′=t∑TR(st′,at′,st′+1)−b(st))](4)
这里的函数
b
b
b 称为基线(baseline)。
最常见的基线函数就是价值函数 V π ( s t ) V^\pi(s_t) Vπ(st),它是智能体从状态 s t s_t st 开始一直按照策略 π \pi π 采样并执行动作,最终得到的平均回报。在实际中,选择 b ( s t ) = V π ( s t ) b(s_t)=V^\pi(s_t) b(st)=Vπ(st) 可以减少策略梯度样本估计的方差,从而实现更快和更稳定的策略学习。从直觉的角度来想这也是很合理的:如果智能体得到了它预期的东西,它应该对此 “感到” 中立。
实际中, V π ( s t ) V^\pi(s_t) Vπ(st) 无法精确计算,因此一般是用一个神经网络 V ϕ ( s t ) V_\phi(s_t) Vϕ(st) (就是所谓的 critic)对其进行估计。这个价值网络要跟策略网络 π θ \pi_\theta πθ 一同进行优化,这样它估计的一直是最近策略的价值函数。
最简单、最常用(VPG、TRPO、PPO、A2C 等采用)的价值网络
V
ϕ
V_\phi
Vϕ 训练目标是最小化 MSE:
ϕ
k
=
arg
min
ϕ
E
s
t
,
R
^
t
∼
π
k
[
(
V
ϕ
(
s
t
)
−
R
^
t
)
2
]
\phi_k=\arg\min_\phi\mathbb{E}_{s_t,\hat{R}_t\sim\pi_k}\left[(V_\phi(s_t)-\hat{R}_t)^2\right] \notag \\
ϕk=argϕminEst,R^t∼πk[(Vϕ(st)−R^t)2]
其中
π
k
\pi_k
πk 是第
k
k
k 个 epoch 的策略。
李宏毅老师的课程中这样来介绍策略梯度中基线的作用。在一个强化学习任务中,有可能所有的回报 R ( τ ) R(\tau) R(τ) 都是正的,这样就期望 π θ \pi_\theta πθ 让所有动作选项的概率都提高,虽然听起来不太好,但这可能并不会对策略梯度的造成影响,因为即使都是正值,各自动作的绝对值也有所不同,从而概率提升的幅度不同,而实际上概率需要归一化到 1,因此 R ( τ ) R(\tau) R(τ) 绝对值较小的动作,实际上概率也是下降了。但是这是在充分采样的理想情况下。在 RL 中,我们需要对 π θ \pi_\theta πθ 进行采样来构建轨迹数据,而这很可能会导致早期一些很好的动作没有被采样到,而一些比较一般的动作,被采样到且回报为正的话,其概率又会被进一步提高,导致好的动作一直没有办法被探索到。通过引入 baseline,减掉一个合适的值,就可以打压回报不够高的动作,让好的动作更有可能被采样到。
其他形式的策略梯度
目前我们有了策略梯度的通用形式:
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
Φ
t
]
\nabla_\theta J(\pi_\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\left[\sum_{t=0}^T\nabla_\theta\log\pi_\theta(a_t|s_t)\Phi_t\right] \notag \\
∇θJ(πθ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)Φt]
其中
Φ
t
\Phi_t
Φt 可以是:
Φ
t
=
R
(
τ
)
\Phi_t=R(\tau)
Φt=R(τ) 或
Φ
t
=
∑
t
′
=
t
T
R
(
s
t
′
,
a
t
′
,
s
t
′
+
1
)
\Phi_t=\sum_{t'=t}^TR(s_{t'},a_{t'},s_{t'+1})
Φt=∑t′=tTR(st′,at′,st′+1) 或
Φ
t
=
∑
t
′
=
t
T
R
(
s
t
′
,
a
t
′
,
s
t
′
+
1
)
−
b
(
s
t
)
\Phi_t=\sum_{t'=t}^TR(s_{t'},a_{t'},s_{t'+1})-b(s_t)
Φt=∑t′=tTR(st′,at′,st′+1)−b(st)。所有这些选择策略梯度的期望值都是相同的,但是方差会不同。除了这些之外,还有两种重要的
Φ
t
\Phi_t
Φt 的选择。一个是动作价值函数,即:
Φ
t
=
Q
π
θ
(
s
t
,
a
t
)
\Phi_t=Q^{\pi_\theta}(s_t,a_t)
Φt=Qπθ(st,at),还有一个是优势函数,即:
Φ
t
=
A
π
θ
(
s
t
,
a
t
)
\Phi_t=A^{\pi_\theta}(s_t,a_t)
Φt=Aπθ(st,at)。
回顾一下:优势函数 A π θ ( s t , a t ) = Q π ( s t , a t ) − V π ( s t ) A^{\pi_\theta}(s_t,a_t)=Q^\pi(s_t,a_t)-V^\pi(s_t) Aπθ(st,at)=Qπ(st,at)−Vπ(st) 描述了使用当前策略比选择其他动作平均而言要好多少。
现在,使用优势函数来构建策略梯度是非常常见的,不同的算法使用多种不同的方法来估计优势函数。如果对此有兴趣,可以阅读关于广义优势估计(Generalized Advantage Estimation,GAE)的论文,该论文在背景一节中深入探讨了 Φ t \Phi_t Φt 的不同选择,并提出了GAE,这是一种在策略优化算法中广泛使用的方法,用于近似优势函数。Spinning Up 实现的 VPG、TRPO 和 PPO 都利用了它。以后会单独介绍一下优势函数和 GAE。
总结
本文介绍了最简单的策略梯度算法的推导,对其导出形式进行了讨论并提供了一些直觉上的理解,并介绍了 reward-to-go 和 baseline 两项对于策略梯度最简形式的基础优化。