大模型的对抗攻击与防御
原文:OpenAI 安全系统(Safety Systems)团队负责人 Lilian Weng 发布的一篇博客文章 《Adversarial Attacks on LLMs》
随着 ChatGPT 的发布,大型语言模型应用正在加速大范围铺开。OpenAI 的安全系统团队已经投入了大量资源,研究如何在对齐过程中为模型构建默认的安全行为。但是,对抗攻击或 prompt 越狱依然有可能让模型输出我们不期望看到的内容。
目前在对抗攻击方面的研究很多集中在图像方面,也就是在连续的高维空间。而对于文本这样的离散数据,由于缺乏梯度信号,人们普遍认为攻击会困难得多。Lilian Weng 之前曾写过一篇文章《Controllable Text Generation》探讨过这一主题。简单来说:攻击 LLM 本质上就是控制该模型输出特定类项的(不安全)内容。
此外,还有研究者试图通过攻击大语言模型来提取其预训练数据、私有信息或者通过数据毒化手段来干扰模型的训练过程。但这些并非本文要探讨的主题。
基础
威胁模型
对抗攻击是对输入样本进行微小难以察觉的修改,诱使模型输出我们不期望的内容。许多早期研究关注的重点是分类任务,而近期的工作则开始更多关注生成模型的输出。本文探讨的是大型语言模型,并且假定攻击仅发生在推理阶段,也就是说模型权重是固定的。
对抗样本的定义:对抗样本是指能够欺骗模型,使其做出错误预测的输入样本,但与原始样本在语义上仍然相似,不易被人察觉。
分类
在过去,研究者更关注的是对分类器进行对抗攻击,并且许多是在图像领域。LLM 也可被用于分类,给定一个输入 $x$ 和一个分类器 $f(.)$,我们希望找到该输入的一个差异细微的对抗版本 $x_{adv}$,使得 $f(x_{adv})≠f(x)$。
文本生成
给定一个输入$x$和一个生成模型 $p(.)$,该模型可输出一个样本 $y \sim p(.|x)$。这里的对抗攻击是找到一个$p(x)$,使得 $y$ 会违反该模型内置的安全行为,比如输出非法主题的不安全内容、泄漏隐私信息或模型训练数据。对生成任务而言,判断一次攻击成功与否并非易事,这需要一个超高质量的分类器来判断 $y$ 是否安全或需要人类来进行审查。
白盒攻击和黑盒攻击
-
白盒攻击(White-box attacks)假设攻击者可以完全访问模型权重、架构和训练工作流程,这样一来攻击者就可以获得梯度信号。这里我们并不假设攻击者能获得全部训练数据。这仅适用于开源模型。
-
黑盒攻击(Black-box attacks)则是假设攻击者只能访问 API 类型的服务 —— 攻击者可以提供输入 $x$ 并获取反馈的样本 $y$,而不知道有关模型的更多信息。
对抗性攻击的种类
为了让大语言模型 (LLMs) 做出错误的输出,研究人员发明了多种对抗性输入方法。这里,我们介绍五种主要策略。
攻击方式 | 类型 | 描述 |
---|---|---|
Token操作 | 黑盒 | 微调输入文本的少量 Token,引发模型失效,同时保留原文的含义。 |
基于梯度的攻击 | 白盒 | 利用梯度信息来制定出有效的攻击策略。 |
越狱式提示 | 黑盒 | 常用一些基于直觉的提示来绕过模型内建的安全机制。 |
人类参与的红队策略 | 黑盒 | 人工对模型进行攻击,可能会借助其他模型的协助。 |
模型红队攻击 | 黑盒 | 一个模型对另一个模型进行攻击,攻击者模型可以根据需要进行调整。 |
Token操作
给定一段包含一个 token 序列的文本输入,我们可以使用简单的token操作(比如替换成同义词)来诱使模型给出错误预测。
想象一下,如果我们有一段文本,里面充满了各种Token(就是文字或词汇),我们可以对这些Token进行一些小把戏,比如换个同义词,就能让智能模型搞不清楚状况,做出错误的判断。这种在所谓的黑盒环境下的“Token 操纵术”是可行的。
基于 token 操作的攻击属于黑盒攻击。在 Python 框架中,Morris et al. 2020 的论文《TextAttack: A Framework for Adversarial Attacks, Data Augmentation, and Adversarial Training in NLP》实现了许多词和 token 操作攻击方法,可用于为 NLP 模型创建对抗样本。这一领域的许多实验主要针对分类和文本蕴含。
举个例子,Ribeiro et al (2018) 的研究《Semantically Equivalent Adversarial Rules for Debugging NLP models》依赖于人工提出的「语义等价式对抗规则(SEAR)」,其可以通过尽可能少的 token 操作来让模型无法生成正确答案。比如,其中的规则包括将 What 换成 Which、将 was 换为 is。另外,还有其他研究者提出的替换关键词、用同义词替换等方法。
基于梯度的攻击
如果是白盒攻击,则攻击者可以获取所有的模型参数和架构。因此,攻击者就可以依靠梯度下降来通过编程方式学习最有效的攻击手段。这种基于梯度的攻击手法,只适用于可以完全访问内部结构的白盒环境,比如开源 LLM。
GBDA
Guo et al. 2021 的论文《Gradient-based Adversarial Attacks against Text Transformers》提出的基于梯度的分布式攻击(GBDA)使用了 Gumbel-Softmax 近似法,来使对抗损失优化可微。在这种方法中,BERTScore 和困惑度(perplexity)用来衡量生成的文本既关联又流畅。然而,Gumbel-softmax 技巧难以扩展用于 token 删除或增添,它受限于 token 替换操作。
-
核心思想:寻找一个对抗分布,而不是单个对抗样本。这个对抗分布参数化地表示一系列可能的对抗样本,并使用连续的矩阵$\theta$进行控制。通过优化$\theta$,我们可以调整对抗分布,使其包含更多能够欺骗目标模型 h 的样本。
-
优化过程:
- GBDA 使用 Gumbel-softmax 技术将对抗分布的采样过程变得可微分,从而可以使用梯度下降等优化算法进行优化。
- 优化过程中,目标是最小化一个包含对抗损失、流畅性约束和语义相似性约束的损失函数。
- 对抗损失鼓励模型对样本做出错误预测。
- 流畅性约束使用语言模型来评估样本的流畅程度,并鼓励生成更自然的文本。
- 语义相似性约束使用 BERTScore 来评估样本与原始样本在语义上的相似程度,并鼓励生成语义上更接近原始样本的对抗样本。
-
生成对抗样本:优化完成后,从对抗分布 PΘ 中采样即可得到对抗样本。由于对抗分布中包含多种可能的对抗样本,我们可以从中选择最适合当前任务和目标模型的样本。
HotFlip
Ebrahimi et al. 2018 在论文《HotFlip: White-Box Adversarial Examples for Text Classification》 中则是将文本操作看作是向量空间中的输入,度量的是损失在这些向量上的导数。基于one-hot表示的梯度来有效估计单个操作所造成的最大损失的变化,通过原子翻转操作(将一个字符替换为另一个字符)生成对抗样本,并通过一系列的字符翻转来支持插入和删除操作。HotFlip 可以扩展用于 token 删除或增添。
UTA
Wallace et al. (2019) 的论文《Universal Adversarial Triggers for Attacking and Analyzing NLP》提出了一种在 token 上进行梯度引导式搜索的方法,可以找到诱使模型输出特定预测结果的短序列,这个短序列被称为 Universal Adversarial Triggers (UAT,通用对抗触发器)。UAT 不受输入的影响,这意味着这些触发器可以作为前缀(或后缀)连接到来自数据集的任意输入上。
上面的 token 搜索方法可以使用波束搜索增强。当寻找最优的 token 嵌入时,可以选取 top-k 个候选项,而不是单独一个,在当前数据批上从左到右搜索,并根据 $L_{adv}$ 为每个波束评分。
UAT 的损失 $L_adv$ 需要针对具体任务而设计。分类或阅读理解依赖于交叉熵。
UAT 为何有效?这是一个很有趣的问题。因为 UAT 是与输入无关的,并且可以在有不同嵌入、token 化方案和架构的模型之间迁移,因此它们也许可以有效地利用训练数据中的偏差,毕竟这种偏差已经融入到了模型的全局行为中。
使用 UAT 攻击有一个缺点:很容易检测出来。原因是所学习到的触发器往往是毫无意义的。Mehrabi et al. (2022) 在论文《Robust Conversational Agents against Imperceptible Toxicity Triggers》中研究了 UAT 的两种变体,它们会促使所学到的触发器在多轮对话语境中难以察觉。其目标是创建能在给定对话中有效触发有毒响应的攻击性消息,同时保证该攻击在对话中是流畅、连贯和一致的。
AutoPrompt
Shin et al., 2020 的《AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts》使用了同样的基于梯度的搜索策略来为多样化的任务寻找最有效的 prompt 模板。
通用对抗触发 token 作为后缀连接到输入
Zou et al. (2023) 的论文《Robust Conversational Agents against Imperceptible Toxicity Triggers》也研究了将通用对抗触发 token 作为后缀连接到输入请求上的情况。他们具体研究了对 LLM 的恶意请求 —— 对此模型应当拒绝回答。事实上,拒绝不被允许的内容类别(比如犯罪建议)是 GPT-4 内置的一个重要的安全措施。对抗性的目标是,即使面对应该被拒绝的请求,也能操纵语言模型给出 肯定的回应。例如,面对一个恶意请求,模型可能会回答说:“Sure, here is how to …”。为了避免仅仅通过改变话题来引出一个 “sure” 回答,预期中的肯定回应也被设定为会重复用户的部分提示。而计算这种回应的可能性时使用的损失函数非常简单,就是目标回应的负对数似然 (NLL)。
GCG
为了在多个输入上引发模型给出肯定回应,研究人员在两个不同的模型 Vicuna-7b 和 Vicuna-13b 上进行了实验。他们使用了一种称为贪婪坐标梯度 (GCG) 的搜索技术,来找到能在所有可能的单个 Token 替换中减少损失最多的候选 Token。鉴于实际上不可能评估所有 Token 的替换,研究者采用了一种基于梯度的 Token 搜索策略,这种策略与 UAT 和 AutoPrompt 相似,可以为每个 Token 找出能够最大化减少损失函数梯度的最佳候选 Token。
尽管他们的攻击序列完全是基于开源模型训练的,但它们却出乎意料地可以移植用于其它商用模型,这表明对开源模型的白盒攻击对私有模型也有效,尤其是当低层的训练数据有所重叠时。注意 Vicuna 的训练使用了从 GPT-3.5-turbo 收集的数据(通过 shareGPT),这本质上是蒸馏,因此这种攻击更像是白盒攻击。
ARCA
Jones et al. 2023 等提出的自回归随机坐标上升(ARCA),ARCA 考虑了一系列更广泛的优化问题,用以寻找符合某种特定行为模式的输入输出对 $(x,y)$;例如,输入是以 “Barack Obama” 开头的无害内容,但可能产生有害的输出。
越狱式提示
Jailbreak 提示技术是一种利用弱点强制大语言模型(LLMs)产出那些本应被过滤的有害内容。这种技术属于黑盒攻击,其措辞组合的选取是基于经验法则和手动尝试。
Wei et al. (2023) 的论文《Jailbroken: How Does LLM Safety Training Fail?》提出了 LLM 安全的两种失败模式,可用于指导越狱攻击的设计:
-
目标冲突:当一个模型在执行能力(比如“必须严格执行指令”)和安全目标之间出现矛盾时,我们称之为目标冲突。举例来说,有些人可能会利用这种冲突来实施所谓的“越狱攻击”:
- 前缀引导:让模型以肯定答复开始对话。
- 拒绝抑制:详细指示模型避免使用拒绝的表达方式。
- 风格限制:要求模型不使用复杂词汇,这样它就无法使用专业术语或详细解释来拒绝某些请求。
- 角色扮演:例如,扮演 DAN(立即行动),AIM(总是表现出高智能和机智)等角色。
-
泛化失配:安全训练未能覆盖到模型实际具备能力的领域。这种情况通常发生在模型的安全训练数据未涉及到的领域,但这些输入却在它广泛的预训练资料库中。比如:
- 特殊编码:使用 Base64 编码来构建对抗性输入。
- 字符变换:ROT13 密码、火星文或脑残体(用视觉上相似的数字和符号替换字母)、摩尔斯电码。
- 词变换:Pig Latin(用同义词替换敏感词,比如用「窃」替换「偷」)、拆分关键词(即所谓的 token smuggling,也就是把敏感词分成几部分)。
- prompt 层面的混淆:翻译成其它语言、要求模型以其能理解的方式进行混淆。
Wei et al. (2023) 实验了大量越狱方法,包括由以上原理构建的组合型策略。
- combination_1 组合了前缀引导、拒绝抑制和 Base64 攻击。
- combination_2 加入了风格限制。
- combination_3 又添加了生成网站内容和格式化限制条件。
Greshake et al. (2023) 的论文《Not what you’ve signed up for: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection》则在较高层面上观察了 prompt 注入攻击。其中指出,即便当攻击无法提供详细的方法而仅仅提供一个目标时,模型也有可能自动去实现它。当模型可以访问外部 API 和工具时,对更多信息(甚至是专有信息)的获取可能导致更大的钓鱼攻击和私密窥探攻击风险。
有人类参与的红队策略
由 Wallace 等人 (2019) 提出的“人类参与的敌对生成”策略,旨在开发工具辅助人类“智破”人工智能模型。在他们的研究中,以 QuizBowl QA 数据集 为基础,他们设计了一套敌对性写作界面。这个界面可以引导用户编写类似《危险边缘》节目风格的问题,目的是让人工智能模型产生错误的判断。系统会根据每个词的重要度来进行颜色高亮显示,这个重要度是通过移除该词后模型预测概率的变化来确定的,具体是通过计算模型对词嵌入的梯度来近似得到的。
界面由(左上角)模型的前五个预测和(右下角)根据词语重要性高亮显示的用户问题组成。
在 Ziegler 等人 (2022) 的一个实验中,研究人员指导人类参与者寻找针对暴力内容的安全分类器的潜在失败点。他们开发了一种工具,帮助参与者更快速、更有效地发现并解决分类器的漏洞。使用工具辅助的改写比全手工改写更高效,把处理每个案例的时间从 20 分钟缩短至 13 分钟。具体来说,他们为人类作者引入了两种辅助特性:
- 特征 1: 每个词语的显著性分数展示。工具界面会突出那些一旦被移除就可能影响分类器判定结果的词语。一个词语的显著性分数是根据这个词语的嵌入对分类器输出的梯度幅值来确定的,这和 Wallace 等人 (2019) 的做法是一样的。
- 特征 2: 词语替换与添加。这项功能让用户通过 BERT-Attack 轻松进行词语的操作。接着,由人类作者对词语更新进行复核。只要点击文本片段中的某个词语,就会弹出一个下拉菜单,里面按照能够降低当前模型分数的程度,列出了新的词语选项。目的是减少模型预测这些输入为暴力内容的可能性。
Xu et al. 2021 的《Bot-Adversarial Dialogue for Safe Conversational Agents》提出了 Bot-Adversarial Dialogue(BAD),该框架可以引导人类去诱使模型犯错(比如输出不安全的内容)。他们收集了 5000 多组模型与众包工作者的对话。每一组对话都包含 14 轮,然后他们根据不安全对话轮次的数量给模型打分。他们最终得到了 BAD 数据集,其中包含大约 2500 组带有攻击性标签的对话。
Anthropic 的红队数据集包含接近 4 万个对抗攻击,它们收集自人类红队者与 LLM 的对话。他们发现,RLHF 的规模越大,就越难以攻击。OpenAI 发布的大模型(比如 GPT-4 和 DALL-E 3)普遍使用了人类专家红队,以确保系统的安全性。
模型红队攻击
人类红队策略很强大,但是难以大规模实施而且可能需要大量经过培训的专业人士。现在想象一下:我们可以学习一个红队模型 red 来与目标 LLM 进行对抗,以触发其给出不安全响应。对于基于模型的红队策略,主要的难题是如何判断一次攻击是否成功;只有知道了这一点,我们才能构建用于训练红队模型的合适学习信号。
假设我们已经有一个高质量的分类器,能够判断模型的输出是否有害,我们就可以将其用作奖励来训练红队模型,以得到一些能最大化分类器在目标模型输出上的分数的输入。令 $r(x, y)$ 是一个这样的红队分类器,其可以判断在给定测试输入$x$时,输出 $y$ 是否有害(基于Perez et al. 2022 的论文《Red Teaming Language Models with Language Models》)。
Casper et al. (2023) 的论文《Explore, Establish, Exploit: Red Teaming Language Models from Scratch》设计了一种有人类参与的红队过程。其与 Perez et al. (2022) 的主要不同之处在于其明确地为目标模型设置了一个数据采样阶段,这样就可以收集其上的人类标签来训练针对特定任务的红队分类器。其包含探索(Explore)、建立(Establish)和利用(Exploit)三个阶段。使用强化学习培养一个对抗性的提示生成器,这个生成器能够触发一系列多样化的有害输出。
Mehrabi et al. (2023) 的论文《FLIRT: Feedback Loop In-context Red Teaming》则是依靠红队 LM $p_red$ 的上下文学习来攻击图像或文本生成模型 $p$,使其输出不安全的内容。红队语言模型 $p_{red}$ 创造了一个根据示例定制的对抗性提示 $ x \sim {p_{red}{(.∣{examples})}}$ 这些初步的示例是由人工仔细打造的;生成模型$p$会以这个提示为条件,输出图像或文字 $y \sim p(.∣x)$。然后,生成的作品 $y$ 会被检测,比如使用分类器来判定其是否安全;如果结果是不安全的,那么这个触发提示 $x$ 就会用来更新上下文的案例,从而让 $p_{red}$ 按照某种策略制作出新的对抗性提示。
如何应对攻击
鞍点问题
Madry et al. 2017 的《Towards Deep Learning Models Resistant to Adversarial Attacks》提出了一个很不错的对抗稳健性(adversarial robustness)框架,即将对抗稳健性建模成一个鞍点问题,这样就变成了一个稳健优化(robust optimization)问题。该框架是为分类任务的连续输入而提出的,但它用相当简洁的数学公式描述了双层优化过程。其目标由一个内部最大化问题和一个外部最小化问题组成:
- 内部最大化:寻找能导致高损失的最有效的对抗数据点 𝐱+𝜹。所有对抗性攻击方法最终都可归结为如何最大化这个内部过程的损失。
- 外部最小化:寻找最佳的模型参数化方案,使得由内部最大化过程找到的最有效攻击的损失能被最小化。要训练出稳健的模型,一个简单方法是将每个数据点替换为其扰动版本,这些版本可以是一个数据点的多个对抗变体。
LLM 稳健性
这里简单谈谈一些有关 LLM 稳健性的研究。
Xie et al. 2023 的论文《Defending ChatGPT against Jailbreak Attack via Self-Reminder》发现了一种简单直观的保护模型免受对抗攻击的方法:明确地指示模型成为负责任的模型,不要生成有害内容。这会极大降低越狱攻击的成功率,但对模型的生成质量会有副作用,这是因为这样的指示会让模型变得保守(比如不利于创意写作),或者会在某些情况下错误地解读指令(比如在安全 - 不安全分类时)。
目前降低恶意攻击风险最常见的方法是对抗性训练,即在攻击样本上训练模型。这种方法被认为是最有效的防御手段,但它需要在模型稳健性和性能之间做出权衡。在 Jain 等人 2023 的《Baseline Defenses for Adversarial Attacks Against Aligned Language Models》中,他们测试了两种对抗性训练方案:(1)将有害提示与 “I’m sorry. As a …” 的回应配对进行梯度下降;(2)在每个训练步骤中,对拒绝回应进行一次梯度下降,而对“红队”的不当回应进行一次梯度上升。结果显示方案(2)几乎无效,因为它严重降低了模型生成的质量,而攻击成功率却仅有少量下降。
白盒攻击通常会产生毫无意义的恶意提示,这些提示可以通过检查困惑度来识别。当然,白盒攻击可以通过专门优化以降低困惑度来规避这一检测,比如 UAT-LM,它是 UAT 的变体。不过,这种方法也有其权衡,可能会降低攻击的成功率。
Jain et al. 2023 还测试了对文本输入进行预处理的方法,使得能在移除对抗性修改的同时维持语义含义。
- 解释含义:使用 LLM 来解释输入文本的含义,这可能会对下游任务性能造成较小影响。
- 重新 token 化:将 token 拆分开并使用多个更小的 token 来表示它们,比如使用 BPE-dropout(随机丢弃一定比例的 token)。使用这种方法的假设是对抗性 prompt 很可能会利用特定的对抗性 token 组合。这也确实有助于降低攻击成功率,但也有限,比如从 90% 以上降至 40%。