跳到主要内容

三种补救,以及它们各自怎么失手

这一章讲什么: 第 12 章诊断出了病(跑到 400 步左右分数会掉),这一章开三副药。 一副真的管用,另外两副各自把事情搞得更糟 —— 一副把模型训成了吐乱码,一副让模型发现「光守着格式就能赚分」。 每一种失手都是一张能读的曲线,而读懂它们本身就是这一章的价值。

它在全书链条里的位置: 「动权重」这条路的最后一站,也是全书唯一一章 以失败为主线的正文。这类现场在论文和教科书里几乎见不到。

需要的基础: 第 11 章那套(优势、损失、求和的对数概率)和第 12 章那几个仪表。

顶层全景:同样四个回答,三种改法

这一章的主走查接着第 11 章:同样那四个回答、同样那个损失 −2.5764。

第 11 章算出来的:损失 = −2.5764

├─ 补救一:限制单次更新的幅度
│ 更新前的对数概率 [−10.9243, −20.3546, −14.6130, −23.3677]
│ 更新后的对数概率 [ −7.9243, −20.1546, −16.6130, −23.3677]
│ │ 算「变了多少倍」
│ ▼ [20.0855, 1.2214, 0.1353, 1.0000] ← 第一个变了 20 倍!
│ │ 卡进 [−9, 11] 这个范围
│ ▼ [11.0000, 1.2214, 0.1353, 1.0000]
│ ▼ 损失从 −2.5764 变成 **−2.3998**
│ ⟹ **400 步那次下跌不见了。这一副药管用。**

├─ 补救二:再加一项,约束整条训练轨迹上的长期漂移
│ ⟹ 前 50 步 15% → 40%,约 200 步奖励塌到 0,
│ 之后模型开始吐 "framework.raises Self profess(import",准确率归零

└─ 补救三:给「按格式写」也发奖励
⟹ 平均奖励基本不变,可准确率往下滑 —— 模型找到了捷径

图说:三副药,一副管用两副出事。而两次出事的机制都能讲清楚,
这才是这一章真正的教材价值。

1. 补救一:限制单次更新能走多远

先说它要解决什么问题:一步迈太大,可能把训练直接搞崩。

怎么量「迈了多大一步」?书给的口语化说法特别好1:

如果这个模型之前认为某个答案有某种可能性,那么调完权重之后, 它觉得同一个答案的可能性变了多少?

做法就是把同一个回答,拿更新前和更新后的对数概率比一比。

走查:四个回答,一个变了 20 倍

书给了两组数(更新后那一组就是第 11 章那四个)2:

更新后 [ −7.9243, −20.1546, −16.6130, −23.3677]
更新前 [−10.9243, −20.3546, −14.6130, −23.3677]
│ 相减,再换算回「倍数」

倍数 [20.0855, 1.2214, 0.1353, 1.0000]
↑ ↑ ↑ ↑
变大 20 倍 变大一点 变小到 1/7 **完全没变**

倍数等于 1.0 就是「完全没变」 —— 书专门说明了这一点3

第一个那 20 倍太大了。 书解释了不管会怎样4:

如果更新后的模型突然给某个回答高得多或低得多的可能性,这个倍数就会变得极大或极小, 而它会把优势那一项放大,导致一次巨大的改动,可能毁掉训练。

所以要卡一个上下界。这一招的名字叫裁剪策略比率 (「策略」还是第 10 章那个;「比率」就是上面那个倍数;「裁剪」就是超出范围就削到边界)。

设一个宽度参数 = 10.0 ⟹ 允许的范围是 [1 − 10, 1 + 10] = [−9, 11]
倍数 [20.0855, 1.2214, 0.1353, 1.0000]
│ 超出范围的削到边界

[11.0000, 1.2214, 0.1353, 1.0000]
↑ **只有第一个被削了**
│ 拿削过的倍数重算损失
▼ **−2.3998**(第 11 章那个原始值是 −2.5764)

书解释了为什么只差这么一点:因为这个例子里只有一个倍数真的被削了, 而且用的宽度 10.0 已经相当宽松5

书还顺带记了另一个可以长期盯的数:平均倍数 = 5.6106。 它这么大,意味着更新后的模型给这些采出来的词高得多的可能性5

那个宽度该取多少,差别很大

