第 14 讲:推理 I——思维链与提示

Natural Language Processing with Deep Learning · Lecture 14。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS224N Winter 2026 Lecture 12(Reasoning 1)。和同目录 CS336 第 16 讲(可验证奖励的强化学习)有重叠:本讲侧重思维链的直觉和”为什么有用”,强化学习训练推理模型的细节在第 15 讲和 CS336 中展开。 配套代码:code/lecture14/(01、03 号文件导入第 7 讲的 transformer.py;02、04 号文件只需要 numpy) 预计阅读时间:3.5–4 小时


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 说出几种推理(演绎、归纳、溯因)的区别,以及”语言模型能否推理”这场争论里双方的主要证据。
  2. 写出少样本思维链提示和零样本思维链提示,说出它们的经典实验结果和”只在大模型上有效”的现象。
  3. 从计算的角度解释思维链为什么有用:固定深度的 Transformer 每生成一个词只能做有限的串行计算,思维链把计算摊到很多个词上;再说出另外几种解释。
  4. 解释自洽性:它为什么能超过贪心解码(对推理路径做边缘化),什么时候有用、什么时候有害,上限在哪里。
  5. 解释 STaR 的流程、合理化的作用、它和强化学习的关系,以及”筛选只能放大已有能力”的局限。
  6. 说出今天的推理模型(o1、DeepSeek-R1)大致是怎么训练出来的。
  7. 解释思维链的忠实性问题,以及用篡改中间步骤、提前作答来检测它的方法。

0.2 先修知识

知识点用在哪里最低要求
第 7 讲第 4 节Transformer 的层数、注意力能”查找”和”复制”
第 10 讲第 6 节SFT;RLHF 的目标;策略梯度的直觉
第 11 讲第 3 节少样本提示、上下文学习
第 12 讲第 4、5 节ReAct;智能体的错误累积
第 13 讲第 2、7 节数据污染;基准测试的可信度

0.3 本讲地图

第1节  什么是推理?
第2节  争论:语言模型能推理吗?
第3节  思维链提示
第4节  思维链为什么有用?(本讲重点)              ← 代码 01
第5节  自洽性:多想几次再投票                      ← 代码 02、03
第6节  从提示到训练:STaR 与推理模型                ← 代码 04
第7节  思维链忠实吗?                              ← 代码 03
第8节  实践建议
第9–13节 小结、与作业的关系、练习、延伸阅读、下一讲预告

关于本讲的实验数字:02、04 号代码是纯 numpy 的精确计算 / 模拟(几秒钟),编写讲义时完整运行过,讲义引用的是实际输出。01、03 号代码要训练两个小 Transformer(合计约半小时),编写时只做了冒烟测试,讲义中只描述预期的趋势,表格留给你运行后填写。


1. 什么是推理?

“推理”这个词在日常生活里很宽泛。在 NLP 里,人们通常指从已知信息出发、经过若干步骤、得出新结论的过程,尤其是那些答案不能直接”记住”或”一眼看出”的问题。

逻辑学里常分三种:

  • 演绎(deduction):从一般规则推出具体结论,结论必然成立。“所有人都会死;苏格拉底是人;所以苏格拉底会死。“数学证明、程序执行都属于这一类。
  • 归纳(induction):从具体例子总结一般规律,结论可能出错。“我见过的天鹅都是白的,所以天鹅都是白的。“第 11 讲的上下文学习是一种归纳。
  • 溯因(abduction):为观察到的现象寻找最合理的解释。“草地湿了,大概是下过雨。“医生诊断、侦探破案、读懂别人的言外之意,都靠溯因。

心理学家 Kahneman 用”系统 1”和”系统 2”描述人的两种思考方式:系统 1 快速、自动、凭直觉(看到 2 + 2 就知道是 4);系统 2 缓慢、费力、一步步来(心算 17 × 24)。一个直观的类比是:语言模型生成每一个词,就像一次”系统 1”的反应;而思维链让模型把中间步骤写出来,像是在纸上做”系统 2”的推演。

本讲关心的推理任务主要是:多步数学应用题(如 GSM8K)、符号操作(如把几个单词的最后一个字母拼起来)、逻辑推理、常识推理和多跳问答。这些任务的共同点是:答案需要组合多个步骤才能得到。


2. 争论:语言模型能推理吗?

这是近几年 NLP 里争论最激烈的问题之一。

支持”能”的证据:

  • 数学应用题基准 GSM8K(Cobbe 等 2021)上,最强模型的准确率从 2021 年的约 35%(GPT-3 微调 + 验证器为 55%)涨到今天的 95% 以上;更难的竞赛数学、研究生水平的科学题上也有巨大进步。
  • 模型能解出训练数据里不太可能出现的新题,能写出正确的证明,能在长时间的智能体任务里规划和纠错(第 12 讲)。
  • 第 4 节会看到:从计算的角度,带思维链的 Transformer 在原理上确实能执行任意长的串行计算。

