GSM 攻击—防御蒸馏—梯度遮蔽—鲁棒性评估
一、写在前面
第一次真正被“对抗样本(Adversarial Example)”这个概念震撼,是在深夜的实验室。那天我把一张 99% 识别率的手写数字图片加了一点几乎看不见的噪声,模型立刻把 8 认成了 3。屏幕里的结果让我忽然意识到:我们日常津津乐道的高准确率,其实隐藏着巨大的脆弱性。后来半开玩笑地和同门说:“如果说黑客是刀尖舞者,那搞对抗的人就是显微镜下跳霹雳”——动作极小,却能让系统原地崩溃。
这篇文章想把最近几个月在“FGSM 攻击—防御蒸馏—梯度遮蔽—鲁棒性评估”这一完整闭环上的折腾体会,一股脑记录下来。一是交作业;二是给同样徘徊在对抗门口的朋友提供一份可落地的流水账,哪怕踩的坑能帮你少绕一两个弯,也算值得。
二、概念串联:从 FGSM 到梯度遮蔽
-
FGSM(Fast Gradient Sign Method)
- 论文首见于 2015 年 ICLR《Explaining and Harnessing Adversarial Examples》。
- “一次性”攻击:沿着损失函数对输入的梯度符号方向,直接迈 epsilon 步。
- 公式:x_adv = x + ε · sign(∇_x L(θ, x, y))
-
防御蒸馏(Defensive Distillation)
- 原本是为压缩、加速模型提出的“知识蒸馏”副产物。
- Papernot 在 2016 提出:用高温 Softmax 训练 teacher,再用 soft label 训练 student,可在一定程度上抑制 FGSM/Papernot 攻击成功率。
-
梯度遮蔽(Gradient Masking)
- 任何让攻击者“看不清”真实梯度的技巧,统称梯度遮蔽。
- 包括但不限于:随机化层、剪枝、非可导预处理、数值下采样,乃至某些“看似有效”的蒸馏策略。
- 遮蔽≠防御:多数情况下只是把梯度藏起来,换 BPDA、EOT、二阶近似等进攻方式后仍被攻破。
-
模型鲁棒性评估
- 静态指标:对抗准确率(Adv ACC)、精度下降率(δ)。
- 动态指标:CLEVER、Lipschitz Bound、AutoAttack 综合评分。
- 现实约束:算力、时间、业务场景中的容忍噪声范围。
三、实验设计:小而精的流水线
我选了 CIFAR-10 数据集做演示,原因很简单:既不至于像 ImageNet 那样跑一天一夜,也比 MNIST 更贴近真实分布。硬件是租的云 GPU(Tesla T4),成本不到 30 块钱,足够复现实验。
(1)Baseline:
- 架构:ResNet-18
- 学习率 0.1 / Cosine Decay
- 训练 200 epoch,干净测试集准确率 ≈ 93.4%
(2)FGSM 参数:
- ε = {2/255, 4/255, 8/255}
- 单步攻击,使用 PGD 对照验证“梯度遮蔽”是否存在
(3)防御蒸馏:
- 温度 T = 20
- Teacher、Student 均为 ResNet-18,蒸馏损失权重 α = 0.7
(4)评估:
- Clean Accuracy、FGSM Accuracy (ε=8/255)
- AutoAttack Accuracy
- 统一在 PyTorch 1.13、TorchVision 0.14 环境
四、核心代码片段(PyTorch)
import torch
import torch.nn.functional as F
# FGSM 核心函数
def fgsm_attack(model, x, y, eps=8/255):
x = x.clone().detach().requires_grad_(True)
logits = model(x)
loss = F.cross_entropy(logits, y)
loss.backward()
grad_sign = x.grad.sign()
x_adv = x + eps * grad_sign
x_adv = torch.clamp(x_adv, 0, 1) # 保持像素范围
return x_adv.detach()
# 防御蒸馏训练循环
def train_student(student, teacher, dataloader, T=20, alpha=0.7):
student.train(); teacher.eval()
optimizer = torch.optim.SGD(student.parameters(), 0.05, momentum=0.9)
for x, y in dataloader:
with torch.no_grad():
soft_target = F.softmax(teacher(x)/T, dim=1)
student_logits = student(x)/T
loss_soft = F.kl_div(F.log_softmax(student_logits, dim=1), soft_target, reduction='batchmean')
loss_hard = F.cross_entropy(student_logits, y)
loss = alpha * loss_soft + (1 - alpha) * loss_hard
optimizer.zero_grad(); loss.backward(); optimizer.step()
注意两点实践“小坑”:
- 蒸馏时不要忘了学生输出同样除以 T;预测阶段再乘回来,否则精度掉头就走。
- FGSM 在高温 Softmax 上容易出现数值爆炸,需
model.eval()下开启torch.no_grad()。
五、结果与分析
先上核心结果表,一目了然(平均 3 次重复实验):
| 模型或策略 | Clean ACC ↑ | FGSM ACC (ε=8/255) ↑ | AutoAttack ACC ↑ | 是否疑似梯度遮蔽 |
|---|---|---|---|---|
| Baseline ResNet-18 | 93.4% | 21.8% | 17.3% | 否 |
| Defensive Distill | 92.6% | 53.1% | 24.8% | 可能 |
| Distill + PGD 5步 | 92.4% | 47.6% | 23.9% | 可能 |
| Gradient Mask Toy | 92.1% | 71.2% | 18.1% | 是 ✔ |
乍一看蒸馏提升了 FGSM 抗性(21.8%→53.1%),老板会很开心;可再放进 AutoAttack(含 EOT/PGBM)后,只剩 24.8%。这就暴露了一个经典现象:蒸馏部分抵御来自于“平滑化 logits”,梯度噪声上来了,但并没真正增加决策边界的安全距离。
我又额外实现了一个“梯度截断层”(Gradient Mask Toy),攻击准确率飙到 71.2%,但 AutoAttack 依然跌回 18%,毫无疑问是典型梯度遮蔽。
下面拆成三条具体体会:
-
蒸馏的有效窗口
- 温度太低(T<5)基本等于没蒸馏;太高(T>40)会导致学生难以收敛。实验表明 T=15~25 折中最佳。
- ε 在 2/255 时差距最明显,往上增大,蒸馏优势递减。
-
遮蔽≠鲁棒
- 如果一个防御对 FGSM 好、对 PGD 差,那十有八九在遮蔽。
- 最简检验:用 BPDA 或者加点噪声重估梯度,再打一遍。
-
评估指标千万别偷懒
- 仅靠 FGSM 会高估防御效果 20~50 个百分点。
- AutoAttack 足够强,但建议再跑个随机初始化版本,避免偶然性。
六、关于鲁棒性评估的“人话”注解
- Adv ACC 本质是“在约束条件 C 下模型还能对几张图片给出正确标签”。C 可以是 L∞(ε)、L2(δ) 或物理世界旋转/亮度变换。指标直观,但过于依赖具体 ε,容易被“调参—秀分”。
- CLEVER 倾向于理论上界,算法复杂度高,不适合大规模数据集线上监控。
- AutoAttack(AA)是社区共识的“综合大杀器”,因为它集合了 FAB、Square、APGD 等子攻击,cover 了梯度可导和不可导的场景。实务中,先跑 AA,过了再考虑细节。
七、从实验到生产:我踩过的 5 个坑
-
数据增广误以为防御
有同学加了 CutMix、RandAugment,看起来对抗准确率变高,其实是训练集被动引入了“局部扰动”,与真正的 adversary 仍有差距。 -
BatchNorm 的怼脸反噬
蒸馏 teacher ⇒ student 时,如果 teacher 用的是 batchnorm,而 inference 阶段 batchsize 很小,统计量失真会导致鲁棒性跳水。 -
混合精度的暗箭
FGSM/PGD 的 ε 量级很小,float16 下极易被舍入为 0,造成结果失真。实测请关闭 AMP 或 selective cast。 -
日志与版本不可或缺
攻防实验赞成“一把梭”循环调参,可千万别忘了wandb、tensorboard或纯文本记录,不然精度波动真会把人逼疯。 -
业务指标高于学术指标
线上推理时,遇到可疑图片直接 fallback 到规则引擎,比一味追求 90% Adv ACC 更稳;毕竟生产事故是 100/0 的损益,而不是论文里的平均值。
八、开放问题与未来方向
-
多任务蒸馏
假如 teacher 额外承担 self-supervised 任务,能否让 student 获得更强的表示平滑性?这在视觉多模态(CLIP-like)里或许更值得赌一把。 -
物理世界扰动
ε-ball 之外,现实中还有雨天、刮花、打印再拍照。如何桥接数字噪声与物理畸变,是下一阶段的重头戏。 -
Certifiable Robustness
传统“经验鲁棒”仍逃不开攻守升级的军备竞赛。形式化验证(如 Interval Bound Propagation、CROWN)虽然开销大,却给了下限保证,值得关注。
九、结语
短短几个月下来,我对“安全”二字多了几分敬畏:
• FGSM 看似简陋,却一针见血;
• 蒸馏表面风光,暗地里可能遮蔽了梯度;
• 真正的鲁棒,离不开严苛而多维的评估。
面对瞬息万变的攻击技术,我们能做的只有两件事:一边保持好奇心,一边保持怀疑心。希望这篇嘚啵嘚能够让你看到实验室里那些反复爬坑的瞬间,也期待有更多同行一起把模型从“纸面精度”拽向“可信稳健”。
代码、配置文件与完整日志已同步至 GitHub(临时私库,比赛结束后将公开)。如果有任何问题或者想交换实验脚本,欢迎邮件骚扰。祝各位在对抗学习这条“显微镜下的霹雳舞”道路上,跳得比我更潇洒。
- 点赞
- 收藏
- 关注作者
评论(0)