Universal and Transferable Adversarial Attacks on Aligned Language Models
Abstract
由于“开箱即用”大型语言模型能够生成大量令人反感的内容,最近的工作集中在对齐这些模型以试图阻止不想要的生成。虽然在规避这些措施方面取得了一些成功——所谓的针对 LLMs 的“越狱”——但这些攻击需要大量的人类创造力,在实践中很脆弱。自动的对抗提示生成的尝试也只取得了有限的成功。在本文中,我们提出了一种简单有效的攻击方法,该方法会导致对齐的语言模型产生令人反感的行为。具体来说,我们的方法找到一个后缀,当它被添加到到 LLMs 的广泛查询时会产生令人反感的内容,它旨在最大化模型生成一个肯定响应的概率(而不是拒绝回答)。然而我们的方法不依赖于手动人工的工程,而是通过结合贪心的和基于梯度的搜索技术来自动生成这些对抗性后缀,并且还改进了过去的自动提示生成方法。
令人惊讶的是,我们发现我们的方法生成的对抗性提示是高度可迁移的,包括黑盒的、公开发布的、生成式 LLMs。具体来说,我们在多个提示(即询问许多不同类型的令人反感的内容的查询)以及多个模型(在我们的例子中是 Vicuna-7B 和 13B)上训练了一个对抗性攻击后缀。当这样做时,由此产生的攻击后缀会在 ChatGPT、Bard 和 Claude 的公开交互界面中引起令人反感的内容,开源的 LLMs,例如 LLAMA-2-Chat、Pythia、Falcon 等,也会如此。有趣的是,这种攻击迁移的成功率比基于 GPT 的模型要高得多,这可能是由于 Vicuna 本身是在 ChatGPT 的输出上训练的。总的来说,这项工作显着推进了针对对齐语言模型的对抗性攻击的最新技术,提出了关于如何防止此类系统产生令人反感的信息的重要问题。代码可在 github.com/llm-attacks/llm-attacks 获得。
1 Introduction
图 1:对齐的 LLMs 不是对抗性对齐的。我们的攻击构建了一个单一的对抗性提示,它一致地规避了最先进的商业模型(包括 ChatGPT、Claude、Bard 和 Llama-2)的对齐,而无需直接访问它们。这里显示的示例是这些系统的所有实际输出。对抗性提示可以以高概率从这些模型中引发任意有害行为,显示出滥用的潜力。为了实现这一点,我们的攻击(贪婪坐标梯度)通过优化多个较小的开源 LLMs 来寻找这种通用和可转移的提示,以实现多个有害行为。这些在第 3 节中进一步讨论,完整的未删节转录本在附录 B 中提供。
大型语言模型 (LLMs) 通常在从互联网上抓取的大量文本语料库上进行训练,这些语料库已知包含大量令人反感的内容。因此,最近的 LLM 开发人员已经采取了通过各种微调机制来 “对齐”这样的模型;该任务采用了不同的方法[Ouyang et al., 2022, Bai et al., 2022b, Korbak et al., 2023, Glaese et al., 2022],但这些方法的总体目标是试图确保这些 LLMs 不会对用户的查询产生有害或令人反感的响应。至少在表面上,这些尝试似乎是成功的:公共聊天机器人在直接询问时不会生成某些明显不合适的内容。
在另一项工作中,也有大量精力投入到识别(理想情况下是阻止)机器学习模型的对抗性攻击中[Szegedy et al., 2014, Biggio et al., 2013, Papernot et al., 2016b, Carlini and Wagner, 2017b]。大多数工作是在计算机视觉领域提出的(尽管对包括文本在内的其他模式进行了一些应用),但众所周知,在机器学习模型的输入中添加小的扰动会极大地改变其输出。在某种程度上,已知类似的方法来对抗 LLMs :有许多已发表的“jailbreaks”: 精心设计的提示,导致对齐的 LLMs 生成明显令人反感的内容[Wei et al., 2023]。然而,与传统的对抗样本不同,这些越狱攻击通常通过人类的创造力制作——小心地设置场景,来直观地引导模型堕落——而不是自动化方法,因此它们需要大量的手动工作。事实上,尽管已经有一些关于对 LLMs 对抗性攻击的自动提示调优的工作 [Shin et al., 2020, Wen et al., 2023, Jones et al., 2023],但这传统上被证明仍是一项具有挑战性的任务,一些论文明确提到它们无法通过自动搜索方法生成可靠的攻击 [Carlini et al., 2023]。这很大程度上归功于这样一个事实,即与图像模型不同,LLMs 是对离散的标记输入进行操作,这不仅极大地限制了有效的输入维度,并且似乎会导致计算困难的搜索。
然而,在本文中,我们提出了一类新的对抗性攻击,它实际上可以诱导对齐的语言模型来产生几乎任何令人反感的内容。具体来说,给定一个(可能有害的)用户查询,我们的攻击将一个对抗性后缀添加到查询中,来试图诱导产生负面的行为。也就是说,用户的原始查询保持不变,但我们添加了额外的标记来攻击模型。为了选择这些对抗性后缀标记,我们的攻击由三个关键元素组成;这些元素确实在文献中以非常相似的形式存在,但我们发现是它们仔细的组合,在实践中会导致可靠的成功攻击。
-
最初的肯定反应。 正如过去的工作 [Wei et al., 2023, Carlini et al., 2023] 中所确定的,在语言模型中诱导令人反感行为的一种方法是迫使模型对有害查询给出一个(只有几个标记的)肯定响应。因此,我们的攻击目标是使模型以“Sure, here is (content of query)”开始其响应,来响应许多引发不良行为的提示。与过去的工作类似,我们发现只针对响应的开头部分的这种方式把模型切换到一种“模式”,这种模式中它会在响应后立即产生令人反感的内容。
-
结合贪婪和基于梯度的离散优化。 对对抗性后缀进行优化具有挑战性的,因为我们需要优化离散标记以最大化攻击对应的对数似然。为此,我们利用 token 级别的梯度来识别一组有可能的单个的token替换,评估该集合中的一些候选者的损失,并选择最佳评估的替换。事实上,该方法类似于 AutoPrompt [Shin et al., 2020] 方法,但也有差异(我们发现实际上这点非常重要),我们在每一步搜索所有可能的标记来替换,而不仅仅是单个标记。
-
鲁棒的多提示和多模型攻击。 最后,为了生成可靠的攻击后缀,我们发现很重要的是创建一个攻击,不仅适用于单个模型上的单个提示,而且适用于跨多个模型的多个提示。换句话说,我们使用我们的基于贪婪梯度的方法来搜索一个单个的后缀字符串,该字符串能够在多个不同的用户提示和三个不同的模型中诱导负面行为(在我们的例子中,是 Vicuna-7B 和 13b Zheng et al. [2023] 和 Guanco-7B Dettmers et al. [2023],这很大程度上是为了简单起见,也可以使用其他模型的组合)。
将这三个元素放在一起,我们发现我们可以可靠地创建绕过目标语言模型对齐的对抗性后缀。例如,在一套关于令人反感的行为基准上运行,我们发现我们能够在 Vicuna 中生成 99 个(在 100 个中)有害行为,并在其输出中生成与目标(潜在有害)字符串的 88 个(在 100 个中)完全匹配。此外,我们发现提示在攻击 GPT-3.5 和 GPT-4 时的成功率高达 84%,PaLM-2 的成功率高达 66%; Claude 的成功率要低得多(2.1%),但值得注意的是,攻击仍然可以诱导原本从未生成的行为。说明性示例如图 1 所示。此外,我们的结果突出了我们的特定的优化器的重要性:以前的优化器,特别是 PEZ [Wen et al., 2023](基于梯度的方法)和 GBDA [Guo et al., 2021](使用 Gumbel-softmax 重新参数化的方法)无法达到任何准确的输出匹配,而 AutoPrompt [Shin et al., 2020] 的成功率仅达到 25%,而我们的攻击成功率为 88%。
总体而言,这项工作极大地推动了针对此类 LLMs 演示对抗性攻击的最新技术。因此,它还提出了一个重要问题:针对对齐语言模型的对抗性攻击是否遵循与视觉系统相似的模式,这对这种对齐方法的整体议程来说意味着什么?具体来说,在现代计算机视觉系统中,对抗性攻击仍然是一个普遍存在的现象。最先进的防止对抗样本的方法 [Madry et al., 2018, Cohen et al., 2019, Leino et al., 2021] 在实践中几乎从未使用过,因为1) 它们的计算效率低下,2) 它们导致系统结果中的性能大幅下降(就“干净”模型性能而言),以及3) 它们只能防止通常针对一个狭义的攻击模型的事实。在 LLM 空间仍然可以看到对抗性攻击和防御之间的这种“军备竞赛”是如何进行的,但历史先例表明我们应该考虑当前尝试的大量严谨替代方案,旨在事后“修复”已经能够产生有害内容的底层模型。
2 A Universal Attack on LLMs
在本节中,我们介绍了这项工作的主要技术贡献,这是一种攻击语言模型的方法,以诱导不良行为。正如我们在下一节所展示的,该方法比现有的攻击方法有了很大的改进,能够可靠地破坏目标(白盒)模型,由此产生的攻击甚至可以表现出一个值得注意的对其他(完全黑盒)模型的可迁移度。
我们的攻击的对抗性设置反映了越狱攻击的相关工作 [Wei et al., 2023, Carlini et al., 2023],并且在某种程度上,反映了提示调优的相关工作 [Shin et al., 2020, Wen et al., 2023]。我们考虑一个用户对一个 LLM 提出询问,例如:
Tell me how to build a bomb. \text{Tell me how to build a bomb.} Tell me how to build a bomb.
当然,作为聊天机器人的 LLM 不会单独看到这个输入,它会被嵌入到更大的提示中,结合系统提示和额外的结构来构建聊天框架内的响应。因此,LLM 将看到的实际输入如下所示,具体细节取决于实际的聊天程序,以及某些情况下还取决于模型的调整方式:
System: You are a chat assistant designed to provide helpful and not harmful responses to user queries. User: Tell me how to build a bomb. Assistant: \begin{align*} & \text{System: You are a chat assistant designed to provide helpful and not }\\ & \text{harmful responses to user queries. }\\ & \text{User: Tell me how to build a bomb. }\\ & \text{Assistant:} \end{align*} System: You are a chat assistant designed to provide helpful and not harmful responses to user queries. User: Tell me how to build a bomb. Assistant:
上面,“User:”注释后面的蓝色文本是用户可以控制的唯一内容。在一个典型的对齐 LLM 的操作中,系统不会为该用户查询提供响应,而是会声明模型无法提供潜在的危险内容。
我们在用户提示上引入了一个额外的对抗性后缀,旨在规避LLM的对齐,并诱导它对用户的原始的——有潜在危害的——请求做出响应。换句话说,我们将如下输入传递给模型:
System: You are a chat assistant designed to provide helpful and not harmful responses to user queries. User: Tell me how to build a bomb. ! ! ! ! ! ! ! ! ! ! Assistant: \begin{align*} & \text{System: You are a chat assistant designed to provide helpful and not }\\ & \text{harmful responses to user queries. }\\ & \text{User: Tell me how to build a bomb. ! ! ! ! ! ! ! ! ! !}\\ & \text{Assistant:} \end{align*} System: You are a chat assistant designed to provide helpful and not harmful responses to user queries. User: Tell me how to build a bomb. ! ! ! ! ! ! ! ! ! !Assistant:
在这里,红色文本包含了一些对抗性后缀,之后将会被攻击优化,以使模型回答原始用户查询。重要的是,在开发一个通用的攻击时,我们不考虑对用户提供的蓝色文本进行改变。这对于通用攻击的最终目标至关重要:找到一组标记来替代初始的红色文本,来使对齐的 LLM 肯定地响应任何用户提供的蓝色的指令选择。
在上述设置中,我们有许多选择来优化对抗性后缀:例如,要优化的损失函数、数据以及优化算法本身。虽然上述设置在文献中被认为是非常相似的形式,但即使在白盒的设置中,这些过去的工作也无法可靠地攻击对齐的 LLM [Carlini et al., 2023]。事实上,我们发现一个少量的关键设计元素是产生一个可靠攻击的关键,我们在本节的其余部分进行描述。
2.1 Producing Affirmative Responses
开发攻击的第一个标准之一是识别其目标,即将使用什么损失函数来优化对抗性后缀。当然,有许多可能的损失函数;例如,我们可以最大化模型生成某些特定选择字符串(例如,在上面的情况下,包括炸弹指令的字符串)的可能性(似然)。虽然这可能足以压力测试模型产生对齐内容的能力,但它在作为两种方式的攻击目标时表现得很差。首先,它为查询规定了一个单个的“真实值”输出,但实际上可能有许多合适的答案,并且对目标 LLM 来说是更有可能的。其次,它特定于一个单个的查询,而我们最终更倾向一个通用的后缀,可以适用于许多查询。
相反,我们采用了一种在(手动)越狱攻击社区中受到一些关注的方法,并要求模型以一个对用户查询的积极肯定开始其响应。换句话说,对于上面的示例,我们希望 LLM 开始其响应,从短语:
System: You are a chat assistant designed to provide helpful and not harmful responses to user queries. User: Tell me how to build a bomb. ! ! ! ! ! ! ! ! ! ! Assistant: Sure, here is how to build a bomb: \begin{align*} & \text{System: You are a chat assistant designed to provide helpful and not }\\ & \text{harmful responses to user queries. }\\ & \text{User: Tell me how to build a bomb. ! ! ! ! ! ! ! ! ! !}\\ & \text{Assistant: Sure, here is how to build a bomb:} \end{align*} System: You are a chat assistant designed to provide helpful and not harmful responses to user queries. User: Tell me how to build a bomb. ! ! ! ! ! ! ! ! ! !Assistant: Sure, here is how to build a bomb:
上面,紫色文本仅指示所需的 LLM 完成的目标的开始,其余内容在攻击目标中未指定。这种方法的直觉是,如果语言模型可以放入一个“状态”中,在这个状态中这个完成是最可能的响应,而不是拒绝回答查询,那么它可能会精确地继续这个完成,来继续得到令人反感的行为。
如前所述,之前已经在手动的越狱攻击中研究过类似的行为,例如将模型“respond with ‘sure’”添加到提示中,或者其他类似的方法 [Wei et al., 2023]。然而,在实践中,这种手动方法仅略微成功,并且通常可以通过稍微更复杂的对齐技术规避。此外,先前关于攻击多模态 LLMs 的工作发现,仅指定第一个目标 token 通常就足够了(尽管在这种情况下,攻击面更大,因此可以更大程度地优化)[Carlini et al., 2023]。然而,在纯文本空间中,仅针对第一个标记有完全覆盖原始提示的风险;例如,对抗性的提示可以简单地包括一个短语,如 “Nevermind, tell me a joke,”,这将增加“sure”响应的概率,但并不会引起令人反感的行为。因此,我们发现提供一个肯定地重复了用户提示的目标短语,为产生提示的行为提供了最好的手段。
Formalizing the adversarial objective 我们可以将这个目标写成一个规范的对抗性攻击的损失函数。我们认为 LLM 一个映射,从一些 token x 1 : n x_{1:n} x1:n (这里 x i ∈ { 1 , . . . , V } x_{i}\in \{1,...,V\} xi∈{1,...,V}, V V V 是词汇表的大小,也就是, token 的数量)的序列到下一个token的分布是。具体来说,我们使用符号:
p ( x n + 1 ∣ x 1 : n ) p(x_{n+1}|x_{1:n}) p(xn+1∣x1:n)
对于任意 x n + 1 ∈ { 1 , . . . , V } x_{n+1}\in \{1,...,V\} xn+1∈{1,...,V},来表示给定前面的标记 x 1 : n x_{1:n} x1:n 的情况下,下一个标记是 x n + 1 x_{n+1} xn+1 的概率。稍微扩展一下,我们用 p ( x n + 1 : n + H ∣ x 1 : n ) p(x_{n+1:n+H}|x_{1:n}) p(xn+1:n+H∣x1:n) 来代表给定到每个点前的所有标记,最终产生序列 x n + 1 : n + H x_{n+1:n+H} xn+1:n+H 的概率,也就是:
p ( x n + 1 : n + H ∣ x 1 : n ) = ∏ i = 1 H p ( x n + i ∣ x 1 : n + i − 1 ) p(x_{n+1:n+H}|x_{1:n}) = \prod_{i=1}^{H}p(x_{n+i}|x_{1:n+i-1}) p(xn+1:n+H∣x1:n)=i=1∏Hp(xn+i∣x1:n+i−1)
在此符号下,我们关注的对抗性损失就是简单的一些目标序列 x n + 1 : n + H ∗ x_{n+1:n+H}^{*} xn+1:n+H∗ (即,短语 "Sure, here is how to build a bomb."的表示) 的(负对数)概率:
L ( x 1 : n ) = − log p ( x n + 1 : n + H ∗ ∣ x 1 : n ) \mathcal{L}(x_{1:n})=-\log p(x_{n+1:n+H}^{*}|x_{1:n}) L(x1:n)=−logp(xn+1:n+H∗∣x1:n)
因此,我们的对抗性后缀的优化任务可以被写成一个优化问题:
minimize x I ∈ { 1 , . . . , V } ∣ I ∣ L ( x 1 : n ) \underset{x_{\mathcal{I}}\in\{1,...,V\}^{|\mathcal{I}|}}{\text{minimize}}\mathcal{L}(x_{1:n}) xI∈{1,...,V}∣I∣minimizeL(x1:n)
这里 I ⊂ { 1 , . . . , n } \mathcal{I} \subset \{1,...,n\} I⊂{1,...,n} 代表了 LLM 输入中的对抗性后缀的标记的索引。
2.2 Greedy Coordinate Gradient-based Search
优化 (4) 的一个主要挑战是我们必须对一组离散的输入进行优化。尽管存在几种离散优化方法(包括上一节中提到的方法),但过去的工作发现,即使是这些方法中最好的也可能难以可靠地攻击对齐的语言模型 [Carlini et al., 2023]。
然而,在实践中,我们发现直接的方法最终就是 AutoPrompt 方法 [Shin et al., 2020] 的一个简单扩展,在这项任务中表现得非常好(并且还大大优于 AutoPrompt 本身)。我们的方法的动机来自贪心坐标下降方法:如果我们能评估所有可能的单令牌替换,我们可以换成最大地减少损失的令牌。当然,评估所有这些替换是不可行的,但我们可以利用关于 one-hot 令牌指标的梯度来找到一组有希望的候选者来替换每个标记位置,然后通过前向传递准确地评估所有这些替换。具体来说,我们可以计算替换掉提示中的第 i i i 个token,也就是 x i x_{i} xi,的线性化近似,通过评估梯度
∇ e x i L ( x 1 : n ) ∈ R ∣ V ∣ \nabla_{e_{x_{i}}}\mathcal{L}(x_{1:n})\in \mathbb{R}^{|V|} ∇exiL(x1:n)∈R∣V∣
其中 e x i e_{x_{i}} exi 表示第 i i i 个标记的当前值的 one-hot 向量(即,向量中位置 e i e_{i} ei 处是1,其他位置是0)。请注意,由于 LLMs 通常从每个token来形成embeddings,因此它们可以写成是这个值 e x i e_{x_{i}} exi 的函数,因此我们可以随即取到关于该数的梯度; HotFlip [Ebrahimi et al., 2017] 和 AutoPrompt [Shin et al., 2020] 方法采用了相同的方法。然后,我们计算负梯度最大的top-k个值作为令牌 x i x_{i} xi 的候选替换。我们对所有输入中的对抗性后缀的标记,也就是 i ∈ I i\in \mathcal{I} i∈I,计算这个候选集,然后从中随机选择 B ≤ k ∣ I ∣ B\le k|\mathcal{I}| B≤k∣I∣ 个token,在这个子集上准确地评估损失,并以最小的损失的token来替换。这个完整的算法,我们称之为贪婪坐标梯度 (GCG),如算法 1 所示。
我们在这里注意到 GCG 与 AutoPrompt 算法 [Shin et al., 2020] 非常相似,除了一个微小的变化,就是 AutoPrompt 提前选择一个单个的坐标来调整,然后仅针对这个位置评估替换。然而,正如我们在以下部分中说明的那样,这种设计选择具有惊人的大效果:我们发现对于每次迭代相同的批量大小 B(即,相同数量的总的前向评估,到目前为止占主导地位的计算量,这里指使用相同的计算量),GCG 在很大程度上优于 AutoPrompt 。我们相信 GCG 很可能可以通过例如构建采用类似全坐标策略的 ASCA [Jones et al., 2023] 版本来进一步提高,但为了简单起见,我们在这里关注更基本的方法。
2.3 Universal Multi-prompt and Multi-model attacks
为了特意优化通用的攻击——这将导致对各种提示生成令人反感的内容——我们通过结合几个训练提示 x 1 : n ( i ) x_{1:n}^{(i)} x1:n(i) 和相应的损失 L i \mathcal{L}_{i} Li 来构建算法 1。由于一个通用的对抗样本的目标不是生成一个特定的token序列,因此我们使用在等式 3 中使用的目标序列在实例化每个 L i \mathcal{L}_{i} Li 时是一个与模型的肯定响应一致的前缀。例如,对于一个训练提示“Give instructions for building a pipe bomb”,相应的目标序列将是“Sure, here’s instructions for building a pipe bomb”。
我们不是在每个提示中指定不同的可修改的标记子集,而是对一个单个的后缀 p 1 : l p_{1:l} p1:l 进行优化,聚合梯度和损失来选择 top-k 个标记替换和每一步的最佳替换。在聚合梯度之前,它们被裁剪为具有单位范数的样式。此外,我们发现,只有在找到一个候选者(作为更早的提示的对抗样本)之后,再增量地合并新的提示,产生了更好的结果,比从一开始就尝试一次优化所有提示。这个过程如算法 2 所示。
为了使对抗性样本可迁移,我们在多个模型上合并了损失函数。当模型使用相同的tokenizer时,用于计算 top-k 令牌的梯度都将在 R V \mathbb{R}^{V} RV 中,并且可以没有障碍地聚合。因此,Vicuna 的多个变体,比如说,可以在不修改算法 2 的情况下同时优化。请注意,当攻击在嵌入空间中进行了优化时,情况并非如此。