第二章:对抗攻击基础
好,咱们正式开始聊对抗攻击。说实话,这个概念刚出来的时候,我第一反应是「这怎么可能?」——一张图片,人眼看还是猫,模型却认成了狗。后来自己动手复现了一次,才真正服气。
对抗攻击,说白了就是给正常样本加一点「人眼看不出的扰动」,让模型犯错。这个扰动,我们叫它对抗扰动。加上扰动后的样本,就是对抗样本。
核心定义:对抗样本 = 干净样本 + 微小扰动 → 模型误分类
2.1 对抗样本的概念
我习惯把对抗样本理解成「AI的视觉错觉」。就像下面这张图,人看还是熊猫,但模型可能认为它是长臂猿。
为什么会这样?因为模型的决策边界和人类的认知边界不一样。模型在高维空间里做判断,而我们生活在低维空间。你想想看,一个像素值从128变成129,人眼根本察觉不到,但模型可能就跨过了一条关键的决策线。
我在项目中遇到过最典型的例子:一个部署在手机上的人脸识别模型,用户只是把手机稍微倾斜了一下,光照变了几个像素值,模型就死活认不出人了。嗯,这就是对抗样本的雏形——只不过不是恶意攻击,而是自然扰动。
我的经验:对抗样本不是「黑客的玩具」。在自动驾驶、医疗影像这些场景里,自然噪声也可能产生对抗效果。所以理解对抗攻击,本质上是理解模型的脆弱性。
2.2 对抗攻击分类
攻击分类主要看攻击者对模型的了解程度。我把它分成两大类:白盒和黑盒。
2.2.1 白盒攻击
白盒攻击,就是攻击者知道模型的一切——结构、参数、梯度。这就像你拿着试卷的标准答案去考试,想怎么改就怎么改。
白盒攻击的核心是利用梯度信息。模型对输入的梯度,告诉我们「往哪个方向改,模型最容易被骗」。我个人习惯把梯度想象成「模型的软肋」——你轻轻戳一下,它就疼得跳起来。
2.2.2 黑盒攻击
黑盒攻击就难多了。攻击者只知道模型的输入和输出,不知道内部结构。这就像你只能通过敲门来猜屋里有什么家具。
黑盒攻击有两种常见思路:
- 查询攻击:不断给模型喂样本,看输出变化,慢慢摸索出规律
- 迁移攻击:用一个替代模型生成对抗样本,然后拿去攻击目标模型
我曾经做过一个测试:用白盒攻击生成的对抗样本,直接拿去攻击另一个结构完全不同的模型,成功率居然还有30%多。这说明什么?说明不同模型学到的「软肋」是相似的。
避坑指南:我曾经以为黑盒攻击必须用很多查询次数。后来发现,有时候10次查询就能找到有效的对抗扰动。关键是选对查询方向,而不是盲目乱试。
2.3 常见攻击算法
讲算法之前,我想先问一个问题:什么样的扰动是「好」的扰动?
答案很简单:扰动小,效果好。扰动太大,人眼能看出来,攻击就失败了。扰动太小,模型不受影响,也白搭。
2.3.1 FGSM(快速梯度符号法)
FGSM是最经典的对抗攻击算法,2014年由Goodfellow等人提出。它的思路极其简单:
# FGSM 核心公式
x_adv = x + ε * sign(∇_x J(θ, x, y))
解释一下:
x是原始输入ε是扰动大小,一般取0.01到0.1之间sign()是符号函数,取梯度的方向∇_x J是损失函数对输入的梯度
说白了,FGSM就是「沿着梯度方向走一步」。我刚开始学的时候觉得这太粗暴了,但实验证明它确实有效。为什么?因为高维空间里,即使只走一小步,也可能跨过决策边界。
关键点:FGSM是单步攻击,一次计算就生成对抗样本。速度快,但效果一般。适合快速验证。
2.3.2 PGD(投影梯度下降法)
PGD是FGSM的升级版。它不满足于只走一步,而是走多步,每一步都调整方向。
# PGD 核心思路(伪代码)
x_0 = x + random_noise # 随机初始化
for t in range(T):
x_t+1 = x_t + α * sign(∇_x J(θ, x_t, y))
x_t+1 = clip(x_t+1, x - ε, x + ε) # 投影回ε球内
PGD的关键在于:
- 随机初始化:从原始样本附近随机开始,避免陷入局部最优
- 多步迭代:每一步都重新计算梯度,更精准
- 投影约束:确保扰动不超过ε,人眼看不出来
我在项目中测试过,PGD的攻击成功率比FGSM高出20%到30%。但代价是计算量大了很多。你想想看,FGSM只需要一次前向传播和一次反向传播,PGD需要T次。
我的建议:做对抗训练时,用PGD生成的样本比FGSM更鲁棒。但如果你只是快速验证模型是否脆弱,FGSM就够了。别一上来就上PGD,浪费时间。
2.4 攻击评估指标
怎么判断攻击好不好?我一般看三个指标:
| 指标 | 含义 | 我的用法 |
|---|---|---|
| 攻击成功率 (ASR) | 对抗样本中让模型犯错的比例 | 越高越好,但别超过95%,否则可能是过拟合 |
| 扰动大小 (Lp范数) | 对抗样本与原始样本的差异 | 常用L2或L∞范数,越小越好 |
| 查询次数 | 黑盒攻击中需要多少次模型调用 | 越少越好,实战中超过1000次就不太现实 |
这三个指标要一起看。举个例子:
- ASR 90%但扰动很大 → 人眼能看出来,攻击失败
- 扰动很小但ASR只有10% → 攻击太弱,没意义
- 黑盒攻击查询了10000次 → 实战中早被检测系统发现了
我记得有一次做项目评估,团队里有人只盯着ASR看,觉得95%就万事大吉了。结果我一看扰动大小,L∞范数都到0.3了,图片明显有噪点。嗯,这种攻击在实际场景里根本用不了。
避坑指南:我曾经犯过一个错误——只报告ASR,不报告扰动大小。结果模型防御方说「你的攻击扰动太大,不算有效攻击」。从那以后,我每次评估都同时报告ASR和Lp范数,缺一不可。
2.5 本章小结
对抗攻击的基础就这些。总结一下:
- 对抗样本是加了微小扰动的输入,让模型犯错
- 白盒攻击利用梯度,黑盒攻击靠查询或迁移
- FGSM是单步快速攻击,PGD是多步精准攻击
- 评估指标要综合看ASR、扰动大小和查询次数
下一章我们会聊对抗防御。说实话,防御比攻击难多了——你永远不知道攻击者会从哪个角度下手。但别急,咱们一步步来。
一句话记住本章:对抗攻击不是魔法,是模型在高维空间里的「视觉盲区」。理解了这一点,你就掌握了对抗攻击的精髓。