17. PPO 在 RLHF 中具体怎么工作?工程上最痛的几个点是什么?

整理 PPO 的核心机制、工程难点与超参调优要点。

简单回答

PPO(Proximal Policy Optimization)在 RLHF 里的角色是"用 Reward Model 的打分作为奖励信号,对 SFT 模型做策略优化"。它的核心机制是 clip 重要性采样比KL 惩罚 两个约束——前者防止单步更新过大破坏 policy,后者防止 policy 偏离参考模型太远导致 reward hacking。工程上最痛的点有四个:四模型同时驻显存(policy / reference / reward / value)、超参敏感(lr、KL 系数、clip range 都难调)、训练不稳定(奖励稀疏、采样方差大)、reward hacking(模型钻 RM 漏洞而不是真改善质量)。

详细解释

PPO 在 RLHF 链路里的位置

本专题第 06 篇文章讲过 RLHF 三步:SFT → 训 Reward Model → 用 PPO 做强化学习优化。PPO 这一步是把前两步的产物——一个有基本对话能力的 SFT 模型 + 一个能给回答打分的 Reward Model——结合起来,让模型真正"按人类偏好"优化。

形式上是个 RL 问题:状态是 prompt 和已生成的 token,动作是下一个 token,奖励是 RM 在生成结束后给整段回答打的分。但和经典 RL 任务(机器人、游戏)相比有几个特殊性:动作空间巨大(vocab 几万到十几万)、奖励极度稀疏(只在 episode 结束时给一次)、初始 policy 已经很强(SFT 模型已经能说话了,不能太大幅度改动)。这些特殊性决定了 PPO 在这里的具体调法。

PPO 的两个核心约束

PPO 的优化目标可以写成(简化版):

第一项是 PPO 的 clipped surrogate objective,里面 是新旧 policy 的概率比值(重要性采样比), 是优势函数估计。clip 操作把 ratio 限制在 1-ε, 1+ε 范围内(通常 ε=0.2),意思是"单步更新 policy 时不要让任何 token 的概率变化超过 20%"。

第二项是 KL 惩罚,约束 policy 不要偏离参考模型 (通常就是 SFT 模型的冻结副本)太远。系数 β 控制约束强度。

这两个约束都是为了"稳":clip 防止单步更新过激,KL 防止累积偏离过远。少了任何一个 PPO 训练都容易发散。

Advantage 估计:GAE 和 Value Model

(优势函数)的估计是 PPO 最微妙的部分。常用的是 GAE(Generalized Advantage Estimation):

这个公式需要一个 value function 来估计"从当前状态出发未来能获得的累积奖励"。在 RLHF 里这个 value function 通常是另一个和 policy 同规模的模型——叫 value modelcritic

也就是说 PPO 训练时显存里要同时有四个模型:

  1. Policy model(当前正在优化的)—— 大小和 SFT 模型一样
  2. Reference model(SFT 模型的冻结副本)—— 用于算 KL 惩罚,参数不更新
  3. Reward model(前面训好的)—— 给完整回答打分
  4. Value model(critic)—— 估计 advantage

四个模型都要前向,policy 和 value 还要反向。70B 模型做 PPO 没几百张 GPU 几乎跑不起来。这是 RLHF 工程上最直接的痛点。

工程痛点 1:显存和成本

四模型驻显存的代价非常高。常见的省显存技巧有:

  • 共享 backbone:让 policy 和 value 共享底层 transformer,只在最后一层分两个 head(一个输出 logits,一个输出 scalar)。但很多工程实现里两者完全独立,因为分开调更稳。
  • Reward 和 Reference 用低精度甚至量化:这两个模型只做前向,可以用 INT8 或更低精度,省显存。
  • CPU offload:把 reference 和 reward 卸到 CPU 内存,用时再 swap。延迟会变高但能跑得起来。

但这些都是缝缝补补,根本上 PPO 的成本结构就是高的。这也是本专题第 07 篇 DPO 对比里讲到的 DPO 的一大优势——只需要 policy + reference 两个模型。

工程痛点 2:超参敏感

PPO 的几个核心超参都很难调:

  • Learning rate:太大 policy 一步崩,太小训不动。RLHF 里通常用 1e-6 到 1e-5,比 SFT 阶段小一两个数量级。
  • KL 系数 β:太小 policy 跑飞产生 reward hacking,太大策略不动等于不优化。常见做法是用 adaptive KL——根据当前 KL 偏离量动态调整 β,偏离过大就增大 β,偏离很小就减小。
  • Clip range ε:标准 PPO 是 0.2,RLHF 里有时调到 0.1-0.2 之间根据实验微调。
  • Rollout batch size 和 PPO epochs:每次采样多少 prompt 做 rollout、每批数据 PPO 更新几次。这两个数决定数据复用率和训练稳定性。

