引言

想象一下,你正在使用一个大语言模型 (LLM) 执行检索增强生成 (RAG) 任务。你给模型提供了一份特定的文档,上面写着“法国的首都是北京”,这可能是一个假设场景或虚构故事的一部分。然后你问模型: “法国的首都是哪里?”

此时模型面临着一场危机。它内部预训练的记忆 (参数化知识) 高喊着“巴黎!”但你提供的上下文窗口 (上下文知识) 却明确写着“北京”。这种现象被称为知识冲突 (knowledge conflict)

在实际应用中,模型如何解决这种冲突至关重要。如果你正在构建一个事实问答系统,你会希望模型拒绝那些包含幻觉或错误的上下文。如果你正在构建一个创意写作助手或虚构文本摘要器,你会希望模型严格遵循上下文,即使它与现实相悖。

长期以来,研究人员认为模型的特定部分——“记忆头 (memory heads) ”——负责处理事实,而“上下文头 (context heads) ”则处理输入文本。当时的主流理论是,我们可以简单地关闭记忆头以使模型忠实于上下文,反之亦然。

一篇题为 “Taming Knowledge Conflicts in Language Models” 的新论文挑战了这一假设。研究人员发现,模型的组织结构并没有那么整齐划一。相反,它们表现出一种被称为上下文信息与参数化记忆的叠加 (CP Superposition) 的现象。为了解决这个问题,他们提出了一种新颖的、无需训练的干预方法,称为 JUICE (Just Run Twice,运行两次即可)。

在这篇文章中,我们将深入探讨知识冲突的机制,理解为什么以前的“剪枝头 (head-pruning) ”方法会失败,并探索 JUICE 如何通过运行两次推理来有效地引导模型倾向于事实或上下文。

背景: 冲突剖析

要理解解决方案,我们首先需要了解 LLM 是如何处理这些冲突的。

参数化知识 vs. 上下文知识

  • 参数化知识 (Parametric Knowledge) : 这是在预训练期间存储在模型权重 (参数) 中的信息。它是模型对事实、语法和世界知识的“长期记忆”。
  • 上下文知识 (Contextual Knowledge) : 这是在提示词 (输入文本) 中提供的信息。它是短暂的,仅在当前推理期间存在。

传统观点: 各司其职的注意力头

Transformer (LLM 这种架构) 依赖于注意力头 (Attention Heads) 。 这些头允许模型关注输入的得不同部分。

  • 先前的信念: 以前的研究 (如 Jin et al., 2024) 假设特定的注意力头是排他性的。有些是“记忆头” (从权重中检索事实) ,另一些是“上下文头” (从输入中复制信息) 。
  • 策略: 如果这是真的,解决冲突就很容易。要强迫模型使用上下文,你只需“剔除” (置零) 记忆头即可。

然而,正如我们将看到的,Transformer 的内部现实要混乱得多——也有趣得多。

发现: CP 叠加态 (CP Superposition)

这篇论文的作者首先在各种类型的冲突中测试了“独立注意力头”的假设。他们发现,具有高度影响力的注意力头通常同时对记忆和上下文起作用。

图1: 我们的发现超越了以往关于排他性“记忆头”和“上下文头”的观念,展示了记忆和上下文以叠加的方式编码在注意力头中。

如上图 1 所示,新发现表明存在一种叠加态。一个注意力头不仅仅是“记忆检索器”或“上下文复制器”。它通常两者兼而有之。这意味着,如果你试图关闭一个头来抑制参数化记忆,你可能会无意中破坏模型处理上下文的能力,导致输出崩溃。

分析冲突类型

为了证明这一点,研究人员将冲突分为三个难度级别:

  1. 纯净 (Clean) : 无冲突。上下文支持事实。
  2. 替换冲突 (Substitution Conflict,句子级) : 上下文包含直接的替换信息 (例如,“法国的首都是北京”) 。
  3. 连贯冲突 (Coherent Conflict,段落级) : 上下文是一个有说服力、完全连贯的段落,论证这个错误的事实。这是模型最难抗拒的场景。

行为不一致的证据

研究人员进行了一项实验,他们“剔除” (置零) 模型的不同组件——注意力机制和多层感知机 (MLP) ——以观察这如何影响模型输出参数化答案 (\(a_p\)) 的概率。

我们可以使用以下方程量化这些干预的影响:

测量概率预期变化的方程。

这个方程本质上是在测量: 当我关闭组件 M 时,正确答案的概率会发生多大变化?

结果显示在下方的图 3 中,极具启示性。

图3: 在世界首都数据集上,剔除 (置零) 模型组件对输出参数化答案 token 概率的影响。