书给了两个真实的取值,差了一百倍6:

宽度什么性质
DeepSeek-R110非常弱的裁剪 —— 基本不怎么管
RLHF 里常用的那套(PPO)0.1激进的裁剪 —— 每一步策略变化小得多

——这条要记住:同一个机制,参数差一百倍,做的其实是两件不同的事。

一个小注解,书专门给了7:参数名里那个 eps 是希腊字母 epsilon 的缩写, 数学里常用它表示一个很小的正量。

数学推导超出本章范围,书指向了 PPO 那篇原论文8PPO 本身我们书架上有9

我们做的其实是一个便宜的近似,书老实说了

这一段很有价值,因为它把「书里的实现」和「真实的工业做法」摆在了一起10:

DeepSeek-R1 的做法这本书的做法
复制当前模型当参照
用它一次性生成 8192 个回答,凑一个大池子只采 8 个回答
把这批固定的回答分成 16 小份依次训不分小份,重新采一组再来一次(默认再来一次)
走完之后更新参照模型

书自己承认:资源受限,做不到那么多回答、也分不了那么多小份,所以用一个更便宜的近似10

——这种坦白值得记:你读到的很多「我们实现了 X 算法」,实际实现的是 X 的一个简化版。

效果:那次下跌不见了

这是三副药里唯一真的管用的一副11:

和之前几次训练相比,加了裁剪之后明显更稳 —— 400 步附近那次平均奖励和评测准确率的下跌,不见了。

2. 补救二:约束长期漂移 —— 结果把模型训成了吐乱码

先给一个身份澄清,书专门开了个边栏12:

熟悉强化学习的读者会认出来:我们到目前为止实现的东西, 本质上就是「带组归一化优势的 REINFORCE」。

——这句话对老手很有用:它把这本书从零写的东西挂回了教科书上的名字。

这一项是什么,它和上一招管的不是同一件事

这一项叫 KL 项。 所谓 KL,是两个人名的缩写(Kullback 和 Leibler); 它量的是:当前的模型和一个参照模型差得有多远 —— 而那个参照,通常就是训练刚开始时的原始模型13

它和上一招的分工,书划得很清楚14:

管什么
裁剪比率(补救一)每一步之间能变多少
KL 项(补救二)整条训练轨迹上的长期漂移 —— 别离出发点太远

参照模型的维护方式也不同15:

补救一:参照模型**每一轮都换**成当前的模型
补救二:参照模型是**训练之初那个原始模型**,固定不动,或者很少更换
(DeepSeek-R1 是每 400 步换一次)

实现只有两行的意思:算出「当前模型和参照模型的对数概率之差」的平均, 乘上一个系数,加到原来那个损失上16

两条代价书也写了17:

代价说明
内存要在内存里多留一份原始模型的副本
取值那个系数实践中通常是 0.001 到 0.05 之间的小值

然后它崩了 —— 这是全书最精彩的一段失败分析

书跑了一次,结果是这样18:

前 50 步:准确率从略高于 15% 涨到约 40% ← 和第 11 章一致,一切正常
约 200 步:平均奖励**塌到 0**
之后: 损失爆炸,评测准确率**掉向 0%**
人工检查生成的内容:模型开始吐乱码,例如
"framework.raises Self profess(import"

书给了两条原因,每一条都值得单独讲。

原因一:这一项用的是「求和」的对数概率,所以序列越长它天然越大19

——第 11 章第 2 节那条副作用,在这里闯了祸:

求和的对数概率随长度线性变负
⟹ 回答越长,「当前模型和参照模型之差」的绝对值就越大
⟹ 这一项被无意中变成了「写得越长,这一项越大」
⟹ **它在鼓励模型写超长输出**
⟹ 书确实观察到回答长度在涨,而这进一步把训练搞崩

图说:这不是实现错了。是「求和」这个正确的选择,
在换了一个用途之后产生了错误的激励。

原因二:奖励塌到 0 之后,这一项成了唯一还活着的梯度来源20

这条是第 11 章第 4 节和第 12 章第 3 节那条性质的直接后果:

所有奖励 = 0
⟹ 优势全为 0(第 11 章)
⟹ 策略梯度那一项**不再贡献任何梯度**(第 12 章的仪表上就是标准差归零)
⟹ 而 KL 项还活着,于是它**独占了所有更新**
⟹ 它把模型推向**更高的熵、接近均匀的词分布**
⟹ 这同时解释了两件事:**输出越来越随机**,以及**准确率掉到 0%**

