0%

近端策略优化算法(PPO)— 深度技术评审

摘要

强化学习(RL)已成为现代 AI 的基石 —— 从训练机器人行走,到通过 RLHF 将大语言模型与人类偏好对齐。这些突破的核心,是一个看似简单却影响深远的算法 —— 近端策略优化(Proximal Policy Optimization,PPO),由 John Schulman、Filip Wolski、Prafulla Dhariwal、Alec Radford 和 Oleg Klimov 于 2017 年在 OpenAI 提出。

PPO 提出了一族新的策略梯度方法,在与环境交互采样数据和使用随机梯度上升优化"替代"目标函数之间交替进行。与标准策略梯度方法每个数据样本只做一次梯度更新不同,PPO 引入了一种新颖的裁剪目标函数,使得同一批数据可以进行多轮小批量更新,而不会导致灾难性的策略大幅变化。其结果是:PPO 继承了信赖域策略优化(TRPO)的稳定性,同时实现大幅简化 —— 相比 vanilla 策略梯度只需修改几行代码。

实验结果表明 PPO 在广泛的基准测试中表现出色:连续控制任务(MuJoCo)、复杂的 3D 人形运动控制(Roboschool)以及 Atari 游戏。PPO 在采样效率、简洁性和运行时间之间实现了出色的平衡。

为什么这篇论文今天仍然重要? PPO 可以说是深度学习时代最有影响力的 RL 算法。它成为了机器人训练、游戏 AI 的默认算法,更为关键的是 —— 它是 RLHF 流水线的核心优化引擎,ChatGPT、Claude、Gemini 等大语言模型的人类偏好对齐都依赖于它。理解 PPO 是从事 AI 对齐、LLM 训练或现代 RL 系统研究的必备前置知识。


1. 前置知识:读懂这篇论文需要了解什么

1.1 强化学习基础:智能体、状态、动作与奖励

在深入 PPO 之前,让我们先建立强化学习(RL)的基本框架。如果你从未接触过 RL,可以把它想象成通过试错来教计算机做决策 —— 就像训练一只小狗:好的行为获得奖励,坏的行为受到惩罚,学习者随着时间推移逐渐学会正确的做法。

RL 基本设定。 一个 RL 问题由智能体(学习者/决策者)和环境(外部世界)的交互组成。在每个时间步 tt

  1. 智能体观察当前状态 sts_t(例如:机器人各关节的位置,或屏幕上的像素)
  2. 智能体根据其策略 π\pi(决策策略)选择一个动作 ata_t
  3. 环境转移到新状态 st+1s_{t+1} 并给出一个标量奖励 rtr_t
  4. 目标是最大化累积(折扣)奖励:R=t=0γtrtR = \sum_{t=0}^{\infty} \gamma^t r_t

这里,γ[0,1)\gamma \in [0, 1)折扣因子 —— 它决定了智能体对未来奖励和即时奖励的权衡。γ\gamma 接近 1 意味着智能体有远见;接近 0 则意味着只看眼前。

策略 π\pi 策略是智能体的决策规则,将状态映射到动作。在深度 RL 中,策略通常是一个由参数 θ\theta 参数化的神经网络:

  • 对于离散动作空间(如 Atari 游戏中的摇杆方向):πθ(as)\pi_\theta(a|s) 输出动作上的概率分布
  • 对于连续动作空间(如机器人关节力矩):πθ\pi_\theta 输出高斯分布的均值(有时也包括方差),再从中采样动作

价值函数 V(s)V(s) 价值函数估计处于某个特定状态有多"好" —— 具体来说,是从状态 ss 开始、遵循策略 π\pi 的期望累积奖励:

Vπ(s)=Eπ[t=0γtrts0=s]V^\pi(s) = \mathbb{E}_\pi\left[\sum_{t=0}^{\infty} \gamma^t r_t \mid s_0 = s\right]

动作-价值函数 Q(s,a)Q(s, a) 类似地,Q 函数估计在状态 ss 执行动作 aa、然后遵循 π\pi 的期望回报:

Qπ(s,a)=Eπ[t=0γtrts0=s,a0=a]Q^\pi(s, a) = \mathbb{E}_\pi\left[\sum_{t=0}^{\infty} \gamma^t r_t \mid s_0 = s, a_0 = a\right]

优势函数 A(s,a)A(s, a) 优势函数衡量动作 aa 比状态 ss 下的平均动作好多少:

Aπ(s,a)=Qπ(s,a)Vπ(s)A^\pi(s, a) = Q^\pi(s, a) - V^\pi(s)

正的优势值意味着该动作优于平均水平;负值则意味着低于平均。优势函数是 PPO 的核心 —— 它告诉我们应该鼓励哪些动作、抑制哪些动作。

1.2 策略梯度方法:通过梯度上升学习

