跳到主要内容

GRPO — 让一组回答互相比,比出一个能改权重的信号

这一章讲什么: 第 10 章交出了四个数 [1, 1, 0, 0]。 这一章把它们一路变成模型内部那 6 亿个数的改动,每一步都有具体的中间结果。 然后是全书的高潮:50 步训练,15.2% → 47.4%,已经贴到官方推理版的 48.2%。

它在全书链条里的位置: 全书的落点。前面九章都是为它铺路 —— 第 04 章给模型和生成函数,第 05 章给验证器(在第 10 章变成了奖励), 第 07 章给温度和 top-p(这里用来采出多个回答), 第 09 章给对数概率(这里进入训练目标 —— 那处伏笔在这一章兑现)。

需要的基础: 第 10 章那四个奖励,第 09 章那套对数概率,第 02 章第 2 节那个训练循环。

顶层全景:从四个奖励到一次权重更新

① 奖励(第 10 章交来的) [1, 1, 0, 0]
│ 换算成「比这一组平均好多少」

② 优势 [0.8659, 0.8659, −0.8659, −0.8659]
│ 另一边:算每条回答「被这样写出来」的可能性有多大

③ 每条回答的对数概率 [−7.9243, −20.1546, −16.6130, −23.3677]
│ 把 ② 和 ③ 对应相乘、取平均、再乘 −1

④ 一个数 **−2.5764**
│ 照着它,按第 02 章那个循环把 6 亿个数各挪一丁点

⑤ 重复 50 次 ⟹ **15.2% → 47.4%**

图说:整章就这五步。② 是「组相对」三个字的落点,
③ 是第 09 章那套算法的第二次出场(而且改了一处),④ 那个负号有专门的理由。

1. 奖励不能直接用:先换算成「比这一组的平均好多少」

问题在哪: 假设这一组四个回答的奖励是 [1, 1, 1, 1](全对)。 四个都拿满分,那该加强谁、削弱谁?没有信息。 反过来 [0, 0, 0, 0](全错)也一样。

所以要换一个量:不看绝对分,看「比这一组的平均高多少还是低多少」。

奖励 [1, 1, 0, 0]
│ 这一组的平均是 0.5
├─ 1 比平均高 0.5
└─ 0 比平均低 0.5
│ 再按这一组的离散程度缩放一下(除以标准差,并加一个极小的数防止除以零)

优势 [0.8659, 0.8659, −0.8659, −0.8659]

这个换算出来的数叫优势(advantage)1

它有什么用?书说得很干脆:优势值直接缩放后面那一步的改动幅度2:

优势后果
正的抬高「产生这条回答的那些动作」的可能性
负的压低
接近零几乎不起作用

「组相对」三个字的全部意思就在这里。 书自己下的定义: GRPO 对同一道题生成多个回答,然后把它们互相比较,以此构造出学习信号3

——注意这句话反过来读的推论:如果这一组回答好坏一致,就比不出任何东西。 这不是空话,第 4 节会看到它真的发生。

2. 另一边:每条回答被「这样写出来」的可能性有多大

这一节是第 09 章那套算法的第二次出场,而且改了一处很要紧的地方。

先回顾:第 09 章算的是「一条回答里每个词的可能性,各自取对数再相加」, 最后为了公平比较不同长度的回答,还求了平均**。

这里要改回求和。理由是硬的4:

GRPO 给的是「整条回答一个奖励、一个优势」。 所以对数概率也应当反映**「产生整条序列」的可能性有多大**,而不是每个词的平均值。

书还把「不这么做会怎样」讲了出来5:

求平均会按长度做一次归一化。那对「比较不同长度的答案」有用(第 09 章正是这个场景), 但在这里它会无意中重新缩放学习信号,让长回答和短回答对更新的贡献变得不均。

同一条回答,两种算法的结果差多少,书当场量了6:

同一条回答:
每个词的平均对数概率 = **−0.0613**
乘以答案的词数 → 序列级的 **−16.2390**
直接用求和版函数算 → **−16.2998**
↑ 两者差 0.06,书归因为浮点行为和舍入

