AI 基建
0%
第四部分 · 推理与测试时算力 · 第 24 章

引出推理

作者Changkun Ou
阅读时长约 11 分钟

一个基座模型早已具备远超贪心解码所能展现的推理能力,而在推断时就能把它引出来,不必动任何一个权重。引出推理,指的是那些把一次前向传播变成一段审议过程的提示与解码方法。思维链(CoT),也就是写出来的一串中间推理步骤,管用,是因为它给中间演算留下了词元;采样许多条链再投票更稳,是因为错误路径往往分散;一棵树或一次搜索,只有在问题存在可探索分支时才值得付出代价;验证器则是把 best-of-n 从原始采样变成选择的关键组件。怎样教权重去推理,是 第 28 章 的相邻问题,这里不训练任何东西。

2026-06-21T23:29:46.063896 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 1 0 0 1 0 1 测试时样本数 0.4 0.5 0.6 0.7 0.8 0.9 解题率 直接回答 链式推理 树搜索
图 24.1. 测试时推理方法随样本预算增加而变化的示意图。直接回答很早进入平台,链式推理有所帮助,而当问题有可探索分支时搜索更有价值。理想化曲线,非实测。

答案词元来得太早

给模型出一道多步的题,再贪心解码,它会在做完答案所依赖的演算之前,就先锁定一个答案词元。第 5 章 讲的自回归目标,在每个词元上投入的算力固定而均等,于是一道要十步算术的题,和一道一步都不用的题,分到的是同样的单次传播。模型具备这些子技能,因为预训练见过那些加法、查找与推导,可解码没给它们任何施展的余地。答案那个位置,必须一次完成所有整合。

这个观察给出了设计问题:投入更多推断算力,并以正确的结构使用它,让潜在能力浮现,而模型本身不变。推断时有两个控制方式。一个是提示,它能要求模型把中间步骤外化成词元,模型随后就能据此条件化。另一个是解码过程,它能采样、分叉、评分、选择,而不是贪心地取最高的那个词元。后面的每种方法,都是这两种方式的组合,而它们的演进顺序很清晰:先给推理一处施展之地,再摆脱对单个样本的依赖,然后组织并搜索由此形成的解空间。图 24.2 预览了这条线索上的四种解码方式。

Q 问题 M 解码形态 Q->M CoT 思维链 M->CoT 一条链 SC 自一致性 M->SC n 条链,投票 ToT 思维树 M->ToT 分叉、评估、回溯 BoN Best-of-n M->BoN n 个候选,打分,挑选 A 答案 CoT->A SC->A ToT->A BoN->A
图 24.2. 从一个固定模型引出并选择推理的四种解码形态。每一种都比贪心解码花费更多推断算力,只是结构不同。

给推理一处施展之地

第一步,是让模型把演算写出来,再利用这一点:写出来的演算如今已经是上下文的一部分。CoT是最小的形态,提示模型在最终答案之前先产出中间推理步骤,于是每一步都成了后面步骤能注意到的一段词元序列。这把一次困难的预测,拆成了一连串更容易的预测,也让模型有余地为更难的问题分配更多前向传播,每个推理词元一次。提示里放几个范例就能引出它 (Wei et al. 2022),而即便只给一句「Let's think step by step」,在毫无范例的情况下也能零样本地引出它 (Kojima et al. 2022)。权重保持不变。能力本就潜伏在那里,提示解锁的是解码,而那个零样本的结果把要点说透了:起作用的是引出,不是示范。

不再依赖单个样本

一旦推理被写进词元,解码过程就成了一片设计空间。下一步,是不再依赖单个样本。一条贪心的链可能早早就拐错了弯,从此再也回不来。自一致性(self-consistency)的做法,是在非零温度下采样许多条链,再对最终答案取多数投票 (Wang et al. 2022)。推理路径在这里不是要返回的输出,而是一份加总之后即可丢弃的草稿:

y^=argmaxyi=1n1[a(zi)=y],zipθ(zx)\hat{y} = \arg\max_{y} \sum_{i=1}^{n} \mathbf{1}\left[ a(z_i) = y \right], \quad z_i \sim p_\theta(z \mid x)

