对抗攻击(Adversarial Attack)
Adversarial Attack(对抗攻击) 是指恶意攻击者通过对输入数据进行微小的、往往是人类难以察觉的扰动(perturbations),诱导机器学习模型(特别是深度神经网络)产生错误输出(如错误分类)的技术。比如说,通过给AI模型下套,让它猫识别成狗。
主要概念与常见类别
限制条件与L范数
对抗攻击的本质是:在不被人眼发现的情况下欺骗 AI。
为了量化“人眼看不看得见”,我们规定了三种范数:
- \(L_\infty\) 范数: 规定每一个像素点改动的最大值(比如每个点最多改 8 个灰度值)。这是最常用的,因为它保证了全图没有一个地方突兀。
- \(L_2\) 范数: 规定所有像素改动的 平方和 (总能量)。它允许某些点改动大一点,只要整体改动小就行。
- \(L_0\) 范数: 规定只能改动多少个像素点(比如整张图只准改 10 个点,但改多少度随意)。
这里要注意,范数本身并不是对抗攻击专有的,但是在对抗攻击中,\(L_\infty\) 成了对抗攻击的明星,是因为它对“最大像素改动”的严格限制最符合人类视觉系统的特性(只要任何一点都不突兀,整体看起来就没变)。
常见攻击类别
在AI安全领域,攻击通常根据发生的时间阶段分为两大类:
- Poisoning Attack(投毒攻击): 发生在 训练阶段 。攻击者向训练数据集中注入恶意数据,从而破坏模型的完整性。
- Evasion Attack(逃逸攻击): 发生在 推理(部署)阶段 。模型已经训练好了,攻击者通过修改输入数据来欺骗模型。
Adversarial ML(对抗性机器学习)是ML与计算机安全的交叉领域。传统的计算机安全通常是二进制的(如密码正确/错误,权限有/无)。机器学习则是基于概率和统计的。Adversarial ML 研究的是当这两个领域碰撞时产生的新型漏洞。例如,图片中提到的生物识别认证(Biometric Authentication)、网络入侵检测(Network Intrusion Detection)和垃圾邮件过滤(Spam Filtering),这些都是既依赖ML算法,又对安全性要求极高的场景。如果攻击者能通过微调垃圾邮件的文本特征(对抗样本)来绕过过滤器(逃逸攻击),系统的安全性就失效了。
在安全领域,遵循“不知攻,焉知防”的原则。研究人员必须先开发出强大的攻击算法(如FGSM, PGD, C&W等攻击算法),生成能够骗过模型的对抗样本,然后才能针对性地设计防御机制(如对抗训练 Adversarial Training)。
常见威胁类型
对抗性样本(Adversarial examples)的表现形式多种多样,攻击的具体形式取决于攻击者的三个关键要素:
- 目标 (Goals) :他们想达到什么目的(如让模型误判、失效或获取隐私)。
- Untargeted: 只要让模型分类错误即可。在上面讨论的自动驾驶案例中,只要识别错误,即可造成巨大的安全隐患。
- Targeted: 攻击者希望模型将其误分类为一个指定的、特定的标签。这种目的性显而易见,比如强制将垃圾邮件分类为正常邮件,将A识别为B等。
- 知识 (Knowledge) :机器学习的本质来自于高维空间的数学特性和统计学习。反过来讲,攻击者是否了解模型的内部结构,将决定攻击威胁有多大。我们一般按照攻击者的知识储备,将威胁模型分类为:
- White-box attack, 白盒攻击。攻击者完全掌握模型信息(架构、参数、权重、梯度等)。这就像拿到了保险箱的设计图,可以精确计算出如何破解。常用方法:FGSM、PGD。
- Black-box attack, 攻击者 对内部一无所知 ,只能看到输入和输出。通常通过“查询”模型(喂入大量数据看反馈)来训练一个“替身模型”,然后利用对抗样本的迁移性进行攻击。
- Grey-box attack, 介于两者之间,可能知道架构但不知道参数,或者知道部分训练数据分布。
- 能力 (Capabilities) :他们能对系统施加多大影响(如修改训练数据或仅修改测试输入)。一般来说,攻击者可采取的技术手段包括:
- 构建对抗样本 Crafting adversarial inputs。攻击者能够根据模型的预测结果和概率分布来设计专门的对抗输入。
- 数据准备:攻击者可以收集或生成 辅助数据 (Auxiliary data) 。
- 模型训练(查询与替代):通过在辅助数据集上反复查询 (Querying) 目标模型;利用获取的反馈训练出一个 本地替代模型 (Local substitute) ,也称为 代理模型 (Surrogate model) 。
- 利用迁移性进行攻击:将该代理模型作为“白盒”代理,在上面构建对抗样本。利用对抗样本的 迁移性 (Transferable) ,使这些样本在原始目标模型上也同样奏效。
我们先来看一下主要的威胁模型(Threat Models),然后再从原理入手分析攻击方法和防御手段等。
Causative Attack
因果攻击 / 中毒攻击 (Causative Attack / Poisoning Attack)是一种发生在训练阶段 (Training phase) 的攻击。攻击者试图学习、影响或直接腐蚀(Corrupt)机器学习模型本身。
其工作原理如下:
- 输入混入 :在“常规训练数据”(Regular Training Data)中掺入“恶意训练数据”(Malicious Training Data)。
- 模型训练 :模型在含有毒素的数据集上进行训练。
- 结果触发 :如果训练出的模型达到了攻击者的“预期结果”(Desired Outcome),则该模型被视为 已中毒(Poisoned) 。
Evasion Attack
规避攻击 (Evasion Attack) ,也称为探索性攻击 (Exploratory Attack)。这是一种发生在测试/推理阶段 (Testing phase) 的攻击。攻击者不会篡改机器学习模型本身,而是通过精心设计的输入,诱导模型产生由攻击者选定的特定输出结果。
其常见过程如下:
- 尝试样本 (Try Sample) :攻击者向现有的模型输入一个样本。
- 判断结果 (Desired Outcome?) :检查模型的输出是否达到了攻击者的预期目标。
- 循环迭代 (Derive New Sample) :
- 如果没有达到预期(No),攻击者会根据反馈推导并生成一个新的样本,再次尝试。
- 如果达到了预期(Yes),则攻击成功,实现 规避 (Evasion) 。
与之前看到的“中毒攻击”不同,规避攻击就像是在找系统的“漏洞”或“后门”。模型在训练时是健康的,但攻击者通过寻找模型决策边界的弱点,让它在处理特定数据时出错(例如:让自动驾驶系统把“停止”标志识别为“限速”标志)。
Evasion Attack是最为常见的一种攻击方式。
机器学习分类器的工作原理是在不同类别的特征之间寻找一条“分界线”。比方说,假如我们正在经营一家在线拍卖网站,为了防止用户销售违禁品,我们常通过训练一个 深度卷积神经网络(Deep Convolutional Neural Network) 作为图像分类器,来区分“违禁物品”和“合法物品”。
如下图所示,分类器实质上是通过分界线来区分不同的区域:

其本质上是将每一张图片的全部像素转换为向量,然在向量空间找到分界线。由于每一张图都由数以万计的像素点组成,这意味着我们将有数万个可以微调的变量,通过极其细微地调整这些像素,我们可以将图像推过分类器的决策边界(decision boundry)。
如下图所示,调整后的图片被同样的模型识别为toaster(烤面包机)。

对人类而言,调整后的图片看起来没有任何变化,但对AI模型而言,同样的猫图,分类器却以98%的极高置信度将其识别成了烤面包机。
逃逸攻击不仅可以修改图片识别结果,利用同样的方法,攻击者可以在不同程度上绕过所有的Machine Learning Model的决策边界,从而实现不同的恶意目的。
如下图所示,恶意软件检测模型通常能以较高的概率识别出某个文件是恶意软件(Malware)。然而,攻击者通过在 AndroidManifest.xml 文件中添加一些“无关紧要”的新内容后,即使文件核心恶意功能没变,模型的判断结果却发生了逆转,以 90% 的概率将其误判为良性(Benign)。这种攻击的成功率高达 85% ,会导致恶意软件绕过检测,最终造成系统入侵。

语音识别任务也同样如此。供给者在原始音频中加入极其微小的噪声(例如乘以 \(0.001\) 或 \(0.01\) 的系数),这种扰动在Adversarial Attack中被称为对抗扰动(Perturbation)。即便这些噪声对人类来说是听不见的,但对于 AI 模型来说却是“清晰可见”的指令。
如下图所示,供给者通过微小的扰动,将原本描述“最好/最坏时代”的文学名句误识别为《傲慢与偏见》的开头。将简单的问候语“How are you?” 篡改为极具危险性的指令 “Open the door” (开门)。这种误识别可能直接导致安全隐患或人身伤害(例如让入侵者进入房屋)。

对抗攻击不仅仅存在于虚拟世界中,其亦可渗透到现实世界,因为我们如今的现实世界已经高度集成信息技术。比方说,如今道路上行驶着非常多的自动驾驶汽车,而自动驾驶汽车主要通过视觉识别来判断路况。
下图展示了攻击者通过对现实世界中的交通标志微调,诱导AI模型产生误判。

攻击者采用了“精细海报”(Subtle Poster)、“涂鸦掩护”(Camouflage Graffiti)和“伪装艺术”(Camouflage Art)等手段。实验结果显示,在不同距离和角度下,这些被修改过的“停止”(STOP)标志或“右转”标志具有极高的攻击成功率。例如,某些“精细海报”攻击的 成功率达到了 100% 。这种误识别(Misrecognition)会导致严重的后果,如 车祸 。
下图展示了针对自动驾驶感知层(车道线识别)的攻击:

研究人员通过在地面张贴对人类司机几乎不可见、但能误导自动驾驶仪(Autopilot)的贴纸,诱导车辆 驶入逆向车道 。上右侧图片展示了对 NVIDIA 自动驾驶平台的测试。通过特定的干扰,系统可能无法正确识别车道边界或行驶方向(由红色箭头示意误导后的转向轨迹)。这种误检测(Misdetection)同样会引发 安全隐患或直接的人身伤害 。
这些看似微小的物理改动会绕过 AI 的防御,将识别/检测错误转化为现实世界中的 物理伤害 。
我们必须严谨考虑AI技术的鲁棒性,确保AI技术是可靠的。扰动不一定来自于攻击者的刻意而为。由于训练集无法涵盖所有情况,现实中的不可预测性往往会带来一些意想不到的结果。
如下图所示,《科学与外交》杂志讨论了自主武器面临的挑战:

文中提到一个极端的误识别案例,即武器可能将一辆 校车(School Bus)误认为是军事车队(Military Convoy) 。这种 AI 漏洞会导致 平民丧生 ,引发严重的国际法和道德问题。
参考资料:
- 2013: Szegedy et al. ,链接:https://arxiv.org/abs/1312.6199 ,观点:存在低概率的非线性“口袋”及正则化不足。
- 2014: Goodfellow et al. ,链接:https://arxiv.org/abs/1412.6572 ,观点:DNNs 的分段线性特性(如 ReLU/Sigmoid)导致扰动被放大。
- 2016: Tanay and Griffin ,链接:https://arxiv.org/abs/1608.07690 ,观点:决策边界倾斜导致模型无法完美拟合。
- 2018: Schmidt et al. ,链接:https://arxiv.org/abs/1804.11285 ,观点:缺乏足够的训练数据来保证鲁棒性。
- 2018: Bubeck et al. ,链接:https://arxiv.org/abs/1805.10204 ,观点:构建鲁棒分类器在计算上是不可行的。
- 2019: Ilya et al. ,链接:https://arxiv.org/abs/1905.02175 ,观点:对抗样本是由于模型捕捉到了非鲁棒特征。
- 2022: Amich and Eshete ,链接:https://arxiv.org/pdf/2202.08944.pdf ,观点:大多数对抗样本本质上属于分布外(OOD)输入。
Privacy Attacks
隐私攻击旨在获取模型内部或训练数据中的敏感信息,主要分为两种:
- 模型逆向攻击 (Model Inversion Attack) :利用模型的输出和模型本身,反向推导出 私密且敏感的输入数据 。
- 模型提取攻击 (Model Extraction Attack) :通过向模型发送大量查询请求,从而“窃取”或 提取模型的内部参数 。
下图展示了通过人脸识别系统的置信度分数,成功还原出受害者的人脸图像。

下图展示了在 Amazon 等平台上进行此类攻击的成本极低(例如,仅需 $0.03 到 $0.15 即可完成一次提取)。