走查第 ③ 步:四条回答各自的序列级对数概率7:

回答对数概率
r1 \boxed{83}−7.9243
r2 The correct answer is \boxed{83}−20.1546
r3 The final answer is 83−16.6130
r4 We get \boxed{38}−23.3677

一个副作用,书主动交代了

回答越长,求和出来的这个值就越负,而且是成正比地越负5

于是有一个隐含的后果:

两个一样好的答案里,训练会隐含地偏爱短的那一个 —— 因为短的那个在「可能性」这本账上更便宜。 书的原话:求和的对数概率会鼓励模型早点停下来,除非写得更长能换到更高的奖励。

——这条要记住。第 13 章那次训练崩溃,根子就在这条性质上。

3. 把两边合起来:算出一个数,照着它去改权重

现在把优势和对数概率对应相乘,取平均,再乘上 −1。

优势 [ 0.8659, 0.8659, −0.8659, −0.8659]
对数概率 [−7.9243, −20.1546, −16.6130, −23.3677]
│ 对应相乘
▼ [−6.862, −17.452, +14.386, +20.234] ← 这四个乘积是我们算的,书没有印出来
│ 取平均
▼ 约 +2.576
│ 乘 −1
▼ **−2.5764** ← **书里印出来的真实结果**[^8]

训练时要往小了推的那个数,这一行就叫损失。 上面算出来的 −2.5764 就是它。

还要认一个词。第 02 章第 2 节说过「把每个数朝差得少一点的方向挪一丁点」—— 那套「每个参数该往哪挪、挪多少」的方向信息,这一行就叫梯度。

把这两个词和第 10 章那个「策略」拼起来,就是这个数的全名:策略梯度损失 (policy gradient loss)—— 一个照着「该怎么改这个模型」算出来的、要往小了推的数。

那个负号是怎么回事:书专门解释了

这一处不解释,读者会一直觉得别扭:为什么损失是负的?

先说一件更基础的事: 训练说到底就是朝着让某个数变小的方向一步步挪 —— 这件事有个统称,就叫优化

书的回答8:

我们真正想做的是「最大化」:让高优势的回答,对数概率更高。 而现成的工具里,那个专管「按方向去挪权重」的部件(它就叫优化器) 被定义成「最小化一个数」。 所以把这个目标乘上 −1,就把一个最大化问题变成了等价的最小化问题。

书还强调:最小化「负的目标」,和最大化原目标,得到的参数改动一模一样 —— 只是这样写才能直接用现成的那个部件9。 (书甚至专门开了个边栏,用「假设要最大化的目标就是常数 3」这样的例子演示了一遍这个等价10。)

还有一处技术细节,不讲会留下疑问

书特意说明:优势在这一步要被「摘下来」,不让改动回流到算优势那一段11

为什么: 优势在这次更新里被当成一个固定的学习信号; 我们只想更新那些影响对数概率的参数,不想去改「奖励怎么算」这件事。

4. 一次「什么都没发生」的真实更新

这是全章最好的教学素材,而且它是真跑出来的,不是编的。

书在真实数据上跑了一次完整的计算,结果是这样12:

两个回答:
第一个只生成了 4 个小块,内容是 " 14<|endoftext|>" —— 刚说了个 14 就自己停了
第二个撞到 256 个小块的上限还没答完


奖励 [0.0, 0.0] 两个都答错
│ 都一样 ⟹ 谁也不比谁好

优势 [0.0, 0.0] **全为零**


损失 **−0.0** **梯度为零 ⟹ 那 6 亿个数一动不动**

图说:这一步训练**完全白跑了**。花的算力一分不少,学到的东西是零。

这个例子把「组相对」的含义演示到了骨子里:

一组回答如果好坏一致,GRPO 就学不到任何东西。

这条性质不是缺陷,是这个算法的定义本身。 但它会变成一个实际的麻烦: 如果模型太弱、一整组全答错(或者太强、一整组全答对), 训练就会空转。

