基于激活控制的LLM指令跟随

我尝试向一个 2024 年初发布的 LLM询问一些关于时事的基本问题。

答案是……错误的。

随着世界不断变化,LLM 无法自然地整合新知识。它们只训练一次,之后参数就基本固定了。

实际上,这意味着我们需要依赖像 RAG 这样的变通方法。

但问题在于:即使你通过 RAG 提供了正确的上下文,LLM 也并非总能遵循它,尤其当该上下文与模型从训练中“记住”的内容相冲突时。

在我最新的 arXiv 预印本中,我讨论了一种使用名为“激活控制”(Activation Steering)的方法来解决这一问题。

在本博客中,我们将该方法分解为基本原理,并解释它为何令人兴奋、为何有效,以及为何它可能代表 LLM 控制的未来。

1、现有解决方案(以及它们为何不完美)

人们尝试用几种方法来解决 RAG 的问题:

  • 提示:您可以添加诸如“始终遵循提供的上下文”或“仅使用上面给出的信息”之类的指令。然而,这种方法并非总是有效。此外,提示通常难以解释,并且可能导致意想不到的副作用。
  • 微调:您可以微调模型以使其学习遵循上下文。但是,微调成本高昂、耗时,并且需要大量数据。

关键在于,我们需要更有针对性、更易于解释且更高效的方法。

这就是激活导向的用武之地。

2、什么是激活导向?

在解释激活导向之前,让我们快速回顾一下 Transformer 架构的工作原理。

在 Transformer 的每一层,都有一个称为残差流(Residual Stream)的东西。这基本上就是流经模型的信息。

以下是它的数学表示:

第 l 层的残差流,我们称之为 x_i^(l),包含模型用于处理信息的激活值(内部表征)。

现在,激活值引导背后的关键思想是:

我们可以提取这些激活值,对其进行操作,并引导模型的行为朝着特定方向发展。

以下是我通常喜欢使用的简单示例。

3、让 LLM 更“快乐”

假设我想让我的 LLM 生成更多积极、快乐的输出。

我会这样做:

首先,我会向 LLM 输入一个“快乐”的提示,并提取该提示在特定层对应的残差流激活值。

表示“快乐”提示的激活值的向量来自残差流。

现在我们得到了一个代表激活值的向量:

接下来,我会对“悲伤”提示词做同样的操作:

现在,神奇之处在于:我从“快乐”向量中减去“悲伤”向量。

这样我就得到了一个导向向量,它代表了“激活空间”中与“快乐”对应的方向。

更好的方法是采集多个正样本和多个负样本,提取它们的向量,然后计算两个分布之间的平均差异。

现在,每当LLM生成一个标记时,我都会将这个导向向量添加到该特定层的残差流中。

结果如何?LLM的输出明显变得更“快乐”了。

4、如何将其应用于上下文跟随

好的,太棒了。

现在我将向您展示如何将同样的思路应用到我们的问题中:使 LLM 能够紧跟我们提供的上下文。

方法出奇地相似。

我们不再使用“高兴”与“悲伤”的提示,而是使用:

  • 正样本:包含系统指令、上下文和问题的提示 →  <SYS> + <CTX> + <Q>
  • 负样本:仅包含问题的提示 → <Q>

我们提取正负样本的残差流激活值,并计算:

上下文跟随向量 = 正激活值 — 负激活值

让我举一个具体的例子。

正提示:

<SYS>: You are a helpful assistant. Always use the provided context to answer questions.
<CTX>: Donald Trump is the current president of the United States as of 2025.
<Q>: Who is the president of the United States?

否定提示:

<Q>: Who is the president of the United States?

我们将两者都输入到 LLM 中,提取特定层的激活值,然后相减得到我们的引导向量。

然后,对于模型生成的每个输出标记,我们将此引导向量添加到残差流中。

结果如何?模型现在能够遵循我们提供的上下文。

5、这真的有效吗?

我们在多个模型的数据集上测试了此方法:Llama-3.1–8b、Llama-3.1–70b 和 Mistral-7B。

结果一致:引导显著提高了上下文跟随性能。

6、为什么它比其他方法更好?

我认为激活引导比传统方法有几个优势。

首先,它比提示更易于解释。提示的改变常常会产生意想不到的后果。另一方面,我认为激活值控制是一种更具针对性的方法,可以减少意外后果。

虽然它在可解释性方面还不够“完美”,但如果我们最终想要实现“完美”的可解释性和“精准”的修复,那么像这样的方法仍然是朝着正确方向前进的。

其次,它比微调效率高得多。微调需要庞大的数据集、梯度更新和大量的计算资源。而激活值控制只需要计算一次向量,无需反向传播或重新训练。

在我看来,激活值控制就像轻轻地推动模型朝着正确的方向前进,而微调则像是为了修复某个特定问题而重新训练模型的整个特性。

7、结束语

在本篇博客中,我们讨论了逻辑逻辑模型的一个核心问题:它们通常无法遵循您提供的上下文,尤其是在上下文与训练数据冲突时。

我向您展示了一种名为“激活控制”的方法,它通过直接操控模型的内部表征来解决这个问题。

结果:多个模型的上下文跟踪能力均得到显著提升。

最棒的是什么?这仅仅是个开始。

随着我们对这些模型内部运行机制的理解不断加深,我们将能够以越来越高的精度控制它们。


原文链接:This simple method will save you 95% in finetuning costs.

汇智网翻译整理,转载请标明出处