策略梯度方法是一族直接优化策略参数 θ\theta 的 RL 算法,通过计算期望奖励关于 θ\theta 的梯度并执行梯度上升来实现。

策略梯度定理。 这个基础性结果(Sutton 等人,1999)告诉我们,期望回报 J(θ)J(\theta) 关于策略参数的梯度可以写为:

θJ(θ)=Eπθ[θlogπθ(atst)Aπθ(st,at)]\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}\left[\nabla_\theta \log \pi_\theta(a_t|s_t) \cdot A^{\pi_\theta}(s_t, a_t)\right]

直觉理解: 这个梯度告诉我们"增加优势为正的动作的概率(比平均好的),减少优势为负的动作的概率。"更新幅度与该动作比平均好(或差)的程度成正比。

普通策略梯度(REINFORCE)。 在实践中,我们用采样的轨迹来估计这个梯度:

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

其中 A^t\hat{A}_t 是优势函数的估计值。这个估计是无偏的,但方差非常高,导致训练噪声大、不稳定。对应的损失函数是:

LPG(θ)=E^t[logπθ(atst)A^t]L^{PG}(\theta) = \hat{\mathbb{E}}_t\left[\log \pi_\theta(a_t|s_t) \hat{A}_t\right]

普通策略梯度的问题。 虽然数学上很优美,但普通策略梯度有一个致命的实际限制:每批采样的数据只能用一次梯度步骤。如果你尝试在同一批数据上做多次梯度更新,更新会叠加,策略可能发生剧烈变化,导致性能崩溃。这在数据效率上是极大的浪费 —— 你收集了一整条轨迹,用一次就丢掉了。

1.3 信赖域策略优化(TRPO):PPO 的前身

TRPO(Schulman 等人,2015)通过引入一个约束来解决不稳定问题 —— 限制每次更新中策略的变化幅度。其思路非常直观:如果我们只允许小幅度的策略变化,就可以安全地重复利用数据进行多次梯度更新,而不必担心性能灾难性下降。

TRPO 目标函数。 TRPO 在约束 KL 散度的条件下最大化一个"替代"目标:

maxθE^t[πθ(atst)πθold(atst)A^t]\max_\theta \hat{\mathbb{E}}_t\left[\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)} \hat{A}_t\right]

s.t. E^t[KL[πθold(st),πθ(st)]]δ\text{s.t. } \hat{\mathbb{E}}_t\left[\text{KL}[\pi_{\theta_\text{old}}(\cdot|s_t), \pi_\theta(\cdot|s_t)]\right] \leq \delta

概率比率。 比率 rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)} 称为重要性采样比率。当 θ=θold\theta = \theta_\text{old} 时,该比率等于 1。随着策略变化,比率偏离 1。这个比率允许我们用旧策略收集的数据来评估新策略的表现 —— 这正是数据重用的关键所在。

TRPO 为什么有问题? 虽然 TRPO 效果不错,但它有显著的实际缺陷:

  1. 实现复杂度高: TRPO 需要计算二阶导数(Fisher 信息矩阵)并用共轭梯度算法求解约束优化问题。正确实现并非易事。
  2. 与共享架构不兼容: TRPO 不容易用于策略网络和价值函数网络共享参数的架构,也不适用于辅助任务 —— 而这些在实践中很常见。
  3. 与噪声不兼容: 不能很好地与 dropout 或其他形式的网络随机性配合使用。

PPO 的设计目标就是在不承受这些缺陷的前提下获得 TRPO 的所有好处。

1.4 KL 散度:衡量策略之间的距离

KL 散度(Kullback-Leibler 散度)衡量两个概率分布之间的差异。对于策略 πold\pi_\text{old}πnew\pi_\text{new}

KL[πoldπnew]=aπold(as)logπold(as)πnew(as)\text{KL}[\pi_\text{old} \| \pi_\text{new}] = \sum_a \pi_\text{old}(a|s) \log \frac{\pi_\text{old}(a|s)}{\pi_\text{new}(a|s)}

关键性质:

  • KL0\text{KL} \geq 0 恒成立,且 KL=0\text{KL} = 0 当且仅当两个分布完全相同
  • 它是不对称的:KL[πoldπnew]KL[πnewπold]\text{KL}[\pi_\text{old} \| \pi_\text{new}] \neq \text{KL}[\pi_\text{new} \| \pi_\text{old}]
  • 小的 KL 散度意味着两个策略做出相似的决策

在 TRPO 中,KL 约束确保策略在每次更新中不会变化太多,从而防止性能灾难性下降。

1.5 重要性采样:从旧策略重用数据

重要性采样是一种使用来自一个分布的样本来估计另一个分布下期望值的技术。如果我们有来自 πold\pi_\text{old} 的样本,但想评估 πθ\pi_\theta 下的期望奖励:

Eπθ[f(x)]=Eπold[πθ(x)πold(x)f(x)]\mathbb{E}_{\pi_\theta}[f(x)] = \mathbb{E}_{\pi_\text{old}}\left[\frac{\pi_\theta(x)}{\pi_\text{old}(x)} f(x)\right]

这正是 PPO 能够重用旧策略收集的轨迹来更新新策略的原因 —— 概率比率 rt(θ)r_t(\theta) 正是这个重要性采样修正因子。然而,当两个分布差异很大时,重要性采样会变得不可靠(高方差),这也是 PPO 需要机制来保持策略接近旧策略的原因。

1.6 广义优势估计(GAE)

GAE(Schulman 等人,2015b)是一种计算优势估计的技术,提供了偏差和方差之间的平滑权衡:

A^t=l=0(γλ)lδt+l\hat{A}_t = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l}

其中 δt=rt+γV(st+1)V(st)\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)时序差分(TD)误差γ\gamma 是折扣因子,λ[0,1]\lambda \in [0, 1] 是控制偏差-方差权衡的新超参数:

  • λ=0\lambda = 0:只使用单步 TD 误差 δt\delta_t —— 低方差但高偏差
  • λ=1\lambda = 1:退化为完整的蒙特卡洛优势估计 —— 无偏但高方差
  • 中间值 λ\lambda(通常为 0.95):平衡两者

PPO 在所有实验中都使用 λ=0.95\lambda = 0.95 的 GAE,这已成为标准实践。


2. PPO 算法:核心贡献

2.1 动机:一阶 TRPO

驱动 PPO 的核心问题是:我们能否只使用一阶优化(常规梯度下降),而不需要约束优化的复杂性,就获得 TRPO 的稳定性好处?

作者探索了两种方法:

  1. 裁剪替代目标(PPO-Clip):修改目标函数以自然地惩罚大的策略变化
  2. 自适应 KL 惩罚(PPO-Penalty):使用惩罚项代替硬约束,惩罚系数自适应调整

裁剪版本的效果最好,并已成为标准的"PPO"算法。

2.2 裁剪替代目标(PPO-Clip)

这是论文的核心创新。回顾 TRPO 的 CPI 替代目标:

LCPI(θ)=E^t[rt(θ)A^t]L^{CPI}(\theta) = \hat{\mathbb{E}}_t\left[r_t(\theta) \hat{A}_t\right]

其中 rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)} 是概率比率。

如果没有任何约束,最大化 LCPIL^{CPI} 可能导致破坏性的大策略更新 —— 比率 rt(θ)r_t(\theta) 可以变得非常大,导致策略跳跃到完全不同的行为。

PPO 的解决方案:裁剪比率。 PPO 提出:

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

其中 ϵ\epsilon 是一个超参数(通常 ϵ=0.2\epsilon = 0.2)。

逐步拆解这个公式:

  1. rt(θ)A^tr_t(\theta) \hat{A}_t:这是标准的替代目标 —— 概率比率乘以优势值。

  2. clip(rt(θ),1ϵ,1+ϵ)\text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon):将概率比率裁剪到区间 [1ϵ,1+ϵ]=[0.8,1.2][1 - \epsilon, 1 + \epsilon] = [0.8, 1.2](当 ϵ=0.2\epsilon = 0.2 时)。这意味着裁剪版本忽略任何使比率超出此区间的策略变化。

  3. min(,)\min(\cdot, \cdot):取裁剪和未裁剪目标的最小值。这创建了真实目标的一个悲观(下界)估计。

为什么这能工作?需要考虑两种情况:

情况 1:正优势(A^t>0\hat{A}_t > 0)。 该动作好于平均。我们想增加它的概率(增大 rtr_t)。未裁剪目标 rtA^tr_t \hat{A}_trtr_t 增加而增加。但裁剪版本在 rt=1+ϵr_t = 1 + \epsilon 处封顶收益。min\min 操作意味着:"你可以增加这个好动作的概率,但最多到原概率的 1+ϵ1 + \epsilon 倍 —— 超过后就不再获得额外的目标值。"

情况 2:负优势(A^t<0\hat{A}_t < 0)。 该动作差于平均。我们想降低它的概率(减小 rtr_t)。未裁剪目标 rtA^tr_t \hat{A}_trtr_t 减小而"改善"(变得不那么负)。但裁剪版本在 rt=1ϵr_t = 1 - \epsilon 处封顶收益。min\min 操作意味着:"你可以降低这个差动作的概率,但最低到原概率的 1ϵ1 - \epsilon 倍。"

关键洞察: 裁剪起到了单侧约束的作用。我们只裁剪那些会改善目标的变化 —— 永远不裁剪使目标变差的变化。这意味着裁剪后的目标始终是未裁剪目标的下界,创造了一个"悲观"估计,阻止了过于激进的策略更新。正是这种不对称性赋予了 PPO 稳定性。

