跳转到内容

第 37 章 运行时增加计算:采样、搜索、验证和停止

37.1 权重不动,也可以多做几次工作

Section titled “37.1 权重不动,也可以多做几次工作”

即使事实齐全,第一次作答也可能选错运算。第 36 章先加总住宿费、再封顶的做法,把正确的 1430 算成了 1500。我们可以用更好的解答训练模型,也可以保持权重不变,让它多产生几个候选,再加以检查。这是两种不同的改动。

运行时增加计算(test-time compute),指为当前请求投入更多计算。它可以是生成更长的解题过程、多次采样、搜索其他解法,或者调用核验器,并不意味着每次尝试之间都在更新参数。第 29 章解释了采样怎样产生不同续写,第 36 章解释了为什么检查这些续写是另一项能力。

额外工作究竟换来了什么?如果只计算最后胜出答案的成本,就隐藏了被淘汰的候选;如果只算生成,把核验当作免费服务,又会偏袒昂贵的选择办法。本章公开全部候选,采用明确的预算口径;第 38 章再对真实的本地 KA-1 模型做运行侧适配比较。

例 37.1:固定一个小候选池。 每道题都有两晚整元住宿费,限额均为每晚 750 元。分别封顶,再把允许金额相加,不得挪用额度。下表四个正确总额都能按这条规则手算。

直接回答和分步候选均为作者给定,不是模型生成结果。CPU 实验是在固定候选上重放控制流程,测量的是选择程序的行为和重放时间,不是语言模型准确率或生成速度。这样无需 GPU,也能逐步检查选择。原始候选池保存在 data/part-vi/budget-v1.json。

表 37.1:完整题集与候选池。 A、B、C 是每道题内部的候选位置。相同字符串也保留为不同次尝试。

费用正确总额直接回答分步候选 A分步候选 B分步候选 C
680、82014301500680 + 820 = 1500680 + 750 = 1430680 + 750 = 1430
400、300700700400 + 300 = 700400 + 300 = 700400 + 300 = 700
800、90015001500750 + 750 = 1500800 + 900 = 1700800 + 900 = 1700
600、90013501500600 + 750 = 1350600 + 900 = 1500600 + 900 = 1500

分步表达式里的两个数,是声称允许报销的金额,不只是原始账单。因此第一题 A 的第二项金额是错的。第三题 B、C 则重复了同一种未封顶错误。不同调用可能犯相关的错误,文字多了,并不保证换了一种方法。

本章横轴采用每道题最多允许的计入预算的调用数:生成一个候选算一次,调用核验器也算一次。这是明确规定的调用配额,不是说每次调用花费相同的时间、Token 或 FLOP。输入输出 Token 和耗时另行记录。

固定重放使用 ASCII 请求串 sum per night minimum costs 680 820 cap 750,每题只替换其中两晚费用。教学词法规则把一个单词、一段连续数字或一个非空白标点各算一个 Token。每条请求都是 9 个 Token,直接数字答案是 1 个,分步表达式是 5 个。这些是固定材料的教学 Token,不是 MG-2 或 API 的 Token。两种语言页面分析的是同一批原始字符串。

生成时读入全部 9 个请求 Token,再输出候选。核验时读取请求与候选,再输出一个 accept 或 reject 判定 Token。不假定前缀复用。因此直接回答花费 9+1=109+1=10 个教学 Token,分步回答花费 9+5=149+5=14 个,核验花费 9+5+1=159+5+1=15 个。重复和被拒绝的候选都要计入。真实模型应使用它的分词器、实际处理的上下文和实现中的计时,不能直接套用这套教学词法规则。

直接作答(direct)只尝试一次答案。思维链(chain-of-thought,CoT)方式先生成中间解题文本,再给答案;本例的“首条分步路径”取第一个分步候选。原始 CoT 提示研究改变的是输入示范,不是权重。本章给定的两类输出也不是对该论文实验的复现。可见步骤能为后续 Token 提供有用上下文,但仍是生成文本,不是完整的内部计算记录。Wei 等人说明了提示设定及其限制。

自洽性选择(self-consistency)采样多条解题路径,提取最终答案,再选择出现最多的答案。本例 vote 按指定顺序最多取三个候选;平票时保留最先遇到的答案。它数的是最终金额的票,不是比较哪段话听起来更有道理。真实模型还需要合适的采样方式和答案解析器,控制程序重放不会替模型创造多样性。Wang 等人给出了多路径采样方法。

