我们为何思考

作者: Lilian Weng
日期: 2025-05-01
URL: https://lilianweng.github.io/posts/2025-05-01-thinking/
标签: language-model, reinforcement-learning, reasoning, long-read


特别感谢 John Schulman 对本篇文章提供了大量极具价值的反馈和直接修改。

测试时计算(test-time compute)(Graves et al. 2016, Ling, et al. 2017, Cobbe et al. 2021) 与思维链(Chain-of-Thought, CoT)(Wei et al. 2022, Nye et al. 2021) 已经显著提升了模型性能,同时也引发了诸多研究问题。本文旨在回顾近期在如何有效利用测试时计算(即”思考时间”)以及它为何有效方面的发展。

这一核心思想与人类的思考方式有着深刻的联系。我们人类无法立即回答”12345 乘以 56789 等于多少?“这样的问题。相反,在得出结果之前,花时间思考和分析是自然而然的事,尤其是面对复杂问题时。在《Thinking, Fast and Slow》(Kahneman, 2013)一书中,Daniel Kahneman 通过双系统理论的视角,将人类思维划分为两种模式:
快速思考(System 1)运行迅速且自动,由直觉和情感驱动,几乎不需要付出努力。
慢速思考(System 2)需要刻意的、逻辑性的思考以及大量的认知投入。这种思考模式消耗更多心理能量,需要有意识地去调动。
由于 System 1 思考快速且轻松,它往往成为主要的决策驱动者,但代价是准确性和逻辑性。它自然依赖于我们大脑的心理捷径(即启发式方法),并可能导致错误和偏见。通过有意识地放慢速度,花更多时间反思、改进和分析,我们可以调动 System 2 思考来挑战直觉,做出更理性的选择。

关于深度学习的一种观点是,神经网络可以通过其在一次前向传播(forward pass)中能够访问的计算量和存储量来刻画,如果我们使用梯度下降(gradient descent)来优化它们以解决问题,优化过程会自行弄清楚如何利用这些资源——它会搞清楚如何将这些资源组织成用于计算和信息存储的回路。从这个角度来看,如果我们设计一种能够在测试时进行更多计算的架构或系统,并训练它有效利用这一资源,它的表现就会更好。

在 Transformer 模型中,模型为每个生成的 token 所执行的计算量(flops)大约是其参数数量的 2 倍。对于混合专家模型(mixture of experts, MoE)这类稀疏模型,每次前向传播只使用一部分参数,因此计算量 = 2 * 参数数量 / 稀疏度,其中稀疏度是指活跃专家所占的比例。

另一方面,CoT 使模型能够为答案中的每个 token 执行远超此数值的计算量。事实上,CoT 有一个很好的特性:它允许模型根据问题的难度使用可变的计算量。

机器学习中的一个经典思想是,定义一个包含潜变量(latent variable) 和可见变量 的概率模型,其中 提供给我们学习算法。对潜变量的可能取值进行边缘化(求和),使我们能够表达可见变量上的丰富分布,。例如,我们可以通过令 表示问题陈述, 表示真实答案或证明, 表示导致该证明的自由形式思维过程,来对数学问题和解决方案的分布进行建模。需要优化的边缘概率分布为

潜变量的视角对于理解涉及收集多条并行 CoT 或在 CoT 上进行搜索的方法尤为有用——这些算法可以看作是从后验分布 中采样。这一观点也暗示了使用对数损失 作为优化目标函数的好处,因为对数损失目标在预训练中已经被证明非常有效。

在生成简短答案之前先生成中间步骤的策略,尤其针对数学问题,由 Ling, et al. 2017 进行了探索,他们引入了 AQUA-RAT 数据集;随后 Cobbe et al. 2021 进行了扩展,引入了小学数学(Grade School Math, GSM)数据集。Cobbe et al. 使用监督学习在人类撰写的解决方案上训练生成器,并训练验证器来预测候选解决方案的正确性;然后他们可以在这些解决方案上进行搜索。Nye et al. (2021) 尝试了将中间思考 token 作为”草稿本”(scratchpads),Wei et al. (2022) 创造了现在已成为标准的术语”思维链”(chain-of-thought, CoT)。

早期改进 CoT 推理的工作涉及在人类撰写的推理轨迹或经过答案正确性筛选的模型生成轨迹上进行监督学习,后者可以看作是一种强化学习(reinforcement learning, RL)的雏形。其他一些工作发现,通过适当的提示,可以显著提升指令微调模型的数学性能,例如使用”逐步思考”(Kojima et al. 2022)或更复杂的提示来鼓励模型先反思相关知识(Yasunaga et al. 2023)。