在起始点附近:θ=θold\theta = \theta_\text{old}(其中 rt=1r_t = 1)处,裁剪和未裁剪目标完全相同。只有当 θ\theta 远离 θold\theta_\text{old} 时它们才会分化。在一阶近似下,LCLIP(θ)=LCPI(θ)L^{CLIP}(\theta) = L^{CPI}(\theta) —— 裁剪对小更新没有影响。

2.3 自适应 KL 惩罚(PPO-Penalty)

论文还提出了一种替代方案:使用 KL 惩罚代替硬约束(如 TRPO),但自动调整惩罚系数。在每次策略更新中:

  1. 对 KL 惩罚目标优化若干轮:

LKLPEN(θ)=E^t[πθ(atst)πθold(atst)A^tβKL[πθold(st),πθ(st)]]L^{KLPEN}(\theta) = \hat{\mathbb{E}}_t\left[\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)} \hat{A}_t - \beta \text{KL}[\pi_{\theta_\text{old}}(\cdot|s_t), \pi_\theta(\cdot|s_t)]\right]

  1. 计算实际 KL 散度:d=E^t[KL[πθold(st),πθ(st)]]d = \hat{\mathbb{E}}_t[\text{KL}[\pi_{\theta_\text{old}}(\cdot|s_t), \pi_\theta(\cdot|s_t)]]

  2. 调整 β\beta

    • 如果 d<dtarg/1.5d < d_\text{targ} / 1.5:更新太保守,将 β\beta 减半 → ββ/2\beta \leftarrow \beta / 2
    • 如果 d>dtarg×1.5d > d_\text{targ} \times 1.5:更新太激进,将 β\beta 加倍 → ββ×2\beta \leftarrow \beta \times 2

实验结论: KL 惩罚版本工作尚可,但在各个基准测试中持续不如裁剪版本。裁剪版本更简单、更有效,这也是为什么实践中"PPO"几乎总是指 PPO-Clip。

2.4 完整的 PPO 目标函数

在实践中,PPO 使用在策略 πθ\pi_\theta 和价值函数 VθV_\theta 之间共享参数的神经网络架构。组合目标函数为:

LtCLIP+VF+S(θ)=E^t[LtCLIP(θ)c1LtVF(θ)+c2S[πθ](st)]L^{CLIP+VF+S}_t(\theta) = \hat{\mathbb{E}}_t\left[L^{CLIP}_t(\theta) - c_1 L^{VF}_t(\theta) + c_2 S[\pi_\theta](s_t)\right]

其中:

  • LtCLIP(θ)L^{CLIP}_t(\theta) 是裁剪的替代策略损失
  • LtVF(θ)=(Vθ(st)Vttarg)2L^{VF}_t(\theta) = (V_\theta(s_t) - V_t^\text{targ})^2 是价值函数损失(预测值和目标值之间的均方误差)
  • S[πθ](st)S[\pi_\theta](s_t)熵奖励,通过惩罚过于确定性的策略来鼓励探索
  • c1c_1 是价值函数系数(通常为 1.0)
  • c2c_2 是熵系数(Atari 中通常为 0.01)

为什么需要熵奖励? 如果没有它,策略可能会收缩到总是选择同一个动作,丧失探索能力,可能错过更好的策略。熵项保持动作分布"展开",确保智能体继续尝试不同的行为。

2.5 完整算法:基于固定长度轨迹段的 Actor-Critic

实际的 PPO 算法将上述所有组件结合起来:

算法:PPO,Actor-Critic 风格

1
2
3
4
5
6
7
8
9
for iteration = 1, 2, ... do
for actor = 1, 2, ..., N do // N 个并行 actor
运行策略 π_θ_old 与环境交互 T 个时间步 // 收集数据
计算优势估计 Â_1, ..., Â_T // 使用 GAE
end for
使用 K 轮 epoch 优化替代损失 L w.r.t. θ // 多次遍历数据
小批量大小 M ≤ NT
θ_old ← θ // 更新旧策略
end for

关键设计决策:

  1. 并行 actor: NN 个 actor 同时从 NN 个环境副本中收集数据。每次迭代提供 N×TN \times T 个转移,实现并行硬件的高效利用。

  2. 固定长度段: 每个 actor 精确收集 TT 个时间步,不考虑 episode 边界。这简化了实现并确保批量大小一致。

  3. 多轮 epoch(KK): 同一批数据被用于 KK 轮优化。这是相比普通策略梯度(只用一次数据)的关键效率提升。裁剪机制防止多次更新造成有害的策略漂移。

  4. 小批量 SGD: 在每个 epoch 中,N×TN \times T 个转移被打乱并分成大小为 MM 的小批量进行随机梯度更新。

  5. GAE 用于优势估计: 使用截断形式的广义优势估计:

A^t=δt+(γλ)δt+1++(γλ)Tt+1δT1\hat{A}_t = \delta_t + (\gamma\lambda)\delta_{t+1} + \cdots + (\gamma\lambda)^{T-t+1}\delta_{T-1}

其中 δt=rt+γV(st+1)V(st)\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) 是 TD 误差。


3. 详细方法分析

3.1 为什么裁剪有效:几何视角

要真正理解裁剪目标为什么有效,从优化景观的几何角度思考会很有帮助。

考虑目标作为策略参数 θ\theta 的函数,从 θold\theta_\text{old} 出发:

  • 未裁剪目标 LCPI(θ)=E^t[rt(θ)A^t]L^{CPI}(\theta) = \hat{\mathbb{E}}_t[r_t(\theta)\hat{A}_t] 是一个光滑函数,可以随 θ\theta 远离 θold\theta_\text{old} 而无限增长。这很危险,因为替代目标对大的策略变化来说已经不再是真实目标的好近似。

  • 裁剪目标 LCLIP(θ)L^{CLIP}(\theta)θold\theta_\text{old} 附近与 LCPIL^{CPI} 相同,但一旦概率比率移出 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon],就会"平坦化"。这创造了一种"信赖域"效果,而无需显式计算 KL 散度。

论文的图 2 漂亮地展示了这一点:当我们沿更新方向插值时,LCLIPL^{CLIP}LCPIL^{CPI} 的下界,在 KL 散度约 0.02 处达到峰值,然后下降。这种自我调节行为 —— 目标自然地阻止超过某个点后的进一步优化 —— 正是 PPO 不需要显式约束就能保持稳定的原因。

3.2 替代目标对比

论文系统地比较了几种替代目标变体:

变体 描述 平均归一化分数
无裁剪或惩罚 Lt(θ)=rt(θ)A^tL_t(\theta) = r_t(\theta)\hat{A}_t -0.39
裁剪,ϵ=0.1\epsilon = 0.1 过于保守 0.76
裁剪,ϵ=0.2\epsilon = 0.2 最佳平衡点 0.82
裁剪,ϵ=0.3\epsilon = 0.3 略过激进 0.70
自适应 KL,dtarg=0.003d_\text{targ} = 0.003 保守 0.68
自适应 KL,dtarg=0.01d_\text{targ} = 0.01 适中 0.74
自适应 KL,dtarg=0.03d_\text{targ} = 0.03 激进 0.71
固定 KL,β=0.3\beta = 0.3 弱惩罚 0.62
固定 KL,β=1.0\beta = 1.0 适中惩罚 0.71
固定 KL,β=3.0\beta = 3.0 强惩罚 0.72
固定 KL,β=10.0\beta = 10.0 非常强惩罚 0.69

关键观察:

  1. 完全没有约束是灾难性的(负分数,原因是在 HalfCheetah 上训练崩溃)
  2. ϵ=0.2\epsilon = 0.2 的裁剪效果最好 —— 超越了所有 KL 惩罚变体
  3. KL 惩罚方法(无论固定还是自适应)具有竞争力,但在超参数选择上不够鲁棒
  4. 裁剪只有一个超参数(ϵ\epsilon),而 KL 惩罚有两个(β\betadtargd_\text{targ},加上初始化)

3.3 架构与实现细节

连续控制的网络架构(MuJoCo):

  • 全连接 MLP,两个隐藏层各 64 个单元
  • Tanh 非线性激活
  • 输出:高斯分布的均值,带学习的(可变)标准差
  • 策略和价值函数共享参数(独立网络)
  • 不使用熵奖励

连续控制超参数:

超参数
视野 TT 2048
Adam 步长 3×1043 \times 10^{-4}
训练轮数 KK 10
小批量大小 MM 64
折扣因子 γ\gamma 0.99
GAE 参数 λ\lambda 0.95
裁剪参数 ϵ\epsilon 0.2

Atari 的网络架构:

  • 卷积神经网络(与 Mnih 等人 2016 相同)
  • 策略和价值函数共享卷积主干
  • 学习率和裁剪参数线性退火

Atari 超参数:

超参数
视野 TT 128
Adam 步长 2.5×104×α2.5 \times 10^{-4} \times \alpha
训练轮数 KK 3
小批量大小 MM 32×8=25632 \times 8 = 256
折扣因子 γ\gamma 0.99
GAE 参数 λ\lambda 0.95
Actor 数量 NN 8
裁剪参数 ϵ\epsilon 0.1×α0.1 \times \alpha
VF 系数 c1c_1 1
熵系数 c2c_2 0.01

其中 α\alpha 在训练过程中从 1 线性退火到 0。这个退火策略意味着学习率和裁剪范围在训练后期都会缩小,允许更精细的调整。


4. 实验结果与分析

4.1 连续控制:MuJoCo 基准测试