图说:一个本来只是「约束」的项,在主信号消失之后变成了唯一的驱动力。
**这是整本书最值得记住的一个失效模式。**

书还建议读者去画其他几个指标确认:熵会变得非常大20 —— 这正好是第 12 章那套读法的实战演练。

四条补救,以及书最终的建议

书列了四条21:

办法书的评价
把系数从 0.02 降到 0.001作者试过,不够
对序列的对数概率做长度归一化(除以生成的词数)能减少「靠写长来累积更大绝对差」的动机
用一种带重要性加权的 KL(DeepSeek-V3.2 提的)那个权重修正了「回答是旧策略生成的」这件事:当前策略很少会产出的样本被降权,会产出的被升权
加一个小的格式奖励,防止优势塌到零引向下一节

但书最终的建议很干脆22:

对数学数据,常见的推荐是干脆不要这一项。 多个近期工作报告说去掉或减弱它之后稳定性/性能更好(书点名了 Dr. GRPO、Olmo 3、DeepSeek-V3.2)。 顺带还简化了代码、省了内存 —— 不用再留一份参照模型。

——这和第 11 章第 4 节那句「很多开发者实践中就不用它」前后呼应。 书是先把标准做法实现出来、演示它会崩、再告诉你多数人不用它。这个顺序本身就是教学。

3. 补救三:给「按格式写」发奖励 —— 结果被刷分了

先认一样东西:那对 <think> 标签。

书说得很清楚:它们就是普通的文本小块,只是被用来标出中间推理的起止 —— 推理写在 <think></think> 之间,最终答案写在外面。 书强调这整套做法是可选的,好处是让输出结构显式化,把推理和最终结果分开23

一个很具体的技术走查

base 模型的分词器根本不认识这对标签24:

把 "<think>" 交给 base 模型的分词器
▼ 得到 [13708, 766, 29] —— **三个小块!**
说明它被当成普通字符拆碎了,词表里没有这个东西
│ 把这两个标签正式加进分词器

再来一次:"<think>" → [151667] **单个小块 ✓**
"</think>" → [151668]

为什么加得进去?书解释了25:这个模型的词表有 151936 个位置, 支持 0 到 151935 的编号,而 151667 和 151668 本来就在这个范围里 —— 那些位置原本是空着的,留给后来微调时用。

(另一条路更省事:直接用官方推理版的分词器,它原生就认识这两个标签26。)

奖励函数怎么改

新加一条规则:生成的内容里,<think> 的位置早于 </think> 就给 1.0 分,否则 0.027总奖励变成「原来那个 + 权重 × 格式分」28

结果:又是一次「先好后坏」

曲线长这样29:

准确率:先涨,后跌
平均奖励:**基本不变** ← 这才是关键的异常
回答长度:准确率下滑的时候,回答在**变短**

书给的诊断29:

模型光靠守着 <think> 的格式,就已经拿到了太多奖励 (可以从格式奖励那条曲线上看出来),于是它对「答案对不对」用力不够。

——这是一个非常经典的失效模式:你奖励什么,它就优化什么; 而它会找到最省力的那条路去拿分。

设计意图:守格式 + 答对 = 高分
模型发现的捷径:守格式(便宜) + 随便答(不管对错)= 也能拿到不少分
⟹ 平均奖励看起来还行,准确率却在掉

图说:「平均奖励基本不变而准确率下滑」这个组合,
就是「奖励被刷分了」的典型信号。**光盯平均奖励看不出来。**

两条改法书给了30:

改法做法
降权把格式奖励的权重从 1.0 降到 0.1
改成有条件的只有答案也对的时候才给格式分(当前实现是不管对错都给)

(书把它出成了一道练习,参考结果在附录里。)

一条必须讲的前提31:不能拿 base 模型来练这个 —— 它从没见过这对标签,结果会很差。 正确做法是先用含这对标签的数据做预训练或者指令微调(那是第 14 章的内容), 所以书这一节直接用已经认识这对标签的官方推理版来训。

