别再无视提示词: 利用对比解码提升上下文学习效果

像 GPT-4 和 Llama-3 这样的大语言模型 (LLMs) 彻底改变了我们处理自然语言处理 (NLP) 的方式。它们最强大的功能之一就是 上下文学习 (In-Context Learning, ICL) 。 你无需为了某个特定数据集花费数小时微调模型,只需在提示词中提供几个例子 (演示) ,模型就能找出规律。

这感觉就像魔法。你给模型三个英语翻译成法语的例子,它就能完美地翻译第四个句子。

但问题在于: 模型是真的从你的例子中学习了,还是只是在假装?

最近的研究表明,LLMs 经常忽略提示词中提供的具体 输入-标签映射 (input-label mapping)。相反,它们严重依赖预训练时的“先验知识 (priors)”——即在初始大规模训练阶段吸收的知识。本质上,模型只是扫了一眼你的提示词,识别出了任务 (例如,“噢,这是情感分析”) ,然后就忽略了你的具体例子,转而通过“直觉”来回答。

今天,我们将深入探讨一篇引人入胜的论文,题为 “Enhancing Input-Label Mapping in In-Context Learning with Contrastive Decoding” (通过对比解码增强上下文学习中的输入-标签映射) 。研究人员提出了一种巧妙且无需训练的方法,强制 LLMs 关注提示词中的具体逻辑。这种方法被称为 上下文对比解码 (In-Context Contrastive Decoding, ICCD)

如果你是 NLP 或机器学习领域的学生,这是一个完美的案例,展示了如何在不触及任何模型参数的情况下,通过在推理阶段操纵概率分布来解决模型根深蒂固的行为问题。


问题所在: 任务识别 vs. 任务学习

要理解为什么上下文学习会失败,我们需要区分两个概念:

  1. 任务识别 (Task Recognition, TR): 模型意识到它应该做 什么 任务 (例如,“对这条影评进行分类”) 。
  2. 任务学习 (Task Learning, TL): 模型根据例子中的具体映射学习 如何 完成任务 (例如,“在这个特定语境下,‘不坏 (not bad)’ 被标记为‘正面 (Positive)’”) 。

理想情况下,ICL 应该包含这两者。然而,研究表明 LLMs 擅长任务识别,但在任务学习上却很“懒惰”。它们受到 标签偏见 (Label Bias) 的影响。如果模型在预训练期间看到“糟糕 (terrible)”一词与“负面 (Negative)”关联了一百万次,即使你在少样本 (few-shot) 示例中明确告诉它标记为“正面”,它也很难照做。

这造成了性能上限。模型并没有在适应,它只是在回忆。


解决方案: 上下文对比解码 (ICCD)

研究人员提出了一种方法,从数学上分离出“任务学习”的信号。他们通过对比模型在 正确示例 上的行为与在 无意义示例 上的行为来实现这一点。

1. 标准方法

在标准 ICL 中,我们给模型一个上下文串 \(c\) (示例) 和一个输入查询 \(x\)。模型根据以下概率分布生成目标 \(y\):

LLM 生成的标准概率公式。

这里,\(\mathcal{T}(x)\) 是包装输入的模板。模型试图最大化这个概率。但正如我们所讨论的,这个概率被模型的预训练先验严重污染了。

2. 构建“负”上下文

为了解决这个问题,作者引入了 负上下文 (Negative Context) (\(c^-\))。

负上下文的目的是欺骗模型。我们需要一组看起来像原始任务,但包含 错误输入-标签映射 的例子。

他们是如何构建的呢?

  • 原始演示: 输入: “电影很棒。” -> 标签: “正面”
  • 负面演示: 保持标签“正面”不变,但随机将输入替换为数据集中的另一句话,比如一句说“我讨厌它”的话。
  • 结果: 负上下文 \(c^-\) 具有与真实上下文相同的结构和标签分布,但输入与标签之间的逻辑联系被打破了。

3. 对比公式

