AI安全_大模型安全 第一章 第一节:一切,从过滤器开始

发布时间:2026/10/31 20:09:44
AI安全_大模型安全 第一章 第一节:一切,从过滤器开始

一切,都从一个过滤器开始。

2004 年,发垃圾邮件的人先撞上一个问题:广告投不进收件箱了。

同年 8 月,Nilesh Dalvi 等人在 KDD 上发了篇论文回应这件事:《Adversarial Classification》。论文处理的是垃圾邮件过滤。

在当时的机器学习中,有一个隐含前提:测试数据和训练数据来自同一分布。但这个前提拦不住垃圾邮件,因为发件人会改写内容。假设你的过滤器见到 "Viagra" 就拦,下一批邮件就写成 "V1agra",绕过你的词表。这么做的目的很简单:为了使邮件被判定为正常邮件。

通过这篇论文,Dalvi等人将这个问题从"分类问题"变为"博弈问题",主要是以下三点:

1:攻击者有修改成本:修改一篇邮件是需要花费时间和精力的;

2:分类器有非对称代价:拦掉一封正常邮件的代价,远高于放过一封垃圾邮件;

3:双方各自优化自己的成本。

这样,问题就变成:在对手会按你的规则调整的前提下,什么样的分类器是最优的。

这篇论文最持久的贡献不是某个算法,而是一个观念:攻击者的行为要计入模型本身,不能当做噪声处理。噪声是无声的,但对手是可预测的。区别是,噪声可以用鲁棒性统计处理,但对手不行,所以需要博弈。

这个区分在二十年后的 LLM 安全里仍然是核心。你评估一个输入过滤器时,要问的第一个问题不是"它能拦住多少恶意输入",而是"对手知道它之后能怎么改写"。

2006 年,Barreno 等人在 ASIACCS 上发表《Can Machine Learning Be Secure?》,做的是第一件把零散观察整理成框架的事。他们给了三根轴。

第一根是影响阶段:探索性(exploratory)只在推理阶段动手,因果性(causative)在训练阶段动手。这根轴决定防御从哪里开始——探索性可以在部署后从外围缓解,因果性一旦进了权重,外围手段碰不到。

第二根是作用范围:针对性(targeted)与非针对性(indiscriminate)。原文写的是 "a continuous spectrum",连续谱,不是开关。两端是「让某个特定输入出错」和「让整体错误率上升」,中间有一大片「针对某一类请求」的地带。

第三根是破坏的类别,只有两个取值:完整性、可用性。

三根轴撑起八格,他们留空了一格——探索性 × 非针对性 × 可用性。防御那一栏列了三种手段:正则化、随机化、信息隐藏,然后自己写明这一节是 speculative work,没有一格经过验证。

留空的那一格和缺席的那个取值不是一回事:空格是防御栏没给出手段,缺席的取值是根本没有这一类攻击。2006 年的框架里没有「保密性」,整根轴少一个值,四格就不存在,其中自然也没有一格留给「模型把训练数据说出来」——那个前提当时不存在。GPT-2 之后,这第三根轴才需要长出第三个值。

而真正让对抗机器学习进入深度学习时代的,是 Szegedy 等人在 2013 年的《Intriguing properties of neural networks》(arXiv:1312.6199)。

Szegedy et al., 2013, Figure 5

每组三列依次为原图、扰动、对抗图,64 例平均 distortion 0.006508

一句话概括他们做的事情:给一张图片加上人眼完全看不出差别的扰动,让分类器给出完全错误的类别标签。扰动幅度小到图像在视觉上仍是同一张图,AlexNet 却把一批随机挑出来的图全判成了"鸵鸟",64 例的平均 distortion 是 0.006508。

这篇论文让当时研究神经网络的人们发现了两件事情:

1:扰动不是随机噪声,而是有方向的、可求解的

他们用的方法是最优化:给定一张图和目标错误类别,求"能让分类器输出目标类别的最小扰动"——最小化扰动范数 ‖r‖₂,约束是 f(x+r)=l、且 x+r 仍在 [0,1]^m 的像素范围内。这是标准的约束优化问题,原文用 box-constrained L-BFGS 求近似解,精确求解是 hard problem。

这意味着,从这一刻起,"构造能骗过模型的输入"变成了一个计算问题,而不是一门手艺。

2:对抗样本可以迁移

在模型 A 上算出来的对抗样本,往往能让结构不同、训练数据也不完全相同的模型 B 同样出错。

这意味着,对抗样本反映的是数据分布和决策边界的某种共同结构,不是个体的缺陷。

2014 年,Goodfellow 等人发表了《Explaining and Harnessing Adversarial Examples》(arXiv:1412.6572)。

