一、模型每个词只能想这么久

心算一下:23 × 47 等于多少?

大多数人没法一秒钟脱口而出。你会在脑子里拆开:20×47=940,3×47=141,940+141=1081。或者干脆拿张纸。

现在回想第 10、11 讲拼出来的模型。它每生成一个 token,都是让输入从第一层一路走到最后一层,走一遍就结束——层数是固定的,每一层做的计算量也是固定的。不管问题是"1+1"还是"证明一个定理",生成下一个 token 花的计算量一模一样。

这意味着:如果要求模型看完题目后,下一个 token 就直接是答案,它只有一次前向传播的计算量来解决这道题。对简单问题足够,对需要好几步推理的问题,这点计算量可能根本不够——就像要求你一秒钟心算出 23 × 47。

这一讲要讲的,是这个限制怎么被绕开,以及一类专门为此训练出来的模型——推理模型(reasoning model)。

二、打个比方:草稿纸

一张草稿纸不会让你变得更聪明。你的脑子还是那个脑子。

但它做了两件事:让你可以把大问题拆成几步,一步只处理一小块;让你把中间结果写下来,后面的步骤可以随时回头看,不用全部记在脑子里。有了草稿纸,同一个脑子能解出原本解不出的题。

⭐ 对语言模型来说,它自己生成的 token 就是草稿纸。这不是比喻上的相似,是机制上的相同,下一节会具体讲为什么。

三、把直觉钉成机制

为什么"多写几个字"真的能让模型想得更多

两个事实放在一起看。

第一,每生成一个 token,就多做一次完整的前向传播。 如果模型先写 200 个 token 的中间步骤再给答案,那么在给出答案之前,它一共做了 200 次前向传播——计算量是"直接给答案"的 200 倍。

第二,写下的每一个 token 都会被接到输入序列末尾(第 13 讲:推理时必须一步步来),后面每一步的自注意力(第 9 讲)都能读到它们。 第 30 步算出的中间结果"940",在第 80 步需要用的时候,可以直接通过注意力把它读回来。

⭐ 合起来:模型单次前向传播能做的计算深度,被层数卡死了;但它可以把中间结果写成 token,让下一次前向传播从这个结果接着算。 写下的 token 就是一张外部的草稿纸——计算的总深度不再被层数限制,而是随着写下的步骤数增长。

直接回答:
  [题目] ──一次前向传播──▶ [答案]

先写中间步骤:
  [题目] ─▶ 20×47=940 ─▶ 3×47=141 ─▶ 940+141=1081 ─▶ [答案]
             ↑ 每一步都是一次前向传播,并且能读到之前写下的所有步骤

让模型"一步一步写出推理过程再给答案",这种做法叫思维链(chain of thought)。最早的发现相当朴素:只要在问题后面加一句"让我们一步一步地想",模型在推理题上的正确率就会明显上升——因为预训练语料里本来就有大量"一步步解题"的文本,这句话把模型引向了那种续写方式。

怎么教会模型写好这张草稿纸

光靠一句提示,效果并不稳定。要让模型可靠地写出好的推理过程,需要专门训练。前三讲的方法各有各的问题:

方法 在"教推理"上的问题
SFT(第 16 讲) 需要人工写大量详细的解题过程,贵;模型的上限被写示范的人卡住
RLHF(第 17 讲) 奖励模型很难可靠地判断一段几千字的推理对不对;而且容易被作弊
DPO(第 18 讲) 离线,只能从现成的数据里学,模型自己摸索出的新解法得不到反馈

但数学题和编程题有一个特殊的性质:最终答案的对错,可以被一个程序客观地检查。数学题有标准答案,比一比就知道;代码可以直接跑测试用例,通过就是通过。

RLVR(Reinforcement Learning with Verifiable Rewards,基于可验证奖励的强化学习) 利用的就是这一点:

  • 保留第 17 讲第 3 步的强化学习框架:让模型自己生成解答,根据得分调整。
  • 把奖励模型整个拿掉,换成一个验证程序:最终答案对了,奖励 1;错了,奖励 0。

RLVR:在答案可以被程序自动验证的任务上,让模型自行生成完整的推理过程和答案,以验证结果(对或错)作为奖励进行强化学习。

⭐ 这一改动同时兑现了前两讲留下的两件事:它是在线的,模型不断生成新的解答并得到反馈,第 18 讲 DPO 放弃的"探索"被拿了回来;奖励不再来自一个模仿人类口味的模型,第 17 讲那种"找到奖励模型的漏洞去刷分"的空间被大幅压缩——验证程序只认答案对不对,不在乎你写得长不长、语气笃不笃定。

手算:奖励在一道题上怎么分配

对同一道题,让模型生成 4 个完整的解答(第 21 讲会讲清楚同一个模型为什么能对同一个问题生成不同的回答)。验证程序检查每个解答的最终答案:

情况一:这道题模型有时做得对,有时做不对。

解答 答案对吗 奖励 减去平均(平均 = 0.25)
1 对 1 +0.75
2 错 0 −0.25
3 错 0 −0.25
4 错 0 −0.25

按第 17 讲的规则——“得分减平均分"当作权重,乘在 log P(这个解答) 的梯度上——解答 1 从头到尾整段推理的概率被调高,另外三个被调低。模型从自己的一次成功里学到了东西。

这里"平均分"的算法值得注意:它是同一道题的这几次尝试的平均。第 17 讲提到 PPO 通常要额外训练一个模型来估计"平均分该是多少”;用同一题多次采样的平均直接充当这个基准,就省掉了那个模型。

情况二:这道题太简单,4 个解答全对。

奖励 = [1, 1, 1, 1],平均 = 1
减去平均 = [0, 0, 0, 0]   ← 全部权重为 0,什么都没学到

情况三:这道题太难,4 个解答全错。

奖励 = [0, 0, 0, 0],平均 = 0
减去平均 = [0, 0, 0, 0]   ← 同样什么都没学到

⭐ 这三种情况揭示了这种训练一个非常实际的性质:只有"有时对、有时错"的题目才产生学习信号。太简单的题,没有什么可改进的;太难的题,模型一次都没碰对,不知道该往哪个方向走。训练效率高度依赖于题目难度是否落在模型能力的边缘——这也是为什么实践中需要精心挑选、随着训练进展不断调整训练题目的难度。

训练出来的模型,在草稿纸上做了什么

⚠️ 关于时效性:2024 年起,陆续有模型开始以"先长时间思考、再给答案"的方式发布,2025 年初有团队公开了用这类强化学习训练推理模型的详细报告。具体模型会不断更新换代,但下面这些在公开报告中被观察到的现象,反映的是这种训练方式的一般特点。

在 RLVR 训练过程中,没有人明确教过模型"应该怎么思考",奖励只看最终答案。但公开报告中反复观察到:

  • 推理过程越写越长:随着训练推进,模型自发地为难题分配更多的 token。
  • 出现自我检查和回退:推理过程中出现类似"等等,这一步好像算错了,重新算一下"的片段。

这些行为没有被直接奖励过。它们被保留下来的原因很简单:写得更长、会回头检查的推理过程,更容易得到正确答案,所以在"得分减平均"的规则下被一次次调高了概率。 这和第 1 讲"猜词逼出理解"是同一种逻辑:只给一个简单的目标,更复杂的行为作为达成这个目标的手段被逼了出来。

测试时计算:扩展的第二个方向

第 15 讲的 Scaling Laws 讲的是训练时投入更多资源——更大的模型、更多的数据、更多的计算——换来更低的损失。

推理模型打开了另一个方向:模型训练好之后,在回答每个问题时投入更多计算,也能换来更好的结果。这叫测试时计算(test-time compute)。有两种基本的花法:

串行:让模型写更长的推理过程(上面讲的全部内容)。

并行:对同一个问题独立生成好几个答案,再从中挑一个——比如取出现次数最多的那个(多数投票),或者用验证程序挑出能通过检查的那个。

用一个简化的例子看多数投票的效果。假设这是一道判断题,模型单次回答正确的概率是 0.6,各次回答相互独立。生成 3 个答案,取多数:

3 个都对:            0.6³           = 0.216
恰好 2 个对:  3 × 0.6² × 0.4        = 0.432
多数正确的概率 = 0.216 + 0.432 = 0.648

从 0.6 提升到 0.648,付出的是 3 倍的计算量。生成 5 个取多数,正确率大约是 0.683——又一次,每多花一份计算,买到的改善越来越少,这和第 15 讲幂律的"边际收益递减"是同一个故事。

⚠️ 这个计算依赖两个假设:各次回答相互独立,以及单次正确率高于 0.5。如果单次正确率只有 0.4,同样的算法会让多数投票的正确率低于 0.4——投票放大的是模型本来的倾向,不管这个倾向是对是错。而同一个模型的多次回答,实际上往往会犯相似的错误,并不真的独立。

四、代价

⭐⭐ 只在能验证的地方有效。RLVR 的全部威力来自"对错可以被程序检查"。数学、编程、某些逻辑题满足这个条件;但"写一封得体的道歉信"“给一个商业决策出主意"没有标准答案,也没有验证程序。在这些领域,奖励依然要回到第 17、18 讲的人类偏好或者 AI 判断,带着它们的全部问题。在可验证领域练出来的推理能力,能在多大程度上迁移到其他领域,目前没有定论。