现在神奇的地方来了。我们希望模型生成的 token 在 给定正确上下文 (\(c\)) 时概率高,但在 给定被破坏的上下文 (\(c^-\)) 时概率低。

如果一个 token 在 两个 上下文中概率都很高,这意味着模型只是依赖其先验知识 (它不需要正确的映射就能猜出这个词) 。如果一个 token 在正确上下文中概率高,但在负上下文中概率低,那么这个 token 就是由我们关心的特定输入-标签映射驱动的。

研究人员使用以下公式调整 logits (Softmax 之前的原始分数) :

展示带有 alpha 参数的对比解码公式的方程。

其中:

  • \(\mathbf{z}_t\) 是来自正确上下文的 logit。
  • \(\mathbf{z}_t^-\) 是来自负面 (被破坏) 上下文的 logit。
  • \(\alpha\) 是一个控制我们惩罚“懒惰”先验程度的超参数。

通过减去 \(\mathbf{z}_t^-\),我们本质上是在说: “移除那些即使给错了例子你也能猜到的预测部分。”

这也可以被视为一个概率比率:

展示 ICCD 概率比率解释的方程。

这种修改放大了正确映射的信号。重要的是,这完全发生在 推理 阶段。没有更新权重,也不需要训练。


实验设置

这真的有效吗?作者在多种设置下测试了 ICCD 以确保其鲁棒性。

  • 模型: 他们测试了不同规模的 Llama-3 (最高 8B) 和 Qwen2 (最高 7B) 。
  • 任务: 7 项自然语言理解 (NLU) 任务,包括情感分析 (SST-2, SST-5)、主观性分析 (Subj) 和自然语言推理 (MNLI, QNLI)。
  • 基线: 他们将 ICCD 与常规贪婪解码 (greedy decoding) 和其他解码策略进行了比较。

他们还研究了不同的演示选择方法:

  1. 随机 (Random): 挑选随机例子。
  2. BM25: 挑选与输入共享关键词的例子。
  3. TopK: 挑选与输入语义相似的例子 (使用向量嵌入) 。

关键结果

结果在各方面都表现得惊人一致。

1. 总体性能提升

最重要的结论是 ICCD 几乎在所有地方都提高了准确性。这不是一个只对特定模型起作用的小众技巧。

看看下面详细的结果。 红色 数字表示 ICCD 优于标准解码的地方。

不同模型在 7 项 NLU 任务上的性能表,显示大部分为红色的提升。

如表 2 所示,对于 Qwen2-1.5B 模型,ICCD 带来了平均 +2.3 分 的提升。即使是在已经相当强大的 Llama3.1-8B 上,ICCD 也平均挤出了 +1.8 分 的额外提升。

关键是,在更难的任务上收益是巨大的。看看 Llama3.1-8B 在 QNLI (一种自然语言推理任务) 上的表现——准确率从 60.3% 跃升至 65.4%。对于一种无需训练的方法来说,这是一个显著的飞跃。

2. 跨选择方法的鲁棒性

对 ICL 研究的一个常见批评是,结果在很大程度上取决于你选择了 哪些 例子。也许 ICCD 只有在你选了烂例子时才有效?

作者反驳了这一点。无论你是随机选择、使用 BM25 还是使用 TopK (嵌入相似度) 选择例子,ICCD 都能提供提升。

表格显示了随机、BM25 和 TopK 选择方法的改进。

表 1 显示,虽然像 TopK 这样的智能选择方法自然比随机选择表现更好,但加入 ICCD (“Ours” 行) 在这些智能选择方法 之上 进一步提高了性能。这是一种互补的技术。

3. 它对聊天模型有效吗?

许多研究人员使用基础模型 (base models),但学生和从业者经常使用“指令 (Instruct)”或“聊天 (Chat)”版本 (如 ChatGPT 或 Llama-Instruct) 。这些模型经过微调以遵循指令,所以人们可能会认为它们不需要这种帮助。

然而,实验表明并非如此:

柱状图比较了常规方法与我们的方法在 Instruct 模型上的性能。

