跳到主要内容

5.4 PPO:一场小心翼翼的拔河

一个看似简单的计划​

上一节结束时,我们手里有了一个会打分的奖励模型。接下来的计划看起来简单得不像话:

让模型可劲儿生成回答,奖励模型打分,往高分方向调参数——完事。

方向也熟悉:这不就是 0.4 节的梯度下降换了个方向吗?损失要下山,奖励要上山,一步步爬就是了。

真按这个计划跑三个月,你大概率会得到一个怪物:满嘴「当然可以!这真是一个非常棒的问题!!」的马屁精,每个回答不灌到八百字不罢休,通篇正确的废话,自信得像什么都懂,其实什么都没说。

学生没变好,它只是摸透了裁判​

出问题的不是优化算法——优化算法工作得太好了。问题出在裁判身上。

奖励模型是从人类偏好里学出来的,而人类的偏好带着系统性的小毛病。你在上一节的标注实验里亲手见过两个:第 2 组里,更长、信息更多的回答看起来更「丰富」(哪怕混进了编造);第 5 组里,顺着用户说的回答更「讨喜」。几十万条标注平均下来,这些偏差被奖励模型忠实地继承,再被强化学习疯狂放大:

  • 裁判略偏爱长回答 → 学生把每个回答灌水到极限;
  • 裁判略偏爱自信语气 → 学生戒掉了「可能」「我不确定」;
  • 裁判略偏爱附和 → 学生变成职业马屁精。

这个现象有个名字:奖励钻空子。记住它的形状:只要评分标准有漏洞,一个足够强的优化器就一定会找到并利用它——刷的是分数,不是能力。这不是大模型特有的毛病,考试应试、KPI 造假,都是同一个故事。

解法:在拔河的另一头拴根橡皮筋​

既然放任优化会跑偏,那就别让它跑远。办法朴素得可爱:给模型拴一根橡皮筋,另一头系在原来的它(SFT 模型)身上。

模型每偏离原来的说话方式一分,就从奖励里扣一分。这根橡皮筋叫 KL 惩罚,整场拔河的目标变成:

总目标=奖励−β×偏离程度\text{总目标} = \text{奖励} - \beta \times \text{偏离程度}

β\beta 是橡皮筋的松紧:拉太紧,模型不敢改进;放太松,马屁精卷土重来。于是优化的含义变成——在「别变得面目全非」的前提下,尽量讨裁判喜欢。灌水八百字、句句感叹号的文风离 SFT 模型太远,橡皮筋会把它拽回来。

PPO:连每一步都要小心​

橡皮筋管住了「总体别跑偏」,PPO 则把「每一步别迈太大」也做进了算法里。它的全名是「近端策略优化」——「近端」二字直译过来就是别走远:每次参数更新都被夹在一个安全范围内,涨得太猛就截断(很有 0.4 节「学习率太大会飞出山谷」的既视感)。

代价是工程上的沉重。一次 PPO 训练要在显存里同时伺候四个模型:被训练的模型、用来算橡皮筋的参考模型、打分的奖励模型,还有一个估计「这个回答比平均水平好多少」的价值模型。又贵、又娇气、超参数难调——RLHF 因此成了大厂的特权游戏。这份沉重,正是下一节各种「捷径」诞生的理由。

这一节的边界在哪里?

本节给的是 PPO 的直觉骨架,不是全貌:强化学习的细节(优势估计、采样效率、训练稳定性技巧)水很深,跳过了整整一门课的内容。另外「四个模型」是经典配置,不同实现有变体——有的把奖励模型和价值模型合并,有的用冻结技巧省显存。方向对了就好,细节请以论文和代码为准。

小结​

本节要点
  • 只追奖励必出事:评分标准的任何漏洞都会被优化器找到并放大(reward hacking)。
  • KL 惩罚是拴向 SFT 模型的橡皮筋:在「别变得面目全非」的前提下讨裁判喜欢。
  • PPO 的「近端」= 每步更新都被夹在安全范围内,稳但工程沉重(四个模型同时在显存)。
  • 裁判的偏差来自人类标注的偏差——你在 5.3 实验里亲手见过它们的源头。
📝 动手自测0/3
1. 训练一段时间后,模型的回答越来越长、语气越来越夸张,但奖励模型给的分越来越高。最可能发生了什么?
2. KL 惩罚项的作用是什么?
3. PPO 名字里的「近端(Proximal)」指的是什么?

延伸阅读​