其中每个 ziz_i 是一条采样得到的链,a(zi)a(z_i) 是它到达的答案。许多路径能经由不同途径抵达正确答案,错误答案却往往各散各的,于是答案分布的众数,比任何单个样本都更可靠。这是这一族方法中性价比最高的一种:不需要验证器,不需要额外模型,只要更多样本加一次投票,而它至今仍是最强的简单基线,原因也正在于此 (Wang et al. 2022)。

试一试:每条链以概率 p 独立地答对,模拟对 n 条链投票。看多数投票的准确率,怎样在 p > 0.5 时升到单个样本之上,再趋于饱和。

import numpy as np

rng = np.random.default_rng(0)
p = 0.55           # 每条链答对的概率
trials = 20000     # 每个 n 的蒙特卡洛试验次数
ns = [1, 3, 5, 11, 21, 41]

for n in ns:
    correct = rng.random((trials, n)) < p   # 哪些链答对了
    votes = correct.sum(axis=1)             # 有多少条投给了正确答案
    win = (votes > n / 2).mean()            # 多数派正确(平票判为错)
    print(f"n={n:>2}  majority-vote accuracy = {win:.3f}")

print(f"\nSingle chain (n=1) accuracy = {p:.3f}; voting amplifies a weak edge.")

组织推理链,再搜索解空间

多采样同一条链,并不是唯一的改进方式。当一个问题本就可以分解时,就可以组织那条链,而不只是采样它。由最少到最多(least-to-most)提示先让模型把问题拆成有序的子问题,再让它一个个求解,每一步都以已经解好的子问题为条件,这让模型能泛化到比提示里任何单个范例都更难的问题 (Zhou et al. 2022)。

最丰富的设计,把推理看成在部分解组成的空间里搜索。思维树(ToT)让每个节点成为一个连贯的中间思维,每个节点扩展出若干子节点,由模型自己评判每个子节点有没有前途,再用广度优先或深度优先搜索来探索这棵树,其中也包括前瞻与回溯 (Yao et al. 2023)。这样一来,一条链就是每个节点只有一个子节点、又不回溯的退化的树。再往前推一步,AlphaZero 风格的方法在推理树上跑蒙特卡洛树搜索,用价值估计来决定往哪里扩展,于是算力集中到有前途的分支上,而不是均匀铺开 (Feng et al. 2023)。

链、树、价值引导的搜索,区别在于它们所探索的空间形态不同,见 图 24.3。一条链走一条线。一棵树向外铺开,逐个节点自评,还能从无效分支里回溯出来。一次搜索再加上一个价值估计,让算力集中到有前途的分支上,而不是均匀铺开。

G cluster_chain cluster_tree 树,分叉与回溯 cluster_search 搜索,价值引导 c0 c1 c0->c1 c2 c1->c2 c3 c2->c3 t0 t1 t0->t1 t2 t0->t2 t3 t1->t3 t4 t1->t4 t5 t2->t5 s0 s1 s0->s1 s2 s0->s2 s3 s1->s3 s4 s1->s4 s5 s3->s5
图 24.3. 链、树与价值引导的搜索,是同一片推理空间的三种形态。链是每个节点只有一个子节点、且不回溯的退化的树。据 Yao 等(2023)与 Feng 等(2023)。
图 24.4. 上图的单链、树和价值引导搜索,这里在同一棵树上运行。切换策略,就能看到价值引导的搜索只保留最好的几个想法,把其余的剪掉(灰色),并把算力集中到留存的最优路径上;而全开的树把同样的算力均匀铺开,连无效分支也不放过。读数标出每种策略各保留了多少个想法。示意性。

当投票还不够:验证器

自一致性靠投票,可投票只在答案是一个可计数的离散标签时才管用。best-of-n 用一个分数取代那次投票。采样 nn 个候选解,用验证器或奖励模型(前者对照真值检查,后者是学出来的质量评分器)给每个评分,返回最高的那个。这个做法最初是为小学数学引入的:训练一个验证器去判断候选解,生成许多个,留下验证器排名最高的那个,结果胜过了一个微调基线 (Cobbe et al. 2021)。同一个评分器也可以拿来引导搜索,而不只是给完成的输出排名,它能评估一棵树内部的部分状态,自评引导的束搜索做的正是这件事 (Xie et al. 2023)。验证器正是把原始样本变成被选中答案的那个组件,选择能换来多少,上限就由它的质量决定。这个上限,以及它如何为测试时扩展设界,留到 第 30 章 再谈。