——第 12 章会把这件事做成一个能长期盯着的仪表,第 13 章会看到它引发的一次彻底崩溃。

一处口径,书顺带交代了13:这一章的实现故意省掉了原始 GRPO 公式里的一项 (那一项要到第 13 章才补上)。 书给的理由:GRPO 在数学题上常被报告为去掉那一项时表现更好。

5. 训练循环:八步里只有一步是新的

这一节要打消一个心理负担。

书说得很清楚:这八步几乎全是标准的训练循环, 唯一专属推理模型的是第 4 步 —— 损失由 GRPO 算,而不是别的模型常用的那种损失14

① 建一个优化器(第 3 节讲过的那个部件)
② 一步一步迭代
③ 把上一步残留的改动清零
④ ★ 算 GRPO 损失 ← **只有这一步是新的**
⑤ 反着推一遍,算出每个参数该往哪挪
└ 顺便把过大的改动截断,稳住训练
⑥ 让优化器真的去挪权重
⑦ 记账:平均奖励、平均回答长度、损失,写进文件
⑧ 每隔几步存一次进度

图说:③⑤⑥ 就是第 02 章第 2 节那个「看差多远 → 每个数朝差得少的方向挪一丁点」的循环,
一个字没变。**换的只有第 ④ 步「差多远」怎么算。**

下面这些数是开跑之前要人手定下来的 —— 它们不是训出来的,而是我们替模型定的。 这类要人定的数,行话就叫超参数。

其中一个要先认个名字:显卡上那块用来放模型和中间结果的内存,就叫显存 —— 它不够用,是这一整章最常见的拦路虎。书给的取值和理由15:

参数书给的理由
训练步数50(而训练集有 12000 道题)纯粹是为了在教学场景下耗时合理;但它已经足够拿到好结果
每道题采几个回答4省资源;显存不够可以降到 2
每个回答最多多少小块512同上;测试时可以降到 64
温度 / top-p0.8 / 0.9常用区间是 0.7–0.9,兼顾多样性和连贯
每一步挪多远1e-5「在合理范围里,效果不错」——「每一步挪多远」这个数就叫学习率
隔几步存一次5一个进度文件约 1.5 GB;真跑长训练建议设成 50 或 100

怎么读训练日志

书跑到第 7 步就手动中断了,把日志原样印了出来16:

[Step 1/50] loss=-0.0000 reward_avg=0.000 avg_resp_len=88.0
[Step 2/50] loss=-0.0000 reward_avg=0.000 avg_resp_len=7.5
[Step 3/50] loss=-0.0000 reward_avg=0.000 avg_resp_len=6.5
[Step 4/50] loss=0.0909 reward_avg=0.250 avg_resp_len=6.5
[Step 5/50] loss=1.1001 reward_avg=0.500 avg_resp_len=300.5

书对这份日志的解读是这一节最要紧的部分17:

① 损失和奖励上下跳是正常的。 强化学习训练就是这样。

reward_avg 怎么读: 每道题采 4 个回答时, 0.5 = 四个里对了两个,0.25 = 对了一个,0 = 全错。

③ 损失的数值不要过度解读。 reward_avg=0.000 的那几步损失接近零,正是第 4 节讲的那件事: 所有回答拿到相同奖励 ⟹ 优势消失 ⟹ 几乎没有学习信号。 而损失数值大,只是反映这一组回答之间差距大 —— 训练初期本来就这样。

④ 该盯的是两条趋势18:多步平均下来,奖励应当上升;推理准确率应当提升。

一处书自己的不一致,我们照实说明: 正文说「第 3 步(上面输出的第 4 行)损失数值较大」, 但输出里第 3 步的损失是 -0.0000,第 4 行对应的是第 4 步(0.0909)这是早期试读版的步号错位。 引这段时按实际输出说17

一条工程现实19:强化学习相当吃资源,因为每一步都要生成好几条(可能很长的)回答; 所以书里的实现不支持成批处理。 有好几张显卡的读者可以用补充材料里带批处理和多卡的版本。