后续研究发现,通过在具有自动可验证解决方案的问题数据集上进行强化学习,可以显著提升 CoT 推理能力,例如具有简短答案的 STEM 问题,或可以通过单元测试检查的编程任务(Zelikman et al. 2022, Wang et al., 2023, Liu et al., 2023)。随着 o1-preview、o3 和 R1 技术报告(DeepSeek-AI, 2025)的发布,这一方法受到广泛关注,这些工作表明简单的策略梯度算法就能带来强劲的性能表现。

测试时计算的根本意图是在测试时自适应地调整模型的输出分布。有多种方式可以利用测试时资源进行解码,以选择更好的样本,从而将模型的预测导向更理想的分布。改进解码过程的两种主要方法是并行采样和顺序修订。

并行采样同时生成多个输出,同时通过过程奖励信号在每一步提供指导,或使用验证器在最后评判质量。这是提升测试时性能最广泛采用的解码方法,例如 best-of- 或束搜索(beam search)。当真实答案不可用时,自一致性(self-consistency)(Wang et al. 2023) 通常用于在多个 CoT 展开中选择多数投票的答案。

顺序修订根据前一步的输出迭代地调整模型的回答,要求模型有意识地反思现有回答并纠正错误。修订过程可能需要依赖微调后的模型,因为单纯依赖模型固有的自我纠正能力而没有外部反馈,可能无法带来改进(Kamoi et al. 2024, Huang et al. 2024)。

并行采样简单、直观且易于实现,但受限于模型能否一次性得出正确解决方案的能力。顺序修订明确要求模型反思错误,但它更慢,且在实现时需要额外注意,因为确实存在将正确预测修改为错误,或引入其他类型幻觉(hallucination)的风险。这两种方法可以结合使用。Snell et al. (2024) 表明,较简单的问题仅从纯顺序测试时计算中获益,而较难的问题通常在顺序计算与并行计算达到最优比例时表现最佳。

给定一个生成模型和一个可用于为完整或部分样本打分的评分函数,我们可以使用多种搜索算法来寻找高分样本。Best-of- 是最简单的此类算法:只需收集 个独立样本,然后根据某个评分函数选择排名最高的样本。束搜索是一种更复杂的搜索算法,它使搜索过程更具适应性,在解空间中更有前景的部分投入更多的采样计算。

束搜索维护一组有前景的部分序列,并在扩展它们和剪枝较不前景的序列之间交替进行。作为选择机制,我们可以使用过程奖励模型(Process Reward Model, PRM; Lightman et al. 2023)来指导束搜索的候选选择。Xie et al. (2023) 使用大语言模型评估其自身生成的推理步骤正确的可能性,格式化为多选题,发现逐步自我评估可以减少束搜索解码过程中多步推理的累积错误。此外,在采样过程中,退火温度有助于缓解累积的随机性。Xie et al. 的这些实验在 few-shot GSM8k、AQuA 和 StrategyQA 基准上使用 Codex 模型取得了 5-6% 的提升。Reward balanced search(简称”REBASE”;Wu et al. 2025)单独训练了一个过程奖励模型(PRM),根据 softmax 归一化的奖励分数来决定束搜索中每个节点在每个深度应该被扩展多少。Jiang et al. (2024) 训练了他们的 PRM,命名为”RATIONALYST”,用于在基于大量未标注数据的条件合成推理上进行束搜索指导。好的推理通过比较推理被包含在上下文中与不被包含时的差异,基于是否帮助降低了真实答案 token 的负对数概率一个阈值来进行筛选。在推理时,RATIONALYST 通过帮助估计下一步推理的对数概率(“隐式”)或直接将下一步推理作为提示的一部分生成(“显式”),为 CoT 生成器提供过程监督。

有趣的是,可以在没有显式零样本或少样本提示的情况下触发涌现的思维链推理路径。Wang & Zhou (2024) 发现,如果在第一个采样 token 处进行分支,保留置信度最高的前 个 token(置信度衡量为采样期间 top-1 与 top-2 候选之间的差异),然后对这 个采样试验继续采用贪心解码,许多这些序列天然包含 CoT。特别是当 CoT 确实出现在上下文中时,它会导致对最终答案的更自信的解码。为了计算最终答案的置信度,答案跨度需要通过特定任务的启发式方法(例如数学问题的最后一个数值)或通过进一步提示模型”所以答案是”来识别。仅在第一个 token 处分支的设计选择基于这样的观察:早期分支显著增强了潜在路径的多样性,而后续 token 受先前序列影响很大。