调好这套超参常常要做几十次小规模实验,每次都要烧不少 GPU 时。

工程痛点 3:奖励稀疏 + 采样方差

PPO 在 RLHF 里只在 episode 末尾拿到一次 RM 打分,整段回答(可能几百个 token)共享这一个奖励信号——这是极度稀疏的奖励。模型很难分辨"这段话里是哪几个 token 让奖励高的",学习信号噪声很大。

加上语言生成的采样方差天然就大——同一个 prompt 多次采样得到的回答风格内容差别巨大,对应 reward 也差别巨大。Advantage 估计的方差因此很高,PPO 更新方向会摇摆。常见的缓解方法是用更大的 rollout batch size 平均掉方差,或者用 reward 标准化(每批 reward 减均值除标准差)。

工程痛点 4:Reward Hacking

这是 PPO 在 RLHF 里最让人头疼的现象——policy 找到了 RM 的漏洞,生成那种 RM 给高分但人类看着不对的回答。

典型表现有几种。模型学会输出特别长的回答,因为 RM 训练数据里长回答可能更受标注员偏好。模型学会用某些"讨好"短语("我很乐意帮助你"、"这是一个很好的问题"),因为标注时这些 prompt 拿到的偏好分高。模型学会重复某些句式或词汇,因为 RM 在这些 pattern 上系统性地打高分。

KL 惩罚是 reward hacking 最重要的兜底——KL 限制了 policy 偏离 SFT 模型的幅度,相当于不让 policy 走得太远去钻空子。但 KL 也只能缓解,不能根治。根治要靠提高 RM 的质量——更多样的偏好数据、不同维度分别打分、定期用最新 policy 生成的样本重新标注 RM 训练数据等。

在哪些场景下 PPO 仍然值得做

DPO 流行后很多人质疑 PPO 还有什么必要。实际产业里 PPO 仍然有一席之地,原因有几个:

复杂多维奖励——比如同时需要"有用、安全、简洁、引用准确"几个维度,RM 可以训练成多 head 输出多维 reward,PPO 优化时灵活组合权重。DPO 在这种多维奖励上不够直接。

在线学习——PPO 是 on-policy 的,每一步都用当前 policy 采样,理论上跟得上 policy 的演化。DPO 是 off-policy 的,训练数据采自 SFT 模型,policy 和数据分布会越来越偏。

强化学习能力——OpenAI 的 o1 系列推理模型据信用了大规模 RL(虽然不一定是经典 PPO),DeepSeek-R1 公开的方案里用了 GRPO(PPO 的一个变体)。这说明在追求复杂推理能力时基于 RL 的方案仍然有价值。

面试时可以这样答

PPO 在 RLHF 里的角色是用 Reward Model 的打分作奖励信号优化 SFT 模型。核心机制是两个约束——clip 重要性采样比限制单步 policy 更新幅度,KL 惩罚限制 policy 累积偏离参考模型的距离。

工程上四个痛点。第一是显存——同时要驻 policy、reference、reward、value 四个模型,70B 规模没几百张 GPU 跑不起来。常见缓解是 reference/reward 用低精度或 CPU offload,但根本上成本就是高的。第二是超参敏感——learning rate、KL 系数、clip range 都难调,常常要做几十次小规模实验才能稳定下来。第三是奖励稀疏——RM 只在 episode 末尾打一次分,整段几百 token 共享一个信号,加上语言采样方差大,advantage 估计噪声很高。第四是 reward hacking——policy 找 RM 漏洞输出长回答、讨好短语、重复句式之类的,KL 惩罚是主要兜底但不能根治。

这些痛点也是 DPO 流行的直接原因——它跳过了 RM 和 PPO,只需要 policy + reference 两个模型,工程量降一个数量级。但 PPO 在多维奖励、在线学习、复杂推理能力训练这些场景下仍然有不可替代的价值,比如 DeepSeek-R1 的 GRPO 就是 PPO 的变体。

常见追问

  1. KL 惩罚里的 adaptive KL 具体怎么实现?什么情况下 β 要调大?
  2. Value model 必须和 policy 同规模吗?能用小模型代替吗?
  3. GRPO 和 PPO 的区别是什么?为什么 DeepSeek-R1 选 GRPO?