6. 高潮:50 步,15.2% → 47.4%

全部 500 道题,评测时允许生成 2048 个小块20:

#模型训练步训练时每条上限每题采几个准确率平均回答长度
1base(第 05 章)15.2%78.85 个小块
2官方推理版(第 05 章)48.2%1369.79 个小块
3本章训出来的50256443.2%560.22
4本章训出来的50512445.6%579.81
5本章训出来的50512847.4%586.11

四条解读,书都写了:

① 50 步就把 15.2% 推到了 47.4%,已经很接近官方推理版的 48.2%21

② 平均回答长度从 78.85 涨到 586 —— 模型确实学会了先写中间步骤。 但它仍明显短于官方推理版的 1369.79,书说这是训练时限制了长度的预期结果22

③ 训练时的长度上限是一条隐形的塑形力。 书说得很具体23:

上限设成 512,就等于告诉模型:512 个小块之内必须把答案框交出来,否则拿不到奖励。 书还引了 DeepSeek-R1 团队的观察:回答长度会随训练自然变长,因为模型开始写中间解释; 所以想要最高准确率,就不该把长度卡得太死。

——表里第 3、4 行就是这条的实物证据:上限从 256 提到 512,准确率从 43.2% 提到 45.6%。

④ 只训 50 步不是偷懒,是一个发现24:

50 步似乎已经足以在 base 模型里「解锁」推理行为。 而且训更久不一定更好,甚至可能掉准确率,因为原始的 GRPO 公式在长跑中可能不稳定。

——最后这句话直接把读者推向第 12、13 章。那两章讲的就是「跑久了会怎样」。

读者不想自己训也行: 作者把训练好的进度文件上传了,可以直接下载来评测25

作者的判断与证据

说法性质
优势 [0.8659, ...]、四个对数概率、损失 −2.5764书里印出来的实测(但输入的四个回答是第 10 章那组编出来的)
那次「零梯度」的更新书里印出来的真实运行结果,不是编的
−0.0613 × 词数 = −16.2390,而求和版是 −16.2998书里的实测,差异书归因为浮点行为和舍入
表 6.1 五行书里的实测
训练日志五行书里印出来的真实日志(作者跑到第 7 步手动中断)
为什么这里求和而不求平均作者的论证,从「GRPO 给整条回答一个奖励」推出来的
求和会隐含偏爱短回答作者的推论,书在这一章没有量它;但第 13 章会看到它闯的祸
那个负号的解释技术事实,不是判断
各个超参数的取值理由作者的经验,他自己也说「在合理范围里」
「50 步已足以解锁推理行为」作者的判断,措辞是「似乎」(appears)
训更久可能掉分作者的实验观察,细节留到第 12 章
「长度上限是一条隐形的塑形力」作者的解释,表里第 3、4 行是它的旁证
训练日志那处步号错位这是我们发现的,书没有承认

判断(我们的,不是书里的): 这一章真正稀有的不是那 47.4%,是第 4 节那次「什么都没发生」。 一本教程肯把一次白跑的训练步印在正文里,比它印十张漂亮的曲线更有用 —— 因为你自己训的时候,十有八九先撞上的是这个,不是那个 47.4%。 如果错,会错在: 我们没法确认这种空转在真实训练里占多大比例。 书只给了一个例子,没有统计「50 步里有多少步是零梯度的」—— 而这个比例恰恰决定了「一组采几个回答」该怎么选。

边界与局限

  1. 走查用的那四个回答是编的(第 10 章说明过)。只有第 4 节那次零梯度是真跑出来的。
  2. 这一章的实现省掉了原始公式里的一项,第 13 章才补上 —— 而补上之后会崩,那也是第 13 章。
  3. 不支持成批处理。 每一步都要生成好几条长回答,书明说实现里没做批处理。
  4. 只训了 50 步,而训练集有 12000 道题。 换句话说,绝大部分数据根本没被用到。
  5. 表 6.1 每一行只跑了一次。 和前面几章同样的问题。
  6. 超参数没有做扫描。 学习率、每题采几个回答这些值,书给的是「合理范围里的一组」,不是调优过的。
  7. 「优势要摘下来不让改动回流」这类实现细节,书点到为止。 想深究要看代码。
  8. 书里的训练日志有一处步号错位(第 5 节末尾),引用时要当心。