本例的搜索加核验器按顺序尝试完整候选。每生成一个,就用第 36 章基于规则的金额检查核验;第一个合格金额出现后即停止。开始新候选前,必须预留一次生成和一次核验的预算。剩余不足两个单位便停止;如果没有合格候选,就弃答。这里题目信息齐全,弃答计为失败。这是一种范围很小的完整解答搜索。前缀搜索或树搜索还可以在中间步骤处分支、剪枝,但扩展、重复前缀、向前试探和检查都要计入预算。本章不实现树搜索算法。

37.4 沿着选择过程看,而不只看最后分数

Section titled “37.4 沿着选择过程看,而不只看最后分数”

例 37.2:每题最多四次调用。 先用主顺序 A、B、C。直接回答只答对第二、三题,成绩为 2/4;首条分步路径 A 答对第二、三、四题,成绩为 3/4。

投票用完三个候选,每题花三次生成。第一题 1430 以二比一胜出;第二题三个答案都是 700。可是第三题中,错误的 1700 以二比一压过正确的 1500;第四题中,错误的 1500 又压过正确的 1350。最终只答对 2/4。更多采样文本,反而降低了相对于主顺序首条分步路径的成绩。

搜索在第一题先拒绝 A=1500,再接受 B=1430,两次生成、两次核验,正好用满四个单位。第二、三、四题的首候选立即合格,各用两个单位。因此搜索总计 4+2+2+2=104+2+2+2=10 次调用,四题全对。

表 37.2:预算上限相同,全部工作照实计入。 每行都是每题最多四次调用,允许提前停止。Token 总数按教学词法规则计算。末列是 CPU 控制程序实际重放的耗时,不是模型生成耗时。

方法生成次数核验次数计入预算的总调用数教学 Token 总数正确题数CPU 重放,ms
直接作答404402/40.011417
首条分步路径404563/40.013000
三路径投票120121682/40.036916
搜索加核验器55101454/40.029125

搜索的五次生成花费 5×14=705\times14=70 个 Token,五次核验花费 5×15=755\times15=75 个,总共 145 个。若只算四个返回答案,就漏掉了第一个被拒候选和全部核验。直接作答与首条分步路径虽然调用数相同,Token 总数却不同,因此这不是等 Token 实验。

在主顺序下,把上限依次设为 1、2、3、4、6。直接作答与首条分步路径在一次生成后便停止。投票用过三个候选后,候选池已空,提高上限不会凭空增加候选。搜索则在接受、候选用尽或剩余预算不足时停止。

表 37.3:主顺序下,各调用上限对应的成绩。

每题最多调用数直接作答首条分步路径投票搜索加核验器
12/43/43/40/4
22/43/43/43/4
32/43/42/43/4
42/43/42/44/4
62/43/42/44/4

上限为 1 时,搜索凑不齐“生成加检查”这一对预算,根本不开始调用。上限为 3 时,首候选失败后只剩一个单位,也无法尝试第二个候选。投票只看两个候选时,平票保留首答案;加入第三票后,第一题改善,第三、四题却退化,净少答对一道题。

○ 直接作答 · □ 首条分步路径 · △ 投票 · ◇ 搜索加核验器

主顺序 A—B—C。生成一次、核验一次都各计一次调用;实际工作可以在上限之前停止。

图 37.1:增加投票可能降低质量;核验搜索也需要足够的调用预算。 原创固定候选数据与静态曲线图 · CC BY-SA 4.0

图 37.1 把表中数据画出来,除了标签,还用不同线型与标记区分曲线。纵轴是四道题中答对几道,横轴是最大配额;未使用的预算不能偷偷算成实际工作。这些点展示固定候选池下的可能结果,不是某个模型家族的普遍曲线。运行时计算研究同样发现,结果依赖题目难度、核验器和成本定义。Snell 等人明确讨论了这些条件,并说明其报告的实验没有计入难度估计成本。

只看一个有利顺序还不够。重放前保留了三个确定性顺序:A—B—C、B—A—C、C—B—A。它们检查的是顺序敏感性,不是三个独立的模型训练种子。

表 37.4:改变固定顺序,重做每题四次调用的比较。

顺序首条分步路径投票搜索加核验器搜索调用数 / 教学 Token 数
A—B—C3/42/44/410 / 145
B—A—C2/42/44/412 / 174
C—B—A2/42/42/412 / 174

