Goodfellow FGSM — 用一次梯度就能造出对抗样本
待复核这篇论文解释了一个很反直觉的现象:给图片加上一点人眼几乎看不出来的噪声,神经网络就可能非常自信地认错。 日常类比:像你把门禁卡边缘轻轻磨掉一点,人看卡片还是那张卡,读卡器却突然把它当成另一张卡。
Goodfellow、Shlens、Szegedy 的关键回答是:问题不一定来自神经网络太弯、太复杂,反而常常来自它在高维空间里太像一条直线。
他们提出的 FGSM(Fast Gradient Sign Method)只做一件事:看模型当前最怕输入往哪个方向变,然后沿着这个方向给每个像素推一小步。
所以它既是一种攻击方法,也是一把诊断尺:用很低成本暴露模型最薄的地方。
不理解 FGSM,下面这些事就很难讲清楚:
- 为什么测试集准确率很高的模型,遇到一点刻意扰动就会崩。
- 为什么同一张对抗样本常常能骗过不同架构、不同训练集训练出的模型。
- 为什么普通随机噪声不一定危险,但沿梯度方向的噪声危险得多。
- 为什么安全场景不能只问“模型平时准不准”,还要问“有人故意捣乱时稳不稳”。
-
高维里小变化会叠加成大变化。类比:一个人每次只往前挪一厘米不明显,但一万人一起挪一厘米,队伍边界就明显变了;图像有成千上万个像素,每个像素微调一点,模型内部的总分可能大幅改变。
-
FGSM 用梯度找最坏方向。类比:下山时看坡度最大的位置走最快,攻击时则反过来,找让损失上升最快的方向;公式就是
x_adv = x + epsilon * sign(grad_x loss)。 -
对抗训练把攻击样本也放进训练。类比:消防演习不是等真正着火才练,而是平时就模拟火情;论文把干净样本和 FGSM 样本混合训练,让模型提前见过这种坏情况。
案例 1:一行公式生成 FGSM 扰动
Section titled “案例 1:一行公式生成 FGSM 扰动”import torch
x.requires_grad_(True)loss = model.loss(x, y)loss.backward()x_adv = x + 0.25 * x.grad.sign()逐部分解释:
requires_grad_(True)表示我们不只对参数求导,也要知道输入怎么改会让损失变大。x.grad.sign()只保留方向,不管每个像素的梯度大小,保证每个像素最多移动同样的幅度。0.25是论文在 MNIST 实验里常用的扰动强度,太小可能骗不过,太大就肉眼可见。
案例 2:为什么线性模型也会被小噪声骗
Section titled “案例 2:为什么线性模型也会被小噪声骗”import numpy as np
w = np.array([0.2, -0.3, 0.1, 0.4])x = np.array([1.0, 1.0, 1.0, 1.0])eta = 0.01 * np.sign(w)print(np.dot(w, x), np.dot(w, x + eta))逐部分解释:
np.sign(w)让每个维度都朝着增大模型打分的方向动。- 单个维度只动
0.01,看起来很小;维度一多,点积变化会按维度数量累积。 - 这就是论文的线性解释:危险不在某个像素,而在很多像素一起“同向用力”。
案例 3:对抗训练不是普通加噪声
Section titled “案例 3:对抗训练不是普通加噪声”alpha = 0.5clean_loss = loss_fn(model(x), y)adv_loss = loss_fn(model(x_adv.detach()), y)loss = alpha * clean_loss + (1 - alpha) * adv_loss逐部分解释:
clean_loss保留正常分类能力,避免模型只会处理怪样本。adv_loss专门惩罚 FGSM 造出的难样本。alpha = 0.5是论文实验里的简单选择,意思是干净样本和对抗样本各占一半训练压力。
-
把 FGSM 当普通噪声:普通随机噪声平均会互相抵消,FGSM 是沿损失上升方向一起推,所以破坏力大得多。
-
以为只有深度网络会中招:论文明确说明 softmax 回归这类浅层线性模型也会被攻击,因为高维点积本身就会放大小扰动。
-
以为集成模型就安全:论文训练了多个 maxout 网络做 ensemble,攻击整个 ensemble 时仍然有很高错误率,原因是模型学到的方向相似。
-
以为对抗训练能一次性解决鲁棒性:MNIST 上错误率明显下降,但仍会自信犯错,说明它是重要起点,不是最终防线。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 快速检查图像分类模型有没有明显的梯度方向漏洞。
- 给初学者解释“为什么小扰动能大影响”这个核心直觉。
- 做对抗训练的入门 baseline,因为一次反向传播就能生成样本。
- 研究白盒攻击,也就是攻击者知道模型结构和梯度的场景。
不适用:
- 需要最强攻击强度评测时,FGSM 往往不如多步攻击细。
- 输入不是连续数值时,比如文本 token,直接加像素式扰动不成立。
- 防御已经专门针对单步攻击训练过时,只用 FGSM 评测容易高估安全性。
- 需要证明级安全保证时,FGSM 只是经验攻击方法,不是形式化证明。
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 2013 年:Szegedy 等人发现对抗样本现象,说明小扰动能让高性能网络认错。
- 2014 年:Goodfellow、Shlens、Szegedy 提出线性解释和 FGSM,把昂贵搜索变成一次梯度计算。
- 2015 年:论文发表于 ICLR,FGSM 很快变成对抗机器学习的标准入门攻击。
- 2016 年:DeepFool 等方法继续追问“离决策边界最近的扰动到底有多小”。
- 2017 年以后:Madry 等人把对抗训练整理成鲁棒优化框架,FGSM 成为后续多步攻击和防御的基础坐标。
- 高维直觉很容易误导人:每个像素的小变化不显眼,但对模型分数可以累计成大变化。
- 模型好训练和模型难攻击之间有张力:ReLU、maxout 等结构容易优化,也更容易呈现局部线性行为。
- 安全评测要看最坏情况:平均准确率只看自然样本,FGSM 逼着我们检查模型在坏方向上会怎样。
- 防御要和攻击一起演化:对抗训练有效,但攻击方法变强后,评测标准也必须跟着升级。
- 论文 PDF:Goodfellow et al. 2015, ICLR —— FGSM 和线性解释的原文。
- szegedy-adversarial-2013 —— 先发现对抗样本现象,FGSM 是它的快速解释与工程化版本。
- deepfool-2016 —— 用迭代方式估计离决策边界更近的扰动。
- madry-robust-optimization-2017 —— 把对抗训练提升为鲁棒优化问题。
- momentum-iterative-attack-2018 —— 在迭代攻击里加入动量,提高迁移攻击能力。
- dropout-2014 —— 论文对比了 dropout 和对抗训练,说明普通正则化不能自动带来鲁棒性。
- szegedy-adversarial-2013 —— 这篇是 FGSM 要解释和加速的直接前作。
- dropout-2014 —— FGSM 论文证明对抗训练能在 dropout 之外继续带来正则化收益。
- deepfool-2016 —— 从“快速造错”转向“更精确地量鲁棒半径”。
- madry-robust-optimization-2017 —— 把 FGSM 的单步思路扩展到更强的多步一阶攻击。
- imagenet-2009 —— 论文用 ImageNet 上的 GoogLeNet 展示肉眼难察觉的攻击效果。
- cifar-10 —— 论文在 CIFAR-10 上报告卷积 maxout 网络也会被 FGSM 高置信度骗过。
- googlenet-2014 —— Figure 1 里被 FGSM 改变预测的代表性深度视觉模型。
- carlini-wagner-2017 —— C&W 攻击 — 用强优化检验神经网络鲁棒性
- deepfool-2016 —— DeepFool 2016 — 用最小扰动量出模型边界有多近
- madry-pgd-2017 —— Madry PGD — 把对抗训练变成最坏情况演练
- szegedy-adversarial-2013 —— Szegedy 对抗样本 — 图片只改一点点,模型却会彻底看错