PPO 论文阅读

323 阅读3分钟

0 论文信息

  PPO (Proximal Policy Optimization Algorithms) 这篇工作之前就大概听说过,但是一直没有去看,刚好也属于 Actor-Critic 算法族中的一员。最近看到的许多工作都是在 PPO 的基础上来做的,因此特地来了解一下这篇工作的具体细节。

  强化学习的论文目前感觉始终有种雾里看花的感觉,等后面理解得更好了我会补充更多的细节

1 PPO 的先验知识 : 策略优化

1.1 策略梯度方法

  策略梯度方法通过计算策略梯度的估计器,并将其插入到随机梯度上升算法中来实现。最常用的梯度估计器具有以下形式

g^=E^t[θlogπθ(atst)A^t]\begin{align} \hat{g}=\hat{\mathbb{E}}_t\left[\nabla_\theta \log \pi_\theta\left(a_t \mid s_t\right) \hat{A}_t\right] \end{align}

  其中,πθ\pi_{\theta} 是一个随机策略,而 A^t\hat{A}_t 是时间步 tt 处优势函数的估计器。这里,期望值 E^t[]\hat{\mathbb{E}}_t[\ldots] 表示在一组有限样本上的经验平均值,在交替采样和优化的算法中使用。使用自动微分软件的实现通过构建一个目标函数,其梯度是策略梯度估计器来工作;估计器 g^\hat{g} 通过对目标函数进行微分得到。

  直接这样看下来可能有些晕,所以我们从之前的 DBC 补充材料中介绍的策略梯度学习进行展开,

V(s;θ)θ=aAπ(as;θ)Qπ(s,a)θ=aAπ(as;θ)Qπ(s,a)θaAQπ(s,a)π(as;θ)θ=aAQπ(s,a)π(as;θ)logπ(as;θ)θ=Eaπ[Qπ(s,a)logπ(as;θ)θ]\begin{aligned} \frac{\partial V(s ; \boldsymbol{\theta})}{\partial \boldsymbol{\theta}} & =\frac{\partial \sum_{a \in \mathcal{A}} \pi(a \mid s ; \boldsymbol{\theta}) \cdot Q_\pi(s, a)}{\partial \boldsymbol{\theta}} \\ & =\sum_{a \in \mathcal{A}} \frac{\partial \pi(a \mid s ; \boldsymbol{\theta}) \cdot Q_\pi(s, a)}{\partial \boldsymbol{\theta}}\\ & \approx\sum_{a \in \mathcal{A}} Q_\pi(s, a) \cdot \frac{\partial \pi(a \mid s ; \boldsymbol{\theta})}{\partial \boldsymbol{\theta}} \\ & =\sum_{a \in \mathcal{A}} Q_\pi(s, a) \cdot \pi(a \mid s ; \boldsymbol{\theta}) \cdot \frac{\partial \log \pi(a \mid s ; \boldsymbol{\theta})}{\partial \boldsymbol{\theta}}\\ & =\mathbb{E}_{a\in\pi} \left[Q_\pi(s, a) \cdot\frac{\partial \log \pi(a \mid s ; \boldsymbol{\theta})}{\partial \boldsymbol{\theta}}\right] \end{aligned}

  如果我们寻找一个与 aa 相互独立的 bb,则有

Eaπ[blogπ(as;θ)θ]=0\begin{aligned} \mathbb{E}_{a\in\pi} \left[b\cdot\frac{\partial \log \pi(a \mid s ; \boldsymbol{\theta})}{\partial \boldsymbol{\theta}}\right]=0 \end{aligned}

  因此为了方便进行 Monte Carlo 估计,我们将计算 Eaπ[Qπ(s,a)logπ(as;θ)θ]\mathbb{E}_{a\in\pi} \left[Q_\pi(s, a) \cdot\frac{\partial \log \pi(a \mid s ; \boldsymbol{\theta})}{\partial \boldsymbol{\theta}}\right] 转变为计算 Eaπ[(Qπ(s,a)b)logπ(as;θ)θ]\mathbb{E}_{a\in\pi} \left[\left(Q_\pi(s, a)-b\right) \cdot\frac{\partial \log \pi(a \mid s ; \boldsymbol{\theta})}{\partial \boldsymbol{\theta}}\right],并记 Qπ(st,at)b=At^Q_\pi(s_t, a_t)-b=\hat{A_t},经常使用 b=V(s)b=V(s) 来进行计算。

