PPO 在 RLHF 里是怎么工作的?为什么需要参考模型和 KL 惩罚?
简化版
PPO(近端策略优化)是经典 RLHF 第三阶段常用的强化学习算法。它把「生成回答」看成决策过程:策略模型产出回答,奖励模型给序列级分数,PPO 更新策略以提高期望回报。参考模型与 KL 惩罚约束策略不要为刷分而偏离 SFT 分布过远;价值函数估计优势,裁剪目标限制单次更新。工程上可把它理解为策略、参考、奖励、价值四个逻辑组件,但实现可能共享骨干、分片或卸载,并非总是四份完整模型同时常驻一张显卡。
详细版
把文本生成建模成 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 的裁剪机制比朴素策略梯度更便于控制更新幅度,因此成为经典 RLHF 的常见选择;但它仍然超参敏感、系统复杂,也不是所有偏好优化任务的默认最优解。
二、把生成过程翻译成强化学习语言
理解 PPO 前,先把文本生成映射到 RL 框架:
- 策略(policy) 就是语言模型 π_θ,它在每个位置输出下一个 token 的概率分布。
- 生成一整段回答 = 策略做了一连串「选下一个 token」的动作。
- 回答生成完毕,奖励模型给整段一个分数,作为这次「轨迹」的回报。
- PPO 的任务:调整 π_θ 的参数,让它更倾向于生成「能拿高回报」的回答。
经典奖励模型通常给出序列级分数,训练时还会加入按 token 估计的 KL 惩罚,并把信号分配到轨迹。价值函数用于构造低方差优势估计;“奖励在结尾”并不意味着价值模型能凭空知道每个 token 的正确贡献,信用分配仍是难点。
三、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):
优势 = 实际回报 − 价值基线,表示「这个动作比平均预期好多少」。 - 用优势代替原始回报来更新策略,能大幅降低梯度方差,训练更稳。
所以 PPO 式 RLHF 包含四个逻辑组件(策略、参考、奖励、价值),其中策略和价值更新,参考和奖励通常冻结。实现可让价值头共享策略骨干,也可通过分片、卸载或分阶段推理降低驻留开销;真正结论是组件和数据流复杂,而不是机械认定“显存里永远有四个同尺寸模型”。
五、裁剪目标:PPO 稳定的关键设计
PPO 的名字「近端(Proximal)」来自它的核心技巧——限制每步策略更新的幅度,别一步迈太大把策略搞崩。它用新旧策略的概率比 ratio = π_new / π_old,配合裁剪:
L = min( ratio · A , clip(ratio, 1−ε, 1+ε) · A )
- 当优势 A>0(好动作)时,鼓励提高其概率,但概率比超过 1+ε 就截断,不许一次涨太多。
- 当 A<0(坏动作)时,压低其概率,但也限制在 1−ε,不许一次降太狠。
这个「裁剪」让 PPO 在「利用奖励改进」和「不偏离旧策略太远」之间取得平衡,避免了朴素策略梯度那种「一步更新过猛导致训练崩溃」的问题,是 PPO 又稳又好用的原因。
六、把一次 PPO 更新拆成四个分数
假设奖励模型给回答 2.4 分,策略相对参考模型的序列 KL 估计为 0.8,KL 系数 β=0.1,则用于优化的整形奖励约为 2.4-0.1×0.8=2.32。价值模型若预测回报 1.9,未做 GAE 细化时优势直觉上约为 0.42;正优势会提高这条轨迹的概率,但 PPO clip 会限制单次比例变化。
| 信号 | 本例数值 | 职责 |
|---|---|---|
| RM reward | 2.4 | 指向偏好目标 |
| KL penalty | 0.08 | 约束偏离参考模型 |
| shaped reward | 2.32 | 策略实际优化信号 |
| value baseline | 1.9 | 降低优势估计方差 |
这四个量必须分别监控。若 RM reward 上升但 KL 暴涨、人工质量下降,通常是策略在利用奖励模型;若 KL 几乎为零且奖励无变化,则约束可能过强或学习率过小。
七、常见误区与追问
- 误区:PPO 阶段只有策略一个组件。 还要参考、奖励与价值信号;它们是四个逻辑角色,物理实现可以共享或分离。
- 误区:KL 惩罚是为了正则化过拟合。 主要是防止 reward hacking 和偏离语言分布,把策略拴在 SFT 附近。
- 追问:为什么会考虑 PPO 而非普通 SFT? 只有整段偏好/奖励且希望对当前策略在线采样时,策略梯度能直接优化期望奖励;若已有固定偏好对,也可考虑 DPO 等离线方法。
- 追问:参考模型是什么,为什么要它? 冻结的 SFT 模型,作为 KL 约束的锚点,防策略跑偏。
- 追问:β 太大/太小分别怎样? 太大约束过死学不到改进;太小约束不住、易 reward hacking 和坍缩。
- 追问:价值模型干什么? 估计价值基线算优势,降低策略梯度方差,让训练更稳。
- 追问:PPO 的 clip 有什么用? 限制每步策略更新幅度(近端),防止一步更新过猛导致崩溃。
- 追问:PPO 阶段为什么资源吃紧? rollout、反向传播及参考/奖励/价值计算共同增加显存和吞吐压力;共享、分片与卸载只能缓解,不能消除系统复杂度。
八、加强记忆
PPO in RLHF 记「四个逻辑角色、两个方向、三项控制」:策略生成并更新、参考模型提供 KL 锚点、奖励模型给序列分、价值函数估计优势;奖励推动高偏好输出,KL 抑制偏离。优势估计降方差、clip 限制新旧策略概率比、参考约束控制漂移。四个角色不等于四份完整模型必须同时驻留;PPO 适合对当前策略 rollout 并优化期望奖励,但训练是否可靠仍取决于奖励质量、KL、采样和回归评测。