如果模型能够反思并纠正过去回答中的错误,我们预期模型会产生一系列质量逐步提升的迭代修订序列。然而,这种自我纠正能力在大语言模型中并不固有存在,也不能轻易开箱即用,这是由于多种失效模式造成的,例如:(1) 幻觉,包括将正确的回答修改为错误的;(2) 行为坍缩为非纠正行为,例如对首次错误的回答只做微小修改或不做修改;或 (3) 无法泛化到测试时的分布偏移。Huang et al. (2024) 的实验表明,天真地应用自我纠正会导致性能更差,模型需要外部反馈才能实现自我改进,这可以基于匹配真实答案、启发式和特定任务指标、编程问题的单元测试结果(Shinn, et al. 2023)、更强的模型(Zhang et al. 2024)以及人类反馈(Liu et al. 2023)。

自我纠正学习(Welleck et al. 2023)旨在给定一个固定的生成模型 ,训练一个纠正模型 。生成模型保持通用性,而纠正模型可以是特定任务的,仅基于初始模型回答和额外反馈(例如一句话、编译器追踪、单元测试结果;可为可选条件)进行生成:

自我纠正学习首先为数据池中的每个提示生成多个输出;
然后通过将同一提示的两个输出配对来创建价值提升对,如果其中一个的价值高于另一个,则形成(提示 ,假设 ,纠正 )这样的样本。
这些对根据价值改进程度 和两个输出之间的相似度 按比例选择,用于训练纠正模型。
为了鼓励探索,纠正模型也将新产生的生成结果放入数据池中。在推理时,纠正模型可以迭代使用,以创建一个顺序修订的纠正轨迹。

递归检查(Qu et al. 2024)也旨在训练更好的纠正模型,但使用单一模型同时完成生成和自我纠正。

SCoRe(Self-Correction via Reinforcement Learning; Kumar et al. 2024)是一种多轮强化学习方法,通过要求模型在第二次尝试时产生比第一次尝试更好的答案,来鼓励模型进行自我纠正。它包含两个训练阶段:阶段 1 仅最大化第二次尝试的准确率,同时仅在第一次尝试上施加 KL 散度(KL divergence)惩罚,以避免第一轮回答与基础模型行为产生过大偏移;阶段 2 优化第一次和第二次尝试产生的答案的准确率。理想情况下,我们希望看到第一次和第二次尝试的表现都更好,但加入阶段 1 可以防止行为坍缩(即模型对第一次回答只做微小或不做修改),阶段 2 则进一步提升结果。

近期在使用强化学习提升语言模型推理能力方面取得了诸多成功,方法是使用带有真实答案的问题集合(通常是 STEM 问题和答案易于验证的谜题),并在模型答对时给予奖励。该领域的近期活跃得益于 OpenAI o 系列模型的强劲表现,以及随后 DeepSeek 发布的模型和技术报告。

DeepSeek-R1(DeepSeek-AI, 2025)是一个开源大语言模型,旨在擅长需要高级推理技能的任务,如数学、编程和逻辑问题解决。它经历了两轮 监督微调(Supervised Fine-Tuning, SFT)-强化学习(RL)训练,使 R1 在推理和非推理任务上都表现出色。

冷启动 SFT 是在数千条冷启动数据集合上对 DeepSeek-V3-Base 基础模型进行微调。如果没有这一步,模型会存在可读性差和语言混合的问题。
面向推理的强化学习仅在推理提示上训练推理模型,使用两种基于规则的奖励:
格式奖励:模型应该用 token 包裹 CoT。
准确率奖励:最终答案是否正确。数学问题的答案需要以特定格式呈现(例如在方框中)以便可靠验证。对于编程问题,使用编译器评估测试用例是否通过。
拒绝采样 + 非推理 SFT 利用在步骤 2 的强化学习检查点上通过拒绝采样创建的新 SFT 数据,结合 DeepSeek-V3 在写作、事实问答和自我认知等非推理领域的监督数据,重新训练 DeepSeek-V3-Base。
过滤掉包含混合语言、长段落和代码块的 CoT。
使用 DeepSeek-V3(DeepSeek-AI, 2024)流程包含非推理任务。
对于某些非推理任务,在回答问题前通过提示调用 DeepSeek-V3 生成潜在的 CoT。但对于”你好”这类更简单的查询,不需要 CoT。
然后在总共 80 万样本上对 DeepSeek-V3-Base 微调 2 个 epoch。
最后的强化学习阶段在推理和非推理提示上训练步骤 3 的检查点,提升有用性、无害性和推理能力。

有趣的是,DeepSeek 团队表明,仅使用纯强化学习,没有 SFT 阶段,仍然可以学习到反思和回溯等高级推理能力(“Aha moment”)。模型在强化学习训练过程中自然地学会了在解决推理任务时花费更多思考 token。所谓”aha moment”可以自发涌现,指的是模型反思之前的错误,然后尝试替代方法来纠正它们。此后,各种开源努力尝试复现 R1 的结果,如 Open-R1、SimpleRL-reason 和 TinyZero,都基于 Qwen 模型。这些努力也证实了纯强化学习在数学问题上能带来优异表现,以及”aha moment”的自发涌现。