LPG(θ)=E^t[logπθ(atst)A^t]\begin{align} L^{P G}(\theta)=\hat{\mathbb{E}}_t\left[\log \pi_\theta\left(a_t \mid s_t\right) \hat{A}_t\right] \end{align}

  虽然在这个损失函数 LPG(θ)L^{P G}(\theta) 上进行多步优化的想法很吸引人,但这样做并没有很好的理论依据,并且经验证明,这通常会导致破坏性的大幅度策略更新。

1.2 信任区域方法

  在 TRPO (Trust Region Policy Optimization) 中,通过对策略更新的大小施加约束条件,最大化一个目标函数 ("替代"目标函数)。具体来说

maximizeθE^t[πθ(atst)πθold (atst)A^t]subject toE^t[KL[πθold (st),πθ(st)]]δ\begin{align} \underset{\theta}{\operatorname{maximize}} \quad& \hat{\mathbb{E}}_t\left[\frac{\pi_\theta\left(a_t \mid s_t\right)}{\pi_{\theta_{\text {old }}}\left(a_t \mid s_t\right)} \hat{A}_t\right] \\ \text {subject to} \quad& \hat{\mathbb{E}}_t\left[\operatorname{KL}\left[\pi_{\theta_{\text {old }}}\left(\cdot \mid s_t\right), \pi_\theta\left(\cdot \mid s_t\right)\right]\right] \leq \delta \end{align}

  其中,θold\theta_{\operatorname{old}} 是更新之前的策略参数向量,式 (3) 最大化也是希望保持策略更新的幅度在可信的区域内的同时,最大化策略的长期累积奖励。通过对目标函数进行线性逼近和对约束条件进行二次逼近,可以使用共轭梯度算法有效地近似解决这个问题。

  实际上,正是 TRPO 的理论依据建议使用惩罚 (penalty) 而不是约束 (constraint),即解决无约束优化问题。

maximizeθE^t[πθ(atst)πθold (atst)A^tβKL[πθold (st),πθ(st)]]\begin{align} \underset{\theta}{\operatorname{maximize}}\quad\hat{\mathbb{E}}_t\left[\frac{\pi_\theta\left(a_t \mid s_t\right)}{\pi_{\theta_{\text {old }}}\left(a_t \mid s_t\right)} \hat{A}_t-\beta \mathrm{KL}\left[\pi_{\theta_{\text {old }}}\left(\cdot \mid s_t\right), \pi_\theta\left(\cdot \mid s_t\right)\right]\right] \end{align}

  对于一些系数 β\beta。这是因为某个特定的替代目标 (计算状态间最大 KL 散度而不是均值) 事实上形成了策略 π\pi 性能的下界。TRPO 使用硬约束而不是惩罚,是因为很难选择一个在不同问题中表现良好的单一 β\beta 值,甚至在单个问题中,特征在学习过程中也会发生变化。因此,为了实现文中的目标,即模拟 TRPO 的单调改进的一阶算法,实验证明简单选择一个固定的惩罚系数 β\beta 并使用 SGD 优化带惩罚的目标方程 (5) 是不够的;需要进行额外的修改。

2 剪裁替代目标

  设 rt(θ)r_t(\theta) 表示概率比率,即 rt(θ)=πθ(atst)πθold(atst)r_t(\theta)=\frac{\pi_\theta\left(a_t \mid s_t\right)}{\pi_{\theta_{\text {old}}}\left(a_t \mid s_t\right)},其中 rt(θold)=1r_t(\theta_{\text{old}})=1。TRPO 最大化一个 "替代" 目标函数

LCPI(θ)=E^t[πθ(atst)πθold (atst)A^t]=E^t[rt(θ)A^t]\begin{align} L^{CPI}(\theta)=\hat{\mathbb{E}}_t\left[\frac{\pi_\theta\left(a_t \mid s_t\right)}{\pi_{\theta_{\text {old }}}\left(a_t \mid s_t\right)} \hat{A}_t\right]=\hat{\mathbb{E}}_t\left[r_t(\theta) \hat{A}_t\right] \end{align}

  LCPI(θ)L^{CPI}(\theta) 指的是保守策略迭代。如果没有约束,最大化 LCPI(θ)L^{CPI}(\theta) 将导致策略更新过大;因此,文中现在考虑如何修改目标函数,以惩罚使 rt(θ)r_t(\theta) 偏离 1 的策略变化。作者提出的主要目标如下 :

LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]\begin{align} L^{CLIP}(\theta)=\hat{\mathbb{E}}_t\left[\min \left(r_t(\theta) \hat{A}_t, \operatorname{clip}\left(r_t(\theta), 1-\epsilon, 1+\epsilon\right) \hat{A}_t\right)\right] \end{align}