可带走的

  1. 奖励不能直接用。 全对或者全错时,绝对分数不含任何「谁更好」的信息。
  2. 先换算成「比这一组的平均好多少」,这个数叫优势。 正的抬高、负的压低、接近零的几乎不起作用 —— 它直接缩放这一步改动的幅度。
  3. 「组相对」的全部意思:同一道题采多个回答,让它们互相比,比出学习信号。
  4. 一组回答好坏一致时,这个算法学不到任何东西(优势全零 ⟹ 权重一动不动)。 这不是 bug,是定义。
  5. 这里的对数概率要求和,不能求平均 —— 因为奖励是给整条回答的, 所以可能性也要反映「产生整条回答」这件事。 (第 09 章求平均是为了公平比较不同长度的答案,场景不同。)
  6. 求和有个副作用:回答越长值越负,所以优化会隐含地偏爱短回答。 记住这条 —— 第 13 章那次崩溃就是它闯的祸。
  7. 损失 = 优势 × 对数概率,取平均,再乘 −1。 那个负号只是因为优化器被定义成「最小化」; 最小化负目标和最大化原目标,给出的参数改动一模一样。
  8. 训练循环八步里只有一步是新的 —— 其余全是标准的那一套。 换的只是「差多远」怎么算。
  9. 读训练日志盯两条趋势:多步平均的奖励在不在涨、准确率在不在涨。 单步的损失数值不要过度解读 —— 接近零多半只是说明这一组回答分数相同。
  10. 训练时的长度上限是一条隐形的塑形力: 上限就是在告诉模型「多少个小块之内必须交卷」。 想要高准确率,别把它卡太死(256 → 512,准确率 43.2% → 45.6%)。
  11. 50 步、一台机器,就能把 15.2% 推到 47.4%,贴近官方推理版的 48.2%。 平均回答长度从 79 涨到 586 —— 它是真学会了写中间步骤,不是学会了猜答案。
  12. 但训更久不一定更好,甚至可能掉分。 为什么,第 12、13 章讲。

原文地图