支持”不能”(或”不是我们以为的那种推理”)的证据:

  • 组合性的局限:Dziri 等(2023,Faith and Fate)发现,GPT-4 做多位数乘法时,位数一多准确率就急剧下降;模型更像是在匹配见过的”子步骤模式”,而不是执行一个通用的算法。
  • 对题面的表面特征敏感:Mirzadeh 等(2024,GSM-Symbolic)把 GSM8K 题目里的人名、数字换掉(题目逻辑完全不变),很多模型的准确率就下降;再加一句无关的话(“其中有 5 个猕猴桃比平均小一点”),准确率大幅下降,最多掉几十个百分点。
  • 反事实任务:Wu 等(2023,Reasoning or Reciting?)让模型做九进制加法、用不同的棋盘规则下棋,表现远不如常规版本。模型对”常见的设定”很擅长,换一个同样简单但罕见的设定就不行了。McCoy 等(2023,Embers of Autoregression)发现类似的规律:模型做移位密码解密时,移 13 位(网上很常见)比移 2 位(很少见)准确得多,尽管两者难度一样。
  • 逆转诅咒:Berglund 等(2023)发现,模型学了”A 是 B”,不一定能回答”B 是谁”。
  • 数据污染:基准题目可能出现在训练数据里(第 13 讲第 8 节),分数高不一定说明会推理。

一种比较平衡的看法:语言模型学到了大量推理的程序和模式,能把它们组合起来解决新问题,但这种能力强烈地依赖于训练数据的分布:在常见的设定、常见的步骤组合上很可靠,离训练分布越远越脆弱。“能不能推理”不是一个是非题,更有用的问题是:在什么条件下、多可靠、怎样才能更可靠。 本讲和下一讲讨论的方法(思维链、自洽性、验证器、强化学习)都是为了回答”怎样才能更可靠”。


3. 思维链提示

3.1 少样本思维链

Wei 等(2022)的做法非常简单:第 11 讲的少样本提示里,示例只给”问题 → 答案”;思维链提示(chain-of-thought prompting)让示例包含”问题 → 推理步骤 → 答案”:

Q: Roger 有 5 个网球。他又买了 2 罐网球,每罐 3 个。他现在有几个网球?
A: Roger 一开始有 5 个球。2 罐每罐 3 个,一共 6 个球。5 + 6 = 11。答案是 11。

Q: 食堂有 23 个苹果。午饭用掉了 20 个,又买了 6 个。现在有几个苹果?
A:

模型看到示例里的推理格式,就会模仿着先写推理步骤,再给答案。结果非常显著:PaLM 540B 在 GSM8K 上,标准少样本提示的准确率约 18%,换成 8 个思维链示例后约 57%,超过了当时专门微调过的 GPT-3 加验证器的结果。

一个重要的发现是:思维链的好处只在大模型上出现。在约 100 亿参数以下的模型上,思维链提示几乎没有帮助,甚至有害:小模型会写出流畅但逻辑混乱的”推理”,然后得出错误的答案。这是第 9 讲讨论过的”涌现”现象的一个经典例子(当然,“涌现”本身也有争议:换一种更平滑的指标,曲线可能就不那么陡峭了)。

3.2 零样本思维链

Kojima 等(2022)发现,连示例都不用:在问题后面加一句”Let’s think step by step.”(让我们一步一步地想),模型就会自己写出推理步骤。在 text-davinci-002 上,MultiArith(简单的算术应用题)的准确率从约 18% 升到约 79%,GSM8K 从约 10% 升到约 41%。一句话的提示带来这么大的变化,说明模型本来就有写推理的能力,只是需要被”引出来”。

3.3 其他变体

  • 草稿纸(scratchpad,Nye 等 2021):在思维链之前,有人训练模型在”草稿纸”上写出程序执行的中间状态、长加法的每一位,明显提升了这些任务的准确率。思维链可以看作”用自然语言写的草稿纸”。
  • 从少到多(least-to-most,Zhou 等 2022):先让模型把问题拆成一串子问题,再按顺序逐个解决,前面子问题的答案用于后面的子问题。在需要组合泛化的任务上(测试题比示例长得多),比普通思维链好得多。
  • 程序辅助(PAL,Gao 等 2022;Program of Thoughts,Chen 等 2022):让模型把推理写成代码,交给 Python 解释器执行。推理的”规划”交给模型,精确的计算交给解释器,这和第 12 讲”把模型不擅长的事交给工具”是同一个思路。

4. 思维链为什么有用?(本讲重点)

为什么”写出步骤”能让模型变聪明?参数没有变,信息也没有增加(推理步骤都是模型自己写的)。这里介绍四种互相补充的解释,重点是第一种。

4.1 计算的视角:把计算摊开到很多个词上

回顾第 7 讲:一个 LL 层的 Transformer,生成每一个词时,信息从输入流到输出只经过 LL 层。每一层能做的事情有限(一次注意力的”查找”,一次前馈网络的变换),所以一次前向传播里能完成的串行步骤是有限的,和层数成正比,而和题目的难度无关。

如果一个问题本质上需要 nn 个串行步骤(必须先算出第 1 步才能算第 2 步……),而 nn 大于模型在一次前向传播里能做的步数,那么直接输出答案就是做不到的,无论模型多大(只要层数固定)。

思维链改变了这个局面:模型每写一个词,就多做一次完整的前向传播,而且写下的词会作为后续前向传播的输入。写下 TT 个词的思维链,相当于把 T×LT \times L 层的计算串起来用。思维链让计算量随问题的难度增长,这正是第 15 讲”测试时计算”的基本思想。