图 1. 图片展示替代函数 LCLIPL^{CLIP} 的一个项 (即单个时间步) 随概率比率 rr 变化的情况,分为正优势情况 (左侧) 和负优势情况 (右侧)。每个图中的红色圆圈表示优化的起始点,即 r=1r = 1。请注意,LCLIPL^{CLIP} 是这些项的累加。

  其中 ϵ\epsilon 是一个超参数,比如 ϵ=0.2\epsilon=0.2。这个目标的动机如下所述 : min\min 函数内的第一项是 LCLIPL^{CLIP}。第二项 clip(rt(θ),1ϵ,1+ϵ)A^t\operatorname{clip}\left(r_t(\theta), 1-\epsilon, 1+\epsilon\right) \hat{A}_t 通过截断概率比率来修改替代目标,这样就消除了使 rtr_t 超出区间 [1ϵ,1+ϵ][1 − \epsilon, 1 + \epsilon] 的激励。最后,文中取截断和未截断目标的最小值,因此最终目标是未截断目标的下界 (即一种悲观的界限)。在这个方案中,只有在使目标变好时才忽略概率比率的变化,并在使目标变差时将其纳入考虑。对于 θold\theta_{\text{old}} 附近 (即 r=1r = 1),注意到 LCLIP(θ)=LCPI(θ)L^{CLIP}(\theta)=L^{CPI}(\theta),但当 θ\theta 偏离 θold\theta_{\text{old}} 时它们会变得不同。图 1 绘制了 LCLIPL^{CLIP} 中的单个项 (即单个 tt);请注意,概率比率 rr 在优势为正或负时被截断为 1ϵ1 − \epsilon1+ϵ1 + \epsilon

图 2. 作为文中在初始策略参数 θold\theta_{\text{old}} 和经过一次 PPO 迭代后计算得到的更新策略参数之间插值的替代目标。更新的策略与初始策略之间的 KL 散度约为 0.02,这是 LCLIPL^{CLIP} 达到最大值的点。

  图 2 提供了关于替代目标 LCLIPL^{CLIP} 的另一个直观理解来源。它展示了在连续控制问题上通过近端策略优化(即将很快介绍的算法)沿着策略更新方向进行插值时,几个目标的变化情况。可以看到,LCLIPL^{CLIP}LCPIL^{CPI} 的一个下界,对于策略更新过大会受到惩罚。

3 自适应 KL 惩罚系数

  另一种方法可以用作裁剪代理目标的替代方案,或者除此之外,是对 KL 散度使用惩罚,并调整惩罚系数,以便我们可以实现 KL 散度 dtargd_{\operatorname{targ}} 的一些目标值每个策略更新。在我们的实验中,我们发现 KL 惩罚的性能比裁剪的代理目标差,但是,我们在这里已经包含了它,因为它是一个重要的基线。

  在该算法的最简单实例化中,我们在每个策略更新中执行以下步骤 :

  • 使用几个 epoch 的 minibatch SGD,优化 KL 惩罚目标
    LKLPEN(θ)=E^t[πθ(atst)πθold (atst)A^tβKL[πθold (st),πθ(st)]]\begin{align} L^{K L P E N}(\theta)=\hat{\mathbb{E}}_t\left[\frac{\pi_\theta\left(a_t \mid s_t\right)}{\pi_{\theta_{\text {old }}}\left(a_t \mid s_t\right)} \hat{A}_t-\beta \mathrm{KL}\left[\pi_{\theta_{\text {old }}}\left(\cdot \mid s_t\right), \pi_\theta\left(\cdot \mid s_t\right)\right]\right] \end{align}
  • 计算 d=E^t[KL[πθold (st),πθ(st)]]d=\hat{\mathbb{E}}_t\left[\operatorname{KL}\left[\pi_{\theta_{\text {old }}}\left(\cdot \mid s_t\right), \pi_\theta\left(\cdot \mid s_t\right)\right]\right]
    • d<dtarg/1.5,ββ/2d<d_{\operatorname{targ}} / 1.5, \beta \leftarrow \beta / 2
    • d>dtarg×1.5,ββ×2d>d_{\operatorname{targ}} \times 1.5, \beta \leftarrow \beta \times 2

  更新后的 β\beta 用于下一个策略更新。通过该方案,我们偶尔会看到 KL 散度与 dtargd_{\operatorname{targ}} 显着不同的策略更新,但是,这些很少见,β\beta 快速调整。上述参数 1.5 和 2 是启发式选择的,但该算法对它们不太敏感。β\beta 的初始值是另一个超参数,但在实践中并不重要,因为算法会快速调整它。