一个日志上的假象,书专门开了个边栏32:这一节那次运行里, 损失全程为 0。原因是默认设置关掉了 KL 项、而且只做一次内部更新 (拿模型和同一步的自己比)—— 于是倍数从 1 开始,而优势被归一化成均值 0, 这个损失数值算出来就是 0。 书的判词很直接:这里的 0 是默认设置造成的计算产物,这个损失没有信息量。 该盯的是平均奖励、格式奖励、优势标准差和平均熵。

4. GRPO 之后还有十几种改法:书只列名字

这一节书自己说了:限于篇幅,详细解释、代码和实验结果超出本章范围33但这份清单本身有价值 —— 它们是你出门会撞见的名字。

来源改的是什么
DAPO过滤掉零梯度的信号;主动采样;把损失从按整条序列算改成按每个词算;去掉 KL 项;把裁剪的上界放宽
Dr. GRPO去掉 KL 项;不做标准差归一化
DeepSeek-V3.2按领域调 KL 的强度(数学取零);重加权的 KL;离策略序列掩码;保留 top-p / top-k 的采样掩码;保留原始的优势归一化
VERL截断的重要性采样
GDPO汇总之前先按奖励做组内归一化
GSPO按整条序列做重要性采样与裁剪
CISPO裁剪重要性采样的权重,而不是裁剪按词的更新

(这份谱系书不展开,我们书架上有一整章讲它们各自在修什么病34。)

书对这份清单的态度值得原样保留35:

除了学习率、最大回答长度、提示词格式这些基础设置,可调的旋钮和改法近乎无穷; 把其中一个或少数几个改法研究透,对一个小团队来说可能就是一整个月甚至一整年的课题。 算法会一直变,重要的是理解底层的基本原理 —— 这样才看得懂、也才欣赏得了这些改进。

——这句话是这一章、也是整个「动权重」部分最好的收尾。

作者的判断与证据

说法性质
那四个倍数、削过之后的损失 −2.3998、平均倍数 5.6106书里印出来的实测(输入的两组对数概率是书造的)
<think> 被拆成三个小块、加进去之后变成单个书里印出来的实测
加裁剪之后 400 步那次下跌不见了真实实验,但只跑了一次(第 12 章开头那条声明依然适用)
KL 项那次崩溃(200 步塌零、吐乱码、准确率归零)真实实验,乱码那句是人工检查生成内容看到的
崩溃的两条原因作者的分析,措辞是「几个可能的原因」;但第二条是从算法性质推出来的,很硬
「把系数降到 0.001 不够」作者自己试过的,他明说了
格式奖励被刷分真实实验,书还给了诊断依据(格式奖励那条曲线)
DeepSeek-R1 用 10、PPO 常用 0.1书给的行业数值,没有列出处
DeepSeek-R1 那套「8192 个回答、分成 16 小份」书转述的做法,不是他自己复现的
「数学任务上干脆不要 KL 项」多家近期工作的报告,书点了三个名字
那十几种改法只列名字,书明说不展开
「算法会变,重要的是懂原理」作者的态度,也是全书最后一条方法论

判断(我们的,不是书里的): 这一章的两次失败,机制上是同一件事的两面 —— 「模型会优化你真正给分的那个东西,而不是你想要的那个东西。」 KL 项那次:主奖励消失后,唯一还给分的东西是「别离原模型太远」,于是它去优化那个, 结果吐出接近均匀的乱码;格式奖励那次:守格式比答对便宜,于是它去优化格式。 两次都不是算法错了,是奖励里真正给分的东西和我们想要的东西不一致。 如果错,会错在: 我们把两次失败归到同一条原因下,可能过度简化了 —— KL 那次还叠了「求和的对数概率鼓励写长」这条独立的机制, 书是把它当成第一条原因列的,而我们把它降级成了辅助因素。

边界与局限

  1. 每次训练只跑了一次。 第 12 章开头那条声明对这一章的每一张曲线都成立。
  2. 裁剪那一招的数学推导书不讲,指向 PPO 原论文。
  3. 书里的实现是工业做法的一个便宜近似(8 个回答 vs 8192 个),作者自己承认了。
  4. clip_eps=10 是「DeepSeek-R1 用的值」,但书没有给出处。 我们也没有核到原文 —— 引用这个数时要说明它只有书这一个来源。
  5. 格式奖励那一节没法在 base 模型上做。 它用的是官方推理版, 所以那次实验的结论不能直接搬到本书主线那个 base 模型上。
  6. 两条改法(降权、改成有条件的)书没有实现,只出成了练习。
  7. 十几种改法只列了名字。 想懂它们各自在修什么,得另找材料。
  8. 那次运行里损失全程为 0 是默认设置造成的(见第 3 节末尾那个边栏)—— 别拿它当算法的性质。