PPO 在 OpenAI Gym 中使用 MuJoCo 物理引擎实现的 7 个模拟机器人任务上进行了测试:HalfCheetah、Hopper、InvertedDoublePendulum、InvertedPendulum、Reacher、Swimmer 和 Walker2d。

PPO 与其他算法对比:

PPO(ϵ=0.2\epsilon = 0.2)与以下算法进行了对比:

  • TRPO(信赖域策略优化)
  • CEM(交叉熵方法)
  • Vanilla PG(自适应步长的普通策略梯度)
  • A2C(优势 Actor-Critic,同步版 A3C)
  • A2C + Trust Region

结果: PPO 在几乎所有环境中都超越了所有基准算法。具体而言:

  • HalfCheetah 上,PPO 达到约 2000 奖励,而 TRPO 约 1500,A2C 约 500
  • Hopper 上,PPO 达到约 2500,而大多数基准在 1500-2000 左右就饱和了
  • Walker2d 上,PPO 达到约 3000,而基准约 1000-2000
  • 只有在 Swimmer 上,PPO 表现与某些基准相当(而非优于)

这些结果的重要意义在于:PPO 用比 TRPO 简单得多的代码实现了这些成绩 —— 不需要共轭梯度求解器、线搜索或 Fisher 信息矩阵计算。

4.2 3D 人形控制:Roboschool

为了展示 PPO 在高维连续控制上的能力,作者在三个使用 Roboschool 的 3D 人形任务上进行了测试:

  1. RoboschoolHumanoid:仅前向运动 —— 机器人必须学会行走
  2. RoboschoolHumanoidFlagrun:目标位置每 200 步或到达后随机改变 —— 机器人必须导航到变化的目标
  3. RoboschoolHumanoidFlagrunHarder:与上面相同,但机器人会被方块砸到,必须从倒地中恢复

这些任务有约 44 维的观测空间和约 17 维的动作空间(控制人形身体的各个关节)。PPO 成功学习了所有三个任务,展示了自然的步态、转向行为以及从被击倒中恢复的能力。学习曲线显示在约 100M 步的训练中持续改善,Flagrun 任务分别达到约 2500 和 3000 的奖励。

这在当时是特别令人印象深刻的,因为人形运动被认为是一个非常具有挑战性的基准。机器人学会了协调多个自由度以产生稳定、自适应的行走行为。

4.3 Atari 游戏

PPO 在 OpenAI Gym 中的全部 49 个 Atari 游戏上进行了测试,与 A2C 和 ACER(带经验回放的 Actor-Critic)进行了对比。

评分指标:

  1. 整个训练过程中的平均每集奖励(偏好快速学习)
  2. 训练最后 100 集的平均每集奖励(偏好最终性能)

结果(每种算法"赢"的游戏数):

指标 A2C ACER PPO 平局
全程平均 1 18 30 0
最后 100 集平均 1 28 19 1

分析:

  • PPO 在快速学习方面占主导地位(赢得 30/49 个游戏)—— 它能快速达到良好性能
  • ACER 在最终性能方面有优势(28/49)—— 有经验回放的加持,它最终在某些游戏上收敛到更好的策略
  • A2C 几乎总是表现最差
  • PPO 在显著比 ACER 简单的前提下达到了这些结果(无经验回放缓冲区、无偏差修正、无信赖域计算)

表 6 中值得注意的逐游戏结果:

  • Atlantis:PPO 达到 2,311,815,A2C 为 729,265,ACER 为 1,841,376
  • BattleZone:PPO 得分 17,367,ACER 为 8,983,A2C 为 3,080
  • Kangaroo:PPO 得分 9,929,A2C 为 45,ACER 为 50 —— 200 倍的提升
  • Zaxxon:PPO 得分 5,009,A2C 为 16,ACER 为 29 —— 戏剧性的提升

5. PPO 在 RLHF 和 LLM 对齐中的角色

虽然原始 PPO 论文关注机器人和游戏环境,但 PPO 最深远的应用是在基于人类反馈的强化学习(RLHF)—— 用于将大语言模型与人类偏好对齐的技术。

5.1 RLHF 流水线

标准 RLHF 流水线(如 InstructGPT、ChatGPT、Claude 等使用的)包含三个阶段:

  1. 监督微调(SFT): 在高质量示范数据上微调预训练的 LLM
  2. 奖励模型训练: 在人类偏好比较(两个回答哪个更好?)上训练奖励模型
  3. PPO 微调: 使用 PPO 优化 SFT 模型以最大化奖励模型的分数

在第 3 阶段,"环境"是文本生成过程:

  • 状态 sts_t:提示词 + 已生成的 token
  • 动作 ata_t:下一个要生成的 token
  • 奖励 rtr_t:由奖励模型给出(通常只在生成结束时给出)
  • 策略 πθ\pi_\theta:正在被微调的语言模型

