PPO 在 RLHF 里是怎么工作的?为什么需要参考模型和 KL 惩罚?
简化版
PPO(近端策略优化)是 RLHF 第三阶段用的强化学习算法。它把「生成回答」看成一个决策过程:策略模型产出回答,奖励模型打分作为回报,PPO 更新策略让期望回报更高。它需要 KL 惩罚和参考模型:参考模型是冻结的 SFT 模型,PPO 在奖励里减去「策略与参考的 KL 散度」,防止策略为了刷高分而偏离 SFT 太远(否则会 reward hacking、丢失语言能力)。PPO 还用价值模型(critic) 估计优势、用裁剪(clip) 限制每步更新幅度,保证训练稳定。RLHF 的 PPO 阶段通常同时加载策略、参考、奖励、价值四个模型。
详细版
把文本生成建模成 RL
- 状态:当前已生成的 token 序列(提示 + 已生成部分)。
- 动作:生成下一个 token。
- 策略 π_θ:模型本身,给出下一个 token 的分布。
- 回报:整段回答生成完后,由奖励模型给一个分数(序列级奖励)。
PPO 的四个模型
| 模型 | 作用 | 是否训练 |
|---|---|---|
| 策略(Actor) | 生成回答,被优化 | 训练 |
| 参考(Reference) | 冻结 SFT,算 KL 约束 | 冻结 |
| 奖励(Reward Model) | 给回答打分 | 冻结 |
| 价值(Critic/Value) | 估计状态价值,算优势 | 训练 |
奖励的构造:RM 分数 − KL 惩罚
r_total(x, y) = r_RM(x, y) − β · KL( π_θ(·|x) ‖ π_ref(·|x) )
r_RM:奖励模型给的分(要最大化)。β·KL:策略偏离参考模型的惩罚(要最小化偏离)。
PPO 的稳定性机制
- 优势函数:用价值模型估计 baseline,算「这个动作比平均好多少」,降低方差。
- 裁剪目标(clipped objective):限制新旧策略的概率比在
[1−ε, 1+ε],防止单步更新过猛导致策略崩溃。
完整版教学
一、为什么对齐这一步要用强化学习
到了第三阶段,我们有了一个能打分的奖励模型,目标是「让模型产出 RM 分数更高的回答」。为什么不直接监督学习?因为奖励是对”整段生成结果”的评价,而不是对每个 token 的标准答案——我们不知道「第 5 个 token 该是什么」,只知道「整段回答好不好」。这种「只有最终结果有反馈、没有逐步标准答案」的问题,正是强化学习的用武之地:通过试错 + 回报信号来优化策略。
PPO 是 RL 里稳定、鲁棒、易调的主流算法,因此成为 RLHF 的默认选择。
二、把生成过程翻译成强化学习语言
理解 PPO 前,先把文本生成映射到 RL 框架:
- 策略(policy) 就是语言模型 π_θ,它在每个位置输出下一个 token 的概率分布。
- 生成一整段回答 = 策略做了一连串「选下一个 token」的动作。
- 回答生成完毕,奖励模型给整段一个分数,作为这次「轨迹」的回报。
- PPO 的任务:调整 π_θ 的参数,让它更倾向于生成「能拿高回报」的回答。
这里的奖励是稀疏的、序列级的(只在结尾给一个分),这也是 RLHF 的 PPO 需要价值模型来估计中间「优势」的原因。
三、KL 惩罚与参考模型:本阶段的灵魂
如果 PPO 只盯着「最大化 RM 分数」,会发生灾难:策略会不择手段地钻 RM 的空子——找到一些 RM 误判为高分、但实际语无伦次或重复堆砌的输出(reward hacking),同时偏离正常语言分布,丧失流畅性和多样性(模式坍缩)。
解决办法是引入**参考模型 π_ref(冻结的 SFT 模型)**和 KL 惩罚。在奖励里减去策略与参考的 KL 散度:
r_total = r_RM − β · KL( π_θ ‖ π_ref )
- KL 衡量「策略偏离 SFT 有多远」,偏得越远惩罚越大。
- 它像一根橡皮筋,一头拴在 SFT 模型上:允许策略为讨好人类偏好而调整,但不许它跑到「面目全非、不再像正常语言」的地方。
- β 控制橡皮筋松紧:β 太大,策略被拽得太死、学不到偏好改进;β 太小,约束不住、容易 reward hacking 和坍缩。
记忆钩子:RM 分数是”往前拉”的力,KL 惩罚是”往回拽”到 SFT 的力,PPO 在两力平衡中找到既高质量又不跑偏的策略。参考模型就是那个”回拽的锚点”。
四、价值模型与优势:让更新更稳
PPO 属于「Actor-Critic」方法,除了策略(Actor),还有一个价值模型(Critic):
- 它估计「从当前状态出发,预期能拿多少回报」(状态价值)。
- 用它算优势函数(advantage):
优势 = 实际回报 − 价值基线,表示「这个动作比平均预期好多少」。 - 用优势代替原始回报来更新策略,能大幅降低梯度方差,训练更稳。
所以 RLHF 的 PPO 阶段要同时加载四个模型(策略、参考、奖励、价值),其中策略和价值在训练、参考和奖励冻结。这也是 PPO 阶段显存开销巨大、工程复杂的原因——四份模型同时在显存里。
五、裁剪目标:PPO 稳定的关键设计
PPO 的名字「近端(Proximal)」来自它的核心技巧——限制每步策略更新的幅度,别一步迈太大把策略搞崩。它用新旧策略的概率比 ratio = π_new / π_old,配合裁剪:
L = min( ratio · A , clip(ratio, 1−ε, 1+ε) · A )
- 当优势 A>0(好动作)时,鼓励提高其概率,但概率比超过 1+ε 就截断,不许一次涨太多。
- 当 A<0(坏动作)时,压低其概率,但也限制在 1−ε,不许一次降太狠。
这个「裁剪」让 PPO 在「利用奖励改进」和「不偏离旧策略太远」之间取得平衡,避免了朴素策略梯度那种「一步更新过猛导致训练崩溃」的问题,是 PPO 又稳又好用的原因。
六、面试拆解算例
对齐题可以用一个偏好训练小实验来拆。假设有 20,000 条提示,每条采样 2 个回答,标注员选出更好的一个,就得到 20,000 对偏好样本。奖励模型不是学习“绝对正确答案”,而是学习 chosen 比 rejected 更符合规范的概率;如果样本里大量偏好“更长、更像解释”的回答,奖励模型就可能把啰嗦误学成高质量。
preference_pair = (prompt, chosen, rejected)
loss = -log sigmoid(r(prompt, chosen) - r(prompt, rejected))
KL_penalty = beta * KL(policy || reference_policy)
| 环节 | 关键输入 | 常见风险 | 检查办法 |
|---|---|---|---|
| 偏好采集 | prompt 与候选回答 | 标注偏见、覆盖不足 | 一致性抽检 |
| 奖励建模 | chosen/rejected 对 | 奖励作弊、长度偏置 | 分桶评估 |
| 策略优化 | 奖励 + KL 约束 | 过优化、能力掉点 | 回归集对比 |
| 安全评估 | 红队与拒答样本 | 过拒或漏拒 | 人工审查 |
SFT 模型 -> 采样回答 -> 人类/AI 偏好 -> 奖励信号 -> 策略优化
| | | | |
基础能力 多样候选 规范边界 代理目标 行为改变
因此回答「PPO 在 RLHF 里是怎么工作的?为什么需要参考模型和 KL 惩罚?」时,要把“偏好从哪里来、奖励学到了什么、优化怎样被约束、上线怎么防奖励作弊”串起来。对齐不是单个算法名,而是一条把人类规范变成模型行为的工程链路。
七、常见误区与追问
- 误区:PPO 阶段只有策略一个模型。 有四个——策略、参考、奖励、价值;参考和奖励冻结,策略和价值训练。
- 误区:KL 惩罚是为了正则化过拟合。 主要是防止 reward hacking 和偏离语言分布,把策略拴在 SFT 附近。
- 追问:为什么对齐用 RL 而非监督学习? 奖励是对整段结果的评价、没有逐 token 标准答案,适合 RL 的试错优化。
- 追问:参考模型是什么,为什么要它? 冻结的 SFT 模型,作为 KL 约束的锚点,防策略跑偏。
- 追问:β 太大/太小分别怎样? 太大约束过死学不到改进;太小约束不住、易 reward hacking 和坍缩。
- 追问:价值模型干什么? 估计价值基线算优势,降低策略梯度方差,让训练更稳。
- 追问:PPO 的 clip 有什么用? 限制每步策略更新幅度(近端),防止一步更新过猛导致崩溃。
- 追问:PPO 阶段为什么显存吃紧? 四个模型同时驻留显存,加上生成采样,开销大——这也是 DPO 想省掉 RL 的动因。
八、加强记忆
PPO in RLHF 记「四模型、两个力、稳三招」:四模型——策略(训)、参考(冻结SFT算KL)、奖励(冻结打分)、价值(训,算优势);两个力——奖励 r=r_RM−β·KL(π‖π_ref),RM 分往前拉、KL 往 SFT 拽(防 reward hacking 与坍缩),β 调松紧;稳定三招——优势函数降方差、裁剪(clip)限更新幅度、参考锚点约束。为什么用 RL?因为奖励是序列级、没有逐 token 答案。抓住「往前拉 vs 往回拽的平衡」这个画面,PPO 阶段就通了。