投票和打分可能给出不同结论,图 24.5 展示了何时如此。在同一批采样得到的链上,投票偏向一致性,打分偏向正确性。当一个有偏的模型一贯出错时,多数答案也是错的,唯有一个拿答案对照真值检查的验证器,才能救回那条恰好正确的少数派的链。

Q 问题 C1 链 1,给出 42 Q->C1 C2 链 2,给出 42 Q->C2 C3 链 3,给出 42 Q->C3 C4 链 4,给出 37 Q->C4 V 投票,计数答案 C1->V S 打分,验证器逐条检查 C1->S C2->V C2->S C3->V C3->S C4->V C4->S VA 选中 42,错 V->VA SA 选中 37,对 S->SA
图 24.5. 在同一批 n 个样本上的投票与打分。多数投票返回共识 42,是错的。验证器对照真值为每条链打分,选中到达 37 的少数派的链,是对的。
争议所在

思维链词元到底是不是产出那个答案的计算的忠实记述,至今没有定论。乐观的读法把那条链当作模型真实的推理,这样它就既是提升准确率的手段,又是一扇可供监督的窗口。怀疑的读法则认为,那条链可以是事后的合理化:答案是由词元并不反映的计算决定的,把所陈述的推理扰动一下,模型照样到达同一个答案,或者它陈述出来的推理根本不驱动答案。如果诸条链并不忠实,那么准确率的提升是真的,可它看似带来的可解释性却是假的,这一点直接关乎 第 55 章 的监督论证。证据两边都有,还取决于任务、模型,以及忠实性是怎么探测的,所以先把一条可见的链当作对准确率的帮助,只有在经过测试之后,才把它当作一条忠实的轨迹。

下层约束

数据层能造出什么样的验证器,决定了能跑哪种引出方法。自一致性只需要一个离散答案供它投票,所以凡是答案可比较之处它都能用。best-of-n 和搜索都需要一个评分器,而最好的评分器,是一个基于真值的检查器:一个单元测试、一次数值或符号相等、一个证明检查器,正是 第 28 章 所界定的那个答案可检查的条件。有可靠验证器的地方,搜索与 best-of-n 划算,上限也高。只有一个学习得到的奖励模型的地方,这些方法就同样继承了 第 19 章 里的过度优化,一次更强的搜索,反而会因为对一个有缺陷的分数施加更强选择压力而把答案弄得更糟。验证器是否可得,是任务的属性而非解码器的属性,正是它决定了推断时算力能投入到多远才仍然有利可图。

每种方法的代价,以及边界在哪里

每种方法都拿推断算力去换准确率,而兑换率各不相同。

  • 单链与投票。 一条链成本最低、延迟最低,可一旦早早拐错弯就很脆弱。自一致性把词元成本乘上样本数 nn,换来一个稳健的多数答案,而且随 nn 增大收益递减。它需要一个离散、可比较的答案,所以不适用于那种无物可投的开放式生成。
  • 投票与评分。 投票不需要额外模型,却没法给自由形式的输出排名,也分不清一个自信而错误的共识和一个正确的共识。best-of-n 需要一个验证器或奖励模型,却能给那个评分器覆盖到的任何东西排名,它的上限随验证器质量而升高。投票奖励一致,评分奖励正确,而当模型一贯出错时,二者就分了岔。
  • 链与树与搜索。 一条链把算力花在一条线上。一棵树把它花在广度上,还能从无效分支里回溯出来,代价是每个节点要做许多次自评调用,而这些调用本身就是会出错的模型调用。MCTS 风格的搜索把算力集中到高价值分支上,却也加上了那套机制,以及对一个价值估计的依赖,后者一旦失准就会把搜索带偏。相对自一致性的增益是真的,可在许多任务上小于它的代价,所以更简单的方法往往才是正确的默认选择。
  • 现在算与训练一次。 这里的每种方法,都在每次查询上、一遍又一遍地付出代价。把这种行为训练进模型,正如 第 28 章 所述,付一次就摊销开了,代价则是一次训练运行和为之所需的数据。当模型固定、任务是新的、或者体量很低时,引出是正确的工具;到了规模上,内化才取胜。