可带走的

  1. 限制单次更新的幅度:比较同一个回答在更新前后的可能性变了多少倍。 倍数 = 1.0 就是完全没变。 超出范围就削到边界 —— 这一招叫裁剪策略比率。
  2. 不裁剪的后果很具体: 某个倍数变得极大或极小,会把优势那一项放大, 导致一次巨大的改动,可能毁掉训练。
  3. 同一个机制,参数差一百倍就是两件事: DeepSeek-R1 用 10(几乎不管), RLHF 里的 PPO 常用 0.1(管得很死)。
  4. 这一招是三副药里唯一真正管用的 —— 400 步那次下跌不见了。
  5. KL 项管的是另一件事:整条训练轨迹上的长期漂移,而不是每一步之间。 它要在内存里多留一份原始模型。
  6. 它把模型训成了吐乱码,而机制值得背下来: 主奖励塌零之后,它成了唯一还活着的梯度来源,于是把模型推向接近均匀的词分布。
  7. 「求和的对数概率」这个正确选择,换个用途就变成了错误的激励 —— 它让 KL 项无意中鼓励模型写超长。
  8. 数学任务上,多家的建议是干脆不要 KL 项。 顺带省代码、省内存。
  9. <think> 那对标签就是普通的文本小块,只是被用来划出推理的起止。 base 模型的分词器不认识它们(会被拆成三块),要先正式加进去。
  10. 给格式发奖励会被刷分: 模型发现光守格式就赚够了分,于是不好好答题。 改法:降权,或者改成「答对了才给」。
  11. 「平均奖励基本不变而准确率下滑」是奖励被刷分的典型信号。 光盯平均奖励看不出来 —— 这就是第 12 章那句「指标要一起看」的实战。
  12. 一条贯穿两次失败的教训:模型优化的是你真正给分的东西,不是你想要的东西。
  13. 可调的旋钮近乎无穷,而算法会一直变。 作者的建议:把底层原理搞懂 —— 那才是能带走的东西。

原文地图