这个直觉有严格的理论结果支持:

  • Feng 等(2023)证明,对基本的算术表达式求值、解线性方程这样的问题,深度有界的 Transformer 要直接输出答案,模型规模必须随输入长度超多项式地增长;而带思维链时,固定大小的模型就够了。
  • Merrill & Sabharwal(2024)证明,思维链的步数决定了 Transformer 的表达能力:步数和输入长度成线性关系时,它能识别所有的正则语言;步数是多项式时,它能解决所有多项式时间可解的问题(复杂度类 P)。没有思维链时,固定深度的 Transformer 的能力被限制在一个很弱的复杂度类里。
  • Li 等(2024)把这个结论表述为:思维链让 Transformer 能解决”本质上串行”的问题。

4.2 一个对照实验:变量追踪

代码 01 用一个能精确控制”串行步数”的任务做对照实验(任务定义见 reasoning_tasks.py)。题目里有两条交错的赋值链(顺序打乱),问其中一条链最后那个变量的值(加法都对 10 取余):

题目:  d = b + 1 , a = 4 , c = a + 3 , b = 7 ; c ?
链 1:  a = 4 → c = a + 3 = 7          (要问的是这一条)
链 2:  b = 7 → d = b + 1 = 8          (干扰项)
答案:  7

链长 kk(每条链的语句数)越大,需要”顺藤摸瓜”的步数越多。干扰链的作用是堵住捷径:如果只有一条链,答案 = 起始值 + 所有常数之和,不用管顺序。

两种输出格式:

直接回答:  ans 7
思维链:    c = a + 3 ; a = 4 ; a = 4 ; c = 4 + 3 = 7 ; ans 7
            └── 倒着找:从被问的变量开始,──┘ └── 正着算:从起始值开始,──┘
                一条条找出它依赖的语句            一步步算出每个变量的值

思维链的每一步都只需要做一件很简单的事:找到一条语句并抄下来,或者做一次一位数加法。用同样结构(3 层、128 维)的两个小 Transformer,同样训练 6000 步(每步 64 道随机新题,链长 1~4),分别学这两种格式。

直接回答不管题目多难都只生成 3 个词(含结束符);思维链的长度随 kk 线性增长(含结束符,k=1k = 1 时 11 个词,k=4k = 4 时 53 个词):题目越难,模型想得越久。

预期的结果(编写时只做了冒烟测试,请你运行后填写):

链长 kk直接回答思维链
1
2
3
4
  • 直接回答:k=1k = 1 时应该还不错(找到一条语句、再找起始值、加一次);kk 越大越差,k=3k = 3、4 时可能接近瞎猜的 10%。3 层的 Transformer 在一次前向传播里做不完这么多串行的查找。
  • 思维链:所有 kk 上都应该接近 100%。
  • 如果你的结果不同:直接回答在 k=2k = 2 上可能也不错(模型能用几层注意力完成两三次查找);思维链模型训练不够时可能在 k=4k = 4 上出错,01 号文件的演示 3 会告诉你它错在哪一步(预期主要错在”倒着找”:抄错了语句,比如抄成了干扰链上的一条)。

4.3 另外三种解释

解释二:更多的监督信号。 这个实验里两种格式训练的题目数、步数完全相同,但思维链格式每道题有几十个词需要预测,直接回答只有两三个。思维链格式提供了大量关于中间步骤的监督:模型不仅被告知答案,还被告知怎么一步步得到答案。所以这个对照不完全”公平”,它同时比较了”能不能分步计算”和”有没有中间步骤的监督”。理论上,即使给直接回答模型无限的训练数据,第 4.1 节的深度限制仍然存在;实践中,两者都起作用。

解释三:经验的局部性(Prystawski 等 2023)。训练数据里,相关的概念往往一起出现在同一段文本里,而相隔很远的概念很少同时出现。于是模型能很好地估计”相邻概念”之间的关系,却不能直接估计”远距离概念”之间的关系。思维链让模型沿着一串”相邻概念”一步步走过去,每一步都在训练分布之内。他们在合成数据上验证了:只有当训练数据具有这种局部结构时,思维链才有帮助。

解释四:把问题拆成”见过的子问题”。 一道复杂的应用题作为整体可能从没见过,但它拆出来的每一步(单位换算、两数相乘)都见过无数次。这和第 2 节”模型擅长常见的步骤组合”的观察是一致的。

一个反例:填充词。 如果思维链的好处只是”多算几次前向传播”,那么让模型输出一串无意义的”……”(填充词)再回答,是不是也行?Pfau 等(2024,Let’s Think Dot by Dot)发现:在特定任务上专门训练,模型确实能利用填充词获得额外的计算;但这很难学会,而且现成的模型不会自动利用填充词。也就是说,思维链的内容很重要:写下的中间结果是后续计算的”记忆”,而不只是”计算时间”。


5. 自洽性:多想几次再投票

5.1 做法

思维链用贪心解码只生成一条推理路径。自洽性(self-consistency,Wang 等 2022):用温度采样生成很多条不同的推理路径,各自得到一个答案,最后多数投票。PaLM 540B 在 GSM8K 上,思维链 + 贪心解码约 57%,采样 40 条再投票约 74%,提升了 17 个百分点。

5.2 为什么有用:对推理路径做边缘化

代码 02 的演示 1 用一个假设的例子说明核心机制。一道题,模型可能走的推理路径:

路径概率答案
一种常见但错误的算法0.3012
正确解法甲、乙、丙、丁各 0.1417
算错了一步0.0715
看错了题0.0721

最可能的路径是第一条(0.30),贪心解码大致会走这条路,得到 12(错)。但最可能的答案是 17:四条不同的正确解法殊途同归,合起来概率 0.56。

