Madry PGD — 把对抗训练变成最坏情况演练
待复核Madry PGD 这篇论文把“怎么训练不容易被对抗样本骗的神经网络”整理成一个清楚的训练目标。日常类比:像学校做消防演练,不是只练一次标准路线,而是让最会找漏洞的人从各个门、各个楼梯模拟火情,再逼着全校按最坏情况练到稳定。
它的核心句子是:训练时先让攻击者在允许范围内把样本改到最难,再让模型学会这个最难版本。
这里的“允许范围”通常是图片像素的一个小盒子,比如每个像素最多动一点点;这里的“最难版本”不是随机噪声,而是用 PGD 多步沿着损失上升方向找出来的对抗样本。
所以这篇论文不只是提出一个攻击算法,而是给对抗鲁棒性定了一个工程基准:先说清攻击者能做什么,再用足够强的攻击者训练和评测模型。
一句话压缩:它把“模型别被小扰动骗”从口号变成了可训练、可比较、可复现的实验协议。
不理解 Madry PGD,下面这些事就很难讲清楚:
- 为什么 FGSM 这类单步攻击可以当入门,但不能当最终安全评测。
- 为什么对抗训练要写成“内层攻击 + 外层训练”的 min-max 问题。
- 为什么 RobustBench 等鲁棒性 benchmark 长期把 PGD 及其变体当默认白盒评测。
- 为什么模型容量会影响鲁棒性:普通分类边界够用,不代表能绕开每个样本周围的小盒子。
-
鲁棒训练是两个人下棋。类比:一个人负责藏题目里最刁钻的坑,另一个人负责把坑都学会;公式上就是
min_theta E[max_delta loss(model(x + delta), y)]。 -
PGD 是反复试探边界的攻击者。类比:不是敲一次门就走,而是每次听声音、换角度、再敲一次,同时保证自己不走出允许区域;这比 FGSM 的“一步到位”更难被模型背答案。
-
容量不是锦上添花,而是鲁棒性的材料。类比:普通路障挡住一条直线就够了,但要保护每个路口周围一整块区域,就需要更多路障和更复杂的路线设计;论文发现更宽的网络更能承受强攻击训练。
案例 1:把训练目标写成“先攻击,再学习”
Section titled “案例 1:把训练目标写成“先攻击,再学习””for x, y in loader: x_adv = pgd_attack(model, x, y, eps=8/255) loss = cross_entropy(model(x_adv), y) loss.backward() optimizer.step()逐部分解释:
pgd_attack是内层最大化:在eps范围里找让模型最痛的x_adv。cross_entropy(model(x_adv), y)是外层最小化:模型不能只认干净图,也要认最坏图。- 这就是论文的鲁棒优化视角,不是给数据随便加噪声,而是在训练中嵌入攻击者。
案例 2:PGD 为什么比 FGSM 更像认真攻击
Section titled “案例 2:PGD 为什么比 FGSM 更像认真攻击”x_adv = x + uniform(-eps, eps)for _ in range(20): grad = grad_x_loss(model, x_adv, y) x_adv = x_adv + step * grad.sign() x_adv = clip(x_adv, x - eps, x + eps)逐部分解释:
uniform(-eps, eps)是随机起点,避免只从原图附近一个位置出发。grad.sign()每一步都沿着让损失上升的方向推像素。clip是投影,把样本拉回允许的小盒子里,所以叫 projected gradient descent。
案例 3:评测时要区分自然准确率和鲁棒准确率
Section titled “案例 3:评测时要区分自然准确率和鲁棒准确率”clean_acc = accuracy(model(x), y)adv = pgd_attack(model, x, y, eps=8/255)robust_acc = accuracy(model(adv), y)print(clean_acc, robust_acc)逐部分解释:
clean_acc问的是“平时考试能考多少分”。robust_acc问的是“有人专门出刁钻题时还能答对多少”。- 论文里 CIFAR-10 宽网络自然准确率约 87.3%,20 步 PGD 白盒攻击下约 45.8%,这两个数字必须分开看。
-
把 PGD 当普通训练增强:随机裁剪、翻转是让数据更多样,PGD 是专门找当前模型最坏方向,目标完全不同。
-
只用 FGSM 评测就宣布安全:单步攻击容易被模型过拟合,论文里 FGSM 训练模型在 PGD 攻击下可以掉到 0% 准确率。
-
忘记写清威胁模型:
eps、范数、白盒还是黑盒没说清,鲁棒准确率就没有可比性。 -
以为 PGD 通过就是绝对安全:论文说的是一阶攻击下的强经验保证,不是所有可能攻击的数学证明;后续研究也发现某些设置会有梯度遮蔽风险。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 图像分类模型的白盒对抗鲁棒训练,尤其是
L_inf像素扰动。 - 需要一个强 baseline 来比较防御方法,而不是只比较自然准确率。
- 想理解攻击和防御如何放进同一个优化框架。
- 研究“安全评测应该先定义攻击者能力”的机器学习安全问题。
不适用:
- 需要严格可证明鲁棒性时,PGD 是经验攻击,不是形式化证书。
- 文本、代码、语音等离散输入,不能直接套像素盒子的直觉。
- 数据很大、模型很大但预算很低时,PGD 训练成本明显高于普通训练。
- 感知距离和
L_inf不一致的场景,比如人眼觉得明显变化但像素范数仍小。
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 2013 年:Szegedy 等人发现对抗样本,证明高准确率视觉模型也有很薄的局部漏洞。
- 2014 年:Goodfellow 等人提出 FGSM,用一次梯度解释和生成对抗样本。
- 2017 年:Carlini-Wagner 攻击击穿多种早期防御,让大家意识到“只防一个攻击”不够。
- 2017 年:Madry 等人把问题写成鲁棒优化,并把多步 PGD 推成一阶攻击的强基线。
- 之后:PGD 对抗训练成为鲁棒性论文的起点,后续 benchmark 会在它之上继续加入更强攻击套件。
- 鲁棒性要先定义攻击者:不说清攻击者能改多少、知道多少,就不能谈“安全”。
- 训练和攻击是一体两面:内层 PGD 负责找坏样本,外层 SGD 负责把坏样本学会。
- 强评测会改变结论:一个防御能挡 FGSM,不代表能挡 PGD、CW 或多次随机重启。
- 鲁棒性有代价:更强攻击训练、更大模型容量、更多计算,换来更可信的最坏情况表现。
- 基线本身也会过时:PGD 很强,但后来评测仍要继续叠加自动攻击、黑盒攻击和认证方法。
- 论文 PDF:Madry et al. 2018, ICLR —— PGD 鲁棒训练的原文。
- szegedy-adversarial-2013 —— 对抗样本研究的起点,先提出“图片几乎不变但模型认错”。
- goodfellow-fgsm-2014 —— 单步梯度攻击,Madry PGD 可以看成它的多步强化版。
- carlini-wagner-2017 —— 更强优化攻击,提醒防御必须经受多种白盒检验。
- deepfool-2016 —— 另一条迭代攻击路线,关注离决策边界最近的小扰动。
- robustbench-2021 —— 后来的鲁棒性排行榜,把强攻击评测流程制度化。
- szegedy-adversarial-2013 —— 先发现漏洞,Madry PGD 负责把训练目标系统化。
- goodfellow-fgsm-2014 —— FGSM 是一步攻击,PGD 是多步投影攻击。
- resnet —— 论文在 CIFAR-10 上使用更宽的 ResNet 来承载鲁棒训练。
- dropout-2014 —— 普通正则化能缓解过拟合,但不能自动提供最坏扰动鲁棒性。
- abadi-dpsgd-2016 —— 同样把训练目标改写为安全约束下的优化问题。
- carlini-wagner-2017 —— 共同推动“防御必须被强白盒攻击检验”的评测文化。
- cifar-10 —— 论文最重要的非玩具实验材料之一。
- carlini-wagner-2017 —— C&W 攻击 — 用强优化检验神经网络鲁棒性
- deepfool-2016 —— DeepFool 2016 — 用最小扰动量出模型边界有多近
- szegedy-adversarial-2013 —— Szegedy 对抗样本 — 图片只改一点点,模型却会彻底看错