主题原书章原文位置
奖励与优势两个向量6.7 Preparing learning signals from rollouts via advantagestext/52-ch06-07-6-7-preparing-learning-signals-from-rollouts-via.txt:73(搜「the corresponding advantages are」)
「组相对」的定义同上text/52-ch06-07-6-7-preparing-learning-signals-from-rollouts-via.txt:92(搜「group relative」)
优势直接缩放改动幅度同上text/52-ch06-07-6-7-preparing-learning-signals-from-rollouts-via.txt:100(搜「directly scale the gradients」) · :106(搜「Rollouts with advantage close to zero」)
为什么求和不求平均6.8 Scoring rollouts with sequence log-probabilitiestext/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:140(搜「a single reward and advantage to each rollout」) · :152(搜「unintentionally rescale the learning signal」)
求和会偏爱短回答同上text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:186(搜「encourage the model to stop earlier」)
两种算法的对照同上text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:128(搜「-0.061279296875」) · :180(搜「-16.239013671875」) · :243(搜「-16.2998」)
四个对数概率同上text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:377(搜「Answer: \boxed{83}」) · :387(搜「-23.3677」)
损失怎么算 · 那个负号6.9 From advantages to policy updates via the GRPO losstext/54-ch06-09-6-9-from-advantages-to-policy-updates-via-the-gr.txt:20(搜「applying a negative sign」) · :81(搜「we convert the maximization problem」) · :94(搜「a simple scalar value」)
损失的数值同上text/54-ch06-09-6-9-from-advantages-to-policy-updates-via-the-gr.txt:63(搜「-2.5764」)
优势要摘下来同上text/54-ch06-09-6-9-from-advantages-to-policy-updates-via-the-gr.txt:69(搜「treated as fixed learning signals」)
省掉的那一项6.10 Putting everything together in a single GRPO functiontext/55-ch06-10-6-10-putting-everything-together-in-a-single-grp.txt:135(搜「intentionally omit the KL loss term」)
那次零梯度的更新同上text/55-ch06-10-6-10-putting-everything-together-in-a-single-grp.txt:177(搜「'advantages': [0.0, 0.0]」)
八步里只有一步是新的6.11 Implementing the GRPO training looptext/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:20(搜「The only stage specific to reasoning models」)
超参数与理由同上text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:277(搜「reasonable and common ranges are 0.7-0.9」) · :301(搜「approximately 1.5 GB of disk space」)
训练日志同上text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:315(搜「[Step 1/50]」) · :322(搜「KeyboardInterrupt」)
日志怎么读同上text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:328(搜「fluctuate, which is normal in RL training」) · :340(搜「should not be over-interpreted」) · :352(搜「average reward should increase」)
不支持批处理同上text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:373(搜「does not support batching」)
表 6.16.12 Loading and evaluating saved model checkpoints:102(搜「Table 6.1」) · :143(搜「78.85」) · :160(搜「1369.79」) · :175(搜「43.2%」) · :192(搜「45.6%」) · :209(搜「47.4%」) · :211(搜「586.11」),均在 text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt
表的解读同上text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt:220(搜「Max tokens」) · :226(搜「shorter responses on average」) · :238(搜「close to the accuracy of the official Qwen3」) · :250(搜「can be unstable over longer runs」)