PPO 的裁剪目标在这里至关重要,因为对奖励模型的不受控优化可能导致奖励黑客 —— 模型找到退化的输出,这些输出按奖励模型的标准得分很高,但实际质量很低(例如重复文本、利用奖励模型的偏见)。

5.2 为什么选择 PPO 用于 RLHF?

PPO 的几个特性使其特别适合 LLM 对齐:

  1. 稳定性: 裁剪目标防止模型在任何单次更新中发生过大变化,这在微调已有宝贵能力的模型时至关重要
  2. 简洁性: RLHF 实现本身就很复杂;PPO 相比 TRPO 等替代方案的简洁性减少了实现负担
  3. 采样效率: 多轮小批量更新允许更好地利用生成成本高昂的轨迹
  4. KL 正则化兼容性: 在 RLHF 中,通常会额外添加一个针对 SFT 模型的 KL 惩罚,防止模型偏离初始行为过远:

reward(x,y)=rϕ(x,y)βKL[πθπSFT]\text{reward}(x, y) = r_\phi(x, y) - \beta \text{KL}[\pi_\theta \| \pi_\text{SFT}]

PPO 的裁剪加上这个 KL 惩罚提供了双重保障,防止奖励黑客行为。

5.3 替代方案与后续发展

PPO 在 RLHF 中的主导地位催生了替代方案的研究:

  • DPO(直接偏好优化): 完全消除奖励模型,将问题重新表述为偏好上的监督学习
  • GRPO(群体相对策略优化): DeepSeek 使用;用群体相对优势替代 critic 模型
  • REINFORCE 变体: 一些近期工作(如 RLOO)表明,带有适当基准的更简单策略梯度方法可以在 RLHF 设置中匹配 PPO
  • KTO(Kahneman-Tversky 优化): 使用前景理论启发的目标函数,而非配对比较

尽管有这些替代方案,PPO 仍然是 RLHF 中最广泛验证的方法,被多个主要 AI 实验室在生产环境中使用。


6. 局限性与边界条件

6.1 对超参数的敏感性

虽然 PPO 比 TRPO 更鲁棒,但它并非不需要超参数调优:

  • 裁剪参数 ϵ\epsilon 有显著影响(0.1 vs. 0.2 vs. 0.3 给出明显不同的性能)
  • 学习率、epoch 数和批量大小都很重要
  • GAE 参数(γ\gammaλ\lambda)在新领域中需要调优

在 RLHF 设置中,超参数敏感性被放大,因为奖励信号本身就是噪声的(来自不完美的奖励模型)。

6.2 采样效率限制

PPO 是一个在线策略算法 —— 它只使用当前策略收集的数据。虽然裁剪机制允许每批数据多次梯度步骤,但 PPO 的采样效率仍然显著低于使用经验回放缓冲区的离线策略方法(如 SAC)。这意味着:

  • 与离线策略方法相比需要更多的环境交互
  • 在数据收集成本高的场景中(如真实机器人、带人类反馈的 RLHF),这是一个重大成本

6.3 长时间跨度的信用分配

PPO 使用 GAE 进行优势估计,依赖价值函数在时间上传播信用。当回合非常长或奖励极其稀疏时,价值函数可能无法提供有用的梯度,导致学习缓慢或失败。这在以下场景中尤其相关:

  • 长视野规划任务
  • 奖励只在最后给出的任务(如游戏胜/负)
  • LLM 对齐中,奖励在生成完整回答后才给出

6.4 RLHF 中的奖励黑客

在 RLHF 应用中,PPO 仍然可能利用奖励模型的不完美:

  • 模型可能学会生成"骗过"奖励模型的输出,而实际上并不真正有帮助
  • 需要额外技术如 KL 惩罚、奖励模型集成和过程监督来缓解这个问题
  • 裁剪参数提供了一些保护,但不是完整的解决方案

6.5 可扩展性问题

原始 PPO 论文使用相对较小的网络(2 层 MLP,64 个单元)。当扩展到非常大的模型(如 175B 参数的 LLM)时,新的挑战出现了:

  • 存储新旧策略参数的内存
  • 计算所有 token 概率比率的计算成本
  • 跨多个 GPU 的分布式训练协调
  • 每个 PPO 步骤中通过整个模型的梯度计算

7. 可复现性与实践考虑

7.1 实现可用性

PPO 在众多开源库中有实现:

  • Stable Baselines3(Python):最流行的 RL 库,包含经过充分测试的 PPO 实现
  • RLlib(Ray):可扩展的分布式 RL 框架
  • CleanRL:用于教育的单文件实现
  • TRL(Hugging Face):专门用于通过 RLHF 微调 LLM 的 PPO 实现
  • DeepSpeed-Chat:微软的可扩展 RLHF 训练框架

7.2 常见实现陷阱