针对图像的白盒逃逸攻击
我们先来讲一下最常见的白盒攻击。
给定函数 \(F: X \mapsto Y\)(可以是逻辑回归 LogReg、支持向量机 SVM 或 深度神经网络 DNN)。目标是构建一个对抗样本(Adversarial Sample)\(X^*\)。方法是在原始输入 \(X\) 上添加一个扰动向量 \(\delta_X\)。
白盒攻击意味着攻击者对目标模型 \(F\) 拥有完全的知识。攻击者知道模型的架构(如 ResNet, VGG)、所有参数(权重和偏置)、以及训练数据分布。最关键的是,攻击者可以访问模型的梯度(Gradient)信息,这是进行反向传播生成对抗样本的基础。
逃逸意味着攻击发生在模型训练完成后的 推理(Inference)阶段 。攻击者不通过投毒数据改变模型参数,而是通过修改输入数据来欺骗模型。
举例来说,在深度学习中,比如CNN图像识别任务中:\(X\) 是原始像素矩阵(例如一张熊猫的照片)。\(Y\) 是模型输出的概率向量(Softmax层输出)。\(\delta_X\) 是精心设计的噪声。这不仅仅是随机噪声,而是针对模型 \(F\) 的决策边界计算出的特定噪声。
由此,我们可以写出白盒逃逸攻击的数学定义:
- 其中 \(X^* = X + \delta_X\),\(Y^*\) 是攻击者想要的对抗输出(Targeted Attack)。
可以看出,这是一个约束优化问题:
- 目标函数 \(\min \|\delta_X\|\)* :我们要让扰动尽可能小。在视觉上,这意味着对抗样本 *\(X^*\) 和原始样本 \(X\) 在人类肉眼看来应该是一模一样的(不可察觉性)。通常使用 \(L_0, L_2, L_\infty\) 范数来衡量这个距离。
- 约束条件 \(F(X + \delta_X) = Y^*\)* :这是攻击成功的条件。例如,本来识别为“熊猫”,现在必须识别为“长臂猿”(*\(Y^*\))。
- 直观理解 :我们在高维特征空间中寻找一条通往目标类别 \(Y^*\) 的“捷径”,同时要求这条捷径的物理距离最短。
当 \(F\) 是非线性(Nonlinear)或/且非凸(Nonconvex)时,解决这个问题是非常困难的(Non-trivial)。直接解析求解上述优化问题是不可能的,因此必须依赖 近似解法(Approximate Solutions) 。
JSMA
我们来看一下最基础的JSMA算法。该算法是一个非常古老的算法,我们用这个算法来了解基本思想,但是注意:该算法在今天已经完全无法使用了。具体原因我放在最后讲。
首先复习一下模型训练的过程,以SGD为例:
- 固定 :输入数据 \(X\)(比如一张猫的图)。
- 变量 :模型的权重 \(W\)。
- 目标 :计算损失函数 \(L\) 关于权重 \(W\) 的梯度 \(\nabla_W L\),然后更新 \(W\) 让 Loss 变小。
在攻击时,我们要把逻辑反过来:
- 固定 :模型的权重 \(W\)(模型已经训练好了,你动不了参数)。
- 变量 :输入数据 \(X\)(你想改这张图)。
- 目标 :计算输出概率 \(F(X)\) 关于输入 \(X\) 的梯度 \(\nabla_X F\),然后修改 \(X\) 让目标类别的概率变大。
换句话说,在训练模型时,我们不动图,而是改权重,目的是让模型能认出图来;而在攻击时,我们不改权重,而是动图,目的是让模型认不出图来。
JSMA(Jacobian-based Saliency Map Attack) 利用雅可比矩阵计算出的“灵敏度图”,去寻找那些对结果影响最大、但数量最少的几个关键像素。它不关心所有像素,只关心那几个“阿喀琉斯之踵”。
换句话说,普通SGD中,我们算的是 \(\frac{\partial Loss}{\partial W}\);在JSMA中,我们需要算的是 \(\frac{\partial \text{分类概率}}{\partial \text{像素}}\) 。
我们可以首先评估模型 \(F\) 在输入点 \(X\) 处的敏感度:
这本质上就是雅可比矩阵(Jacobian Matrix) 。假设输入图像有 \(N\) 个像素,模型输出有 \(M\) 个类别。矩阵中的元素 \(\frac{\partial F_j(X)}{\partial x_i}\) 告诉我们:如果微小改变第 \(i\) 个像素的值,第 \(j\) 个类别的预测概率会变化多少?在深度学习中,我们可以通过固定模型参数,对输入 \(X\)进行反向传播来高效计算这个矩阵。
我们可以选择那些能影响样本 \(X\) 分类的扰动(Perturbation)。有了雅可比矩阵,攻击者就可以构建一张“热力图”。比方说,攻击者可以找到那些对目标类别 \(Y^*\) 具有 正向高梯度 (增加该像素,目标类概率剧增),且对原始正确类别具有 负向高梯度 (增加该像素,原始类概率剧降)的像素点。我们只修改这些关键像素,就能以极小的扰动(\(L_0\) 范数最小化)实现攻击。
举例来说,假设输入是一张 \(28 \times 28\) 的手写数字图片(共 \(784\) 个像素),模型输出是 \(0 \sim 9\) 共 \(10\) 个类别。
- SGD看的是 :Loss 对 几百万个参数 的梯度。
- JSMA看的是 :10个类别的概率 对 784个像素 的梯度。
这个矩阵 \(J\) 的样子是这样的(\(10\) 行 \(\times\)\(784\) 列):
我们可以利用反向传播,把输入图片 \(X\) 当作“参数”,把模型参数固定住。然后分别对输出层的每一个节点(类0, 类1...)做一次反向传播到输入层,就能得到这个矩阵。
有了上述矩阵后,我们现在就知道了,当每一个像素发生微小变化时,每一个类别的概率会怎么跳动。因此,JSMA的目标是针对性攻击(Targeted Attack),比如说假设原始图片是 “1” ,你的攻击目标是让模型认为是 “4” 。JSMA的美学是极简主义的:尽可能少改动的情况下来达到目标。因此JSMA是\(L_0\)范数优化:
- 视觉效果 :图片上会出现几个奇怪的亮点或噪点,像死像素一样。
- 缺点 :计算量巨大(算整个雅可比矩阵很慢),就像做外科手术一样慢。
JSMA详细过程如下所示:

JSMA是一种 迭代式 、 针对性 (Targeted)的白盒攻击。它的核心目标是:我想让模型把数字“1”误报为“4”,但我只想修改最少的像素点(\(L_0\)范数优化)。对应上面的流程图,我们可以大致把JSMA的整个过程分为四个阶段。
首先是初始化与输入:
- 输入 (\(X\)) :流程图左侧展示了一张手写数字“1”的原始图片。
- 模型 (\(F\)) :一个训练好的深度神经网络。此时 \(F(X) = 1\)(分类正确)。
- 攻击目标 (\(Y^*\)) :攻击者指定的目标类别 \(t = 4\)。
- 当前状态 :图片还是原始图片,扰动 \(\delta X = 0\)。
紧接着,我们进行方向敏感度估计(Direction Sensitivity Estimation),这是JSMA中最核心的第一步。我们慢点学,理解一下每个词的含义。以图示中的数字1为例,假设你想把它改成数字“4”,但你只能改动极少数的像素:
- Direction (方向) :指的就是每一个具体的 像素点 (比如第 3 行第 5 列的那个点)。在数学上,每一个像素就是一个维度的“方向”。
- Sensitivity (敏感度) :指的是如果你改变这个像素的数值(比如把黑色变成白色),模型输出“这是数字 4”的概率会 波动多少 ?
- Estimation (估计) :因为神经网络太复杂了,我们无法直接知道结果,必须通过计算导数(梯度)来预测这个变化量。
方向敏感度估计的数学本质就是计算雅可比矩阵 (Jacobian)。假设输入图像 \(X\) 有 \(N\) 个像素(\(x_1, \dots, x_N\)),模型的输出层有 \(M\) 个类别(\(F_1, \dots, F_M\))。我们需要计算雅可比矩阵 \(J_F(X)\):
其中
- \(\partial F_j(X)\):表示第 \(j\) 个类别(比如“熊猫”或“长臂猿”)的预测概率。
- \(\partial x_i\):表示第 \(i\) 个输入像素。
在这个矩阵中,我们特别关注两部分信息:
- 目标类的梯度 :\(\frac{\partial F_t(X)}{\partial x_i}\)(其中 \(t=4\))。这代表:如果增加第 \(i\) 个像素的值,类别“4”的概率会增加多少?(我们需要这个值 越大越好 )。
- 其他类的梯度和 :\(\sum_{j \neq t} \frac{\partial F_j(X)}{\partial x_i}\)。这代表:如果增加第 \(i\) 个像素的值,除了“4”以外的其他类别的概率总和会怎么变?(我们需要这个值 越小越好 ,即其他类的概率下降)。
在流程图中的三维波峰图就是基于上述梯度计算出的原始数据。波峰最高的地方,意味着那个位置的像素对模型决策最敏感——换句话说,这里就是攻击者的“最佳下手点”。攻击者利用这张图来选择扰动点,进而修改X。
在了解上述原理后,我们就可以构建显著图(Saliency Map)并实现扰动(Perturbation)。其核心思想是,对于每一个像素 \(i\),我们看它是否满足两个条件:
- 助攻目标 :如果我们增加像素 \(i\) 的亮度,目标类别(4)的概率会猛增吗?****
- 查表:\(\frac{\partial \text{类4}}{\partial x_i} > 0\) 且很大。
- 打压异己 :如果我们增加像素 \(i\) 的亮度,其他所有类别(包括原始正确的1)的概率会猛降吗?****
- 查表:\(\sum_{\text{其他类}} \frac{\partial \text{其他类}}{\partial x_i} < 0\) 且很小(负得厉害)。
JSMA 的逻辑是:只有当一个像素既能 显著提升目标类概率 ,又能显著压低其他类概率时,它才会被选中。我们会给这样的像素打一个高分(Saliency Score)。
JSMA 定义了一个显著性评分 \(S(X, t)[i]\) 来评估第 \(i\) 个像素的攻击价值。
一个理想的攻击像素 \(i\) 必须同时满足两个条件:
- 正向贡献 :增加它,目标类(4)的概率通过导数看是增加的 (\(\frac{\partial F_t(X)}{\partial x_i} > 0\))。
- 负向抑制 :增加它,非目标类(比如原始的 1)的概率总和是减少的 (\(\sum_{j \neq t} \frac{\partial F_j(X)}{\partial x_i} < 0\))。
如果是这样,我们就计算它的得分(通常是两者的乘积);否则,得分置为 0。
我们在整张图的所有像素中,找到得分最高的那个像素(或者一对像素):
在这个步骤中,算法锁定了那个唯一的、最致命的像素点。
最后,我们便可以通过迭代来完成修改。JSMA和后面要介绍的FGSM不同,JSMA是一步步来的,并不对全部像素进行修改。
JSMA的算法流程如下:
- 输入 :原始图片 \(X\),目标类别 \(Y^*=4\)。
- 循环开始 (直到攻击成功或达到修改上限):
- Forward :把当前图片扔进网络,计算预测结果。如果已经是“4”了,停止。
- Backward :计算雅可比矩阵(当前图片下,各个像素的敏感度)。
- Selection :根据显著图公式,找到得分最高的那个(或那对)像素点。
- Perturb :狠狠地修改这个像素。 * 注意 :这里不是像SGD那样只动 \(\eta=0.001\)。JSMA通常是直接把这个像素 饱和化 (比如直接变成纯白或纯黑,或者加一个很大的值)。
- Lock :这个像素已经废了(被改过了),下一轮不再考虑它。
- 循环继续 :拿着这张被改了一个点的图,回到第1步。
之所以要循环,是因为神经网络是非线性的。当你把图上左上角的一个黑点变成白点后,模型对整张图的理解就变了。之前认为“右下角那个点很重要”,现在可能变得不重要了。所以每改一个点,必须重新计算一次梯度的雅可比矩阵。
我们可以看到,JSMA需要知道每一个输入点对每一个输出类的具体贡献,这在早期MNIST手写数据集上还可以进行,但在ImageNet和ViT时代,计算Jacobian矩阵几乎是一件不可能也不现实的事情。
此外,JSMA的前提假设是固定数量的分类,如果ViT用的是分类输出,在理论上JSMA还可用。然而,到LLM时代,我们更多的是输出下一个Token的概率分布,我们希望得到的是对图片的描述,这种情况下JSMA是彻底失效的。
FGSM
Fast Sign Gradient Method (FGSM)即快速梯度符号法。其核心逻辑类似于地毯式轰炸:它不计算复杂的雅可比矩阵,而是计算 损失函数的梯度 。它问的问题是:“整体往哪个方向走,能让模型的错误率上升最快?”然后,它不管具体哪个像素敏感,直接让所有像素都往那个坏方向挪动一小步(\(\epsilon\))。公式核心是 sign() 函数,这意味着所有像素变化的幅度是一样的。
扰动形态 (\(L_\infty\) 范数) :所有像素都发生了微小的变化 。
- 视觉效果 :整张图片蒙上了一层淡淡的雪花点或底噪,像老电视的信号干扰。
- 优点 : 极快 。只需要反向传播一次,几乎和模型正常推理一样快。
FGSM的核心思路:
- 核心思想: 既然训练模型是顺着梯度的反方向走(让 Loss 变小),那攻击就是顺着梯度的正方向走(让 Loss 变大)。
- 特点: 只走一步。速度极快,但攻击力比较“粗糙”。
DeepFool
DeepFool的目标不是“最快出错”,而是“用最小的代价出错”。它把神经网络的决策边界想象成一道墙。它计算当前点到这道墙的最短垂直距离,然后把球轻轻推过墙。因为神经网络是非线性的(墙是弯曲的),所以它需要迭代几次(推一下,算一下,再推一下),直到跨过边界。
扰动形态 (\(L_2\)范数) :整体变化量的平方和最小 。
- 视觉效果 :它的扰动通常是这三者中最肉眼难辨的,因为它追求的是数学上的最小距离。
- 优点 :生成的对抗样本质量很高(扰动极小),通常用来评估模型的鲁棒性(即:到底多小的推力能把模型推倒?)。
PGD
在JSMA的小节中我们已经提到了,在LLM时代JSMA是失效的。当模型越来越大以及我们进入LLM时代不再预测固定分类的时候,我们需要回归到基于Loss的攻击,因为不管模型多大,Loss永远只是一个标量:
算一个标量对输入的梯度,无论模型多大,成本都约等于一次反向传播(Backpropagation)。这比算雅可比矩阵(向量对向量的导数)快了 \(M\) 倍(输出类别数倍)。
在学术界和工业界,如果你要证明你的模型“很安全”,通常必须通过 PGD 攻击 的测试。因为 FGSM 这种“一波流”很容易被防御(比如通过对抗训练),但 PGD 这种“死缠烂打”的攻击非常难防。
PGD是目前来说最为标准的、超强的白盒攻击方法。Madry 等人在 2018 年证明,PGD 是利用一阶梯度信息能找到的最优攻击。
PGD算法是加强版的FGSM,主要动作包括:
- 往梯度方向走一小步。
- 检查是否超出了 \(L\) 范数的限制(比如 \(L_\infty \le 8\))。
- 如果超了,就强行按回边界(这就是所谓的 Projected ,投影)。
- 重复以上动作。
AutoAttack
虽然 PGD 很强,但近年来研究发现更复杂或组合的攻击比标准 PGD 更全面、更难防御。AutoAttack不是单一攻击,而是将多个强攻击组合成一个“自动化”的评估流程,包括:
- Auto-PGD(多种损失函数)
- FAB(Fast Adaptive Boundary)
- Square Attack(可作为黑盒组件)
整体产生比单一 PGD 更具破坏性的对抗样本,并能更稳定地评估模型鲁棒性。因此在现代评估中, AutoAttack 已成为比 PGD 更全面的白盒攻击基准 。
C&W 攻击(Carlini & Wagner Attack)
C&W 攻击由 Carlini 和 Wagner 于 2017 年提出,是目前最强的优化型白盒攻击之一,能够有效突破蒸馏防御等当时流行的防御手段。
核心思路: 将对抗样本生成问题转化为一个无约束优化问题。引入变量替换 \(\delta = \frac{1}{2}(\tanh(w) + 1) - x\),将 \(L_\infty\) 约束自然地编码进变量空间,从而避免显式的投影操作。目标函数为:
其中 \(f\) 是一个专门设计的置信度损失函数(而非直接使用交叉熵),\(c\) 是通过二分搜索(Binary Search)确定的权衡系数。
C&W \(L_2\) 攻击: 最常用的变体,最小化扰动的 \(L_2\) 范数,同时满足攻击成功的约束。
C&W \(L_0\) 攻击: 目标是最小化被修改的像素数量(即 \(L_0\) 范数)。算法采用迭代剪枝策略:
- 首先执行 \(L_2\) 攻击,得到初始对抗样本。
- 计算梯度 \(g = \nabla f(x + \delta)\),找到对分类结果贡献最小的像素 \(i = \arg\min_i g_i \cdot \delta_i\)。
- 将像素 \(i\) 从可修改集合中移除(固定为原始值)。
- 重复上述过程,直到 \(L_2\) 攻击在剩余像素上失败为止。
最终结果是一组数量最少的关键像素扰动,使分类器出错。
C&W \(L_\infty\) 攻击: 目标是控制扰动的最大幅度(即 \(L_\infty\) 范数)。由于 \(L_\infty\) 范数不可微,采用迭代惩罚逼近策略:
其中 \((\cdot)^+ = \max(0, \cdot)\) 表示 ReLU 函数,\(\tau\) 是当前容忍的最大扰动幅度。迭代规则为:若所有 \(\delta_i < \tau\),则令 \(\tau := \tau \times 0.9\)(收紧约束);否则终止。通过不断收紧 \(\tau\),算法逐步逼近真正的 \(L_\infty\) 最优解。
多模态视觉注入
Visual-GCG
Image-Hijack
针对LLM的白盒逃逸攻击
针对LLM的白盒逃逸攻击,在LLM界一般也被成为越狱攻击(Jailbreak Attack)。
GCG
GCG是针对大语言模型LLM领域最著名的对抗攻击方法之一,它结合了梯度搜索和离散替换。它利用梯度找到那些“最可能导致模型乱说话”的 Token 位置,然后把这些位置的词替换掉。。GCG 在 2023 年被提出来时(论文 Universal and Transferable Adversarial Attacks on Aligned Language Models ),引起了巨大的轰动,因为它证明了两个可怕的事实:
- 通用性 (Universal) :它找到的那串乱码(Suffix),不仅仅对“制造炸弹”有效,对“偷窃信用卡”、“写勒索信”都有效。它就像一把万能钥匙。
- 可迁移性 (Transferable) :最可怕的是,你在开源模型(如 LLaMA)上算出来的这串攻击代码,直接拿去喂给闭源模型(如 ChatGPT、Claude、Bard),竟然也经常有效!这意味着攻击者不需要知道 ChatGPT 的参数,就能隔空攻击它。
AutoDAN
RepE, Activation Steering
这是最高级的白盒攻击,属于“脑科手术”级别。
- 核心逻辑 : 现在的攻击者发现,与其费劲改输入(Prompt),不如直接改模型 思考过程中的中间状态 。
- 攻击者会在模型推理时,找到代表“拒绝/Refusal”的神经元激活方向。
- 操作 :在推理时,强制把这个方向的数值 减去 (或者加上一个“顺从/Compliance”向量)。
- 为什么火 : 降维打击 。只要你有模型权重(白盒),这种防御几乎无法被 Prompt层面的防御手段(如系统提示词)拦截,因为你直接修改了模型的“潜意识”。
损失函数工程
不仅仅是让模型认错,还要让它按你指定的方式认错(比如把“猫”认成“面包”)。
无定向攻击
让 \(\text{CrossEntropy}\) 变大,顺着梯度让模型“变瞎”。
定向共计(改变含义)
让 \(\mathcal{L}_{target}\)(比如“狗”)变小,精准地把像素往“狗”的特征空间挪动。
多模态注入
\(\mathcal{L}_{desc}\) + \(\mathcal{L}_{inj}\),平衡两个力量:一边维持原义,一边注入坏指令。
迁移性
我们用PGD攻击A模型成功后,能否继续欺骗B模型?
FOA / 动量项 / 图像变换……
黑盒攻击
黑盒攻击(Black-box Attack)中,攻击者无法访问目标模型的内部参数和梯度,只能通过观察模型的输入输出行为来发动攻击。根据可获得的信息类型,黑盒攻击主要分为三类。
基于替代模型的攻击(Surrogate Model / Transfer-based Attack)
核心思路: 既然无法访问目标模型,就训练一个功能近似的"替代模型"(Surrogate Model),然后对替代模型实施白盒攻击,再将生成的对抗样本迁移到目标模型上。
Papernot 的 Jacobian 数据集增强方法(JBDA): Papernot 等人提出了一种系统化训练替代模型的流程:
- 从少量初始查询样本出发,向目标模型查询标签,构建初始训练集。
- 在此数据集上训练替代模型 \(\hat{F}\)。
- 利用替代模型的雅可比矩阵(Jacobian Matrix)\(J_{\hat{F}}(x)\) 确定最敏感的输入方向,进行数据增强(Dataset Augmentation):生成新的合成样本 \(x' = x + \lambda \cdot \text{sign}(J_{\hat{F}}(x))\)。
- 向目标模型查询新样本的标签,加入训练集,迭代重复上述步骤。
最终对替代模型 \(\hat{F}\) 实施 FGSM 或 PGD 等白盒攻击,所得对抗样本往往能成功迁移攻击目标黑盒模型。
可迁移性(Transferability): 不同模型若在相似数据上训练,往往会学习到相似的决策边界,导致在一个模型上生成的对抗样本对另一个模型也有效。提升迁移性的常用技巧包括:使用集成模型(Ensemble)生成攻击、引入动量项(Momentum)、以及随机输入变换(Input Diversity)等。
基于查询的攻击(Query-based Attack)
攻击者通过反复向目标模型提交查询并观察输出来估计梯度,进而生成对抗样本。根据可获取的输出信息粒度,又细分为两类:
基于分数的攻击(Score-based Attack): 目标模型返回完整的概率向量(Softmax 输出)。攻击者可以利用有限差分法(Finite Differences)或自然进化策略(Natural Evolution Strategy, NES)来估计梯度:
其中 \(u_i\) 为随机采样方向,\(\sigma\) 为平滑参数。代表方法有 ZOO(Zeroth Order Optimization)。
基于决策的攻击(Decision-based Attack): 目标模型仅返回最终预测标签(硬标签,Hard Label),信息量最少,也最贴近真实部署场景。代表方法有 Boundary Attack:从一个已经是对抗样本的点出发,沿决策边界游走,在保持攻击成功的同时,逐步减小与原始图像的距离。以及 HopSkipJump Attack,通过估计决策边界处的梯度方向来加速搜索。
对抗防御(Adversarial Defense)
对抗训练(Adversarial Training)
对抗训练是目前公认的最有效的对抗防御方法,其核心思想是:在训练过程中动态生成对抗样本并将其加入训练集,迫使模型学习对扰动鲁棒的特征表示。
Min-max 目标函数:
外层最小化(Min)对应正常的模型训练,优化参数 \(\theta\);内层最大化(Max)对应攻击者的视角,在 \(L_p\) 范数约束 \(\|\epsilon\|_p \leq \sigma\) 下寻找使损失最大的扰动 \(\epsilon\)。这构成一个双人博弈(Two-player Game):攻击者与防御者在训练过程中相互对抗,共同演化。
与梯度正则化的等价性: 可以证明,对抗训练在线性近似下等价于对梯度范数施加正则化:
其中 \(p^*\) 为 \(p\) 的对偶范数(满足 \(\frac{1}{p} + \frac{1}{p^*} = 1\))。这意味着对抗训练在平滑损失函数的梯度,使决策边界更加平坦。
主要缺陷: 对抗训练存在精度-鲁棒性权衡(Accuracy-Robustness Tradeoff)——提升对对抗样本的鲁棒性,通常会导致在干净样本(Clean Examples)上的标准精度有所下降。此外,对抗训练的计算开销显著高于标准训练(需要在每个 batch 内运行多步 PGD 攻击)。
防御蒸馏(Defensive Distillation)
Papernot 等人于 2016 年在 IEEE S&P 上提出防御蒸馏(Defensive Distillation),通过知识蒸馏技术平滑模型的决策面,以抵抗对抗攻击。
训练流程:
- 在温度参数 \(T > 1\) 下训练初始分类网络 \(F\)(高温 Softmax 产生更平滑的概率分布)。
- 使用 \(F\) 对训练集 \(X\) 生成软标签(Soft Labels)\(F(X)\),这些软标签包含类间相似性信息。
- 在相同温度 \(T\) 下,使用软标签 \(F(X)\) 训练蒸馏网络 \(F^d\)。
防御原理: 软标签训练使得 \(F^d\) 的输出概率分布更加平滑,梯度幅值更小,从而使基于梯度的攻击(如 FGSM)难以找到有效的扰动方向。直观上,模型的决策面变得更加"光滑",减少了尖锐的决策边界。
局限性: 防御蒸馏后来被 Carlini 和 Wagner 的 C&W 攻击彻底破解——C&W 攻击专门针对 Softmax 层设计了新的损失函数,绕过了温度缩放带来的梯度消失问题。这说明依赖模糊梯度(Gradient Obfuscation)的防御本质上是脆弱的。
Defense-GAN(ICLR 2018)
Defense-GAN 利用生成对抗网络(GAN)的生成器将输入样本投影到模型学习到的数据流形(Manifold)上,以去除对抗扰动。
核心思路: 对抗扰动将输入推离了真实数据流形,而 GAN 的生成器 \(G(z)\) 恰好能够描述这个流形。因此,若能将输入"投影"回流形,扰动自然被消除。
算法流程: 给定输入(可能被污染的)图像 \(x\),求解以下优化问题:
使用 \(R\) 个随机初始化点,各自进行 \(L\) 步梯度下降(Gradient Descent),最终取距离最小的 \(z^*\),将"清洁后"的图像 \(G(z^*)\) 送入分类器进行预测。
局限性: 优化过程计算开销大;\(L\) 和 \(R\) 的选取影响防御效果与推理速度的权衡;强自适应攻击(Adaptive Attack)可以将整个 Defense-GAN 流程纳入攻击目标。
特征压缩(Feature Squeezing)
特征压缩(Feature Squeezing)通过对输入施加多种变换("压缩器")来消除可能的对抗扰动,并通过比较原始输入与压缩后输入的预测结果来检测对抗样本。
常用压缩操作:
- 位深度缩减(Bit-depth Reduction): 将像素值从 8 位量化为更低位(如 4 位或 2 位),粗化特征空间,消除精细的对抗扰动。
- 空间平滑(Spatial Smoothing): 对图像施加中值滤波(Median Smoothing)或高斯模糊,消除局部像素级扰动。
检测机制: 若原始输入 \(x\) 与压缩后输入 \(\tilde{x}\) 的模型预测结果差异超过阈值,则判定 \(x\) 为对抗样本并拒绝。
优点: 无需修改模型,作为预处理层即插即用,计算开销小。局限性: 对自适应攻击(Adaptive Attack,攻击者知道压缩器存在)防御效果大幅下降。
对抗样本检测(Adversarial Example Detection)
与其修正对抗样本,另一种防御思路是检测出对抗样本并予以拒绝,让系统拒绝服务而不是做出错误预测。
朴素方法: 训练一个二分类器,用于区分原始(正常)样本与对抗样本。输入特征可以是原始像素、中间层激活值或统计特征(如局部像素方差)。
主要问题:
- 检测器本身可被攻击: 攻击者可以将检测器也纳入攻击目标,生成能同时欺骗分类器和检测器的对抗样本(即自适应攻击)。这是一个"猫鼠游戏"——检测器的引入只是增加了攻击者的成本,并不能从根本上解决问题。
- 高计算开销: 对每一个输入都运行检测器,在实时系统中引入了显著的推理延迟。
- 泛化性差: 在已知攻击类型上训练的检测器,对未知攻击类型(Out-of-distribution Attacks)的检测效果通常较差。
更成熟的检测方法: 基于统计检验(如核密度估计、Mahalanobis 距离)在特征空间中检测分布偏移,或利用模型不确定性(如 MC Dropout)来识别对抗样本。