⚠️ 奖励作弊没有消失,只是换了形式。验证程序本身也可能有漏洞。测试用例写得不够全面时,模型可能学会写出"恰好能通过这几个测试、但并没有真正解决问题"的代码;答案格式的检查不够严格时,模型可能学会钻格式的空子。古德哈特定律(第 17 讲)依然成立:验证程序也是一个指标,它被当成目标去优化时,它的每一个疏漏都会被找到。

⚠️ 答案对了,不代表过程对了。奖励只看最终答案,所以一段推理只要结论正确,整段都会被调高概率——包括其中碰巧写错、但没影响结论的步骤。反过来,一段大部分正确、最后一步出错的推理,整段都会被调低。一个自然的想法是给每一步单独打分,但那需要一个能判断"这一步对不对"的评判者,又把第 17 讲那个可以被钻空子的奖励模型请了回来。更深一层的问题是:模型写下的推理过程,是否如实反映了它实际得出答案的方式? 这个问题会在第 31 讲讨论可解释性时再次出现。

⚠️ 每一个推理 token 都要按顺序生成。第 13 讲讲过:训练时可以并行,推理时必须一个 token 一个 token 地串行生成。推理模型把回答前的 token 数从几十个拉到几千个,恰好把最贵的那部分放大了几十上百倍——用户等待的时间和服务的成本随之上升。对一个简单问题也写上几千字推理,就是纯粹的浪费。这笔账第 24 讲会详细算。

五、和后面课程的关系

  • 第 20 讲 会把 SFT、RLHF、DPO、RLVR 放在一起看:这些方法到底改变了模型的什么,又没改变什么。
  • 第 21 讲(采样策略) 会讲清楚这一讲反复用到的"同一个问题生成好几个不同解答"是怎么做到的。RLVR 的探索依赖这种多样性:如果模型每次都生成一模一样的解答,情况一那样"有对有错"的学习信号就不会出现。
  • 第 24 讲 是这一讲的另一半:这一讲讲测试时计算为什么有效,那一讲讲它在延迟和成本上的代价。
  • 第 28 讲(多步推理与规划) 会把这一讲的"写下中间步骤"扩展到"中间步骤里还可以调用外部工具”。
  • 第 31 讲(可解释性) 会回到第四节的问题:写下的推理过程,是不是模型真实的思考过程。

六、本讲小结

  • 模型每生成一个 token 的计算量是固定的,直接给答案意味着只有一次前向传播的计算量来解题。
  • ⭐ 生成的 token 就是草稿纸:每多写一个 token,就多一次前向传播;写下的中间结果会被后续步骤的注意力读到。计算的总深度不再被层数限制,这就是思维链有效的机制。
  • ⭐ RLVR:保留第 17 讲的在线强化学习框架,把奖励模型换成验证程序(对为 1,错为 0)。在线,拿回了 DPO 放弃的探索;奖励客观,压缩了奖励作弊的空间。
  • ⭐ 手算显示,只有"有时对、有时错"的题目产生学习信号:全对或全错时,“得分减平均"全部为 0。用同一题多次采样的平均作基准,省掉了 PPO 里额外估计平均分的模型。
  • 没人教模型怎么想,它自己学会了写更长的推理、回头检查——因为这些行为更容易换来正确答案。
  • 测试时计算是训练规模之外的第二个扩展方向:串行(写更长的推理)或并行(多次生成再挑选)。多数投票的手算显示它同样边际收益递减,并且只在单次正确率高于一半、各次回答相对独立时才有帮助。
  • ⚠️ 代价:只在能验证的领域直接有效;验证程序的漏洞同样会被钻;答案对不代表过程对;推理 token 全部串行生成,恰好放大了最贵的环节。

思考题

  1. 用第三节的逻辑解释:为什么让模型直接回答"23 × 47 = ?“比让它先写出"20×47=940,3×47=141"再回答更容易出错?请从"每个 token 的计算量固定"和"写下的内容能被后续注意力读到"两个角度说。
  2. 在第三节情况一的表格里,如果 4 个解答中有 2 个对、2 个错,每个解答的权重分别是多少?和"1 对 3 错"相比,那个正确解答被调高的力度是变大还是变小?这说明了什么?
  3. 假设你在准备 RLVR 的训练题目,手头有三类题:模型几乎全对的、几乎全错的、大约一半对的。根据第三节的分析,你会怎么分配这三类题在训练中的比例?随着训练进行,这个比例应该怎么调整?
  4. 用第三节的方法算:如果单次正确率是 0.4,生成 3 个答案取多数,正确率是多少?和单次的 0.4 相比是升还是降?这对"多采样几次总是更好"这个直觉意味着什么?
  5. 第四节说"测试用例写得不够全面时,模型可能学会只通过这几个测试”。请设计一个具体例子:一道编程题、一组不够全面的测试用例,以及一段能通过这些测试、但没有真正解决问题的代码。