对齐 · 大模型推理 · 强化学习

PPO 解读:撑起 RLHF 的裁剪目标函数

近端策略优化(PPO)用一个裁剪过的代理目标稳住策略梯度——几乎和 TRPO 一样稳,却简单得多——后来成了 ChatGPT、InstructGPT 背后 RLHF 的默认强化学习引擎。

PPO 解读:撑起 RLHF 的裁剪目标函数

快速答案

近端策略优化(PPO)是一种策略梯度强化学习算法,核心是每次更新都把新旧策略的概率比裁剪进一个很窄的区间——论文用的是 [1-0.2, 1+0.2]——从而能在同一批数据上反复训练好几轮而不让策略崩掉。它只用一阶梯度、约十几行代码,就拿到了信赖域策略优化(TRPO)的大部分稳定性;后来它又成了 InstructGPT 与 ChatGPT 做 RLHF 时内部的那个优化器。

它解决什么问题

朴素策略梯度既浪费又脆弱:每条采样轨迹只用来做一次梯度更新,一旦步子迈大了,策略就会崩溃且再也回不来。TRPO 用一个硬约束修好了崩溃——限制新策略相对旧策略的 KL 散度不能超过某个值——但代价是一套二阶优化(共轭梯度加 Fisher 矩阵),实现起来别扭,还和共享参数、带 dropout 的网络结构不兼容。PPO 的目标很窄也很务实:保住 TRPO「别迈太远」的那份保证,但只用任何深度学习框架都能跑的普通随机梯度上升来实现。

裁剪代理目标函数

核心其实就是一项。PPO 写出每个样本的策略比 r = π_new(a|s) / π_old(a|s),乘上优势估计,这和普通代理目标一样。窍门在于:它再算一个把 r 强行夹进 [1-ε, 1+ε] 的裁剪版本,然后在裁剪项和未裁剪项之间取最小值。正是这个最小值让它生效——当某个动作看起来好(优势为正)时,一旦比值超过 1+ε,目标就不再因继续加大概率而给奖励,于是没有动机把概率一路推高;当动作看起来差时,裁剪又拦住策略把它压得过狠。结果是一个悲观的下界,恰好在更新会迈太远时抹掉梯度信号——不需要 KL 约束,不需要二阶数学,只要一个 min 和一个 clamp。论文也描述了另一种给损失加自适应 KL 惩罚的做法,但它报告裁剪版效果更好,世界采用的也正是这一版。

实践中 PPO 跑的是一个 actor-critic 循环:并行采样固定步数的数据,估计优势(论文用广义优势估计),再对裁剪目标、价值损失和一个熵奖励做几轮小批量 SGD,然后丢掉数据重新采样。

关键结果

  • 在 MuJoCo 连续控制任务(HalfCheetah、Hopper、Walker2d 等)上,带裁剪的 PPO 在作者的超参扫描里综合得分最高,胜过自适应 KL 版、朴素策略梯度、A2C 与 TRPO。
  • 裁剪阈值 ε = 0.2 是整套连续控制任务里最好的单一设置——这个数字几乎原封不动地被后来无数代码库继承了下来。
  • 在 Atari 基准(49 个游戏)上,PPO 多数游戏追平或超过 A2C,与 ACER 相当却简单得多,并在训练中的「学习速度」指标上明显胜出。
  • 论文给出的核心权衡是:PPO「在样本复杂度、简洁性与墙钟时间之间取得了有利的平衡」——而且不同于大多数这类说法,它「简洁」这一点经受住了十年复用的检验。

PPO 为何成了 RLHF 的主力

PPO 真正的分量不在机器人或 Atari,而在语言模型。基于人类反馈的强化学习(RLHF)要把一个大型预训练模型推向人类偏好的输出,又不能毁掉它在预训练中学到的流畅性——这恰恰就是 PPO 当初为之而生的「迈一步有用的、但别迈太远」的问题。OpenAI 做 InstructGPT 进而做 ChatGPT 时,对齐阶段先用人类偏好比较训练一个奖励模型,再用 PPO 把语言模型策略往这个奖励上优化,并用一个回到原模型的 KL 惩罚把策略拽在起点附近。于是一篇 2017 年瞄准模拟运动控制的论文,反倒成了让指令遵循助手跑通的那个优化器。我的判断:PPO 赢得这个位置,不是因为它最省样本或理论最干净,而是因为它足够稳、足够宽容,一个团队不靠专门的 RL 研究力量就能把它跑在 1750 亿参数的策略上——在对齐这件事上,这份务实比峰值性能更重要。

局限与存疑

PPO 在那条干净公式藏不住的地方其实很挑剔。它的真实表现严重依赖论文轻描淡写的实现细节——优势归一化、奖励缩放、价值损失裁剪、学习率调度、正交初始化——后来的可复现性研究表明,这些「代码层面的优化」贡献了它所报告增益的很大一部分,这对一个以「简单」为卖点的方法来说有点尴尬。它仍是 on-policy 的,每批数据训几轮就丢,在采样昂贵的任务上远不如 off-policy 方法省样本。具体到 RLHF 场景,PPO 还要额外拖着一个价值网络和一个奖励模型,训练循环又重又难调——而这正是后来直接偏好优化(DPO)和 GRPO 想去掉的痛点,它们一个砍掉评论家、一个砍掉单独的奖励模型。PPO 是在位者,而非定论。

常见问题

用大白话说,PPO 到底是什么?

PPO 是一种强化学习算法,它通过尽量大地更新策略、同时把动作概率的变化裁剪进一个很窄的区间(论文用 ±20%)来改进策略,从而让策略稳步变好,又不会一步跳崩。

为什么 RLHF 和 ChatGPT 要用 PPO?

RLHF 需要把语言模型往一个学出来的奖励模型上优化,又不能让它跑离预训练模型太远。PPO 的裁剪目标加上一个 KL 惩罚正好做到这点,所以 InstructGPT 和 ChatGPT 的对齐阶段都用了 PPO。

PPO 和 TRPO 有什么不同?

TRPO 用二阶优化施加一个硬性 KL 约束,实现复杂。PPO 用一阶的裁剪目标近似出同样「贴着旧策略走」的效果,所以只用普通 SGD、代码少得多,却能达到相当甚至更好的结果。

PPO 里的裁剪参数 epsilon 是干嘛的?

epsilon 设定新旧策略概率比在目标停止给奖励之前能移动多远;论文发现 ε = 0.2 最好,即更新被有效限制在前一动作概率的 ±20% 以内。

一句话:把策略更新裁剪到永远迈不出太远,你就用 SGD 的简单换来了 TRPO 的稳定——正是这笔交易让 RLHF 变得可行。阅读 arXiv 原文