自一致性只在真相恰是众数时有效——也仅在此时。
自一致性(Wang 等,2022)在非零温度下采样许多条思维链,并返回多数答案。它是最廉价、最易并行的测试时计算杠杆,往往也是杠杆率最高的一根。本文解释它生效的统计学原因、它失效的精确条件、它边际收益递减的曲线形状,以及如何花好你手上真正有限的采样预算。
机制:在推理路径上做边缘化。
单次贪心解码只押注一条路径;早期一个错 token 就会让它满盘皆输。自一致性采样 k 条独立轨迹,并对最终答案而非推理过程投票。它赌的是:许多条不同的正确推导会收敛到同一个答案,而错误是弥散的、会散落到许多个错误答案上。于是即便没有任何单条样本可靠,正确答案仍会积累出相对多数。本质上,这是在隐含推理路径上做蒙特卡洛边缘化——你不再关心走了哪条路径,而是问路径分布集中在哪个答案上。
# Self-consistency: sample, extract, vote samples = [model.call(q, temperature=0.7) for _ in range(k)] answers = [extract_final(s) for s in samples] ans = majority(answers) # mode of the answer distribution
失效条件是精确的:偏向一个错误的众数。
只有当正确答案是众数样本时,自一致性才能找回真相。如果模型存在系统性偏差——一个常见误解、一个有缺陷的启发式、一个带引导性的提示——那么错误答案就是众数,而投票会放大这个偏差。更多样本只会让你对错误答案更自信,而非更不自信。这是最重要的一条警告:自一致性降低的是方差(解码的运气不好),对偏差(一个平均而言就是错的模型)毫无作用。它无法凭空造出采样分布里本就不存在的信号。
绝不要把一边倒的投票(例如 28/30 一致)当成置信度分数。一个自信地错着的模型,会对错误答案产出极不均衡的投票。投票优势度量的是模型的确定性,而非答案的正确性——只有当模型在该任务上无偏时,二者才重合。
结构性约束:答案空间必须小且离散。
投票要求答案能按相等性比较且能相互碰撞。它适用于一个最终整数、一个选择题选项、一个归一化后的短字符串;对自由文本、代码、证明或文章则毫无用处——两份正确的程序在文字上不同、永不碰撞,于是每个样本都自成单点,"多数"也就失去意义。对那类任务你需要另一种选择器(在候选之上的核验器或裁判),那是 best-of-N,不是自一致性。投票前要积极归一化:规范数字、剥离单位、统一选项大小写——一次解析失误就会把一个真实的多数打散成噪声。
收益递减:一条饱和曲线,而非直线。
准确率对 k 的关系是凹的、会饱和的。早期样本带来真实信息;后期样本越来越多地重走已见过的路径,于是边际收益衰减。在当代强模型上,对许多推理基准而言这条曲线通常在十几到二十几个样本处趋平——再往后,额外样本多半只是复制已有轨迹,准确率进入平台,甚至在某些任务上因低质量轨迹稀释投票而略有下降。与此同时,成本严格随 k 线性增长。你是在用线性开销买一个近似对数的准确率收益;经济上理智的区间是曲线的拐点,而不是它的尾巴。
按任务类别经验性地找拐点:在有标注的开发集上扫 k ∈ {1,3,5,10,20,40},画准确率对成本的曲线,选取斜率走平之后最小的那个 k。再加上自适应早停:一旦领先优势在统计上已成定局就停止采样,让简单样本只花 3 个样本、只有难样本才花 40 个。
把预算花得比均匀投票更聪明。
朴素多数对每条轨迹一视同仁,包括那些明显坏掉的。按依赖强度递增的廉价升级有:在投票前过滤掉通不过免费检查的轨迹(格式错误、单元测试失败、自相矛盾);当你有一个可用的核验器或自报置信度时,对投票做加权;或者在存在答案级核验器时切换到加权 best-of-N——它会压过投票,因为它能奖励一条多数会淹没掉的"罕见但正确"的轨迹。多样性同样重要:在合理温度下用多样的提示/人设采样,比在单一提示上猛拉 k 更能去相关化错误、更快锐化众数。
诚实的取舍。
对于答案空间小且离散、模型大致无偏的任务,自一致性是每美元换准确率的最佳杠杆——而当模型有偏时,它是一个抬高置信度的陷阱。它以线性成本削减解码方差,在拐点处饱和,并会悄无声息地放大任何系统性错误。度量拐点、把 k 封顶在那里,一旦答案空间不再可投票就立刻改用核验器。