a^贪心≈答案(arg⁡max⁡路径P(路径)),a^自洽=arg⁡max⁡a∑路径→aP(路径)\hat{a}_{\text{贪心}} \approx \text{答案}\Big(\arg\max_{\text{路径}} P(\text{路径})\Big),\qquad \hat{a}_{\text{自洽}} = \arg\max_{a} \sum_{\text{路径} \to a} P(\text{路径})

自洽性挑的是把通向同一个答案的所有路径加起来之后最可能的答案,这就是对推理路径做边缘化。投票选对的概率随采样次数 nn 上升:

nn135112141
投票选对的概率56.2%64.5%71.8%82.5%90.5%96.7%

直觉上:正确的推理有很多种方式,错误的推理也有很多种方式,但错误的方式往往各错各的(得到五花八门的答案),正确的方式会汇聚到同一个答案。

5.3 什么时候有用、什么时候有害

投票放大的是众数(出现最多的答案)。代码 02 的演示 2:

答案分布(第一个是正确答案)n=1n=1n=5n=5n=11n=11n=21n=21n=41n=41
(a) 对 40%,错误答案五花八门(6 种,各 10%)39.9%59.7%78.8%92.9%99.2%
(b) 对 40%,但有一个错误答案占 45%39.8%43.4%42.4%40.1%36.4%
(c) 只对 25%,错误答案非常分散(15 种,各 5%)24.9%39.4%59.7%80.0%95.5%
(d) 对 60%,另一个答案 40%60.0%68.3%75.4%82.8%90.4%
  • 正确答案是众数时(a、c、d),投票越多越好,哪怕单次只有 25% 的正确率,只要错误足够分散。
  • 有一个错误答案比正确答案更常见时(b),投票一开始略有帮助(排除了零散的错误答案),之后越投越差,nn 足够大时趋于 0。系统性的错误(一种常见的误解、一个诱人的陷阱)是投票救不了的。

这和 Condorcet 陪审团定理的直觉一样:每个投票者略好于随机、而且错误互相独立时,人多力量大;错误一旦相关,人多也没用。

5.4 收益递减与上限

代码 02 的演示 3:2000 道题,每道题单次采样的正确率从 0 到 1 不等(平均 50.5%),错误答案有时分散、有时集中:

采样次数 nn13510204080
准确率50.5%56.8%62.2%67.4%70.6%72.4%73.3%

前几次采样的提升最大,之后收益递减,逼近上限 74.4%:上限不是 100%,而是”正确答案恰好是众数”的题目比例。代价却是线性的:采样 40 次,计算量和费用就是 40 倍。

另一个限制:自洽性要求答案能比较(数字、选项)。开放式的回答(写一段解释)没法直接数票,需要判断哪些回答”意思相同”,或者让模型自己从多个回答里挑一个最一致的(universal self-consistency)。

5.5 当多数人错了:带打分的投票

代码 02 的演示 4 回到情形 (b)(正确 40%,一个错误答案 45%),但假设每条推理路径还有一个”验证器”打的分数:正确路径的分数 ~ N(1,1)N(1, 1),错误路径 ~ N(0,1)N(0, 1)(有用但远不完美):

nn多数投票加权投票取最高分
140.1%40.1%40.1%
543.3%64.1%66.9%
1142.9%70.6%76.4%
2139.7%73.6%81.8%

只数票数,多采样几乎没有帮助;按验证器的分数加权,或者直接挑分数最高的那条路径(best-of-n),就能把正确答案”捞”回来。多采样只是第一步,怎样从很多候选里挑出对的那个才是关键,这是第 15 讲的主题。

5.6 在真实模型上

代码 03 的演示 1 用 01 号训练的思维链模型,在 k=4k = 4 的题目上采样(温度 0.8)多条思维链再投票。预期:采样的单条思维链比贪心解码差一些(温度带来随机错误),投票之后能追上甚至超过贪心解码;如果模型已经接近 100%,投票就没什么可提升的;如果模型的错误是系统性的(总在同一类题上找错语句),投票也救不了。


6. 从提示到训练:STaR 与推理模型

6.1 STaR:从自己的推理中学习

思维链提示需要模型本来就会推理;要训练模型推理,需要大量带推理步骤的数据,而人写推理步骤很贵。STaR(Self-Taught Reasoner,Zelikman 等 2022)的想法:

  1. 用少量思维链示例提示模型,让它对大量题目自己写推理;
  2. 只保留最终答案正确的推理(答案可以自动核对);
  3. 在这些”自己写对了的推理”上微调模型(每轮从原始模型重新开始微调);
  4. 重复。

对做错的题,还可以把正确答案作为提示给模型,让它”倒推”出一条导向正确答案的推理,叫合理化(rationalization),训练时去掉提示。在 CommonsenseQA 上,STaR 训练的 GPT-J(60 亿参数)的表现可以和大 30 倍、直接在答案上微调的模型相当。

6.2 STaR 的动力学

代码 04 把”模型”简化成一张表:对每类题目,模型以一定的概率选择几种”推理策略”之一,每种策略有一个得出正确答案的概率 r(s)r(s)(数字都是假设的)。无限样本时,“只保留答对的、再重新拟合”这一步正好是:

πt+1(s)=πt(s) r(s)∑s′πt(s′) r(s′)⟹πt(s)∝π0(s) r(s)t\pi_{t+1}(s) = \frac{\pi_t(s)\, r(s)}{\sum_{s'} \pi_t(s')\, r(s')} \quad\Longrightarrow\quad \pi_t(s) \propto \pi_0(s)\, r(s)^t

也就是”以答对为条件”的后验分布。成功率高的策略被指数级地放大。代码 04 的演示 1:

题型第 0 轮第 2 轮第 4 轮第 8 轮
简单的计算题(正确解法初始概率 30%)29.7%94.9%95.0%95.0%
困难的计算题(正确解法初始概率 2%)3.5%88.4%90.0%90.0%
没学过的题型(正确解法初始概率 0)1.6%1.9%2.0%2.0%
判断题(正确推理初始概率 5%)52.2%57.2%68.3%90.5%

困难的题型:正确解法的概率从 2% 到第 2 轮就变成 98.2%。但没学过的题型,正确解法的初始概率是 0,乘多少次还是 0。

筛选只能放大模型已经会(哪怕只是偶尔会)的东西,不能凭空创造新能力。

这是所有”从自己的输出中学习”的方法(STaR、拒绝采样微调、强化学习)共同的局限。

合理化打破了这个局限。代码 04 的演示 2(每轮 200 道题,假设看着答案时模型有 20% 的概率倒推出正确的推理):没学过的题型,纯 STaR 永远停在 1.8%;加上合理化,第 2 轮就到 89.2%。代价是:倒推出来的推理可能只是”为了凑答案”。

6.3 答案对了,推理却是错的

判断题只有两个答案,错误的推理、不推理直接蒙,也有一半的机会答对,它们也会通过”答案正确”的筛选。代码 04 的演示 3:

轮数01248
准确率52.2%54.1%57.2%68.3%90.5%
答对的题里,推理真的对的比例9.1%16.0%26.5%56.6%94.4%

一开始,答对的题里只有 9.1% 是真正推理对的,第一轮的训练数据里大部分是答案对、推理错的样本,它们会被一起强化。好在正确推理的成功率(95%)高于蒙对(50%),每轮相对放大 1.9 倍,最终占主导。但答案空间越小、正确推理越罕见,这个阶段越长。只看最终答案的奖励(结果奖励)不检查过程,第 15 讲会讨论检查每一步的”过程奖励”。

6.4 STaR 与强化学习

把策略写成 softmax,奖励 = 答案是否正确。期望奖励对每个策略 logit 的梯度是 π(s) (r(s)−E[r])\pi(s)\,(r(s) - \mathbb{E}[r]):成功率高于平均的策略被加强,低于平均的被削弱。代码 04 的演示 4 显示,STaR 一轮之后 log⁡π\log \pi 的变化和策略梯度的方向一致。STaR 可以看作一种只用正样本的强化学习,也叫专家迭代(expert iteration)、拒绝采样微调(rejection sampling fine-tuning,Yuan 等 2023);ReST-EM(Singh 等 2023)把它推广到更大规模,发现在数学和代码任务上,用模型自己生成、经过正确性筛选的数据训练,可以超过用人写的数据训练。

6.5 今天的推理模型

2024 年 9 月,OpenAI 发布 o1:模型在回答前会生成很长的、用户看不到的思维链,在数学竞赛、编程竞赛、科学问答上大幅超过之前的模型。它的性能随两种计算增长:训练时更多的强化学习,以及推理时更长的思考。

2025 年 1 月,DeepSeek-R1 公开了一条类似的路线:

  • R1-Zero:从预训练的基座模型出发,不做 SFT,直接用强化学习(GRPO 算法,第 15 讲)训练,奖励只有两条简单的规则:答案对不对(数学题核对答案、编程题跑测试),格式对不对(推理写在规定的标签里)。训练过程中,模型的回答越来越长,自发地出现了检查、反思、换一种方法重试的行为(论文里称之为”顿悟时刻”)。
  • R1:R1-Zero 的推理可读性差(语言混杂),于是先用少量高质量的长思维链数据做 SFT(“冷启动”),再做强化学习,再结合拒绝采样和更广泛的 SFT、RLHF。
  • 蒸馏:用 R1 生成的推理过程微调更小的模型,小模型的推理能力也大幅提升。

这些模型背后的核心思想,和本讲的 STaR 一脉相承:在答案可以自动核对的任务上,让模型自己探索推理过程,用结果来奖励。 区别在于规模、算法(同时利用答对和答错的样本)和思维链的长度(几千到几万个词元)。之后 Anthropic、Google 等也都推出了可以”延长思考”的模型。第 15 讲会讨论测试时计算的扩展规律、验证器和 GRPO。


7. 思维链忠实吗?

思维链看起来是模型的”思考过程”。但它真的是模型得出答案的原因吗?还是模型先”知道”了答案,再编一段看起来合理的解释?如果思维链忠实(faithful)地反映了模型的计算过程,我们就能通过阅读它来理解、检查甚至监督模型;否则,它可能给人一种虚假的透明感。

7.1 不忠实的证据

Turpin 等(2023)做了一个巧妙的实验:在少样本示例里,让正确答案总是选项 (A)。模型受到影响,在新问题上更倾向于选 (A),准确率明显下降;但它写出的思维链从不提”因为前面的答案都是 A”,而是为 (A) 编出一套看似合理的理由。也就是说,影响答案的真实因素没有出现在思维链里。

7.2 检测方法

Lanham 等(2023)提出了几种检测忠实性的干预方法:

  • 提前作答:把思维链截断在不同位置,逼模型直接给答案。如果截断之后答案就不变了,说明答案在推理写完之前就”定了”,后面的推理可能只是装饰。
  • 加入错误:在思维链中间改掉一步,让模型接着写。如果最终答案跟着改,说明答案确实依赖写出来的推理。
  • 改写:用别的措辞重写思维链,看答案变不变(检测模型是否在思维链的措辞里”藏”了信息)。
  • 填充词:把思维链换成无意义的符号,看是否还有同样的好处。

他们发现,忠实程度因任务而异,而且在一些任务上,更大的模型反而更不忠实:大模型不需要推理也能答对简单的题,思维链对它来说更像事后的解释。

7.3 在我们的玩具模型上

代码 03 的演示 2、3 在 01 号训练的思维链模型上做”加入错误”和”提前作答”两个测试。

加入错误:给模型”题目 + 正确的倒着找部分 + 正着算的第一行”,但把起始值改掉 δ\delta。所有运算都是加法,如果模型用的是写下来的数,最终答案应该也改 δ\delta。

kk跟着改(忠实)还是原答案都不是
1
2
3
4

提前作答(k=4k = 4):把标准思维链截到不同位置,接上 “ans”,看模型给出的下一个词:

保留的思维链准确率
(参考)直接回答模型
什么都不写
倒着找写完
正着算到第 3 行
全部写完

预期:几乎总是”跟着改”;思维链没写到最后一行之前,答案和瞎猜差不多,写完最后一行才跳到接近 100%。在这个任务里思维链是忠实的、承担了真正的计算(Lanham 等称之为 load-bearing):题目太难,模型不写下来就算不出来。这正好和 7.2 节的发现形成对照:题目越需要推理,思维链越可能是忠实的;题目越简单,思维链越可能只是装饰。(注意:“ans” 在训练时总是跟在完整的思维链之后,截断后接 “ans” 是模型没见过的情况,这个测试有点不公平。)

7.4 为什么重要

如果推理模型的思维链基本忠实,阅读它就是一种强大的安全监督手段:研究者确实在推理模型的思维链里看到过模型”计划”钻奖励函数空子的内容。但也有研究发现,如果在训练中直接惩罚这类”坏念头”,模型可能学会隐藏它们,在思维链里不再写出来,同时继续钻空子。如何保持思维链的可读性和忠实性,是当前的一个开放问题(第 17、19 讲)。


8. 实践建议

  • 对普通(非推理)模型:数学、逻辑、多步问题上,要求它”先写出推理步骤,再给出答案”,并且让答案出现在固定的位置(比如最后一行”答案:……”),方便解析。简单的事实问答、分类任务,思维链往往帮助不大,还更慢、更贵。
  • 对推理模型:它们会自动思考,不需要”一步一步想”之类的提示,有时这类提示反而有害;更重要的是把问题本身说清楚,并根据任务难度设置思考的预算。
  • 自洽性:答案可以比较、预算允许时,采样几次投票是一个简单可靠的提升;先试 5~10 次,看收益是否值得。
  • 把精确计算交给工具:代码解释器、计算器(PAL、第 12 讲)。
  • 不要把思维链当成可靠的解释:它可能有帮助,但不一定反映模型真实的决策依据(第 7 节)。
  • 评估时:报告解码方式(贪心还是采样、温度、采样次数),否则不同的结果没法比较;警惕数据污染(第 13 讲)。

9. 本讲小结

  1. 推理:从已知出发、经过多步得出新结论。语言模型能否推理存在争论:进步巨大,但对题面的表面特征、罕见设定、组合长度很敏感。更有用的问题是”在什么条件下、多可靠”。
  2. 思维链提示:示例里加上推理步骤(Wei 等),或者一句”Let’s think step by step”(零样本);只在大模型上明显有效;变体有草稿纸、从少到多、程序辅助。
  3. 为什么有用:固定深度的 Transformer 每生成一个词只能做有限的串行计算,思维链把计算摊开到很多个词上,让计算量随难度增长(有理论结果支持);此外还有中间步骤的监督、经验的局部性、拆成见过的子问题。思维链的内容是后续计算的记忆,不只是”多算几次”。
  4. 自洽性:采样多条推理再投票,等价于对推理路径边缘化,挑最可能的答案而不是最可能的路径。正确答案是众数时有用,系统性错误时有害;收益递减,上限是”正确答案是众数”的比例;加上验证器的打分能突破这个限制。
  5. STaR:自己写推理、只保留答对的、再学习;无限样本时 πt(s)∝π0(s) r(s)t\pi_t(s) \propto \pi_0(s)\, r(s)^t;筛选只能放大已有的能力,合理化能引入新的推理;结果奖励会连带强化”答对但推理错”的样本;它是只用正样本的强化学习。今天的推理模型(o1、DeepSeek-R1)用大规模的可验证奖励强化学习训练出长思维链。
  6. 忠实性:思维链不一定反映模型真实的决策依据(Turpin 等的偏差实验);可以用提前作答、加入错误等干预检测;越需要推理的任务,思维链越可能忠实。

10. 与作业的关系

  • Winter 2026 的作业 4(大语言模型的基准测试与评估):很多推理基准(GSM8K、MATH 等)的分数强烈依赖于是否使用思维链、是否自洽投票、用什么解码方式,评估时要把这些设置写清楚、保持一致(第 8 节、第 13 讲)。
  • 期末项目:推理是近年最热门的项目方向之一。在小模型上复现”直接回答 vs 思维链”、比较不同的思维链格式、在合成任务上做 STaR 或简单的强化学习,都是可行的项目。本讲的变量追踪任务就是一个可控的起点。
  • 想做大规模的推理强化学习,可以参考 CS336 的作业 5(对齐与推理强化学习)。

作业的具体题目以当年官方发布的版本为准。


11. 练习

练习 1(串行步数)★:一个 4 层的 Transformer,假设每一层最多完成一次”查找”。(a) 直接回答链长 kk 的变量追踪题,大约需要多少次串行的查找?kk 多大时它就力不从心了?(b) 思维链格式下,生成每个词需要几次查找?为什么链长不再受层数限制?

参考答案

(a) 要从被问的变量出发,依次找到它依赖的语句、再找下一个……共约 kk 次查找,还要把找到的常数逐个相加。如果每层只能做一次查找,kk 超过 3~4 时就不够了(实际的 Transformer 可以在一层里并行做多件事,也可能用更巧妙的方式组合,所以这只是粗略的估计)。 (b) 每个词只需要一两次查找:抄写一条语句、或者找到前一行算出的值和对应的常数做一次加法。链长增加时,生成的词数增加,但每个词需要的计算量不变,所以不受层数限制。

练习 2(零样本 vs 少样本)★:(a) 零样本思维链(“Let’s think step by step”)和少样本思维链各有什么优缺点?(b) 为什么在约 100 亿参数以下的模型上,思维链提示可能有害?

参考答案

(a) 零样本:不需要写示例,通用;但推理的格式和风格不可控,答案位置不固定,可能需要第二步提示来提取答案。少样本:能控制推理的格式和详细程度,效果通常更好;但要为每类任务写示例,示例的质量和顺序会影响结果(第 11 讲)。 (b) 小模型能模仿思维链的格式,但每一步推理本身不可靠,错误还会累积;写出一长串错误推理后,答案反而比直接回答更差。思维链的好处要求模型能可靠地完成每个小步骤。

练习 3(自洽性)★★:一道题的答案分布是:正确答案 0.35,错误答案 A 0.30,错误答案 B 0.20,其余 0.15 分散在很多答案上。(a) 采样次数趋于无穷时,多数投票选对的概率趋于多少?(b) 如果错误答案 A 的概率是 0.40(其余相应减少),呢?(c) 由此总结自洽性的上限由什么决定。

参考答案

(a) 正确答案是众数(0.35 > 0.30),n→∞n \to \infty 时投票几乎肯定选中它,概率趋于 1(但收敛很慢,因为 0.35 和 0.30 很接近)。 (b) A 成为众数,概率趋于 0。 (c) 由”正确答案是不是众数”决定。数据集层面,上限 = 正确答案是众数的题目比例。

练习 4(边缘化)★★:用第 5.2 节的例子,(a) 如果”一种常见但错误的算法”的概率是 0.60,四种正确解法各 0.08,还会是”最可能的路径 ≠ 最可能的答案”吗?(b) 设计一个例子,让贪心解码和自洽性的答案相同。

参考答案

(a) 正确答案的总概率 0.32 < 0.60,最可能的答案也是错的,自洽性同样选错。自洽性帮不了”大多数概率质量都在同一个错误上”的情况。 (b) 最可能的路径本身导向正确答案,并且正确答案的总概率最大,例如正确路径 0.5,两条错误路径各 0.25 且导向不同的答案。

练习 5(STaR 的动力学)★★:一类题有两种策略:正确解法(r=0.9r = 0.9,初始概率 0.01)和蒙(r=0.1r = 0.1,初始概率 0.99)。(a) 用 πt(s)∝π0(s)r(s)t\pi_t(s) \propto \pi_0(s) r(s)^t,几轮之后正确解法的概率超过 50%?(b) 如果正确解法的初始概率是 10−610^{-6} 呢?(c) 这说明 STaR 对”初始能力”有什么要求?

参考答案

(a) 需要 0.01×0.9t>0.99×0.1t0.01 \times 0.9^t > 0.99 \times 0.1^t,即 9t>999^t > 99,t>log⁡99/log⁡9≈2.09t > \log 99/\log 9 \approx 2.09,第 3 轮。 (b) 9t>106−19^t > 10^6 - 1,t>6/log⁡109≈6.3t > 6/\log_{10}9 \approx 6.3,第 7 轮。在有限样本下更难:10−610^{-6} 的概率意味着要采样上百万次才能见到一次正确解法,很可能一次都见不到。 (c) 无限样本时只要初始概率不为 0,最终都会被放大;有限样本时,初始概率要足够大,至少能在每轮的采样里出现。否则需要合理化、更多采样或更好的初始模型(比如先用少量人写的推理做 SFT,这也是 DeepSeek-R1 加入”冷启动”的原因之一)。

练习 6(结果奖励的漏洞)★:在四选一的选择题上做 STaR。(a) 一个完全不推理、随机选的策略,有多大概率通过”答案正确”的筛选?(b) 和判断题相比,这个问题是更严重还是更轻?(c) 有什么办法减少”答案对、推理错”的样本?

参考答案

(a) 25%。(b) 比判断题(50%)轻,但仍然不可忽视;开放式的答案(比如一个具体数字)几乎不可能蒙对,问题最轻。(c) 尽量用开放式答案的题目;同一题采样多次,只保留”多数推理都得到这个答案”的;用过程奖励或验证器检查中间步骤(第 15 讲);人工抽查。

练习 7(忠实性实验设计)★★:设计一个实验,检测一个对话模型在做数学应用题时,思维链是否忠实。说明你会怎样干预、观察什么、怎样解读结果。

参考答案

一种设计:(1) 让模型生成思维链和答案;(2) 在思维链中间某一步引入一个计算错误(比如把 6 × 7 = 42 改成 6 × 7 = 48),让模型从这里接着写;(3) 观察最终答案是否随错误改变。如果大多数情况下答案跟着改,说明后续推理依赖于写下的中间结果;如果答案经常不变(模型”无视”错误、得出原来的答案),说明答案可能在推理之外就已经决定了。还可以做提前作答:在不同位置截断,看答案在哪一步定下来。对照组:不需要推理的简单题。注意区分”模型发现并纠正了错误”(会在思维链里写出”等等,6 × 7 应该是 42”)和”模型无视了推理”。

练习 8(思考):GSM-Symbolic 发现,把题目里的数字和人名换掉,很多模型的准确率会下降。(a) 这能说明模型”不会推理”吗?(b) 给出至少两种其他解释。(c) 你会设计什么实验来区分这些解释?

参考答案

(a) 不能直接说明。它说明模型的表现部分依赖于题目的具体形式,而不完全依赖于题目的逻辑结构。 (b) ① 数据污染:模型见过原题,换数字后失去了”记忆”的帮助;② 新的数字更难算(更大或更不”整”),计算出错的概率更高;③ 模型学到的是和常见题面绑定的解题模式,泛化能力有限。 (c) 控制数字的难度(保持数字的位数和”整齐程度”不变);比较训练截止日期之后才出现的新题;在已知没有见过原题的模型上做同样的实验;分析错误是出在推理步骤还是计算步骤(看思维链)。

练习 9(动手):

(a) 运行代码 01,填写第 4.2 节的表格。直接回答在哪个 kk 上开始崩溃? (b) 把 MODEL_CFG 的层数从 3 改成 6,重新训练直接回答模型(删掉 checkpoints/direct.pt)。直接回答的准确率随 kk 下降的拐点会推迟吗?这和第 4.1 节的理论一致吗? (c) 设计一种”只倒着找、不写计算过程”的思维链格式(c = a + 3 ; a = 4 ; ans 7),和完整格式比较。哪一部分对准确率更重要? (d) 运行代码 03,填写第 7.3 节的两个表格。 (e) 在代码 04 里加一种”部分正确”的策略(r=0.6r = 0.6),看它在 STaR 的几轮中是先上升后下降,还是一直上升?用 πt∝π0rt\pi_t \propto \pi_0 r^t 解释。


12. 延伸阅读

  • Wei et al.,Chain-of-Thought Prompting Elicits Reasoning in Large Language Models(2022)。
  • Kojima et al.,Large Language Models are Zero-Shot Reasoners(2022)。
  • Nye et al.,Show Your Work: Scratchpads for Intermediate Computation with Language Models(2021)。
  • Zhou et al.,Least-to-Most Prompting Enables Complex Reasoning in Large Language Models(2022);Gao et al.,PAL: Program-aided Language Models(2022)。
  • Wang et al.,Self-Consistency Improves Chain of Thought Reasoning in Language Models(2022)。
  • Feng et al.,Towards Revealing the Mystery behind Chain of Thought: A Theoretical Perspective(2023);Merrill & Sabharwal,The Expressive Power of Transformers with Chain of Thought(2024);Li et al.,Chain of Thought Empowers Transformers to Solve Inherently Serial Problems(2024)。
  • Prystawski et al.,Why Think Step by Step? Reasoning Emerges from the Locality of Experience(2023);Pfau et al.,Let’s Think Dot by Dot: Hidden Computation in Transformer Language Models(2024)。
  • Zelikman et al.,STaR: Bootstrapping Reasoning With Reasoning(2022);Singh et al.,Beyond Human Data: Scaling Self-Training for Problem-Solving with Language Models(2023,ReST-EM)。
  • DeepSeek-AI,DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning(2025);OpenAI,Learning to Reason with LLMs(2024,o1 的介绍)。
  • Dziri et al.,Faith and Fate: Limits of Transformers on Compositionality(2023);McCoy et al.,Embers of Autoregression(2023);Wu et al.,Reasoning or Reciting?(2023);Mirzadeh et al.,GSM-Symbolic(2024);Berglund et al.,The Reversal Curse(2023)。
  • Turpin et al.,Language Models Don’t Always Say What They Think(2023);Lanham et al.,Measuring Faithfulness in Chain-of-Thought Reasoning(2023)。
  • Kahneman,Thinking, Fast and Slow(2011):系统 1 与系统 2。

13. 下一讲预告

本讲看到:多采样几次、投个票,准确率就能上去;再加一个给推理打分的”验证器”,还能更好;推理模型思考得越久,答得越准。这些都指向同一个问题:在推理时多花计算,能换来多少能力?

下一讲(推理 II:验证与测试时计算)讨论:

  • 测试时计算的扩展:best-of-n、多数投票、验证器,以及它们的扩展曲线;
  • 结果奖励模型(ORM)和过程奖励模型(PRM):检查答案,还是检查每一步?树搜索;
  • 用可验证奖励做强化学习(RLVR);GRPO 的思路(DeepSeek-R1 用的算法);
  • 长思维链的现象与问题:想得越久越好吗?“过度思考”。
← 返回课程目录