注意图表中混乱的行为:

  • 纯净输入 (左) : 移除组件通常会降低正确答案的概率。这很合理;你破坏了模型。
  • 替换冲突 (中) : 移除组件导致概率剧烈波动。
  • 连贯冲突 (右) : 令人惊讶的是,移除几乎所有组件都会增加参数化答案的概率。这意味着在强冲突期间,模型的几乎每个部分都在合谋支持上下文。

单头干预的失败

反驳“排他性头”理论的最有力证据来自对注意力头的排名。研究人员找出了顶级的“记忆头”——即那些在活跃时最强烈推动参数化事实的头。

表1: 在替换冲突中,通过剔除操作使上下文知识概率增加最多的前4个头。

表 1 显示了一个惊人的矛盾。列出的这些头在替换冲突中被认定为强“记忆头” (移除它们增加了对上下文的依赖,因此是绿色数字) 。然而,看看“连贯冲突 (Coh-Conflict) ”列。对于某些头来说,移除它们实际上损害了对上下文的依赖 (红色数字) 。

结论: 一个在某种情况下充当“记忆头”的头,在另一种情况下可能充当“上下文头”。这就是 CP 叠加态 。 你不能简单地切断一个头来解决冲突,因为它的角色会根据输入动态变化。

解决方案: 运行两次 (JUICE)

既然我们不能简单地剪枝而不造成附带损害,我们需要一种更智能的干预措施。作者提出了 JUICE , 一种无需永久修改模型即可引导模型的方法。

核心洞察很简单: 不要让注意力头沉默;引导它的输出。

JUICE 如何工作

JUICE 分两个不同阶段运作: 头识别和双次运行推理。

图4: JUICE 概览。头识别和双次运行推理阶段。

第一阶段: 头识别 (Head Identification)

首先,我们需要知道哪些头是“叠加”头——即那些在记忆和上下文的拉锯战中具有强烈影响力的头。

  1. 研究人员使用一个极小的数据集 (少至 4 个样本) ,其中包含不同的冲突类型。
  2. 他们根据每个注意力头将概率推向参数化或上下文答案的程度,为其计算一个分数。
  3. 他们选择对输出有一致影响的前 \(K\) 个头。

第二阶段: 双次运行推理 (Dual-Run Inference)

这是创新的部分。模型不是对每个查询只进行一次推理,而是运行两次。

  1. 第一次运行 (“倾听”阶段) : 模型正常处理输入。在此过程中,JUICE 记录 (保存) 在第一阶段识别出的前 \(K\) 个头的激活输出。
  2. 第二次运行 (“引导”阶段) : 模型再次处理输入。这一次,JUICE 获取第一次运行时保存的激活值,将其按比例缩放 (正向或负向) ,然后加回到当前运行的激活值中。
\[H_{new} = H_{current} + \beta \times H_{saved}\]

如果你想增强参数化记忆 , 你可以减去包含大量上下文信息的激活值 (使用负的 \(\beta\)) 。如果你想增强上下文依赖 , 则加上它们。

为什么要运行两次?

你可能会问,“为什么不直接在第一次运行时引导它?”

作者发现,单次运行干预 (如“只运行一次”或 JUNE )是不稳定的。由于叠加效应,头与头之间会相互作用。如果你干预了头 A,头 B 可能会进行补偿或做出不可预测的反应。

通过保存第一次运行的“自然”激活值,你捕获了模型想要做什么的稳定快照。将该快照用作第二次运行的引导向量,比盲目地操纵实时数据流要稳健得多。

图6: 运行两次与运行一次的效果对比。

图 6 清晰地说明了这一点。随着干预的头数量增加,蓝线 (运行一次) 迅速下降。而红线 (运行两次) 即使在干预许多头的情况下也能保持高效 (logit 值) 。第一次运行的“幽灵”为第二次运行提供了可靠的地图。

实验与结果

研究人员在 11 个数据集和 6 种模型架构 (包括 Gemma、Llama-2 和 Llama-3) 上评估了 JUICE。他们测试了两个目标:

  1. 增强参数化信念: 强迫模型忽略虚假的上下文。
  2. 增强上下文依赖: 强迫模型遵循上下文,即使它与记忆相矛盾。

1. 增强参数化信念

在这种设置中,模型被给予一个虚假的上下文 (例如,“法国的首都是北京”) ,并且必须输出真相 (“巴黎”) 。

表3: 增强参数化记忆的干预结果。

表 3 显示了结果。 原始 (Original) 模型在 3 类 (连贯) 冲突中经常遭遇灾难性失败,准确率接近 0% (它相信了那个令人信服的谎言) 。

  • PH3: 一种剪枝头的基线方法。它有帮助,但在连贯冲突中往往表现挣扎。
  • JuNE: 作者方法的单次运行版本。好一些,但不稳定。
  • JuICE: 双次运行方法取得了最先进的结果,在 Gemma 的 3 类冲突中得分 91.9% , 而原始模型为 0%。它有效地对模型进行了“去催眠”。