DeepSeek 团队还分享了他们的一些不成功的尝试。他们未能成功使用过程奖励模型(PRM),因为很难定义逐步评分标准或判断中间步骤是否正确,同时这使得训练更容易受到奖励黑客攻击。在蒙特卡洛树搜索(MCTS)上的努力也失败了,因为语言模型 token 的搜索空间巨大,相比之下国际象棋的搜索空间就小得多;而且用于指导搜索的细粒度价值模型的训练也非常具有挑战性。失败的尝试往往能提供独特的洞见,我们希望鼓励研究社区更多地分享哪些方法没有奏效。

在推理步骤中,某些中间步骤可以通过执行代码或运行数学计算来可靠且准确地解决。将这部分推理组件卸载到外部代码解释器中,如 PAL(Program-Aided Language Model; Gao et al. 2022)或 Chain of Code(Li et al. 2023),可以通过外部工具扩展大语言模型的能力,消除了大语言模型需要学习执行代码或充当计算器的需求。这些代码模拟器,如 Chain of Code 中的那样,可以通过大语言模型进行增强,使得如果标准代码解释器失败,我们可以选择使用大语言模型来执行那行代码。使用代码来增强推理步骤对数学问题、符号推理和算法任务尤为有益。这些单元测试可能并非编程问题的一部分,在那些情况下,我们可以指示模型自我生成单元测试来验证其解决方案(Shinn, et al. 2023)。

ReAct(Reason+Act; Yao et al. 2023)结合了搜索 Wikipedia API 的动作和推理轨迹的生成,使得推理路径可以整合外部知识。

OpenAI 近期发布的 o3 和 o4-mini 是另外两个很好的例子,其推理过程涉及工具使用,如网页搜索、代码执行和图像处理。该团队观察到,大规模强化学习与 GPT 范式中展现的趋势一致:“更多计算 = 更好的性能”。

深度学习模型常被视为黑箱,人们提出了各种可解释性方法。可解释性有用有几个原因:首先,它为我们提供了一个额外的检验手段,来判断模型是否与其创建者的意图不一致,或者它是否以我们无法通过监控其行为来察觉的方式表现异常。其次,它可以帮助我们判断模型是否使用了合理的过程来计算其答案。思维链提供了一种特别便捷的可解释性形式,因为它使模型的内部过程以自然语言的形式可见。然而,这种可解释性建立在一个假设之上:模型真实地描述了其内部思维过程。

近期研究表明,监控推理模型的 CoT 可以有效检测模型的不当行为,如奖励黑客,甚至可以使较弱的模型监控较强的模型(Baker et al. 2025)。增加测试时计算还可以提升对抗鲁棒性(Zaremba et al. 2025);这在直觉上是合理的,因为当模型面对不寻常的输入(如对抗样本或越狱尝试)时,更长时间的思考应该特别有用——它可以利用额外的思考时间来理解它所面对的奇怪情况。

直观上,由于缺乏旨在鼓励忠实推理的显式训练目标,模型的 CoT 可能存在偏见。或者,当我们在人类撰写的解释上微调模型时,那些人类撰写的样本可能包含错误。因此,我们不能默认假设 CoT 总是忠实的。

Lanham et al. (2023) 通过故意在 CoT 中引入错误并测量其对一组多选题任务(如 AQuA、MMLU、ARC Challenge、TruthfulQA、HellaSwag)准确率的影响,研究了 CoT 忠实性失效的几种模式:

错误 1(提前回答):模型可能在 CoT 生成之前就过早地形成了结论。这通过提前截断或在 CoT 中插入错误来测试。不同任务揭示了 CoT 有效性的任务特定依赖性;有些任务的评估性能对截断的 CoT 敏感,但有些则不敏感。Wang et al. (2023) 做了类似的实验,但在 CoT 形成过程中引入了与桥接对象或语言模板相关的更微妙的错误。

错误 2(无信息 token):无信息的 CoT token 能提升性能。这一假设通过将 CoT 替换为填充文本(例如全为句号)来测试,该设置显示准确率没有提升,且与没有 CoT 相比,某些任务的性能可能略有下降。

错误 3(人类不可读的编码):相关信息以人类难以理解的方式编码。以非标准方式改写 CoT 并未降低跨数据集的准确率,表明准确率提升并不依赖人类可读的推理。

有趣的是,Lanham et al. 指出,对于多选题,较小的模型可能能力不足,无法很好地利用 CoT,而较大的模型可能在没有 CoT 的情况下也能解决这些任务。这种对 CoT 推理的依赖性(通过使用与不使用 CoT 获得相同答案的百分比来衡量)在多选题上并不总是随模型规模增加而增加,但在加法任务上确实随模型规模增加而增加,这意味着思考时间对复杂推理任务更为重要。