想象一间神秘的考场:阅卷老师是一台不知疲倦的神经网络,批改“猫咪照片识别卷”又快又准。班里有个学生悄悄发现了一个天大的秘密——只要在答卷上轻轻擦掉一小块淡墨,肉眼完全察觉不到,老师居然会把“熊猫”自信地判成“长臂猿”,还给了满分。更邪门的是,这套“涂改手法”换个阅卷老师照样奏效。 这个秘密就是“对抗样本”(adversarial example),那一笔“涂改”叫扰动(perturbation)。怎么知道该往哪儿涂?答案藏在阅卷老师的“批注”里——损失函数的梯度。FGSM(Fast Gradient Sign Method,快速梯度符号法)正是把“批注”读出来、只取方向、轻轻一涂的作弊利器。它简单到只需一行公式,却是整个对抗攻防领域的基石:自动驾驶路牌被“贴纸”骗过、人脸识别被“眼镜框”绕开,背后都有它的影子。 接下来,我们会从数学公式到梯度计算,从定向攻击到模型迁移性,一步步拆解 FGSM,最后学会用它给自己的模型做一次“鲁棒性体检”。
对 AI 从业者而言,FGSM 是理解模型鲁棒性的第一把钥匙——用它能快速生成对抗样本、评估模型防御水平,这是 AI 安全工程师的日常工作,也让算法工程师在设计系统时多一根“攻击者视角”的弦。
可视化演示
展示FGSM梯度符号法扰动原理、epsilon超参数权衡、targeted/non-targeted攻击变体、迁移性与迭代攻击演进,交互式理解对抗样本生成核心技术。
本节配有交互动效(进入视口后自动加载,约 3KB)。
FGSM梯度符号法扰动原理 沿损失函数梯度方向添加扰动,使模型损失最大化 取梯度符号乘以epsilon,单步反向传播完成 x_adv = x + ε · sign(∇_x L(θ,x,y)) FGSM是对抗攻击最基础快速的方法。
对抗样本概念
说回那间考场。作弊学生发现,自己只是把“熊猫”照片里某一小格像素的亮度调暗了一丝丝——就像在答卷上擦掉一点墨迹——阅卷老师就尖叫着宣布这是“长臂猿”。更气人的是,老师不是蒙对的,它信心十足地给出了 99.7% 的正确概率。学生恍然大悟:原来机器的“眼睛”和人眼完全不一样。
在深度学习里,这种“人眼看不出区别,模型却认错且自信爆棚”的输入,就叫对抗样本。它有三个标志性特征:第一,扰动小到人眼不可察觉;第二,模型以高置信度输出错误答案;第三,同一个样本常常能骗过多个不同模型,这种性质叫迁移性。
为什么模型这么好骗?因为深度模型学到的决策边界在高维空间中紧贴着训练数据——边界外一点点就是另一个类别的地盘。只要让输入朝“损失增大”的方向挪动一小步,就可能翻越边界。对抗样本不是玄学,而是一个可以精确计算出来的产物:沿着梯度方向移动输入,模型就会一步步滑向错误的深渊。
所以,作弊学生从不瞎涂——他每次都研究阅卷老师的评分标准(损失函数),顺着“扣分最狠”的方向涂改。FGSM 就是那本把“评分标准”翻译成“涂改方向”的作弊手册。
FGSM数学原理
作弊学生要涂改成功,第一步是搞清楚“往哪个方向涂”。他发现阅卷老师批改时会留下淡淡的批注痕迹——这张卷子往右下角改一点点,分数就会暴跌。这个“批注”就是损失函数对输入的梯度:它精确指出了能让模型犯错最快的那条路。
FGSM 的全称是 Fast Gradient Sign Method(快速梯度符号法),它把“批注”浓缩成一个简洁公式:对抗样本等于原始输入加上一小段“顺着批注方向”的涂改。式子里的每一项都对应着作弊流程中的一个动作。
有了这个公式,作弊学生只需两件事:读批注(算一次梯度),擦一笔(叠加 $\epsilon \cdot \mathrm{sign}$)。FGSM 之所以叫“快速”,正是因为从读懂批注到下笔,只需要一次前向和一次反向传播——快到老师都没反应过来。
- 对抗样本(涂改后的答卷)$x_{\text{adv}}$ 是最终产物,它和原始输入 $x$ 看起来几乎一样,但模型的预测已经被彻底改写。
- 原始输入(干净的答卷)$x$ 是模型原本能正确识别的样本,比如一张真实的熊猫照片。
- 扰动预算(橡皮擦的力度上限)$\epsilon$ 是超参数,控制涂改幅度——太大容易被肉眼发现,太小则攻击无效。
- 符号函数(只认方向不认大小)$\mathrm{sign}(\cdot)$ 把梯度每个分量压成 $+1$ 或 $-1$,丢掉“改多少”,只保留“往哪儿改”。
- 输入梯度(老师的批注)$\nabla_x J(\theta, x, y)$ 是损失对输入 $x$ 的偏导,指出“往哪个方向改输入,模型会错得更离谱”。
梯度计算流程
学生好奇:老师是怎么算出“往右下角改会扣分”的?原来阅卷流水线先正着读一遍卷子(前向传播),得到总分(损失值),再从总分倒推回来(反向传播),看答卷上每一笔对分数的影响。这条“从分数倒推笔迹”的路径,就是梯度的来历。
在神经网络里,损失 $J$ 是输入 $x$ 和权重 $\theta$ 共同作用的结果。要想知道“输入该怎么改”,就得从输出层一路向输入层做链式求导——每一步都问同一个问题:如果这一层的小齿轮转了一点,最终损失会变多少?
实际工程中,对 softmax 分类器来说这个梯度可写成简洁的矩阵形式:$\nabla_x J = (\mathbf{p} - \mathbf{y}_{\text{onehot}}) \cdot W^{\top}$。整个攻击过程只做一次前向加一次反向,模型参数 $\theta$ 完全冻结——我们不训练模型,只“调教”输入。这个“一次到位”的特性,正是 FGSM 能大规模批量生成对抗样本的原因。
- 中间输出(齿轮的传动比)$z_j$ 是样本经过各层加权后的中间结果,它是连接输入 $x$ 与损失 $J$ 的“中间人”。
- 损失对中间输出求导(责任的划分)$\frac{\partial J}{\partial z_j}$ 衡量每个中间输出对最终损失该负多大责任,按 softmax 交叉熵可化简为“预测概率减独热标签”。
- 中间输出对输入求导(齿轮咬合关系)对于线性层,这一项恰是权重矩阵元素 $w_{ij}$——输入改变一单位,中间输出改变多少。
- 链式相乘并求和(逐层回传)把所有层的偏导链式相乘、逐项加总,就得到损失对输入的梯度——也就是那条“批注方向”。
攻击类型变体
有些学生作弊只求“别及格”,涂改随意——只要老师判错就行,这叫非定向攻击。而另一些学生要求精准:必须把“熊猫”改成“长臂猿”,多改一个字都不算,这叫定向攻击。
非定向攻击直接用交叉熵损失 $J(\theta, x, y)$,让真实类别 $y$ 的损失变大,因此沿梯度的正方向加扰动,这就是我们前面看到的公式。而定向攻击要求模型把样本判成指定类别 $y_t$——此时要让“目标类别的损失”变小,方向就得反过来:
除了方向的不同,还有步数的区别。单步 FGSM 追求快,但一步走不准:走多了破坏图像,走少了翻不过边界。迭代式 FGSM(I-FGSM)把总预算 $\epsilon$ 拆成很多小步 $\alpha$,每走一步都重新看一眼批注:
无论哪种变体,本质都是“顺着评分标准下笔”:非定向随手一涂,定向照着目标答案临摹,迭代则是小步多涂、步步校准。
- 小步长(每次只涂一点点)$\alpha$ 通常远小于 $\epsilon$,每一步的移动都很克制,方便随时修正方向。
- 迭代更新(涂一笔看一次批注)每步基于当前对抗样本重新计算梯度,相当于每次涂改后都重新确认老师的最新批注。
- 裁剪(不超预算)$\mathrm{clip}_{x,\epsilon}$ 把每一步结果拉回原始样本的 $\epsilon$ 邻域内,防止改动越界暴露行踪。
模型迁移性
作弊学生惊喜地发现:自己练出来的涂改手法,换到隔壁班的阅卷老师那儿也照样管用。这是因为所有老师都看同一本教材(训练数据)备课,看重的特征大差不差——这就是对抗样本的迁移性。
迁移性指:在模型 A 上生成的对抗样本,往往也能骗过模型 B。不同模型在相似数据上训练,学到的决策边界高度相似,所以对模型 A 致命的扰动方向,对模型 B 来说同样踩在痛处。这直接催生了黑盒攻击:攻击者拿不到目标模型的参数时,可以自己训练一个代理模型,在代理模型上用 FGSM 生成对抗样本,再投喂给目标模型。虽然不知道“目标老师的批注”,但参考“自己老师的批注”也能蒙对大半。
更极端的是通用对抗扰动:一张“万能涂改贴纸”加到任意图片上,都能让模型在多数类别上大面积出错。研究者甚至打印出来贴在路牌上,让自动驾驶模型把“停止”识别成“限速”,这已经不是纸面推演,而是实实在在的物理世界威胁。
这也解释了为什么学校要严格保密“评分标准”——可老师们的阅卷习惯早就被摸透了。对防御者来说,迁移性意味着:即使模型参数没泄露,也不能心存侥幸。
防御策略
学校开始反作弊,从三方面下手:第一,把历年作弊卷当练习题让学生反复做(对抗训练);第二,改进答题卡扫描仪,让涂改痕迹“洗”不进去(输入预处理);第三,定期组织模拟涂改考试(鲁棒性评估)。
对抗训练是目前最有效的防线:在训练时把 FGSM 生成的对抗样本混进训练集,让模型见过“挨了涂改”的样本,学会忽略这类扰动。它相当于给阅卷老师做“脱敏训练”,但代价是干净样本上的准确率往往小幅下降——这就是鲁棒性与准确率之间的权衡。
输入预处理则是在推理前对输入做平滑、压缩、随机重采样等操作,试图把扰动“洗掉”。这类方法实现简单、成本低,但攻击者一旦知道预处理的细节,可以用自适应攻击绕过它。还有一种思路叫防御蒸馏:用“软标签”训练一个更平滑的模型,让梯度的可用信息变模糊,相当于把批注写得歪歪扭扭——可惜 2017 年后已被证明可以绕过。
所以模型鲁棒性没有银弹。就像学校每年都要更新防作弊手段,AI 安全也是“道高一尺,魔高一丈”的军备竞赛,唯一可靠的姿态是持续攻防评估。
鲁棒性测试实战
学校雇了一位“白帽作弊专家”:定期用 FGSM 模拟涂改,检验阅卷老师有没有漏洞。这正是 AI 安全工程师的日常工作——鲁棒性测试,也叫给模型做“体检”。
具体操作分三步:选 ε、批量生成、看指标。ε 是攻击强度的旋钮,从 0 开始慢慢拧大,观察模型准确率的“滑坡曲线”——曲线掉得越早、越陡,模型越脆弱。工程上通常对验证集全量批量生成对抗样本,统计攻击前后的准确率对比:干净准确率(clean accuracy)与对抗准确率(adversarial accuracy)。两者差距越大,说明模型“外强中干”。
实战中有几条经验:不要只看单一 ε,要扫描一个范围(如 0.01、0.05、0.1、0.3、0.5);除了非定向攻击,还要搭配定向攻击测最坏情况;报告里注明模型结构、数据集、ε 和攻击变体,保证可复现。用 FGSM 批量测试的成本很低——一次前向加一次反向就能生成一批样本,非常适合做 CI 流水线里的“鲁棒性门禁”。
一场模拟涂改考试下来,哪个老师(模型)容易被骗一目了然。测试报告就是模型的体检单:上了线,也要定期复查。
AI 应用场景
人脸识别系统上线前的鲁棒性测试
阶段:模型评估与安全测试
解决的问题:人脸识别系统如果不测对抗鲁棒性,攻击者可以戴一副印有微小花纹的眼镜框骗过系统,刷别人的脸。传统测试只看干净样本准确率,掩盖了这类漏洞。用 FGSM 在公开人脸数据集上批量生成对抗样本,能快速量化系统在欺骗攻击下的错误率。
具体案例:某安防公司在部署门禁识别前,用 FGSM(ε=0.05)对内部测试集的 1 万张人脸照片叠加扰动,发现识别准确率从 99.2% 掉到 87%,于是补充对抗训练后才重新上线。
自动驾驶路牌识别模型的压力测试
阶段:感知模型鲁棒性评估
解决的问题:自动驾驶的“停止”路牌如果被贴上一小块对抗贴纸,模型可能识别成“限速 60”,后果不堪设想。用 FGSM 模拟数字世界的极端干扰,帮助感知团队提前发现薄弱类别并补强。
具体案例:感知团队在仿真环境里对路牌识别模型做 FGSM 迭代攻击,暴露出小目标类别(行人、施工标志)对扰动最敏感,随后对困难类别做数据增强并加入对抗训练。
内容审核模型的攻防演练
阶段:红队对抗测试
解决的问题:不良内容加上微小扰动可能绕过审核模型。安全团队用定向 FGSM 把“违规图片”伪装成“安全图片”,验证审核模型在最坏情况下的漏判率,帮助产品团队守住内容安全底线。
具体案例:某内容平台定期用 targeted FGSM 生成对抗测试集(指定模型判为“安全”),追踪审核模型的漏判率变化,并将其作为模型迭代的准入指标之一。
Python 演示
import numpy as np def make_data(n=800, seed=0): """生成两类高斯分布数据,模拟二分类任务。""" rng = np.random.default_rng(seed) x0 = rng.normal([1.0, 1.0], 0.9, size=(n // 2, 2)) x1 = rng.normal([4.0, 4.0], 1.1, size=(n - n // 2, 2)) X = np.vstack([x0, x1]) y = np.array([0] * (n // 2) + [1] * (n - n // 2)) return X, y def softmax(z): e = np.exp(z - z.max(axis=1, keepdims=True)) return e / e.sum(axis=1, keepdims=True) def train(X, y, steps=500, lr=0.2): """训练一个 softmax 线性分类器,返回权重 W 和偏置 b。""" n, d = X.shape W = np.zeros((d, 2)) b = np.zeros(2) for _ in range(steps): p = softmax(X @ W + b) t = np.zeros((n, 2)) t[np.arange(n), y] = 1.0 W -= lr * (X.T @ (p - t)) / n b -= lr * (p - t).mean(axis=0) return W, b def fgsm_grad(W, b, X, y): """计算交叉熵损失对输入 X 的梯度。""" p = softmax(X @ W + b) t = np.zeros((len(X), 2)) t[np.arange(len(X)), y] = 1.0 return (p - t) @ W.T def fgsm_attack(W, b, X, y, eps=0.3): """FGSM 批量生成对抗样本:x_adv = x + eps * sign(grad)。""" grad = fgsm_grad(W, b, X, y) return X + eps * np.sign(grad) def accuracy(W, b, X, y): pred = softmax(X @ W + b).argmax(axis=1) return float((pred == y).mean()) def main(): X, y = make_data() W, b = train(X, y) print("clean acc: %.4f" % accuracy(W, b, X, y)) for eps in [0.05, 0.1, 0.2, 0.4, 0.8]: X_adv = fgsm_attack(W, b, X, y, eps) print("eps=%.2f adv acc: %.4f" % (eps, accuracy(W, b, X_adv, y))) if __name__ == "__main__": main()
t[np.arange(n), y] = 1.0把整数标签转成“独热编码”:只有真实类别那一列为 1,其余为 0。W -= lr * (X.T @ (p - t)) / n梯度下降训练:让模型先学会“正常阅卷”,这是后面攻击的靶子。return (p - t) @ W.T核心中的核心:交叉熵损失对输入 X 的梯度,即“老师的批注方向”。return X + eps * np.sign(grad)FGSM 公式落地:原样本沿梯度符号方向挪动 ε,生成对抗样本。(pred == y).mean()计算准确率,用来评估“涂改前后”模型判断的差距。
常见误区
误区“对抗样本不就是往图片上撒一点随机噪声吗?模型只要鲁棒一点就不会上当。”
正解对抗扰动完全不是随机噪声。FGSM 的扰动是沿着损失函数梯度符号方向精心设计的——它像作弊学生专挑评分标准里最薄弱的地方下手。随机噪声方向杂乱、互相抵消,而梯度方向是“最省力”的攻击路径,一点点扰动就能跨越决策边界。二者有本质区别:噪声靠量变,对抗样本靠定向打击。
为何常见:视觉上对抗样本与加噪图“看起来都差不多”,加上许多科普图把扰动画成马赛克噪声样式,容易让人混淆。
误区“为了让对抗样本不被发现,ε 取 0.01 甚至更小最稳妥。”
正解ε 太小,扰动不足以让样本跨越决策边界,攻击就失效了——就像涂改的笔迹太轻,阅卷老师根本看不出变化。ε 要取到刚好能越过边界的“临界值”:既能骗过模型,又不被人眼察觉。工程上通常扫描一段范围观察精度曲线,而不是拍脑袋定一个极小值。
为何常见:初学者把“隐蔽性”当成唯一目标,忽略了攻击的根本目的是改变模型预测——隐蔽是约束,成功才是目标。
误区“既然算出了梯度,直接 x + ε·∇J 攻击岂不是更狠?用 sign 丢掉梯度大小太浪费了。”
正解直接加梯度有一个致命问题:不同样本的梯度模长差异巨大,导致部分样本扰动过大而暴露,另一些扰动不足而无效。sign 把每个分量归一化为 ±1,使总扰动被严格限制在 ε 的 L∞ 范数球内——这正是 FGSM 名字里“符号法”的意义:只取方向,保证每次涂改的幅度都同样“隐蔽而致命”。
为何常见:人直觉上认为“信息越多越好”,没意识到符号函数其实是在做“归一化、控预算”,让攻击在不同样本上同样有效。
误区“我又拿不到别人模型的权重,FGSM 在我这儿根本没用。”
正解由于决策边界相似性,在代理模型上生成的对抗样本往往也能欺骗目标模型,这就是迁移性。攻击者可以自己训练一个替代模型,或直接选用开源模型,用 FGSM 生成对抗样本,再对目标系统做黑盒攻击,命中率依然可观。连“万能贴纸”这类通用扰动都可以批量复用到任意图片上。
为何常见:教材大多先讲白盒场景下的公式推导,容易让人误以为对抗攻击必须依赖目标模型的内部参数。
误区“模型用对抗样本训练过,就再也不会被欺骗了,完美免疫。”
正解对抗训练能显著提升对已知攻击(如 FGSM)的鲁棒性,但攻防是军备竞赛:更强的攻击(PGD、AutoAttack)或更大的 ε 会让模型再次失效。对抗训练还常常降低干净样本上的准确率,存在“鲁棒性—准确率”权衡。正确做法是把鲁棒性测试纳入持续集成,定期重新评估。
为何常见:“打了疫苗就不会得病”的类比深入人心,但模型安全没有终点,攻击手段总在更新。
面试题
Q1. FGSM 中符号函数 sign 的核心作用是什么?
- A.放大梯度值并增强攻击效果
- B.将梯度转为 ±1 方向信号← 正确答案
- C.计算损失函数的二阶导数
- D.对输入像素做归一化处理
答案:B。sign 把梯度的每个分量压缩成 +1 或 -1,只保留“往哪改”的方向信息,就像作弊学生只看老师批注的箭头,不纠结划线粗细。A 的理解恰好相反,符号函数丢掉了梯度大小;C 和 D 与符号函数无关。
Q2. FGSM 生成的对抗样本必须具备什么特征?
- A.扰动随机且完全不可见
- B.扰动极小且模型误判← 正确答案
- C.样本尺寸大幅压缩
- D.模型权重全部公开
答案:B。对抗样本要“骗过模型”且“不被人眼发现”,所以要求扰动小、预测错。A 错在“随机”二字,FGSM 的扰动是沿梯度的定向扰动;C 是图像压缩不是对抗;D 说的是攻击条件,不是样本本身的特征。
Q3. 在 FGSM 公式 x_adv = x + ε·sign(∇xJ) 中,ε 表示什么?
- A.模型训练的学习率
- B.损失函数的计算轮数
- C.对抗扰动的幅度上限← 正确答案
- D.输入图像的像素均值
答案:C。ε 是扰动预算,同时决定攻击强度与暴露风险,好比作弊学生的橡皮擦使用限度。A 是训练超参数,与攻击无关;B 与 FGSM 的单步特性矛盾;D 是图像统计量。
Q4. FGSM 通常被归为以下哪一类攻击?
- A.完全黑盒攻击
- B.物理世界攻击
- C.白盒梯度攻击← 正确答案
- D.数据投毒攻击
答案:C。FGSM 需要利用损失对输入的梯度,必须知道模型结构和参数,属于白盒攻击。但它生成的样本可以迁移到别的模型,从而用于黑盒场景——这是“生成方式”与“使用场景”的区别,答题时要分清。
Q5. 用 FGSM 生成对抗样本,通常需要以下哪些信息?
- A.模型的损失函数定义← 正确答案
- B.损失对输入的梯度← 正确答案
- C.原始输入样本本身← 正确答案
- D.模型的私有训练数据
答案:ABC。FGSM 需要用损失函数算出梯度,再把梯度符号叠加到原始输入上,A、B、C 缺一不可。训练数据属于额外信息,FGSM 并不需要——对抗扰动完全由当前样本和模型参数决定。
Q6. 与非定向攻击相比,FGSM 定向攻击在公式上最关键的差异是什么?
- A.反向传播改为前向传播
- B.替换目标类并调转梯度方向← 正确答案
- C.扰动幅度必须取负值
- D.不再需要损失函数参与
答案:B。定向攻击把公式中的真实类别 y 换成目标类别 y_t,并把加号变成减号:让目标类别的损失变小,模型才更可能判成指定类。A、C、D 都是对公式的误解,减号针对的是梯度方向而非扰动幅度本身。
Q7. 关于对抗样本迁移性的说法,哪些是正确的?
- A.对抗样本常可骗过多个模型← 正确答案
- B.攻击必须有目标模型的梯度
- C.可在代理模型上生成再使用← 正确答案
- D.只适用于人脸识别场景
答案:AC。迁移性指在模型 A 上生成的对抗样本对模型 B 也有效,因此 A、C 正确。B 恰恰是迁移性要解决的痛点——黑盒攻击不需要目标模型梯度;D 完全以偏概全,对抗样本适用于图像、语音、文本等各类模型。
Q8. “对抗训练”防御手段的核心做法是什么?
- A.提高模型的批大小和显存
- B.把对抗样本混入训练数据← 正确答案
- C.删除所有敏感的数据特征
- D.降低模型参数的精度位数
答案:B。对抗训练在训练集中加入对抗样本,让模型“见过世面”,相当于用历年作弊卷当练习题,让阅卷老师对涂改手法脱敏。A、C、D 都与对抗训练的核心思想无关。
Q9. 与迭代式 PGD 攻击相比,FGSM 最突出的特点是什么?
- A.单步生成、速度快但力度有限← 正确答案
- B.多步迭代、速度慢但更稳
- C.完全不依赖损失函数梯度
- D.只能应用于图像分类模型
答案:A。FGSM 只用一次梯度计算完成攻击,因此叫“快速”,但单步扰动容易“走过头”或“不到位”;PGD 把 ε 拆成多小步迭代、随机重启,效果更强但更慢。C、D 都是明显错误,FGSM 依赖梯度且可用于多种模型。
Q10. 以下关于 FGSM 工程实践的描述,正确的是?
- A.扫描多个ε观察精度下降曲线← 正确答案
- B.固定ε为极小值即可保证攻破
- C.批量生成对抗样本评估鲁棒性← 正确答案
- D.随机方向扰动效果优于梯度方向
答案:AC。工程上应扫描多个 ε 观察模型准确率的滑坡曲线,并批量生成对抗样本统计攻击成功率,故 A、C 正确。固定极小 ε 常因扰动不足而失效(B 错);梯度方向的定向攻击效率远高于随机方向(D 错),这正是 FGSM 的价值所在。