近端策略优化

PPO (Proximal Policy Optimization)

PPO(近端策略优化)是 ChatGPT 时代强化学习对齐环节的标准算法:通过对策略更新幅度做 clip 裁剪约束,在保持训练稳定的前提下最大化奖励信号。

详细解释

PPO(Proximal Policy Optimization,近端策略优化) 是 OpenAI 2017 年提出、直到今天仍然是 LLM 对齐(RLHF 第三阶段)的主力 RL 算法。它之所以能替代之前的 Policy Gradient / TRPO / A2C,核心卖点只有一个字:。普通策略梯度(Vanilla PG)算法一次学太多步,会把策略推到一个全新的分布上,再回头采样经验(On-Policy)的时候,之前的经验已经失效了,训练会上下震荡、直接崩;PPO 给这种”步子迈大”的行为加了一个硬夹子(clip 裁剪):如果新策略比旧策略对某个动作好出大于 (1 + epsilon) 倍,就不再继续加奖励了,强迫每次更新都只在”旧策略附近一小圈”里转悠——也就是论文名字”Proximal 近端”的来历。

LLM 场景下 PPO 的 4 个模块常驻显存

做 RLHF 时,GPU 上通常常驻 4 个模型,这也是 PPO 显存开销巨大、很多团队因此转向 DPO 的根本原因:

模型角色是否要梯度作用典型占显存比例
Policy(当前策略,旧的 SFT 初始化过来)✅ 是我们真正要训练的模型,每步生成回答,根据奖励 + KL 做梯度反传约 25%
Reference(参考模型 = SFT 冻结快照)❌ 否计算 KL 散度:Policy 输出分布与原始 SFT 的距离不能太远,防止 Reward Hacking约 25%
Reward Model(第二阶段训练好的 RM)❌ 否给 Policy 每次生成的完整回答打一个标量奖励分约 25%
Critic(价值模型,和 Reward 同结构分开训练)✅ 是(部分实现)PPO 估计 Advantage(优势函数)时需要的 V(s) 基线,减少梯度方差约 25%

如果是 70B 模型,单份权重就占 ~140G(BF16);4 份就是 560G,至少 8 张 A100-80G 才能开一个 PPO 训练 slot——所以 2025 年小团队几乎都是走 DPO 路线,PPO 只有大厂做。

PPO Loss 三大块(不用背但得懂)

写在代码里的总损失函数长这样(直觉版):

总 Loss = Policy_Loss(带 clip 裁剪) + 0.5 × Value_Loss( Critic MSE) − Entropy_Bonus

  1. Policy Loss(主角):正常策略梯度是 Advantage × log π_new(a|s);PPO 把它和 ratio 比率(π_new/π_old)相乘后再做 clip(ratio, 1-eps, 1+eps)——eps 通常取 0.1 到 0.2,意思是”每步最多允许 10% 到 20% 的变化”,超过这个幅度就白学,鼓励往回收敛。
  2. Value Loss(配角):Critic 预测的 V(s) 与”实际回报(Reward + 未来折现)“的 MSE,让 Critic 越来越会估每个状态好坏。
  3. Entropy Bonus(调味剂):扣 Policy 的熵(减一个负熵相当于鼓励熵增加),鼓励模型别太早陷入”任何时候都只输出一种答案”的坍塌——取 c_0.01 级别很小的系数。

与 DPO 的 2025 年选型建议

维度PPO(RLHF)DPO
需要 RM?✅ 是(外加 Critic 可选)❌ 否
显存开销4×模型大小2×模型大小(SFT + Reference)
训练稳定性中低,KL / LR / clip 稍微错一个就崩高,本质监督微调,和 SFT 调参手感一致
效果上限(同等偏好数据量)略高 1 个点(大厂可挖)略低 1 个点,但 99% 场景没人感知
上线成本贵,8×A100 起步便宜,单张 24G 消费卡可做 7B

如果你是 C 端产品日活过 100 万、有 30 万条以上真实偏好数据,值得上 PPO;其他场景直接上 DPO + 每季度再人工抽标补数据,ROI 最高。唯元智创 控制台把两种对齐方式都做成了一键切换,同一批偏好 JSONL 既能跑 DPO 也能跑 PPO,可跑 A/B 对比再决定主用哪个。

常见问题

PPO 训练 reward 一直 0 或负数怎么办?
90% 情况是 RM 打出来的分本身就不对——它把所有回答都判成低分。排查三步:(1)先拿 10 条你肉眼知道肯定好 / 肯定差的样本单跑一遍 RM,看 RM 打分是不是和人眼一致;(2)给 RM 的 score 做个标准化(batch 内部 z-score,均值 0,方差 1)再给 PPO 用;(3)降低 KL 权重 + 降低 LR,先让 Policy 学会”不比 SFT 差”这条底线,再逐步增加 RM 的权重。以上三点做完 reward 基本会回到正数。
KL 散度应该怎么选权重?
经验起步 beta=0.1,按训练前 100 step 平均 KL 值做反比调整。目标 KL/token 在 0.5 到 3 之间:如果 KL 太大(比如 10 以上),说明 Policy 跑飞了,调大 beta(0.3、0.5)把它往 Reference 拉;如果 KL 太小(比如 0.05 以下),说明 Policy 根本没学到新东西,和 SFT 一样,调小 beta(0.05)让它放开一点手脚。2025 年更推荐 DPO 中的”动态 KL”实现:自动根据 KL 大小调 beta,少一个手动调参。
PPO 训练完能合并权重直接推理吗?
能,PPO 训练的是 Policy 权重本身(或者 Policy 的 LoRA),推理时只需要 Policy 一个模型。Reference / RM / Critic 三个只在训练期常驻,上线全部可以卸载掉。和 SFT 一样,如果你训练时用的是 LoRA,就 merge adapter 到 base 上导出成 safetensors,走标准 vLLM / SGLang / Weimeta 兼容推理端点即可。