主题原书章原文位置
这一招在量什么7.4 Stabilizing sequence-level GRPO using clipped policy ratiostext/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:32(搜「how much more or less likely」)
数学推导超出范围同上text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:109(搜「mathematical derivation is outside the scope」)
两组对数概率与两个倍数向量同上text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:128(搜「old_logps = torch.tensor」) · :161(搜「Ratio: tensor」) · :162(搜「Clipped ratio」)
倍数 = 1.0 就是没变 · 不裁剪会怎样同上text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:168(搜「the ratio is 1.0」) · :174(搜「Without clipping, this would scale the advantage term」)
取值:10 与 0.1同上text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:180(搜「DeepSeek-R1 used clip_eps = 10」)
eps 是什么同上text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:199(搜「short for epsilon」)
裁剪后的损失与平均倍数同上text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:251(搜「-2.3998」) · :257(搜「5.6106」)
DeepSeek-R1 的做法 vs 本书的近似同上text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:311(搜「8,192 responses」) · :375(搜「we mimic the same idea more cheaply」)
效果:那次下跌不见了同上text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:413(搜「no visible drop in the average reward」)
身份澄清:REINFORCE7.5 Controlling how much the model changes with a KL termtext/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:20(搜「REINFORCE with group-normalized advantages」)
KL 是什么同上text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:35(搜「Kullback–Leibler divergence」)
和裁剪比率的分工同上text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:41(搜「another mechanism to control how much the model can change」)
参照模型怎么维护同上text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:78(搜「every 400 steps」)
实现与两条代价同上text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:156(搜「kl_loss = kl_coeff」) · :186(搜「keep an additional copy of the original model」) · :192(搜「between 0.001 and 0.05」)
崩溃的全过程同上text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:267(搜「a total collapse where the loss values explode」) · :273(搜「framework.raises Self profess(import」)
崩溃的两条原因同上text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:279(搜「longer sequences naturally lead to larger KL values」) · :285(搜「the only remaining source of gradient signal」)
四条补救 · 最终建议同上text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:304(搜「this was not sufficient」) · :340(搜「prevent advantages from collapsing to zero」) · :346(搜「a common recommendation is to omit the KL term altogether」)
<think> 是什么7.6 Adding an explicit format rewardtext/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:32(搜「ordinary text tokens that mark the beginning and end」)
被拆成三个小块 · 加进去之后同上text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:76(搜「[13708, 766, 29]」) · :111(搜「single tokens [151667] and [151668]」)
为什么加得进去同上text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:117(搜「vocabulary size of 151936」) · :130(搜「already supports these tokens natively」)
格式奖励怎么算同上text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:198(搜「def reward_format」) · :300(搜「format_reward_weight」)
不能拿 base 模型练同上text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:369(搜「the results would be quite poor」) · :375(搜「instruction fine-tuning is covered in the next chapter」)
被刷分的曲线与诊断同上text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:440(搜「the average reward stays approximately constant」) · :481(搜「make the format reward conditional」)
日志上的假象同上text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:494(搜「the logged kl_loss remains 0」) · :529(搜「The more useful quantities to monitor」)
十几种改法的清单同上text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:608(搜「Zero gradient signal filtering」) · :650(搜「Clip importance-sampling weights」) · :655(搜「outside the scope of this chapter」)
旋钮近乎无穷 · 懂原理最重要同上text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:590(搜「near infinite number of settings」) · :596(搜「understand the fundamentals」)

Footnotes

  1. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 32 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:32,搜「how much more or less likely」)。

  2. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 128 段起(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:128,搜「old_logps = torch.tensor」)是那两组对数概率;两个倍数向量在第 161 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:161,搜「Ratio: tensor」)与第 162 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:162,搜「Clipped ratio」)。「更新前」那一组是书为了演示造的,它的注释里标着「更新后」的对应值。

  3. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 168 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:168,搜「the ratio is 1.0」)。

  4. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 174 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:174,搜「Without clipping, this would scale the advantage term」)。

  5. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 251 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:251,搜「-2.3998」)与第 257 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:257,搜「5.6106」)。 2

  6. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 180 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:180,搜「DeepSeek-R1 used clip_eps = 10」)。这两个数书没有给出处,我们也没有核到原文;引用时应说明它们只有这一个来源。

  7. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 199 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:199,搜「short for epsilon」)。这是书里的一个边栏。

  8. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 109 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:109,搜「mathematical derivation is outside the scope」)。书给的那篇论文题目是《Proximal Policy Optimization Algorithms》,地址写在附录里(见「Appendix A. References and further reading」第 513 段,text/79-apx-a-appendix-a-references-and-further-reading.txt:513,搜「1707.06347」)——那个地址我们没有另行打开核对。

  9. 补充(不在书里,依据我们的 book 书架):这本书不讲 PPO 的推导。依据: shelf=ai-book-reference/the-rlhf-book-reinforcement-learning-from#05-policy-gradient-ppo.md 事实=该章讲清了 PPO 的裁剪目标是怎么来的,以及它为什么需要一个单独的价值模型。

  10. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 311 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:311,搜「8,192 responses」)与第 375 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:375,搜「we mimic the same idea more cheaply」)。 2

  11. 出处:「7.4 Stabilizing sequence-level GRPO using clipped policy ratios」第 413 段(text/63-ch07-04-7-4-stabilizing-sequence-level-grpo-using-clippe.txt:413,搜「no visible drop in the average reward」)。书还把「画出其余几个指标看看」留成了练习。

  12. 出处:「7.5 Controlling how much the model changes with a KL term」第 20 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:20,搜「REINFORCE with group-normalized advantages」)。这是书里的一个边栏。

  13. 出处:「7.5 Controlling how much the model changes with a KL term」第 35 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:35,搜「Kullback–Leibler divergence」)。

  14. 出处:「7.5 Controlling how much the model changes with a KL term」第 41 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:41,搜「another mechanism to control how much the model can change」)。原文把这一项称作一种约束(技术上叫正则项),用来抑制过大的更新、让模型别偏离原来的行为太远。

  15. 出处:「7.5 Controlling how much the model changes with a KL term」第 78 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:78,搜「every 400 steps」)。

  16. 出处:「7.5 Controlling how much the model changes with a KL term」第 156 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:156,搜「kl_loss = kl_coeff」)与第 161 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:161,搜「loss = pg_loss + kl_loss」)。

  17. 出处:「7.5 Controlling how much the model changes with a KL term」第 186 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:186,搜「keep an additional copy of the original model」)与第 192 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:192,搜「between 0.001 and 0.05」)。

  18. 出处:「7.5 Controlling how much the model changes with a KL term」第 267 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:267,搜「a total collapse where the loss values explode」)与第 273 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:273,搜「framework.raises Self profess(import」)。那句乱码是作者人工检查生成内容时看到的,不是自动统计出来的。

  19. 出处:「7.5 Controlling how much the model changes with a KL term」第 279 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:279,搜「longer sequences naturally lead to larger KL values」)。

  20. 出处:「7.5 Controlling how much the model changes with a KL term」第 285 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:285,搜「the only remaining source of gradient signal」)。书还建议读者去画其余几个指标,确认熵变得非常大。 2

  21. 出处:「7.5 Controlling how much the model changes with a KL term」第 304 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:304,搜「this was not sufficient」)到第 340 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:340,搜「prevent advantages from collapsing to zero」)。

  22. 出处:「7.5 Controlling how much the model changes with a KL term」第 291 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:291,搜「several recent works report that models can train better without it」)与第 346 段(text/64-ch07-05-7-5-controlling-how-much-the-model-changes-with-.txt:346,搜「a common recommendation is to omit the KL term altogether」)。

  23. 出处:「7.6 Adding an explicit format reward」第 32 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:32,搜「ordinary text tokens that mark the beginning and end」)。

  24. 出处:「7.6 Adding an explicit format reward」第 70 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:70,搜「tokenizer_base.encode」)与第 76 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:76,搜「[13708, 766, 29]」);加进去之后的结果在第 111 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:111,搜「single tokens [151667] and [151668]」)。

  25. 出处:「7.6 Adding an explicit format reward」第 117 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:117,搜「vocabulary size of 151936」)。

  26. 出处:「7.6 Adding an explicit format reward」第 130 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:130,搜「already supports these tokens natively」)。

  27. 出处:「7.6 Adding an explicit format reward」第 198 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:198,搜「def reward_format」)。找不到那对标签时函数会抛错并按 0.0 处理。

  28. 出处:「7.6 Adding an explicit format reward」第 300 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:300,搜「format_reward_weight」)。

  29. 出处:「7.6 Adding an explicit format reward」第 440 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:440,搜「the average reward stays approximately constant」)。诊断与两条改法在第 481 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:481,搜「make the format reward conditional」)。 2

  30. 出处:「7.6 Adding an explicit format reward」第 481 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:481,搜「make the format reward conditional」)。书把这两条改法出成了练习 7.2,参考结果放在附录 B。

  31. 出处:「7.6 Adding an explicit format reward」第 369 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:369,搜「the results would be quite poor」)与第 375 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:375,搜「instruction fine-tuning is covered in the next chapter」)。

  32. 出处:「7.6 Adding an explicit format reward」第 494 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:494,搜「the logged kl_loss remains 0」)与第 529 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:529,搜「The more useful quantities to monitor」)。这是书里的一个边栏。另外要提一句:这一节的练习正文里夹了一句和上下文无关的注记,明显是早期试读版的粘贴残留,读到那里跳过即可。

  33. 出处:「7.6 Adding an explicit format reward」第 655 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:655,搜「outside the scope of this chapter」)。清单本身从第 608 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:608,搜「Zero gradient signal filtering」)排到第 650 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:650,搜「Clip importance-sampling weights」)。

  34. 补充(不在书里,依据我们的 book 书架):这本书只列了这些改法的名字。依据: shelf=ai-book-reference/the-rlhf-book-reinforcement-learning-from#06-grpo-generation.md 事实=该章把 GRPO 及其后续改法排成了一条谱系,讲清了每一种在修 GRPO 的哪个毛病。

  35. 出处:「7.6 Adding an explicit format reward」第 590 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:590,搜「near infinite number of settings」)与第 596 段(text/65-ch07-06-7-6-adding-an-explicit-format-reward.txt:596,搜「understand the fundamentals」)。