你让同一个大模型解一道小学应用题。第一次它答错了,第二次它又答错了,第三次它答对了。你是不是觉得这模型随机性太强,不可靠?但如果我告诉你,有人专门利用这种随机性——问同一个问题很多次,然后取出现最多的答案——反而把准确率提升了好几个百分点。而且这个方法不需要训练,不需要微调,只需要加一个"投票器"。这就是 Self-Consistency(自一致性),来自 Google Research 的一篇论文,2022 年发表在 arXiv 上。论文链接

要理解它的思路,你得先知道 Chain-of-Thought(CoT)。CoT 就是让模型在回答前先输出推理过程。比如问"一个苹果 3 元,买 5 个多少钱?",模型先写"3 乘以 5 等于 15",再给答案 15。这个简单的改变,让大模型在数学题上的准确率飙升。但 CoT 有一个隐性缺陷:默认的贪心解码只让模型沿着概率最高的路径走,如果这条路径一开始就错了,模型就会一路错下去,没有回头路。
自一致性的想法是:与其只走一条路,不如让模型把多条路都走一遍,最后汇总。具体来说,三步:
- 用较高的温度(比如 0.7)对同一个问题采样多次,每次生成一条完整的推理链和最终答案。因为采样是随机的,不同次数会得到不同但可能都合理的推理路径。
- 把每条推理链对应的最终答案提取出来。
- 对这些答案进行多数投票,票数最高的就是最终输出。
举个例子。问题是"3x + 5 = 14,x 等于多少?"第一次采样,模型走路径 A:3x = 9,x = 3。第二次采样,走路径 B:3x = 14 – 5,x = 3。第三次采样,走路径 C:x = (14 – 5) / 3,x = 3。三条路径殊途同归,答案都是 3,投票结果毫无悬念。但如果用贪心解码,模型可能只生成一条路径,如果这条路径在第二步算成了 3x = 14 + 5,那答案就是 19,而且没有任何纠错机会。
你可能会问:随机采样不是会增加不确定性吗?为什么投票反而能提高准确率?这里的关键在于,模型内部其实"知道"答案,只是单次推理时会被各种噪声干扰。当你用温度采样多次,每一次都是独立的"重新思考"。正确答案对应的推理链可能有多种写法——有的用方程,有的用穷举,有的用逻辑推理——但它们最终会收敛到同一个数字。而错误答案呢?错误的路径通常是"各错各的",这个路径算错一步,那个路径看错条件,最后得到的错误答案五花八门,很难统一。所以,当你统计所有采样结果时,正确答案会形成一个明显的"聚类",而错误答案则散落在各处。多数投票本质上就是找这个最大的聚类。
从概率的视角看,给定输入 x,模型定义了一个条件分布 P(y|x)。自一致性做的事情是,对每个可能的答案 y,估计它在采样中的频率。这个频率近似于 y 的边际概率——把生成路径视为隐藏变量,对它们求和。如果模型的分布足够好,概率最高的答案自然就是最可能的答案。而贪心解码只考虑了概率最高的一条路径,相当于用 mode 而不是 marginal 来估计,这在复杂推理中往往不如后者稳健。
论文在 GSM8K、MultiArith、SVAMP 等多个数学推理数据集上验证了效果。以 PaLM-540B 为例,在 GSM8K 上,贪心解码的准确率约 56%,使用自一致性后提升到 74% 左右,涨了 18 个百分点。在 MultiArith 上更是接近满分。这个提升幅度,相当于换了一个更大的模型。更难得的是,这个方法在多种规模的模型上都有效,从百亿参数到千亿参数都有提升。
为了看清它的定位,我把自一致性和常见的解码策略放在一起对比:
| 方法 | 思路 | 计算成本 | 效果 |
|---|---|---|---|
| 贪心解码 | 每步选概率最高的词,走一条路径 | 低 | 受单一路径限制,可能陷入局部错误 |
| Beam Search | 保留 top-k 条候选序列 | 中 | 对翻译、摘要等有优势,但对推理题提升有限,且容易重复 |
| 自一致性 | 采样 N 条路径,多数投票 | 高(N 倍) | 在数学、常识推理上显著提升 |
| 重排序模型 | 训练一个评分器选最佳路径 | 高(需要额外训练) | 效果取决于评分器质量,不如投票稳健 |
从上表可以看出,自一致性在推理任务上是最具性价比的选择——如果你不介意计算成本的话。
如果你用 Python 调模型,核心逻辑就这几行:
def self_consistency(model, prompt, n_samples=10, temperature=0.7):
answers = []
for _ in range(n_samples):
output = model.generate(prompt, temperature=temperature)
answers.append(parse_answer(output))
return most_frequent(answers)
实现时还有一个容易被忽略的细节:答案的格式要归一化。比如"15"和"15.0"应该算同一个答案,"x=3"和"3"也要归一化。论文在实现中做了简单的字符串解析,但对于更复杂的任务(比如多项选择题),需要根据任务类型定制解析器。
温度设置很重要。论文实验表明,在数学推理任务上,温度 0.7 左右效果最好。温度太低,采样的路径多样性不够,投票退化为贪心解码;温度太高,生成太多噪声,错误答案也开始趋同,投票失效。采样次数一般取 10 到 20 次,超过 20 次后收益递减。
我第一次看到这个 idea 时,觉得这也太"工程化"了,没有理论美感。但后来我读了一篇关于贝叶斯模型平均的文章,才意识到自一致性本质上是一种对模型后验分布的近似边际化——模型在温度采样下的不同生成路径,近似于从它的后验分布中抽样,多数投票就是在估算哪个答案的后验概率最高。这样一想,它其实是把机器学习里最经典的"集成学习"思想用在了推理阶段,简单但符合统计原理。
当然,自一致性不是银弹。它有几个硬伤:
- 只适用于有唯一正确答案的任务。开放式生成(写文章、聊天)不能用。
- 计算成本翻 N 倍。调用一次模型变 N 次,预算有限时很肉疼。
- 对模型本身能力有门槛。如果模型对这个问题一无所知,采样多少次也选不出对的。
- 答案解析是个工程难题。不同格式的答案需要归一化,比如"15"和"15.0"要算同一个答案。
尽管如此,自一致性仍然是我心中最值得先试的推理增强手段。它不需要训练,不需要额外的模型,几行代码就能用。在数学推理、常识问答等任务上,它能把准确率提升几个点到十几个点。它的边界也很清晰:当任务没有唯一答案,或者你付不起多次调用的成本时,它就不适用了。理解它的原理后,你再看到"问多次取多数"这个技巧,就会明白它不是简单的重复劳动,而是对模型概率分布的一种有效利用。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/266.html