GSM 攻击—防御蒸馏—梯度遮蔽—鲁棒性评估

举报
i-WIFI 发表于 2026/01/24 14:21:33 2026/01/24
【摘要】 一、写在前面第一次真正被“对抗样本(Adversarial Example)”这个概念震撼,是在深夜的实验室。那天我把一张 99% 识别率的手写数字图片加了一点几乎看不见的噪声,模型立刻把 8 认成了 3。屏幕里的结果让我忽然意识到:我们日常津津乐道的高准确率,其实隐藏着巨大的脆弱性。后来半开玩笑地和同门说:“如果说黑客是刀尖舞者,那搞对抗的人就是显微镜下跳霹雳”——动作极小,却能让系统原地...

一、写在前面

第一次真正被“对抗样本(Adversarial Example)”这个概念震撼,是在深夜的实验室。那天我把一张 99% 识别率的手写数字图片加了一点几乎看不见的噪声,模型立刻把 8 认成了 3。屏幕里的结果让我忽然意识到:我们日常津津乐道的高准确率,其实隐藏着巨大的脆弱性。后来半开玩笑地和同门说:“如果说黑客是刀尖舞者,那搞对抗的人就是显微镜下跳霹雳”——动作极小,却能让系统原地崩溃。

这篇文章想把最近几个月在“FGSM 攻击—防御蒸馏—梯度遮蔽—鲁棒性评估”这一完整闭环上的折腾体会,一股脑记录下来。一是交作业;二是给同样徘徊在对抗门口的朋友提供一份可落地的流水账,哪怕踩的坑能帮你少绕一两个弯,也算值得。

二、概念串联:从 FGSM 到梯度遮蔽

  1. FGSM(Fast Gradient Sign Method)

    • 论文首见于 2015 年 ICLR《Explaining and Harnessing Adversarial Examples》。
    • “一次性”攻击:沿着损失函数对输入的梯度符号方向,直接迈 epsilon 步。
    • 公式:x_adv = x + ε · sign(∇_x L(θ, x, y))
  2. 防御蒸馏(Defensive Distillation)

    • 原本是为压缩、加速模型提出的“知识蒸馏”副产物。
    • Papernot 在 2016 提出:用高温 Softmax 训练 teacher,再用 soft label 训练 student,可在一定程度上抑制 FGSM/Papernot 攻击成功率。
  3. 梯度遮蔽(Gradient Masking)

    • 任何让攻击者“看不清”真实梯度的技巧,统称梯度遮蔽。
    • 包括但不限于:随机化层、剪枝、非可导预处理、数值下采样,乃至某些“看似有效”的蒸馏策略。
    • 遮蔽≠防御:多数情况下只是把梯度藏起来,换 BPDA、EOT、二阶近似等进攻方式后仍被攻破。
  4. 模型鲁棒性评估

    • 静态指标:对抗准确率(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()

注意两点实践“小坑”:

  1. 蒸馏时不要忘了学生输出同样除以 T;预测阶段再乘回来,否则精度掉头就走。
  2. 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%,毫无疑问是典型梯度遮蔽。

下面拆成三条具体体会:

  1. 蒸馏的有效窗口

    • 温度太低(T<5)基本等于没蒸馏;太高(T>40)会导致学生难以收敛。实验表明 T=15~25 折中最佳。
    • ε 在 2/255 时差距最明显,往上增大,蒸馏优势递减。
  2. 遮蔽≠鲁棒

    • 如果一个防御对 FGSM 好、对 PGD 差,那十有八九在遮蔽。
    • 最简检验:用 BPDA 或者加点噪声重估梯度,再打一遍。
  3. 评估指标千万别偷懒

    • 仅靠 FGSM 会高估防御效果 20~50 个百分点。
    • AutoAttack 足够强,但建议再跑个随机初始化版本,避免偶然性。

六、关于鲁棒性评估的“人话”注解

  1. Adv ACC 本质是“在约束条件 C 下模型还能对几张图片给出正确标签”。C 可以是 L∞(ε)、L2(δ) 或物理世界旋转/亮度变换。指标直观,但过于依赖具体 ε,容易被“调参—秀分”。
  2. CLEVER 倾向于理论上界,算法复杂度高,不适合大规模数据集线上监控。
  3. AutoAttack(AA)是社区共识的“综合大杀器”,因为它集合了 FAB、Square、APGD 等子攻击,cover 了梯度可导和不可导的场景。实务中,先跑 AA,过了再考虑细节。

七、从实验到生产:我踩过的 5 个坑

  1. 数据增广误以为防御
    有同学加了 CutMix、RandAugment,看起来对抗准确率变高,其实是训练集被动引入了“局部扰动”,与真正的 adversary 仍有差距。

  2. BatchNorm 的怼脸反噬
    蒸馏 teacher ⇒ student 时,如果 teacher 用的是 batchnorm,而 inference 阶段 batchsize 很小,统计量失真会导致鲁棒性跳水。

  3. 混合精度的暗箭
    FGSM/PGD 的 ε 量级很小,float16 下极易被舍入为 0,造成结果失真。实测请关闭 AMP 或 selective cast。

  4. 日志与版本不可或缺
    攻防实验赞成“一把梭”循环调参,可千万别忘了 wandbtensorboard 或纯文本记录,不然精度波动真会把人逼疯。

  5. 业务指标高于学术指标
    线上推理时,遇到可疑图片直接 fallback 到规则引擎,比一味追求 90% Adv ACC 更稳;毕竟生产事故是 100/0 的损益,而不是论文里的平均值。

八、开放问题与未来方向

  1. 多任务蒸馏
    假如 teacher 额外承担 self-supervised 任务,能否让 student 获得更强的表示平滑性?这在视觉多模态(CLIP-like)里或许更值得赌一把。

  2. 物理世界扰动
    ε-ball 之外,现实中还有雨天、刮花、打印再拍照。如何桥接数字噪声与物理畸变,是下一阶段的重头戏。

  3. Certifiable Robustness
    传统“经验鲁棒”仍逃不开攻守升级的军备竞赛。形式化验证(如 Interval Bound Propagation、CROWN)虽然开销大,却给了下限保证,值得关注。

九、结语
短短几个月下来,我对“安全”二字多了几分敬畏:
• FGSM 看似简陋,却一针见血;
• 蒸馏表面风光,暗地里可能遮蔽了梯度;
• 真正的鲁棒,离不开严苛而多维的评估。

面对瞬息万变的攻击技术,我们能做的只有两件事:一边保持好奇心,一边保持怀疑心。希望这篇嘚啵嘚能够让你看到实验室里那些反复爬坑的瞬间,也期待有更多同行一起把模型从“纸面精度”拽向“可信稳健”。

代码、配置文件与完整日志已同步至 GitHub(临时私库,比赛结束后将公开)。如果有任何问题或者想交换实验脚本,欢迎邮件骚扰。祝各位在对抗学习这条“显微镜下的霹雳舞”道路上,跳得比我更潇洒。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。