最后一种顺序里,第三、四题各花四个单位拒绝了 C、B,尚未看到正确的 A。把上限提高到六,两题都能走到 A,成绩恢复到 4/4,但总成本为 16 次调用、232 个 Token。实际仍只有四道题,十二个“题目与顺序”结果不能算成十二种独立任务情境。

code/part-vi/core.py 可以复现每个选择和成本。data/part-vi/mechanism-run-v1.json 保存了每种顺序、方法和上限下实际测得的 CPU 重放毫秒数,以及完整调用和 Token 记录。计时包含控制程序、词法处理与核验工作,没有模拟语言模型生成。耗时很短,又依赖具体实现,不能用作服务延迟;第 38 章另行记录真实本地模型的完整调用。

37.6 停止条件要说明什么证据才算够

Section titled “37.6 停止条件要说明什么证据才算够”

硬预算限制的是允许做多少工作,不保证答案正确。本例预留核验预算,避免把最后一个单位花在无法检查的回答上。提前接受可以省工作,前提是核验器在所声明的任务范围内值得信任。

如果换成第 36 章的子串核验器,早早接受就可能保留错误或无依据的回答。继续搜索,还可能找到更多能钻评分漏洞的候选。同一个模型反复同意某个答案,也可能来自共同错误。共识是可以观察的现象,不是独立事实来源。

应先制定停止规则,再看测试结果里哪个最漂亮。从调用、Token 或时间上限,以及针对任务的接受条件开始。在开发数据上比较:增加一档预算多答对了哪些题,又增加多少工作、引入哪些退化。看不到改善,就没有证据支持额外成本。即使还剩有希望的分支,截止时间也可能要求明确弃答或给出有限回答。有分歧时,如果仍有预算且核验器确实能检查,可以再查一次;分歧不能成为无限生成的理由。

现在把住宿题里的现行制度拿掉。十次看似合理、都按 600 元计算的解答,也无法证明现行限额究竟是 600 还是 750。需要的是最新来源。同样,反复描述可能的订单状态,也没有查询真实订单。已有必要信息,并且确实存在可用解法时,增加解题计算才有针对性。因此下一步要判断的,是究竟缺了哪一层。

运行时增加计算,可以不改参数而改变选出的答案。比较时要采用同一套明确的资源口径,计入失败候选和核验,并公开停止与平票规则。更多工作可能改善、停滞,也可能降低质量。固定候选池重放解释的是控制过程,真实模型运行是另一类证据。反复一致或更长的解题文本,都不能提供缺失的事实。

  1. 在主顺序下,给搜索每题最多三次调用。写出第一题的尝试和停止过程,再计算四题总成本。
  2. 主顺序投票从两个候选增加到三个,虽然修好了第一题,为什么总成绩反而下降?
  3. 若核验一次改算两个单位,生成仍算一个单位,主顺序搜索每题至少需要多少上限,才能四题全对?整套题实际花多少单位?
  4. C—B—A 顺序、每题六次调用时,计算搜索的生成次数、核验次数和教学 Token 数。这能说明怎样的顺序敏感性?
  5. 团队报告称:“20 个回答大多数都说 600,因此制度仍是现行的。”缺了什么证据?哪一章的区分能说明这个错误?
  1. 第一题生成 A 后将其拒绝,花两次调用。只剩一个单位,凑不齐下一对调用,因此弃答。其余三题都在两次调用后接受 A,总计八次调用,4×14+4×15=1164\times14+4\times15=116 个 Token,答对 3/4。
  2. 两候选平票时保留 A。第三个候选使第一题答对,却使第三、四题答错。一次改善抵不过两次退化,正确题数从 3/4 降到 2/4。
  3. 每对生成与核验花三个单位。第一题需要两对,所以上限至少为六;其余各用三个单位,总计 6+3+3+3=156+3+3+3=15。成本口径变了,必须重新画曲线,不能只给旧曲线换标签。
  4. 第一、二题各一对,第三、四题各三对,因此共八次生成、八次核验,8×14+8×15=2328\times14+8\times15=232 个 Token。换顺序可能需要更多工作才能接触到同一批正确候选,没有因此学会新的模型能力。
  5. 缺少现行权威制度版本。二十个相关输出不是二十个独立来源。第 36 章区分应用已提供规则与补出缺失事实;第 32、38 章也区分来源选择与答案生成。