Footnotes

  1. 出处:「6.7 Preparing learning signals from rollouts via advantages」第 73 段(text/52-ch06-07-6-7-preparing-learning-signals-from-rollouts-via.txt:73,搜「the corresponding advantages are」)。那个「加一个极小的数防止除以零」在书里的实现里是一个 1e-4 的常数。

  2. 出处:「6.7 Preparing learning signals from rollouts via advantages」第 100 段(text/52-ch06-07-6-7-preparing-learning-signals-from-rollouts-via.txt:100,搜「directly scale the gradients」)与第 106 段(text/52-ch06-07-6-7-preparing-learning-signals-from-rollouts-via.txt:106,搜「Rollouts with advantage close to zero」)。

  3. 出处:「6.7 Preparing learning signals from rollouts via advantages」第 92 段(text/52-ch06-07-6-7-preparing-learning-signals-from-rollouts-via.txt:92,搜「group relative」)。

  4. 出处:「6.8 Scoring rollouts with sequence log-probabilities」第 140 段(text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:140,搜「a single reward and advantage to each rollout」)。

  5. 出处:「6.8 Scoring rollouts with sequence log-probabilities」第 152 段(text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:152,搜「unintentionally rescale the learning signal」)与第 186 段(text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:186,搜「encourage the model to stop earlier」)。第 152 段末尾书还预告了:改进算法时会再回到「按词算」这个话题 —— 那是第 13 章第 6 节列的那些改法之一。 2

  6. 出处:「6.8 Scoring rollouts with sequence log-probabilities」第 128 段(text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:128,搜「-0.061279296875」)、第 180 段(text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:180,搜「-16.239013671875」)与第 243 段(text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:243,搜「-16.2998」)。

  7. 出处:「6.8 Scoring rollouts with sequence log-probabilities」第 377 段起(text/53-ch06-08-6-8-scoring-rollouts-with-sequence-log-probabili.txt:377,搜「Answer: \boxed{83}」),四个值依次是 −7.9243、−20.1546、−16.6130、−23.3677(最后一个见 :387,搜「-23.3677」)。

  8. 出处:「6.9 From advantages to policy updates via the GRPO loss」第 20 段(text/54-ch06-09-6-9-from-advantages-to-policy-updates-via-the-gr.txt:20,搜「applying a negative sign」)。

  9. 出处:「6.9 From advantages to policy updates via the GRPO loss」第 81 段(text/54-ch06-09-6-9-from-advantages-to-policy-updates-via-the-gr.txt:81,搜「we convert the maximization problem」)。

  10. 出处:「6.9 From advantages to policy updates via the GRPO loss」第 94 段(text/54-ch06-09-6-9-from-advantages-to-policy-updates-via-the-gr.txt:94,搜「a simple scalar value」)。这是书里的一个边栏。

  11. 出处:「6.9 From advantages to policy updates via the GRPO loss」第 69 段(text/54-ch06-09-6-9-from-advantages-to-policy-updates-via-the-gr.txt:69,搜「treated as fixed learning signals」)。

  12. 出处:「6.10 Putting everything together in a single GRPO function」第 177 段起(text/55-ch06-10-6-10-putting-everything-together-in-a-single-grp.txt:177,搜「'advantages': [0.0, 0.0]」)。那两条回答的内容和长度也在同一段输出里。书还把这件事出成了一道练习:强行让所有奖励相同,验证损失为零,并问「为什么这个行为是可取的」。

  13. 出处:「6.10 Putting everything together in a single GRPO function」第 135 段(text/55-ch06-10-6-10-putting-everything-together-in-a-single-grp.txt:135,搜「intentionally omit the KL loss term」)。

  14. 出处:「6.11 Implementing the GRPO training loop」第 20 段(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:20,搜「The only stage specific to reasoning models」)。

  15. 出处:「6.11 Implementing the GRPO training loop」第 277 段(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:277,搜「reasonable and common ranges are 0.7-0.9」)与第 301 段(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:301,搜「approximately 1.5 GB of disk space」)。

  16. 出处:「6.11 Implementing the GRPO training loop」第 315 段起(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:315,搜「[Step 1/50]」),中断那一行在第 322 段(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:322,搜「KeyboardInterrupt」)。

  17. 出处:「6.11 Implementing the GRPO training loop」第 328 段(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:328,搜「fluctuate, which is normal in RL training」)与第 340 段(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:340,搜「should not be over-interpreted」)。第 340 段正文说的「step 3(输出的第 4 行)」与日志本身对不上:日志里第 3 步是 -0.0000,第 4 行是第 4 步的 0.0909。这处错位是我们发现的,书没有承认。 2

  18. 出处:「6.11 Implementing the GRPO training loop」第 352 段(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:352,搜「average reward should increase」)。

  19. 出处:「6.11 Implementing the GRPO training loop」第 373 段(text/56-ch06-11-6-11-implementing-the-grpo-training-loop.txt:373,搜「does not support batching」)。

  20. 出处:表 6.1,「6.12 Loading and evaluating saved model checkpoints」第 102 段起(text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt:102,搜「Table 6.1」)。五行的数值见「原文地图」那一行列出的地址。

  21. 出处:「6.12 Loading and evaluating saved model checkpoints」第 238 段(text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt:238,搜「close to the accuracy of the official Qwen3」)。

  22. 出处:「6.12 Loading and evaluating saved model checkpoints」第 226 段(text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt:226,搜「shorter responses on average」)。同一段说明了评测时允许生成 2048 个小块。

  23. 出处:「6.12 Loading and evaluating saved model checkpoints」第 220 段(text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt:220,搜「Max tokens」)。

  24. 出处:「6.12 Loading and evaluating saved model checkpoints」第 250 段(text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt:250,搜「can be unstable over longer runs」)。原文用的是「appears sufficient to unlock reasoning behavior」——「似乎已足以解锁推理行为」。

  25. 出处:「6.12 Loading and evaluating saved model checkpoints」第 47 段(text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt:47,搜「download_qwen3_grpo_checkpoints」)。作者还上传了从 50 步到 9000 步的更多进度文件,地址在同一节第 262 段(text/57-ch06-12-6-12-loading-and-evaluating-saved-model-checkpoi.txt:262,搜「huggingface.co/rasbt」)——那个地址我们没有另行打开核对。