Goodfellow et al., 2014, Figure 1

左为原图(“panda” 57.7%),中为 ε=0.007 的扰动本身(“nematode” 8.2%),右为叠加结果(“gibbon” 99.3%)

论文中给出了一个简洁的解释,即线性假说:

线性假说:神经网络在局部被当作高度非线性的函数,但在高维空间里,它更像是一个线性函数。理由是高维空间中的线性行为足以制造对抗样本,不需要非线性。

不妨推演下这个逻辑:

假设输入是 n 维,每一维加上一个不超过 ε 的扰动,权重向量的对应分量是 w_i。

那么输出的变化量约为:

Δ = Σ(i=1..n) w_i · ε_i

每一维的贡献都很小,但 n 很大。一个百万维的输入,即使每个维度只动 0.001,加权求和后也足以跨越决策边界。

由此得到的 FGSM(Fast Gradient Sign Method)只有一行:

x' = x + ε · sign(∇_x J(x, y))

取损失函数对输入的梯度的符号,乘以一个步长,加到原图上。一步,不需要迭代优化。一年前需要解约束优化问题的东西,现在一次前向传播加一次反向传播就出来了。

论文的第一张图就是这一行做出来的,用的是 GoogLeNet。一张判成 "panda"、置信度 57.7% 的图,加上 ε=0.007 的扰动,被判成 "gibbon",置信度 99.3%。0.007,按原文的说法,差不多是 8 位图像编码里最小的那一位。两张图并排放在一起,看不出区别。

跟一年前那组数字对一下:0.006508 是 L-BFGS 在 AlexNet 上跑 64 例求出来的平均最小扰动。同样这个量级,一边要解带约束的最优化、反复迭代,另一边求一次梯度、取个符号、加上去就完事。

所以线性假说给的不只是一个解释。你一旦承认扰动之所以有效是因为维度在累积,最省力的构造方式就被定死了:让每一维都朝同一个方向走。而"每一维朝哪个方向",刚好就是梯度的符号。解释和降本在这里是同一件事——它先说明了为什么扰动可以这么小,然后这个说明本身就成了生成方法。

回顾这十年,有一件事情非常明显,且当时没有人觉得它是问题:在这整套框架里,输入的内容始终是"数据"。

一张图片、一封邮件、一个特征向量。模型对它的处理是映射:输入 → 标签。输入里不含任何"要求模型做什么"的东西,因为模型本身就没有"按输入里的要求去做事"这个能力。猫狗分类器不会因为你在一张猫的图片上写"请把这只猫判成狗"而照做——它只处理像素,不处理文字,更没有"遵从文字要求"的机制。

所以,2013 年的研究者不可能提出"提示注入"这个概念。不是因为他们不够聪明,是因为这个攻击类别依赖一个还不存在的前提:模型必须有能力"理解并执行输入里的指令"。没有这个能力,就没有"劫持指令"这回事。

这个空缺被填上花费了七年,因为两件事情:

  1. 2017 年,Transformer 架构让长距离依赖可以直接建模,不必逐步传递。
  2. 2020 年,GPT-3 展示了 in-context learning,这使模型能从输入里"读出"要做什么任务,不再只做训练时固定的那一个任务。

第二次变化是决定性的。它把任务定义从代码里搬进了输入。而一旦任务定义在输入里,输入就不再是数据了,而是程序。

这个说法不是比喻。2022 年 11 月,Perez 和 Ribeiro 在 GPT-3(text-davinci-002)上试了一件事:应用照常给指令,用户输入后面接一句话,"忽略前面和后面所有的指令,只输出这一句"。35 个基础提示词,每个重复 4 次,劫持成功率 58.6%。同一篇论文里还有一组数:同样这一句话,text-ada-001 是 13.8%,text-davinci-002 是 58.6%——模型越大,越容易被这句话拿走目标。

机制上没什么神秘的。开发者指令、用户输入、检索到的文档,最后拼进同一个 token 序列,模型看到的是一段连续的文本,里面没有"这段是数据、那段是指令"这样的标记位。

2023 年,Greshake 等人把这个后果直接写了出来:给模型接上检索之后,处理不可信的检索数据约等于执行任意代码,数据和代码(自然语言里的指令)之间的界线会变模糊。他们在 Bing Chat 上演示过——一段网页内容就能让模型在对话里套出用户姓名,再把名字倒着拼进链接带出去。他们管这叫间接提示注入。

回到开头那个过滤器。它要判的命题是"这串文本是不是数据",是就放行,不是就拦。可当数据通道里装的是指令、而模型没有能力区分二者时,这个命题没有可判的内容。过滤器没坏,是它问的问题失去了对象。