从一次问答的退化说起
假设你在一个开放域问答系统中输入“为什么天空是蓝色的?”,模型在回答开头给出了正确的物理解释,但接下来开始重复“因为瑞利散射”这句话,或者突然跳到“因为……因为……因为……”的循环。这种退化在自回归语言模型中并不罕见,尤其是当模型规模较小或生成长度较长时。
传统解码策略试图通过调整概率分布来缓解这个问题。温度采样通过缩放 logits 的 softmax 温度来改变分布的尖锐程度,温度越低越接近贪心,温度越高越随机;top-p(核采样)则从累积概率超过阈值 p 的最小 token 集合中采样,避免从长尾中选出不相关的词。但这些方法都只作用于单一模型的概率分布,无法区分“模型真正想表达的内容”和“模型因训练数据或架构缺陷而产生的惯性模式”。
对比解码(Contrastive Decoding, CD)提供了一种不同的思路:同时运行一个大型“专家”模型和一个小型“业余”模型,利用两者 logits 的差异来指导生成。其核心假设是:专家模型的失败模式(如重复、不连贯)在业余模型中更为严重,因此两者的差异可以揭示哪些文本更值得被生成。
退化重复的根源:最大概率并非最优目标
语言模型通过最大化训练数据中下一个 token 的条件概率来学习,但在开放域生成中,直接使用最大概率作为解码目标会产生短而重复的文本。Li 等人在 2022 年的论文《Contrastive Decoding: Open-ended Text Generation as Optimization》中指出,最大概率目标倾向于选择高频、通用的 token,这些 token 在训练集中出现频繁,但往往缺乏信息量,导致生成内容趋于平淡和重复。
另一方面,纯采样虽然能增加多样性,但可能产生不连贯的文本,甚至偏离原始主题。对比解码的提出正是为了在两者之间取得平衡:它通过对比专家模型和业余模型的概率差异,既保留了专家模型的流畅性,又抑制了业余模型中更明显的退化模式。
对比解码的核心机制
对比解码的目标是找到一段文本,使得它在专家模型下的概率远高于在业余模型下的概率。形式上,对于给定前缀 x,下一个 token 的得分定义为:
score(y) = log P_expert(y|x) - log P_amateur(y|x)
其中 P_expert 和 P_amateur 分别是专家模型和业余模型的条件概率。得分越高,说明该 token 在专家模型中越受青睐,而在业余模型中相对不受欢迎,因此更可能是高质量的选择。
然而,直接最大化这个差异可能导致选择不合理的 token,因为业余模型可能对某些罕见 token 给出极低的概率,从而放大差异。为此,Li 等人引入了一个“合理性约束”:只有专家模型概率高于某个阈值 α 的 token 才被考虑,其他 token 被屏蔽。这个阈值 α 通常设为 0.1,表示专家模型认为该 token 至少有 10% 的概率。
此外,对比解码还包含一个超参数 β,用于控制业余模型惩罚的强度。在后续的推理增强工作中,O’Brien 和 Lewis 在 2023 年的论文《Contrastive Decoding Improves Reasoning in Large Language Models》中采用了 β=0.5,并将得分公式调整为:
score(y) = (1 + β) * log P_expert(y|x) - β * log P_amateur(y|x)
这样,对比惩罚的强度与输出 logits 的预期尺度解耦,使得 β 的调节更加稳定。
数据流与决策过程
为了更直观地理解对比解码的流程,我们可以用以下流程图表示生成一个 token 的过程:
flowchart TD
A[输入前缀 x] --> B[专家模型前向传播]
A --> C[业余模型前向传播]
B --> D[获取专家 logits]
C --> E[获取业余 logits]
D --> F[应用合理性约束: 屏蔽概率低于 α 的 token]
E --> F
F --> G[计算对比得分: (1+β)logP_expert - βlogP_amateur]
G --> H[选择得分最高的 token 或按 softmax 采样]
H --> I[拼接新 token 到前缀]
I --> J{是否达到终止条件?}
J -- 否 --> A
J -- 是 --> K[输出完整文本]
在这个流程中,每一步都需要同时运行两个模型的前向传播,因此计算开销是单个模型的两倍(不考虑并行优化)。但值得注意的是,业余模型通常很小(如 125M 参数),其计算成本远低于专家模型(如 13B 参数),因此实际开销增加的比例小于两倍。
与温度采样、top-p 的互补性
对比解码并不排斥温度采样或 top-p,相反,它们可以组合使用。在计算对比得分后,可以将得分作为 logits 输入到 softmax 中,并应用温度参数来调整分布的尖锐程度,或者使用 top-p 过滤低概率 token。这种组合方式在 O’Brien 和 Lewis 的实验中有所体现,他们使用对比解码配合 8-shot 思维链提示,在 GSM8K 等数据集上取得了显著提升。
温度采样和 top-p 主要作用于单一模型的概率分布,它们无法区分“模型认为合理的”和“模型因退化而偏好的” token。对比解码通过引入业余模型作为参考,提供了一种额外的信号来抑制那些在两个模型中概率都高但实际是退化模式的 token。例如,在重复循环中,业余模型可能更倾向于重复高频 token,而专家模型虽然也倾向于重复,但程度较轻,因此两者的差异会降低这类 token 的得分。
计算开销与延迟影响
对比解码的核心代价是同时运行两个模型。在在线服务场景中,这意味着每个请求需要两倍的显存和计算量。然而,业余模型通常很小,例如 OPT-125M 或 LLaMA-1.5B,其计算量远小于专家模型(如 OPT-13B 或 LLaMA-65B),因此总体开销增加的比例可能只有 10%~20%。
延迟方面,由于两个模型可以并行推理,如果部署在支持多 GPU 的环境下,可以同时运行两个模型,延迟增加有限。但在单 GPU 环境下,需要串行运行,延迟会接近两倍。对于延迟敏感的应用,这可能是一个限制。
与自洽(self-consistency)等方法相比,对比解码的计算量要小得多。自洽需要多次采样并投票,而对比解码只需一次前向传播(两个模型各一次),因此效率更高。
长文本生成中的适用边界
对比解码在长文本生成中表现出色,因为它能有效抑制重复。Li 等人的实验表明,在 Wikipedia、新闻和故事领域,对比解码在自动和人工评估中均优于 nucleus 采样和 top-k 采样。然而,它并非没有边界。
首先,对比解码的效果依赖于业余模型的选择。业余模型必须足够小,以体现更明显的退化模式,但又不能太小以至于完全无法捕捉语言结构。Li 等人使用 OPT-125M 作为业余模型,而 O’Brien 和 Lewis 使用 LLaMA-1.5B,均取得了良好效果。
其次,对比解码可能放大专家模型与业余模型之间的能力差异。在 MATH 数据集上,O’Brien 和 Lewis 发现对比解码并未带来提升,他们推测这是因为该任务超出了专家模型的能力范围,对比解码只会放大专家模型本身学得不好的技能。
此外,在常识推理任务中,对比解码对较小模型(如 LLaMA-13B)可能有害,但在较大模型(如 LLaMA-65B)上有效。这表明对比解码的收益与模型规模相关,需要针对具体模型进行调优。
与替代方案的比较
下表总结了对比解码与几种常见解码策略的对比:
| 解码策略 | 核心机制 | 计算开销 | 质量提升 | 适用场景 |
|---|---|---|---|---|
| 贪心解码 | 每步选择概率最高的 token | 低 | 低,易重复 | 短文本、任务明确 |
| 温度采样 | 缩放 logits 温度后采样 | 低 | 中等,可能不连贯 | 需要多样性的场景 |
| top-p 采样 | 从累积概率达 p 的集合中采样 | 低 | 中等,缓解长尾 | 开放域生成 |
| 对比解码 | 专家与业余模型 logits 差异 | 中(两倍模型) | 高,抑制退化 | 长文本、推理任务 |
| 自洽 | 多次采样并投票 | 高(多次采样) | 高,但计算昂贵 | 需要高可靠性的推理 |
从表中可以看出,对比解码在质量上接近自洽,但计算开销远低于自洽。然而,它需要额外的模型部署,增加了工程复杂度。
失败模式与可观测性
在实际部署中,对比解码可能面临以下失败模式:
- 分布偏移:如果业余模型与专家模型在训练数据分布上差异过大,对比得分可能失真,导致生成不自然。
- 阈值选择不当:α 设置过高会屏蔽过多 token,导致生成受限;设置过低则无法有效抑制退化。
- 业余模型能力过强:如果业余模型过于强大,其退化模式不明显,对比信号减弱,效果下降。
为了监控对比解码的效果,可以观察以下指标:
- 重复率:生成文本中 n-gram 重复的比例。
- 困惑度:专家模型对生成文本的困惑度,用于评估流畅性。
- 人工评估:定期抽样进行人工评分,评估连贯性和相关性。
当发现重复率上升时,可以调整 β 值或检查业余模型是否合适。
未解决的问题
对比解码作为一种无需训练的推理时方法,已经在多个任务上证明了有效性,但仍存在一些未解决的问题:
- 自适应阈值:如何根据输入动态调整 α 和 β,而不是使用固定值。
- 多模型对比:是否可以通过多个不同规模的模型进行对比,获得更稳定的信号。
- 与微调的结合:对比解码与监督微调或偏好优化如何协同,是否能进一步提升。
这些问题的探索将有助于对比解码在更广泛的应用场景中落地。