4 算法

  前几节的代理损失可以通过对典型策略梯度实现的微小更改来计算和区分。对于使用自动差分的实现,只需构造损失 LCLIPL^{CLIP}LKLPENL^{K L P E N} 而不是 LPGL^{P G},并且在此目标上执行多个随机梯度上升步骤。

LtCLIP+VF+S(θ)=E^t[LtCLIP(θ)c1LtVF(θ)+c2S[πθ](st)]\begin{align} L_t^{C L I P+V F+S}(\theta)=\hat{\mathbb{E}}_t\left[L_t^{C L I P}(\theta)-c_1 L_t^{V F}(\theta)+c_2 S\left[\pi_\theta\right]\left(s_t\right)\right] \end{align}

  其中 c1,c2c_1, c_2 是系数,SS 表示熵奖励,LtVFL^{V F}_t 是平方误差损失 (Vθ(st)Vttarg)2\left(V_\theta\left(s_t\right)-V_t^{\operatorname{targ}}\right)^2

  一种策略梯度实现的风格,在下的工作中被广泛推广,并且非常适合与循环神经网络一起使用,它在 TT 个时间步长 (其中 TT 远小于一个回合的长度) 内运行策略,并使用收集到的样本进行更新。这种风格需要一个优势估计器,它不会超过时间步长 TT 进行预测。其使用的估计器是

A^t=V(st)+rt+γrt+1++γTt+1rT1+γTtV(sT)\begin{align} \hat{A}_t=-V\left(s_t\right)+r_t+\gamma r_{t+1}+\cdots+\gamma^{T-t+1} r_{T-1}+\gamma^{T-t} V\left(s_T\right) \end{align}

  其中 tt 指定 [0,T][0, T] 中的时间索引,在给定的长度 TT 轨迹段内。概括这个选择,我们可以使用广义优势估计的截断版本,当 λ=1\lambda = 1 时,它简化为等式 (10):

A^t=δt+(γλ)δt+1+++(γλ)Tt+1δT1 where δt=rt+γV(st+1)V(st)\begin{align} & \hat{A}_t=\delta_t+(\gamma \lambda) \delta_{t+1}+\cdots+\cdots+(\gamma \lambda)^{T-t+1} \delta_{T-1} \\ & \text { where } \delta_t=r_t+\gamma V\left(s_{t+1}\right)-V\left(s_t\right) \end{align}

  下面显示了一个使用固定长度轨迹段的近端策略优化 (PPO) 算法。每次迭代,NN 个 (并行) 参与者中的每一个都收集 TT 个时间步长的数据。然后我们在这些 NTN T 时间步数据上构建代理损失,并使用小批量 SGD (或通常以获得更好的性能使用 Adam) 对其进行 K 个 epoch 优化。

  下面给出更好理解的简单形式


  • 输入 : 策略网络 π(as;θ)\pi(a|s;\theta),值函数网络 V(s;ϕ)V(s;\phi),环境交互次数 TT,迭代次数 KK,PPO 剪切参数 ϵ\epsilon,初始化策略网络参数 θ\theta,值函数网络参数 ϕ\phi.

  • for 迭代次数 k=1k=1 to KK do

    • 通过环境交互收集数据 (状态,动作,奖励)

    • for t=1t = 1 to TT do

      • 使用策略网络 π\pi 选择动作,并记录动作概率 π(as;θ)\pi(a|s;\theta)
      • 执行动作,观察下一个状态和奖励
    • end for

    • 计算优势估计 A(s,a)=Q(s,a)V(s;ϕ)A(s,a) = Q(s,a) - V(s;\phi)

    • for t=1t = 1 to TT do

      • 计算旧策略的动作概率 πold(as)\pi_{\operatorname{old}}(a|s)
      • 计算比值 rt(θ)=π(atst;θ)πold(atst)r_t(\theta)=\frac{\pi(a_t|s_t;\theta)}{\pi_{\operatorname{old}}(a_t|s_t)}
    • 计算优化目标

      L(θ)=E[min(rt(θ)At,clip(rt(θ),1ε,1+ε)At)]L(\theta) = \mathbb{E}[\min(r_t(\theta) * A_t, \operatorname{clip}(r_t(\theta), 1-ε, 1+ε) * A_t)]
    • 使用梯度下降法更新策略网络参数 θ\theta 以最小化 L(θ)L(\theta)

    • 使用梯度下降法更新值函数网络参数 ϕ\phi 以最小化均方差损失 (V(s)R)2(V(s)-R)^2

  • end for