朝高分走,同时别走远 — 最经典的那条路线为什么又贵又不 稳
这一章讲三件事: 有了打分器之后怎么真的把模型往高分那边推; 为什么这一步必须同时勒住两根缰绳(每一步别迈太大 · 整体别离原来的自己太远); 以及它出事的时候长什么样、按什么顺序查。
它在全书链条里的位置: 第 07 章把「哪个更好」变成了一个可以求导的数, 但那个数还只是躺在那儿。 这一章是拿它去改模型的那一步—— 也是全书链条上最贵的一格。第 09 章整章的存在理由, 就是这一章的账单太难看。
★ 第 04 章那条暗线「别走远」在这一章第二次出现,换了个名字、换了管住的东西。 它在这里管的是输出的分布(第 04 章那次管的是每一步的位移)。
1. 先看现象:打分器有了,为什么不能直接朝高分走
上一章结束时,你手上有一个会打分的模型。 最自然的下一步听起来毫无悬念:让模型多写几封信,谁得分高就往谁那边调。
真这么干,你会立刻撞上两件事。
第一件:它比你想的贵得多
这一步跑起来的时候,显卡里同时住着 三个模型1:
| 住在显存里的东西 | 它在干什么 | 会不会被改 |
|---|---|---|
| 正在被训练的那个模型 | 写信 | 会,这是唯一被改的 |
| 参考模型 | 一个被冻住的副本,通常就是上一章之前那个示范训练的成果;它的活是当尺子——「原来的我大概会怎么写」 | 不会,全程冻住 |
| 打分器 | 给写出来的信打分 | 不会 |
| 一个价值头 | 一个小小的附加输出,专管一件事:「碰到这个提示词,我这一回合大概能拿多少分」 | 会 |
再加上训练必需的优化器状态(第 06 章那四笔账里最占地方的一笔), 书给的量级是:大约是单个模型显存占用的三倍1。
这个三倍要有参照物。 第 06 章算过,一个 70 亿参数的模型光装进去做全量训练 就要百来 GB 级别;乘三之后,这件事从「一张顶级卡勉强够」变成「必须上服务器」—— 书的原话是,哪怕最小的实验通常也要服务器级的部署1。
第二件:放开手它会直奔漏洞
第 07 章那条在泻湖里打转的船已经预告过这件事了。 打分器是一个有漏洞的裁判,而正在被训练的模型是一个极有耐心的钻空子的人。 所以这一步不能是「朝高分走」,只能是「朝高分走,同时别走远」。
所以这一章的名字很实在
这条路线的名字叫 PPO(全称 Proximal Policy Optimization, 字面意思就是「贴着近处走的策略优化」——名字里那个「贴着近处」正是这一章的全部主题)。 出门看任何一篇讲偏好训练的文章都会撞见这四个字母,所以这里留名。
但要先说一句实话,而且是书自己说的:
PPO 在实践中已经很大程度上失宠了,原因就是它低效。 作者仍然拒绝跳过它,理由是它是理解这一整族做法的最好例子, 是往后走的出发点2。他还补了一句: 在企业的实际部署里碰到原味 PPO 是相当少见的3。
所以读这一章的姿势是:不是学一个你明天要用的工具,是学一套后面每一条路线都在改的骨架。
2. 顶层全景:一批信在这套流程里走一圈
┌─ 一个提示词 x(「保单 P-4471……请写拒付说明信」)
│
├→ ① 正在训练的模型写出几封候选信 ← 慢。一个词一个词地写
│
├→ ② 打分器给每封信打一个分 ← 快
│
├→ ③ 减掉一个「本来预期能得多少分」 ← §4:剩下的才是有用的信号
│ 剩下的叫「比预期好多少」
│
├→ ④ 照这个信号反推每个参数该往哪挪
│ 但每一步的挪动幅度被裁在一个小区间里 ← §5
│
├→ ⑤ 同时算一笔账:参考模型看到这几封信会有多意外
│ 越意外,扣分越多 ← §6 ★「别走远」
│
└→ 挪一步 → 回到 ①,写下一批
图说:**②③④ 是「朝高分走」,⑤ 是「别走远」。**
这一章后面每一节各讲这条环上的一格,**用的是同一批信、同一组数**。
主走查(全章共用): 让模型为 P-4471 这个提示词写 4 封候选信, 跟着这 4 封信走完上面一整圈,看每一格上具体发生了什么。 下面所有数字都是为演示编的,不是真实数值;编造的部分每次出现都会再标一次。
3. 机制一:不必知道正确答案,只需知道哪次结果好
它解决什么问题
教一个东西做事,最直觉的办法是告诉它正确答案。 第 05 章那条路(给它看示范)就是这么干的——每个位置的正确 token 摆在那儿,照着对就行。
但这条路走到这里已经断了: 你手上没有「完美的拒付信」。 你只有一个会打分的裁判,和一堆模型自己写出来的、参差不齐的信。
怎么做:一个走迷宫的机器人
作者用了一个很小的场景把这件事讲穿4:
想象你在教一个机器人走迷宫。 你并不告诉它最优路径(你自己可能都不知道), 而是让它自己乱走,然后:走得离出口更近的那些动作,以后多做一点; 走进死胡同的那些动作,以后少做一点。
这就是这一族方法的全部直觉,它有个名字叫策略梯度 (policy gradient——「策略」这个词第 07 章讲过,就是正在被训练的那个模型本身; 「梯度」是第 02 章讲过的 那个「每个参数该往哪边挪」的方向)。
它写成一句话是:
把「导致好结果的那些动作」的概率抬高一点,把「导致坏结果的那些动作」的概率压低一点。 抬多少压多少,按结果有多好来定。5
为什么这有效
因为它把要求降低了整整一档。
| 需要什么 | 给它看示范那条路 | 这条路 |
|---|---|---|
| 你必须知道 | 正确答案是什么 | 只需知道哪次结果更好 |
| 谁提供 | 人,一条条写出来 | 打分器,任意多条 |
这一降就是第 07 章那笔经济账的落点。 「认得出比写得出便宜 60 倍」之所以能变成训练,靠的就是这个方法只吃「哪次好」。 书里的原话:这一点正是偏好优化「容易伺候」的本性所在, 而这个本性反过来支撑了它的经济学5。
走查上的这一步
提示词 x =「保单 P-4471,42 岁,腰椎 MRI,拒付代码 CT-06,依据第 7 条第 3 款,
请写拒付说明信」
让当前模型写 4 封:y₁ y₂ y₃ y₄
打分器打分: y₁ = 2.1 y₂ = 1.4 y₃ = 2.6 y₄ = 1.9
← 到这一步为止,策略梯度想干的事是:
把 y₃ 里出现过的那些用词的概率全体抬高,把 y₂ 里的全体压低。
(这 4 个分数是为演示编的,不是真实数值。)
但先别急着照这个做——下一节说明为什么这样直接做会失灵。
4. 机制二:把「好不好」换成「比预期好 多少」
现象:全是正分的时候,它什么都学不到
看上面那 4 个分:2.1、1.4、2.6、1.9。全是正的。
按上一节的做法,这 4 封信里出现的写法会被全体强化—— 包括那封只拿了 1.4 分的、明显更差的 y₂。 它只是因为「碰巧发生在一个正分之前」就被奖励了。
书里对这个局面的判词很不客气:
训练变成一场随机游走,中间偶尔穿插几次运气好的更新。 而且这不是理论上的担心——梯度方差过大,正是朴素策略梯度 在除了最简单的问题之外全都失败的首要原因6。
(「方差过大」在这里的意思就是信号忽上忽下、抓不到稳定方向。)
怎么做:减掉一个基准
做法朴素到有点好笑:减掉一个数。
把问题从「这次结果好不好?」换成「这次结果比预期好多少?」7
减掉的那个数叫基线(baseline)——它是「碰到这种局面,平均大概能拿多少分」的估计。 §1 表里那个价值头,活就是估这个数。
减完剩下的东西有自己的名字,叫优势(advantage): 正数代表这一回合超出了预期,负数代表低于预期7。
走查上的这一步
价值头对这个提示词的估计:2.0
(意思是:「碰到 P-4471 这类信,我这一回合大概值 2.0 分」)
优势 = 分数 − 2.0:
y₁: 2.1 − 2.0 = +0.1 ← 几乎没信息,梯度接近 0
y₂: 1.4 − 2.0 = −0.6 ← 明确压低
y₃: 2.6 − 2.0 = +0.6 ← 明确抬高
y₄: 1.9 − 2.0 = −0.1 ← 几乎没信息
★ 对比一下:减之前,4 封信全被抬高;减之后,
只有真正好的和真正差的在推动学习,平平无奇的那两封几乎不出力。
(2.0 这个估计值是为演示编的。)
为什么这么做不会把方向带偏
这是最容易起疑的一点:凭空减掉一个数,不会把答案改错吗?
不会,而且这有数学保证。 书给的理由一句话就说完了:
这个基线只依赖于「局面」,不依赖于「你选了哪个动作」。 所以它对每个动作的影响是一样的,减掉之后期望方向完全不变, 只是方差大幅下降——而方差下降意味着更快、更稳地收敛7。
这一条值得记住,因为它在第 09 章会以另一种形态回来: 那里的做法是不再养一个价值头,直接拿同一个提示词下几份回答的平均分当基线。 思路完全一样,只是基线从「估出来的」变成了「当场算出来的」。
5. 机制三:裁剪 —— 「可以进步,但别这么起劲」
现象:一次更新就能把模型推进陌生地带
现在方向对了,还剩一个问题:一步迈多大。
书举的例子很具体:假设当前模型给某个高分回答只分配了很低的概率。 朴素的做法会说「那就把它变得可能得多」—— 一次更新就可能把这个概率乘上 10 倍甚至更多8。
问题不在这一步本身,在下一步:
更新之 后的模型已经站在陌生的地带上了。 在旧模型下看起来可靠的那些方向估计,在新模型下可能是误导性的, 于是引发一连串糟糕的更新9。
这就是第 04 章那张地形图上「一步迈太大、跳出盆地」的同一件事, 只是这次跳出去的不是能力,是可靠的方向估计。
怎么做:给「变了多少」设一个上限
PPO 的做法是盯住一个很具体的量:
概率比 = 新模型给这个 token 的概率 ÷ 旧模型给这个 token 的概率。 比值接近 1,说明两个模型差不多;比值偏离得厉害,说明变化太大10。
然后把这个比值硬裁在一个小区间里,区间宽度由一个旋钮定, 这个旋钮的名字是 ε,常用取值 0.1 或 0.210。
取 0.2 的意思就是:任何一次更新,都不许把一个动作的概率改动超过两成—— 不管它看上去多有优势11。
走查上的这一步
盯住 y₃(优势 +0.6)里的一个具体位置:
模型已经写出「……经审核,您申请的腰椎 MRI」,下一个 token 是什么?
旧模型给「未获」的概率:0.30
这一步的梯度想把它推到: 0.42 → 概率比 = 0.42 / 0.30 = 1.40
ε = 0.2 → 允许的上限是 1.20
裁剪之后: 0.36 ← 这一步只准走到这里
★ 效果:方向没变(仍然是抬高),但幅度被砍掉了一半多。
下一轮如果它仍然是好的,可以接着抬;不是的话,损失有限。
(0.30 / 0.42 这两个概率是为演示编的;ε = 0.2 是书里给的常用值。)
为什么这有效:一句反直觉的原话
作者自己承认这听着别扭:
我们实际上是在告诉模型:去进步,但别这么起劲。 抑制模型的热情会让训练慢一点,但会稳定得多12。
这就是 PPO 名字里那个「贴着近处走」的由来,也是它能稳定训练、 而更早的策略梯度方法常常直接崩掉的原因11。