基于广泛的社区经验,实现 PPO 时常见的错误包括:

  1. 错误的优势归一化: 按小批量的归一化(减去均值、除以标准差)对稳定训练至关重要,但论文中没有提到
  2. 错误的价值目标计算: GAE 计算必须在轨迹级别正确完成
  3. 缺少观测归一化: 对观测进行运行均值/标准差归一化可以显著提升性能
  4. 错误的梯度累积: 使用多轮 epoch 时,旧的对数概率必须从计算图中分离/停止
  5. 奖励缩放: 将奖励归一化为单位方差可以显著提升稳定性

ICLR 2022 论文"The 37 Implementation Details of Proximal Policy Optimization"(Huang 等人)详尽地记录了这些细节。

7.3 超参数推荐

基于论文和社区经验:

场景 ϵ\epsilon 轮数 KK 视野 TT 学习率 γ\gamma λ\lambda
MuJoCo 0.2 10 2048 3e-4 0.99 0.95
Atari 0.1→0 3 128 2.5e-4→0 0.99 0.95
RLHF(LLM) 0.2 1-4 完整回答 1e-5 到 5e-6 1.0 0.95

8. 历史背景与影响

8.1 时间线

  • 2015 年: TRPO 发表 —— 第一个通过信赖域实现的稳定策略梯度方法
  • 2015 年: GAE 发表 —— 优势估计的方差降低技术
  • 2016 年: A3C/A2C 发表 —— 策略梯度的并行数据收集
  • 2017 年: PPO 发表 —— 使用裁剪目标的简化 TRPO
  • 2018 年: PPO 用于训练 OpenAI Five(击败世界冠军的 Dota 2 机器人)
  • 2022 年: InstructGPT 使用 PPO 进行 RLHF —— 将 GPT-3 与人类偏好对齐
  • 2022 年至今: PPO 成为 ChatGPT、Claude、Gemini、Llama 等的默认 RLHF 算法

8.2 引用影响

PPO 是深度强化学习中被引用最多的论文之一,拥有数千次引用。更重要的是,它已成为实际标准 —— 当人们说"我们用 RL 训练"时,通常就是指 PPO。

8.3 简洁性原则

PPO 体现了一个重要的工程原则:最好的算法往往不是理论上最优雅的,而是最容易实现、调试和扩展的。 TRPO 有更强的理论保证(在特定条件下的单调改善),但 PPO 的实际优势 —— 一阶优化、与共享架构兼容、易于分布式实现 —— 使它在实践中胜出。


9. 总结

PPO 代表了实用算法设计的大师之作。通过用简单的裁剪替代目标替换 TRPO 的约束优化,Schulman 等人创造了一个:

  1. 简洁的算法:相比 vanilla 策略梯度只需修改几行代码
  2. 稳定的算法:裁剪机制在不需要二阶优化的情况下提供类似 TRPO 的稳定性保证
  3. 通用的算法:适用于共享的策略-价值架构、dropout、辅助任务
  4. 可扩展的算法:一阶优化自然地扩展到大模型和并行实现
  5. 高效的算法:在多样化的基准测试中匹配或超越 TRPO 的性能

这个算法最深远的影响是作为 RLHF 的优化引擎,使大语言模型能够与人类偏好对齐。每当你与 ChatGPT、Claude 或 Gemini 交互时,你都在受益于一个行为由 PPO 的裁剪目标函数所塑造的模型。

对于从业者来说,PPO 仍然是解决 RL 问题时首选的算法。它在简洁性、鲁棒性和跨领域(从模拟机器人到数十亿参数的语言模型)的经过验证的有效性的组合,使其成为深度学习时代最重要的算法之一。


参考文献

  1. Schulman, J., Wolski, F., Dhariwal, P., Radford, A., & Klimov, O. (2017). Proximal Policy Optimization Algorithms. arXiv:1707.06347.
  2. Schulman, J., Levine, S., Moritz, P., Jordan, M. I., & Abbeel, P. (2015). Trust Region Policy Optimization. ICML.
  3. Schulman, J., Moritz, P., Levine, S., Jordan, M., & Abbeel, P. (2015). High-Dimensional Continuous Control Using Generalized Advantage Estimation. arXiv:1506.02438.
  4. Mnih, V., et al. (2016). Asynchronous Methods for Deep Reinforcement Learning. ICML.
  5. Ouyang, L., et al. (2022). Training Language Models to Follow Instructions with Human Feedback (InstructGPT). NeurIPS.
  6. Huang, S., et al. (2022). The 37 Implementation Details of Proximal Policy Optimization. ICLR Blog Track.
  7. Kakade, S. & Langford, J. (2002). Approximately Optimal Approximate Reinforcement Learning. ICML.
  8. Sutton, R. S., McAllester, D., Singh, S., & Mansour, Y. (1999). Policy Gradient Methods for Reinforcement Learning with Function Approximation. NeurIPS.