有两条结构性的边界约束着引出,而它们都不是可以随意调节的参数。引出无法超出固定模型所能产出之物,只能在其中浮现并选择,所以一个模型在任何样本里都从未解出的问题,无论抽多少个、搜索多强,都够不着。还有,那条可见的链是提升准确率的一种手段,并不是对计算的一份有保证的记述,所以把它当作监督来读,正如 第 55 章 所述,是一个需要自己另做测试的主张,而不是让模型出声思考就自动得到的副产品。

把它们组合起来,再回到训练

这些方法更多是相互组合,而不是彼此取代。思维链是基础:让模型把步骤外化,靠范例,或者靠一句类似「一步一步来」的指令。在它之上,自一致性是第一个升级,采样几条到几十条链再投票,因为它成本低,又不需要别的组件。当一个验证器存在时,在同一批样本上做 best-of-n,用一个分数取代那次投票,提高上限。一棵树或一次搜索是最重的工具,只有当问题真有分叉结构、有回溯才逃得出的无效分支、而且每个节点的自评可靠到值得信任时,才用得上它。

这些权衡也都是失效模式:一个有偏的模型会自信地投出错误答案,一个弱验证器会被钻空子(也就是 第 19 章 里那个奖励欺骗(reward hacking)在推断时的表现),一次失准的自评会把树搜索引向死胡同。真正绕不开的是每次调用的代价:一个把词元数乘上数十倍、只换来几个点准确率的方法,未必经得起 第 76 章 的经济账,这也是这片领域的重心移向把行为训练进模型的原因。

训练是这条弧线最自然的收束。这里的一切,都是在推断时引出一个固定模型已然包含之物。下一步,是把这些方法产出的轨迹,那些经验证为正确的链和高价值的搜索路径,拿去训练,让模型把这种行为内化,从而在推断时少依赖这些外部支撑。这就进入了 第 28 章,而它的许多组成部分,采样许多个补全、用验证器给它们打分、留下好的那些,正是这里见过的同一批东西,只是如今接进的是一次权重更新,而不是一次解码。

延伸阅读

  • Wei et al., “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models,” 2022. arXiv:2201.11903
    思维链(CoT)提示通过在少样本示例中加入中间推理步骤,显著提升了大语言模型(LLM)在算术、常识与符号推理任务上的性能。
  • Kojima et al., “Large Language Models are Zero-Shot Reasoners” (zero-shot CoT), 2022. arXiv:2205.11916
    在问题后添加"Let's think step by step"(Zero-shot-CoT)无需任务特定的少样本示例,即可大幅提升 LLM 在算术和符号推理任务上的思维链(CoT)推理能力。
  • Wang et al., “Self-Consistency Improves Chain of Thought Reasoning in Language Models,” 2022. arXiv:2203.11171
    自一致性(self-consistency)通过对思维链(CoT)提示采样多条推理路径并以多数投票选出最一致答案,替代贪婪解码,显著提升大语言模型的推理准确率。
  • Zhou et al., “Least-to-Most Prompting Enables Complex Reasoning in Large Language Models,” 2022. arXiv:2205.10625
    由最少到最多提示法将复杂问题分解为更简单的子问题并顺序求解,使大语言模型能够泛化到比示例更难的问题。
  • Yao et al., “Tree of Thoughts: Deliberate Problem Solving with Large Language Models,” 2023. arXiv:2305.10601
    思维树(ToT)框架让大语言模型通过树搜索探索多条推理路径并自评估,将 GPT-4 在 Game of 24 上的成功率从 4
  • Xie et al., “Self-Evaluation Guided Beam Search for Reasoning,” 2023. arXiv:2305.00633
    本文提出将逐步自评估机制与随机束搜索结合,引导大语言模型(LLM)多步推理,在 GSM8K 等推理基准上相比 Codex 基线最高提升 9.56
  • Feng et al., “Alphazero-like Tree-Search can Guide Large Language Model Decoding and Training,” 2023. arXiv:2309.17179
    TS-LLM 将 AlphaZero 式树搜索与学习到的价值函数相结合,在推理、规划、RLHF 对齐和决策任务中同时引导大语言模型的解码与迭代训练。
  • Cobbe et al., “Training Verifiers to Solve Math Word Problems” (best-of-N reranking with a trained verifier), 2021. arXiv:2110.14168

评论

登录后评论