如图 1 所示,即使是经过对齐微调的模型 (Llama-Instruct 系列) 也能从对比解码中受益。红色的柱子 (Ours) 始终超过蓝色的柱子 (Regular) 。

4. 处理更复杂的类别

许多学术基准测试是二分类的 (正面/负面) 。但现实世界的任务通常有许多类别。作者在 TREC (6 类) 和 Dbpedia (14 类) 上进行了测试,以查看当输出空间变大时对比方法是否仍然有效。

表格显示在 TREC 和 Dbpedia 等具有较大目标类别的数据集上的性能。

表 3 证实了该方法具有良好的扩展性。在 Llama3.2-3B 的 Dbpedia 任务上,准确率跃升了 +8.3 分 。 这表明,随着决策空间变得越复杂,强制模型验证输入-标签映射变得越发重要。


为什么有效?更深入的分析

论文包含几个消融实验 (ablation studies),阐明了 ICCD 的机制。

输入扰动 vs. 标签扰动

在创建“负上下文” (\(c^-\)) 时,我们有两种选择:

  1. 更改输入: 保持标签,交换句子。 (ICCD 使用的方法) 。
  2. 更改标签: 保持句子,将标签交换为错误的。 (Shi et al. 曾尝试类似方法) 。

直觉可能认为更改标签更直接。然而,作者发现更改标签会改变 类别分布 (class distribution) , 这会混淆模型的先验。如果你将“正面”翻转为“负面”,你可能会意外地惩罚整个“负面”概念。

通过更改 输入 但保持 标签 不变,标签的边缘分布保持完全相同。唯一改变的是文本与标签之间的 联系

表格比较了不同的负面示例策略。

表 4 通过经验证实了这一点。“ +Input ”行 (ICCD 策略) 始终优于“ +Label ”和“ +NULL ” (使用空上下文作为负面) 。

分布的散度

为了证明模型实际上是在区分正确和不正确的上下文,研究人员测量了正向和负向上下文输出分布之间的 KL 散度 (KL Divergence)

表格显示平均 KL 散度值。

高 KL 散度 (如 MNLI 上的 0.79) 意味着模型看到合理例子和胡说八道的例子之间有明显的区别。如果模型忽略了映射,这个值将接近于零。该值很高的事实证实了 ICCD 成功地利用了“推理”和“猜测”之间的差异。

样本数量 (Shots) 和 Alpha 的影响

最后,你需要多少个例子?

折线图显示随着样本数量增加性能的提升。

图 2 表明,虽然常规解码 (蓝线) 随着样本增加而改进,但 ICCD (红线) 始终保持领先优势。即使只有几个样本,与负上下文进行对比也能帮助模型更快地确定正确答案。

关于 \(\alpha\) 参数 (修正强度) :

表格显示性能随 alpha 参数变化的情况。

表 6 建议 \(\alpha = 1.0\) 是一个最佳点。如果 \(\alpha\) 太低,修正不足。如果太高 (如 2.0) ,可能会过度惩罚并扭曲预测。


结论

上下文学习很强大,但并不完美。LLMs 容易受到“近因偏见 (recency bias)”和“标签偏见”的影响,经常忽略我们精心为它们挑选的例子。

本文提出的 上下文对比解码 (ICCD) 方法提供了一个数学上优雅的解决方案。通过构建上下文的“无意义”版本,并从原始概率分布中减去其概率分布,我们可以从数学上过滤掉模型的偏见,并分离出任务的真实信号。

对于学生和从业者来说,关键要点是:

  1. 不要相信模型能完美阅读你的提示词。 它经常退回到预训练的先验知识上。
  2. 推理时干预是强大的。 你并不总是需要重新训练或微调。有时,巧妙的解码策略可以释放隐藏在噪声之下的既有性能。
  3. 输入-标签映射是关键。 “输入”扰动策略告诉我们,在打破语义链接的同时保持标签分布,是模拟我们想要移除的“噪声”的最佳方式。

随着 LLMs 继续发展,像 ICCD 这样的方法对于确保它们不仅流畅,而且忠实于我们给出的指令将至关重要。