在一座古老王国的藏书阁里,供奉着一张会呼吸的藏宝图。守卫它的“AI 神谕”能根据图上的每道纹理说出宝藏的位置,千百年来从未出错。直到有一天,一个调皮的魔法师发现了一个秘密:只要在图上撒一层薄薄的魔法尘埃,神谕就会用高得吓人的自信,说出完全相反的答案。尘埃薄到人眼根本看不出变化,地图看起来一切如常,可神谕却像中了邪。这层神秘的尘埃,就是计算机视觉里大名鼎鼎的“对抗样本”。本文将带你走进这个魔法实验室,认识三种最经典的撒尘手法——FGSM 的一记直拳、PGD 的步步为营、C&W 的精妙算计,再看看守方如何给神谕穿上铠甲。
掌握 FGSM、PGD、C&W 三类经典梯度攻击,是 AI 安全从业者的入门必修课。理解它们的原理,你才能在模型上线前找到那些“一眼看不见”的漏洞,真正提升 AI 系统的可信度。
目录
可视化演示
展示三种经典梯度攻击算法在决策空间中的扰动轨迹:FGSM单步符号梯度、PGD多步投影迭代、C&W优化最小扰动,对比攻击效率与精度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
FGSM快速梯度符号法 原始样本x位于正确分类区域 沿损失函数梯度符号方向单步扰动 x\' = x + ε·sign(∇L(x,y)) 单步攻击速度快但扰动幅度固定为ε
对抗样本:让神谕看错的魔法尘埃
魔法师第一次成功时,自己都吓了一跳。他只在藏宝图右上方撒了一小撮会发光的粉末,那粉末细得像晨雾,肉眼几乎分辨不出。可神谕原本还念叨着“宝藏藏在北边第三棵橡树下”,话音刚落就改口说:“不,那里埋的是毒药!”地图明明没有任何肉眼可见的变化。这个让神谕瞬间“变脸”的输入,就是对抗样本。
平时我们训练模型,是把数据喂给它,让它学出规律;而对抗攻击恰恰反过来——既然梯度能告诉我们“输入怎么改动会让损失变大”,那攻击者就顺着这个信息,在输入上叠加一个精心设计的小扰动 δ。
原始输入 x 加上扰动 δ,得到对抗样本 xadv。为了不被人类发现,δ 的大小必须受到约束,ε 就是这个“预算上限”;在预算内,攻击者希望模型输出从真实标签 y 变成别的标签。
就像那撮晨雾似的尘埃,对抗样本的精髓从来不是把地图涂改得面目全非,而是用最小、最隐蔽的改动,精准撬动神谕的判断。理解了这份“隐蔽性”,你就能明白 FGSM、PGD、C&W 都在围绕“如何花最少的尘埃、达到最大的欺骗”做文章。
- 原始输入 x藏宝图的原始样貌,例如一张 224×224 的彩色图片,每个像素都是一个输入维度。
- 扰动 δ魔法尘埃,攻击者在 x 上叠加的微小改动,是所有攻击算法的核心变量。
- 范数约束要求尘埃“薄到看不见”,p=2 对应欧氏距离,p=∞ 对应最大像素改动量。
- 欺骗条件攻击成功后,模型给出的标签与真实标签 y 不再一致,神谕终于“看走眼”。
威胁建模:先摸清神谕的底牌
想撒好尘埃,魔法师得先回答一个问题:我能偷看到神谕的多少秘密?如果他溜进藏书阁,翻开神谕的魔法书,看到它记录着对每道纹理的看法(权重)和思考的敏感方向(梯度),那他就拥有“全知视角”——这对应攻击里的白盒攻击。
如果他进不了藏书阁,只能站在门外一遍遍提问,根据回答反推神谕的脾气,那就是黑盒攻击。真实世界的大多数攻击介于两者之间:攻击者可能拿到了模型结构和权重(白盒),也可能只能调 API 看输出(黑盒),还可能靠“迁移性”——先偷建一个替身模型造对抗样本,再去骗目标模型。
威胁建模还要定义攻击目标:是“只要让神谕说错就行”(非定向攻击),还是“必须让神谕说成某个特定答案”(定向攻击)?攻击者的能力假设,直接决定了评估结果的严谨程度。
摸清底牌,才能选对撒尘手法。如果只拿着 FGSM 这把直拳去面对一个需要精确定向的难题,就像蒙着眼乱撒尘埃,多半要扑空。所以威胁建模永远是攻防的第一课。
- 损失函数 J衡量神谕对当前输入的“困惑程度”,值越大表示越容易被骗出错。
- 对抗输入 x+δ撒过尘埃后的藏宝图,是攻击者与模型博弈的“战场”。
- 预算约束扰动大小不能超出 ε,否则人类一眼就会看穿。
- 最大化 max攻击者在预算内寻找让损失最大的方向,这就是“顺着敏感方向撒尘”的数学写法。
FGSM:一记直拳的快速攻击
在三种手法里,FGSM 是最“莽撞”的一位。急性子魔法师根本不想精打细算:既然神谕的魔法书揭示了它最敏感的方向,那只需朝着这个方向,把整袋尘埃一次撒出去,一步到位。
FGSM 的全称是 Fast Gradient Sign Method(快速梯度符号法),由 Goodfellow 等人在 2014 年提出。它先计算损失函数对输入 x 的梯度 ∇ₓJ(θ,x,y),再对梯度取符号、乘上扰动幅度 ε,一次性叠加到原图上。整个过程只需一次前向传播和一次反向传播,快得惊人。
FGSM 的优点是快:一次计算即可生成对抗样本,几乎不增加部署成本。缺点也很明显——单步决策太“莽”,就像一拳打过去方向稍有偏差就会落空,生成的样本往往不是最优的,攻击力也有限。但 FGSM 是打开这扇门的第一把钥匙,它让整个领域第一次看到“人眼无感、模型崩溃”的可能性;后来的 PGD 和 C&W,本质上都在弥补它“一步不够准”的遗憾。
- 原始输入 x藏宝图原来的样子,也是攻击的起点。
- 损失函数 J神谕在这个输入上的“困惑程度”。
- 梯度运算 ∇ₓ对图上每个像素求偏导,得到神谕最敏感的方向,白盒攻击能读到它。
- 符号函数 sign把梯度压成 ±1,保证每个像素得到均匀而隐蔽的小扰动。
- 扰动幅度 ε魔法尘埃的预算,ε 越大攻击越强,但被人类发现的概率也越高。
PGD:步步为营的迭代围攻
老练的魔法师摇了摇头:一拳打太猛容易打偏,聪明人应该一小把、一小把地撒。每撒一点,就假装漫不经心地观察神谕的反应,顺着最新暴露的敏感方向,再撒一小把,如此反复,直到神谕终于动摇。
PGD(Projected Gradient Descent,投影梯度下降)把 FGSM 的“一拳”拆解成很多小步。每一步都沿着当前对抗样本 xᵗ 的梯度符号方向前进一个小步长 α,然后执行一次投影操作,把超出预算圈的部分“按回去”,确保扰动始终满足 ‖δ‖ ≤ ε。它还可以用随机初始化的方式在球内挑一个起点,避免陷入局部最优。
和 FGSM 的直拳相比,PGD 更像一场耐心的心理战:每次只越界一点点,但方向永远校准到最新、最准。神谕可以挡住一次猛冲,却很难挡住几十次小步的持续逼近——这也是 Madry 等人 2017 年把它确立为鲁棒性评估基准攻击的原因。
- 第 t 步样本 xᵗ迭代过程中的当前对抗样本,每步都在更新。
- 迭代方向在 xᵗ 处重新计算梯度符号,对应魔法师“撒一点、看一眼、再调整”。
- 步长 α每次撒出的小把尘埃量,控制每一步的推进速度。
- 投影 Clip把超出 ε 预算的改动裁回球内,保证全程隐蔽。
C&W:大师级的最小扰动
王国里还有两位炼金术大师,Carlini 和 Wagner。他们觉得 FGSM 太粗、PGD 太费,真正的高手应该用最少的尘埃,刚刚好让神谕说错。于是他们把“攻击”变成了一道优化题:在保证欺骗成功的前提下,让扰动尽可能小。
C&W 攻击把目标写成一个可微的优化问题:最小化扰动范数与“欺骗损失” c·f(x+δ) 的加权和。其中 f 是这样设计的:当神谕被成功误导时 f 为负,否则为正。这样一来,优化器会同时追求“扰动小”和“让神谕出错”两个目标。
f 中的 κ 参数用来控制“要让神谕错得多离谱”:κ 越大,攻击者要求神谕以更高的置信度输出错误答案,生成的扰动通常也越大。C&W 支持 L0、L2、L∞ 三种距离度量,以极小的扰动实现了极高的攻击成功率,曾一度击败当时几乎所有已发表的防御方法。
如果说 PGD 是“打到你服”,C&W 就是“轻轻一推,刚好让你站不稳”。它给整个领域带来一个重要提醒:判断攻击强不强,不能只看成功率,还要看它牺牲了多少隐蔽性。
- 扰动范数 ‖δ‖ₚ尘埃总量的量化指标,越小代表攻击越隐蔽。
- 欺骗函数 f神谕误判时为负、判对时为正,是优化器眼中的“欺骗进度条”。
- 权衡常数 c在“扰动小”和“让神谕出错”之间找平衡的旋钮。
- 边际函数利用模型的 logits 输出 Z 构造,即使“差一点犯错”也能被梯度优化到。
- 置信参数 κ要求神谕犯错时的最低信心,越大攻击越“狠”,扰动也越大。
鲁棒评估与防御:给神谕穿上铠甲
王国被魔法师们折腾得够呛,决定给神谕加训练。方法听起来很朴素:既然你最怕 PGD 这种招数,那我就在训练时一遍遍把这些招数演示给你看,让你见得多了,自然就不怕了。这就是对抗训练(Adversarial Training)。
数学上,对抗训练是一个 min-max 问题:内层的 max 模拟魔法师在预算内寻找最强攻击,外层的 min 让神谕在这种最强攻击下依然尽量答对。每一项的梯度都来自“最坏情况”的样本,神谕被逼着学会忽略那些肉眼不可察的尘埃。
但铠甲并非万能。对抗训练通常只对训练时见过的攻击类型和预算强度有效,遇到更强的攻击仍可能被穿透;它常常以牺牲干净样本上的准确率为代价,出现“鲁棒性-准确率”权衡;有些防御还会陷入“梯度遮蔽”的假象——看似鲁棒,换个攻击方式就原形毕露。城堡的安全从来不靠一件铠甲,而是靠持续的红队演练。FGSM、PGD、C&W 正是这场演练中最经典的三套招式:先像懒魔法师一样快速试探,再像耐心魔法师一样步步紧逼,最后像炼金大师一样精确算计。
- 内层 max模拟魔法师在预算内找到最强攻击,相当于一场“红队演习”。
- 外层 min让模型参数 θ 在最坏情况下损失最小,相当于给神谕加训。
- 求和平均对训练集里的每一个样本都做同样的加固,不留死角。
AI 应用场景
自动驾驶感知系统的红队测试
阶段:模型评估与安全测试
解决的问题:传统测试只用干净样本评估准确率,很难发现“贴张贴纸就让 STOP 变限速”的隐患。用 PGD 在感知模型的输入上生成对抗样本,可以在上线前暴露脆弱点,就像让魔法师提前演练一遍撒尘绝技。
具体案例:某自动驾驶团队用 PGD 对交通标志分类器做压力测试,发现给“STOP“标志叠加一层视觉上几乎无感的扰动后,模型以 0.99 的置信度输出”限速 60”。他们把这类对抗样本加入训练集后,该风险显著下降。
金融风控模型的欺骗性评估
阶段:模型上线前的鲁棒性验证
解决的问题:欺诈分子会刻意优化申请特征来绕过风控。用白盒 FGSM 在输入特征上模拟恶意扰动,可以提前算出模型的“脆弱边界”,判断哪些维度一碰就倒。
具体案例:风控团队用 FGSM 在贷款评分模型的输入特征上叠加符号梯度扰动,发现个别特征组合只改动约 5% 的数值就会被误判为优质客户,于是针对这些敏感维度增设了人工复核规则。
人脸识别支付的攻击审计
阶段:安全合规审计
解决的问题:C&W 这类“最小扰动”攻击让安全团队警惕“对抗眼镜框”等物理攻击的可能性,需要精确评估活体检测的置信边界,而不是只凭肉眼判断攻击是否可行。
具体案例:安全团队用 C&W 的 L2 版本在离线人脸模型上生成最小扰动样本,验证了攻击者可以用极小面积的打印图案干扰身份核验,据此升级了活体检测策略与兜底规则。
Python 演示
import numpy as np def make_data(n=200, seed=7): rng = np.random.default_rng(seed) X = rng.normal(size=(n, 2)) y = np.where(X[:, 0] + X[:, 1] > 0, 1, -1) return X, y def train(X, y, iters=400, lr=0.3): w = np.zeros(2) b = 0.0 for _ in range(iters): z = X @ w + b d = -y / (1 + np.exp(y * z)) w -= lr * (X.T @ d) / len(y) b -= lr * d.mean() return w, b def predict(w, b, X): return np.where(X @ w + b > 0, 1, -1) def grad_x(w, b, x, y): z = x @ w + b return -y * w / (1 + np.exp(y * z)) def fgsm_attack(w, b, x, y, eps=0.5): return x + eps * np.sign(grad_x(w, b, x, y)) def pgd_attack(w, b, x, y, eps=0.5, alpha=0.1, steps=10): adv = x.copy() for _ in range(steps): adv = adv + alpha * np.sign(grad_x(w, b, adv, y)) adv = x + np.clip(adv - x, -eps, eps) return adv def main(): X, y = make_data() w, b = train(X, y) acc = (predict(w, b, X) == y).mean() print("clean accuracy: %.3f" % acc) for i in range(5): x, label = X[i], y[i] x_f = fgsm_attack(w, b, x, label, eps=0.5) x_p = pgd_attack(w, b, x, label, eps=0.5) print("sample%d true=%d clean=%d fgsm=%d pgd=%d" % ( i, label, predict(w, b, x[None, :])[0], predict(w, b, x_f[None, :])[0], predict(w, b, x_p[None, :])[0])) if __name__ == "__main__": main()
d = -y / (1 + np.exp(y * z))交叉熵损失对 logit 的导数,是训练与攻击共用的梯度源头。w -= lr * (X.T @ d) / len(y)沿梯度反方向更新权重,让模型在干净数据上越学越准。return -y * w / (1 + np.exp(y * z))链式法则把“对 logit 的敏感度”传导到输入像素,得到输入梯度。return x + eps * np.sign(grad_x(w, b, x, y))FGSM 核心一行:只保留梯度方向并乘上预算 ε。adv = adv + alpha * np.sign(grad_x(w, b, adv, y))PGD 每步都在最新对抗样本上重算梯度,再沿梯度符号前进 α。adv = x + np.clip(adv - x, -eps, eps)投影操作:把累计扰动裁回 ε 球内,保证不超预算。
常见误区
误区看到模型被一个小扰动骗过,初学者第一反应是“模型背得太死、没学到真正的规律,所以才会被这种小把戏骗到”。
正解真正的原因恰恰相反——正是模型在高维空间里的“线性”特征被利用了。高维空间中,一个方向上微不足道的移动经过累积,就能让输出大幅改变。一个测试集上表现很好的模型同样会被攻击。就像神谕并不是“没读明白地图”,而是地图的某些维度太容易被尘埃撬动。
为何常见:人眼把图片理解为“整体含义”,而模型按“像素数值”工作,直觉上很难接受“几乎没变”的输入会导致截然不同的输出。
误区很多人以为对抗样本就是把图片改得面目全非,像打了马赛克一样明显,否则怎么会让模型认错?
正解经典算法的目标恰恰相反。FGSM 在 ε 较小时改动只有几个灰度级,C&W 更是显式地把“最小扰动”写进优化目标,人眼几乎无法区分原图与对抗样本,模型却会高置信地犯错。
为何常见:生活经验里“彻底改头换面”才叫欺骗,人们难以想象精致的欺骗只需要极其微小的变化。
误区从公式看,PGD 不就是把 FGSM 多跑几遍吗?多跑几遍效果应该差不了太多,没必要严格区分。
正解关键区别在于,PGD 每一步都基于“当前最新的对抗样本”重新计算梯度,并做投影修正。单步 FGSM 常常“走过头”或“方向带偏”,而 PGD 不断校准方向,能在同一预算下找到强得多的对抗样本。就像蒙眼走直线和睁眼调方向,准确性完全不同。
为何常见:只看到“循环调用 FGSM”的表象,忽略了“重新算梯度”和“投影”这两个灵魂步骤。
误区给模型做过对抗训练之后,它应该对所有对抗样本都免疫了,可以高枕无忧地部署上线。
正解对抗训练只对训练时见过的攻击类型和预算强度有效,更强的攻击或新方法仍可能穿透;同时它通常以降低干净样本准确率为代价,是“防御与性能”的权衡。安全本质上是一场持续的攻防博弈。
为何常见:把防御理解成打疫苗可以终身免疫,忽略了攻防双方都在持续进化这一事实。
面试题
Q1. FGSM 生成对抗样本的第一步核心计算是?
- A.对损失求关于输入的梯度← 正确答案
- B.对损失求关于权重的梯度
- C.对图片做数据增强处理
- D.对图片做白化归一化
答案:A。FGSM 的第一步是计算损失 J 对输入 x 的梯度,找到让损失增大的方向;对权重求梯度是普通训练该做的事,数据增强和白化属于数据处理,与攻击无关。就像魔法师要先找到神谕最敏感的方向,才能把尘埃撒准。
Q2. FGSM 中的符号函数 sign 起什么作用?
- A.把梯度变成统一方向箭头← 正确答案
- B.把梯度数值放大一百倍
- C.把梯度清零以减少噪声
- D.把梯度转成概率分布
答案:A。sign 将梯度每个维度归一为 +1 或 -1,只保留方向信息,使每个像素获得均匀的小扰动;放大、清零、转分布都不是符号函数的作用。相当于撒尘埃时不偏袒任何一边,均匀而有力。
Q3. PGD 中投影 Clip 操作的关键目的?
- A.让扰动留在预算范围里← 正确答案
- B.让梯度变化更加平滑
- C.让模型输出更加稳定
- D.让图片分辨率更高
答案:A。投影把每一轮迭代后的扰动裁回 ε 球内,确保总扰动不超预算;平滑梯度、稳定输出和提升分辨率都不是投影的直接目的。这相当于给魔法师的每把尘埃都套上一个圈,不许撒冒。
Q4. 白盒攻击与黑盒攻击的根本差异?
- A.是否知道模型内部结构← 正确答案
- B.是否使用更大的数据集
- C.是否在云端进行推理
- D.是否生成高维对抗样本
答案:A。白盒攻击能读到梯度、权重等内部信息,黑盒攻击只能拿到输入输出。数据集大小、云端推理、样本维度都不是两者本质差异。类比:能否偷看神谕的魔法书,决定了你是全知还是盲猜。
Q5. C&W 攻击框架的优化目标是什么?
- A.在最小扰动下让模型出错← 正确答案
- B.在最大扰动下让模型出错
- C.在不改变输出的前提下加速
- D.在保持输出不变时降维
答案:A。C&W 的目标函数同时最小化扰动范数和欺骗损失,追求“少撒尘埃也能让神谕改口”;B 把方向搞反了,C 和 D 与攻击目标无关。这正是它区别于 FGSM、PGD 的最大特色。
Q6. 对抗样本中扰动幅度 epsilon 的含义?
- A.允许修改像素的最大量← 正确答案
- B.模型训练的步长大小
- C.图片压缩的质量参数
- D.损失函数的温度参数
答案:A。ε 是扰动预算,决定每个像素上允许叠加的改动上限;学习率是训练步长,质量参数与温度参数分属其他语境。就像给魔法师的尘埃袋划了上限,超过就会穿帮。
Q7. PGD 为什么通常比 FGSM 的攻击效果更强?
- A.多步迭代并不断修正方向← 正确答案
- B.使用了更大的扰动幅度
- C.攻击时不需要损失函数
- D.会把像素值全部置为零
答案:A。PGD 每步都在当前位置重算梯度,方向不断修正,能更准确地逼近最强扰动,因此在同一预算下也常常强于 FGSM;“更大扰动”不是必要条件,预算相同时 PGD 依然更优,C、D 更是明显错误。
Q8. 对抗样本常用的实际威胁场景包括?
- A.自动驾驶识别路牌出错← 正确答案
- B.人脸支付身份验证失效← 正确答案
- C.语音助手执行恶意指令← 正确答案
- D.数据库查询速度变慢
答案:ABC。感知系统是对抗样本的重灾区——视觉(路牌、人脸)、语音(恶意指令)都可能被微小扰动欺骗;数据库查询变慢属于性能问题,不属于对抗样本的威胁范畴。
Q9. 关于 C&W 攻击的描述正确的有哪些?
- A.采用优化框架搜索最小扰动← 正确答案
- B.支持 L2 等多种距离度量← 正确答案
- C.攻击速度一定快于 FGSM
- D.扰动幅度一定大于 PGD
答案:AB。C&W 把攻击建模为可微优化问题并支持多种范数度量;FGSM 单步极快,C&W 每个样本都要跑优化,速度通常更慢;C&W 的卖点是扰动更小而非更大,故 C、D 错误。
Q10. 对抗训练作为防御手段的权衡有哪些?
- A.提升鲁棒性可能降低准确率← 正确答案
- B.只针对已知攻击类型有效← 正确答案
- C.能够完全消除全部对抗样本
- D.无需调整超参数即可生效
答案:AB。对抗训练让模型在“见过的最强攻击”下变强,但常以牺牲干净样本准确率为代价,且对未见过的攻击方式未必有效;完全免疫和免调参都是不现实的幻想。安全防线需要在鲁棒性、准确率和成本之间反复权衡。