2. 增强上下文依赖

这里目标相反。模型必须遵循上下文 (例如,特定指令或新定义) 并抑制其先验知识。

表4: 增强上下文知识的干预结果。

如表 4 所示,JUICE 再次占据主导地位。在 Gemma 模型上,它将平均准确率从 45.0% (原始) 提高到了 66.2% , 优于对比解码方法 (CAD) 和剪枝方法 (PH3) 。

可视化成功

下图 Gemma-2b 模型的柱状图最能直观地展示性能的飞跃。

图2: Gemma-2b 在不同冲突类型下不同方法的性能。

注意最右边的“连贯冲突 (Coh-Conflict) ”组。原始模型 (橙色) 为零。PH3 (蓝色) 达到约 40。JUICE (绿色) 跃升至 70 以上。这是鲁棒性的巨大提升。

鲁棒性

对干预方法的一个常见批评是它们很脆弱——对超参数或提示词措辞敏感。作者进行了一项鲁棒性研究 (图 5) ,改变干预头的数量 (\(K\)) 、缩放因子和识别数据集的大小。

图5: JUICE 在关键超参数上的鲁棒性分析。

该方法在广泛的设置范围内保持稳定 (图中的高平台) ,证明它不仅仅是过拟合了特定的配置。

理论分析

为什么会发生这种叠加?为什么模型会将记忆和上下文混合在同一个头中?作者使用简化的两层 Transformer 模型提供了理论分析。

任务设置

他们将训练过程建模为同时学习两个任务:

  1. 事实回忆 (Factual Recall) : 将主体 \(s\) 映射到答案 \(a\) (例如,中国 -> 北京) 。
  2. 归纳 (Induction) : 一种复制机制,模型学习重复模式 (例如,A… B… A… -> B) 。

图7: 理论任务设置示意图。

在图 7 中,我们看到了这种设置。在推理过程中 (底行) ,模型遇到的序列同时触发了这两个任务。主体 \(s\) 触发事实回忆,但序列结构触发归纳 (上下文复制) 。

叠加是如何产生的

作者证明,当 Transformer 通过梯度下降在这些任务上进行训练时,模型使用相同的权重来解决这两个任务在数学上是高效的。

他们推导了使损失最小化的注意力机制权重构造 (\(W_{KQ}\) 和 \(W_{OV}\)) :

展示权重构造的方程3和4。

在方程 (3) 中,特别是 \(W_{KQ}^{(2)}\) 项,我们看到与查询 token \(q\) (上下文触发器) 和主体 \(s\) (参数化触发器) 相关的组件。

因为权重矩阵是这些组件的总和,注意力头自然会同时关注参数化信号和上下文信号。这就是 CP 叠加态的数学定义。

为什么 JUICE 在理论上有效

该理论也解释了为什么 JUICE 成功而剪枝失败。 如果模型处于上下文信号占主导地位的状态 (\(C_{context} > C_{parametric}\)) ,输出将是上下文答案。

  • 剪枝: 如果你删除该头,你就同时移除了上下文信号参数化信号 (因为它们共享这个头) 。结果就是噪声。
  • JUICE: 通过捕获激活值 (其中包含占主导地位的上下文信号) 并减去其缩放版本,你在抑制上下文组件的同时,没有破坏检索参数化事实的底层机制。你实际上是在激活空间中进行向量运算,以抵消不需要的组件。

结论

论文 “Taming Knowledge Conflicts in Language Models” 对我们理解 LLM 的工作原理做出了至关重要的修正。我们不能再将“记忆”和“上下文”视为可以随意开关的独立模块。它们通过叠加紧密纠缠在一起。

JUICE 方法接受了这个混乱的现实。与其试图进行外科手术式的移除特定能力 (并导致失败) ,它利用模型自身的行为来对抗自己。通过运行模型两次,它隔离了模型前进的方向,并允许我们将它引导回正确的航线——无论这条航线是严格的事实准确性,还是对用户提示的忠实遵循。

对于学生和从业者来说,这凸显了提示工程和模型控制的一个重大转变: 有意义的干预往往需要理解推理的动力学,而不仅仅是静态的权重。

关键要点

  • 叠加是真实的: 注意力头同时编码记忆和上下文。
  • 不要剪枝,要引导: 移除头是破坏性的。修改激活值是精确的。
  • 两次运行胜过一次: 使用“干净”的运行来生成引导向量可以稳定干预效果。
  • 多功能性: JUICE 既适用于修复幻觉 (强制事实) ,也适用于强制遵循指令 (强制上下文) 。