假设你是一位博物馆馆长,新来的 AI 鉴宝专家眼光锐利、从不走神。有一天,有人送来一幅画,你和所有人类专家都认定它是梵高的《向日葵》,可 AI 鉴宝专家却斩钉截铁地宣布:这是莫奈的《睡莲》。不是你眼瞎,而是那幅画被做了手脚——有人用几乎看不见的细微笔触,在画面上施加了“定向魔法”,恰好戳中了 AI 专家最敏感的认知死角。这幅让人类看不出差别、却能让 AI 彻底认错的“高仿赝品”,就是对抗样本。 对抗样本生成技术,是 AI 安全测试中最重要的“找茬工具”。它像造假集团研究鉴宝专家一样,研究模型在什么情况下会看走眼:有的手法是照着专家鉴定手册精准动笔(FGSM),有的是反复临摹、一步步逼近(PGD),有的干脆闭眼批量繁殖赝品、优胜劣汰(遗传算法)。研究这些手法,不是为了造假,而是为了在模型真正上岗前,主动替它找出所有容易被骗的盲区,这就是 AI 评测与安全测试的核心工作。

岗位关联

掌握对抗样本生成技术,你就拥有了“主动探测模型弱点”的能力,可以在模型上线前量化其鲁棒性水平,是 AI 评测工程师、安全测试专家的核心技能。

目录
  1. 可视化演示
  2. 对抗样本初识
  3. 攻击分类框架
  4. FGSM快速攻击
  5. PGD迭代攻击
  6. 遗传算法攻击
  7. 扰动评估指标
  8. 防御与评测应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示从原始输入到模型欺骗的完整对抗样本生成链路,含梯度方向可视化和黑盒迁移攻击,粒子流动模拟攻击过程,点击按钮切换不同攻击方法

本节配有交互动效(进入视口后自动加载,约 3KB)。

对抗样本攻击全链路 原始输入经梯度计算生成扰动 微小扰动叠加生成对抗样本 对抗样本欺骗目标模型预测 攻击成功率评估模型鲁棒性 五步管道生成对抗样本评估模型安全

对抗样本初识

想象你是一名古画修复师,每天的工作是分辨真品和赝品。有一天,你遇到一幅画,肉眼看去明暗、笔触、色彩都无可挑剔,可一位经验老到的 AI 鉴宝专家却把它认成了另一幅画。你反复对比,发现画上多了几个你几乎注意不到的色点。这就是对抗样本的世界:对原始数据施加微小而刻意的扰动,让模型以高置信度输出错误结果,而人类的感官完全无法察觉差异。

为什么模型会如此“眼瞎”?深度学习模型本质上是高维空间中的复杂函数,它对输入极其敏感。就像鉴宝专家靠几个局部特征做判断一样,模型在训练中学会的决策依据,可能被某些极端细微的模式轻易推翻。研究者发现,只要沿着让损失函数增大的方向施加一点点扰动,模型的预测就会剧烈偏移——这正是对抗样本存在的根源。

对抗样本的形式化定义如下:给定原始输入 \(x\) 与真实标签 \(y\),要求生成一个扰动后的样本 \(x_{\text{adv}}\),使它被模型 \(f\) 误分类,同时扰动幅度被限制在用户不可感知的范围内。

回到博物馆的比喻:\(\varepsilon\) 就是“允许造假的程度”——改动太多,肉眼一眼看穿,赝品就失败;改动太少,又骗不过 AI 专家。对抗样本的研究,就是在这条钢丝上寻找平衡。

xadv=x+δ,s.t.f(xadv)≠y,∥δ∥p≤ε\displaystyle x_{\text{adv}} = x + \delta, \quad \text{s.t.} \quad f(x_{\text{adv}}) \ne y, \quad \|\delta\|_p \le \varepsilon
这个式子是在说:我们要在“改动幅度不超过 \(\varepsilon\)”的约束下,找出一个让模型判断出错的新样本。
  1. 原始输入 \(x\)被攻击的原始样本,比如一张正常的猫的照片。
    xx
  2. 扰动向量 \(\delta\)叠加在原始样本上的微小改动,通常是肉眼不可见的噪声。
    δ\delta
  3. 对抗样本生成把原始样本和扰动相加,得到新的样本。
    xadv=x+δx_{\text{adv}} = x + \delta
  4. 误判约束模型对对抗样本的输出必须不等于原始标签 \(y\),即“骗过专家”。
    f(xadv)≠yf(x_{\text{adv}}) \ne y
  5. 预算约束扰动的 \(p\) 范数不超过 \(\varepsilon\),保证改动足够隐蔽、不被人类发现。
    ∥δ∥p≤ε\|\delta\|_p \le \varepsilon

攻击分类框架

造假集团实施计划前,首先要弄清楚一个问题:我们到底掌握多少关于 AI 鉴宝专家的信息?是搞到了它的鉴定手册(模型参数),还是只能把画递过去看它的表情(模型输出)?根据信息掌握程度,对抗攻击被分为白盒攻击、黑盒攻击和灰盒攻击三类。

白盒攻击是最理想的“内鬼”场景:攻击者完全掌握模型结构、权重、梯度信息,就像拿到了专家的全套鉴定笔记,可以直接计算“往哪个方向改最容易骗过专家”。FGSM 和 PGD 这类基于梯度的攻击,都是典型白盒攻击。它们的优点是精度高、效果好,缺点是现实中很难拿到模型的内部信息。

黑盒攻击则相反:攻击者只能像普通访客一样,把画递给专家看,根据“点头还是摇头”(模型输出)来反复试探。虽然无法直接计算梯度,但可以通过观察大量输入输出对,估计出模型的行为边界。遗传算法攻击就是黑盒场景的代表——不需要任何梯度信息,只凭“猜-试-改”的循环就能造出赝品。灰盒攻击介于两者之间,比如攻击者知道模型架构但不知道具体参数,或者只能访问部分 API 接口。

| 攻击类型 | 掌握信息 | 典型方法 | 适用场景 |

|---------|---------|---------|---------|

| 白盒攻击 | 完整模型与梯度 | FGSM、PGD | 内部安全测试、开源模型审计 |

| 黑盒攻击 | 仅输入输出 | 遗传算法、迁移攻击 | 商业 API 安全评估 |

| 灰盒攻击 | 部分信息 | 模型窃取攻击 | 半开放平台测试 |

在实际评测中,攻击类型的选择取决于评测目标:如果想知道模型理论上的“最脆弱程度”,用白盒;如果想模拟真实世界中的恶意攻击者,黑盒更贴近现实。就像造假集团既可能买通内鬼(白盒),也可能只靠一次次试递画作来摸索规律(黑盒),两种情报水平决定了完全不同的作案手法。

FGSM快速攻击

现在你搞到了一本 AI 鉴宝专家的鉴定手册,里面记录了它判断一幅画是否为真品的全部偏好。你想快速做出一幅能骗过它的赝品,最直接的办法是什么?答案是:找到专家最敏感的“笔法方向”,然后在这个方向上用力画上一笔。这就是 FGSM(快速梯度符号法) 的直觉——利用梯度,找出能让模型损失函数上升最快的方向,然后一步到位地移动。

FGSM 是 Ian Goodfellow 等人提出的最早也最经典的对抗攻击方法。它的核心洞察是:深度学习模型在高维空间中表现得像线性模型,输入在每个维度上只要偏移一点点,累积效应就足以彻底改变输出。因此,攻击者不需要精心设计复杂的图像,只需要求得损失函数对输入的梯度,取其符号,再乘以一个扰动幅度即可。

FGSM 最大的优点是快:一次前向传播、一次反向传播,就能生成对抗样本,适合大规模批量测试。但缺点也很明显:因为只走一步,攻击强度有限,有时无法保证一定骗过专家。这就好比造假集团只改了专家最在意的那个特征,但如果专家还有别的判断依据,这笔“重注”可能落空。要追求更强的攻击效果,需要更耐心的“多步微调”。

xadv=x+ε⋅sign(∇xJ(θ,x,y))\displaystyle x_{\text{adv}} = x + \varepsilon \cdot \text{sign}\left(\nabla_x J(\theta, x, y)\right)
这个公式是说:先算出“改变图像会使模型损失变大”的方向,然后沿这个方向统一移动 \(\varepsilon\) 的距离,生成最终对抗样本。
  1. 计算梯度 \(\nabla_x J(\theta, x, y)\)对原始输入 \(x\) 求模型损失函数的梯度,梯度指向“让模型误判最有效”的方向。
    ∇xJ(θ,x,y)\nabla_x J(\theta, x, y)
  2. 符号函数 \(\text{sign}(\cdot)\)把梯度向量压缩成只含 \(+1\) 和 \(-1\) 的方向信号,保证每一维都按统一幅度扰动。
    sign(∇xJ(θ,x,y))\text{sign}(\nabla_x J(\theta, x, y))
  3. 扰动预算 \(\varepsilon\)控制每一步偏移的大小,\(\varepsilon\) 越大攻击越强,但赝品越容易被肉眼发现。
    ε⋅sign(∇xJ(θ,x,y))\varepsilon \cdot \text{sign}(\nabla_x J(\theta, x, y))
  4. 生成对抗样本将原始样本与扰动叠加,得到最终的攻击图像。
    xadv=x+ε⋅sign(∇xJ(θ,x,y))x_{\text{adv}} = x + \varepsilon \cdot \text{sign}(\nabla_x J(\theta, x, y))

PGD迭代攻击

FGSM 的一步式攻击就像是赌徒一把押注,赌对了自然一步登天,赌错了就前功尽弃。而 PGD(投影梯度下降法) 则更像老练的造假师:每一次只做小幅修改,做完立刻把成品和原作对照,确保改动没超过可察觉限度,然后从新的位置继续试探。它把一次性的大冒险,变成了稳扎稳打的多步改进。

PGD 的攻击流程可以这样理解:从原始图像出发(或者从一个随机扰动点出发),每轮沿着当前梯度符号方向前进一步,步长为 \(\alpha\),但每走完一步都要检查自己是否超出了 \(\varepsilon\) 的扰动预算——如果超出了,就把扰动“投影”回允许范围内,相当于画师每次改完几笔都要退远一步,确认整幅画仍然看起来像原作。如此反复迭代 \(T\) 轮,直到模型被彻底骗过。

PGD 与 FGSM 的对比,就像“一次改一笔”与“一笔改到底”的区别。PGD 虽然计算量更大,但由于每次修改都经过“检查 + 投影”,它生成的赝品既能保证不被肉眼识破,又能持续增强欺骗效果。在评测中,PGD 常常被当作“强攻击基线”——如果一个模型能扛住 PGD 的攻击,那它对大多数较弱攻击都是安全的。

xt+1=Clipx,ε(xt+α⋅sign(∇xJ(θ,xt,y)))\displaystyle x^{t+1} = \text{Clip}_{x,\varepsilon}\left(x^{t} + \alpha \cdot \text{sign}\left(\nabla_x J(\theta, x^{t}, y)\right)\right)
这个公式描述了一轮迭代:先沿梯度方向迈一小步,再把结果裁剪回以原始样本为中心、半径为 \(\varepsilon\) 的邻域内。
  1. 迭代变量 \(x^{t}\)第 \(t\) 轮攻击时的候选对抗样本,初始可以是原始样本或随机扰动的结果。
    xtx^{t}
  2. 小步步长 \(\alpha\)每轮改动的幅度,通常远小于 \(\varepsilon\),保证每一步都足够精细。
    α⋅sign(∇xJ(θ,xt,y))\alpha \cdot \text{sign}(\nabla_x J(\theta, x^{t}, y))
  3. 投影裁剪 \(\text{Clip}_{x,\varepsilon}(\cdot)\)把每次更新后的样本限制在原始样本 \(x\) 的 \(\varepsilon\) 邻域内,防止扰动超出不可感知的范围。
    Clipx,ε(⋅)\text{Clip}_{x,\varepsilon}(\cdot)
  4. 迭代更新将裁剪后的结果作为下一轮起点,重复 \(T\) 次后得到最终对抗样本。
    xt+1=Clipx,ε(xt+α⋅sign(∇xJ(θ,xt,y)))x^{t+1} = \text{Clip}_{x,\varepsilon}\left(x^{t} + \alpha \cdot \text{sign}(\nabla_x J(\theta, x^{t}, y))\right)

遗传算法攻击

如果拿不到鉴定手册,甚至不知道 AI 专家是什么架构,造假集团还能得手吗?历史告诉我们:能。那些没见过专家笔记的造假者,靠的是最原始也最有效的方法——大量试错与优胜劣汰。这对应到 AI 安全领域,就是基于遗传算法的黑盒攻击。

遗传算法不依赖任何梯度信息,它模仿生物进化:首先随机生成一批候选扰动,把它们分别叠加到原始图像上,得到一群“赝品候选者”;然后让 AI 专家对每个候选打分,看谁最接近“骗过专家”的目标;接着挑选得分最高的个体,让它们进行交叉和变异,生成新一代赝品。如此循环迭代,赝品的欺骗能力一代比一代强。

在这个进化过程中,对每个候选个体的“欺骗程度”打分,称为适应度评估。攻击目标通常是让模型把对抗样本错分为指定的目标类别,因此适应度函数可以定义为模型输出目标类别的概率:

遗传算法攻击的精髓在于“无梯度也能优化”:它把黑盒模型的每一次输出都当作“专家反馈”,通过种群进化逐步逼近最优赝品。它的代价是访问次数多——每次进化都要向模型发起大量查询请求,可能被 API 流量限制所拦。但它也揭示了残酷的事实:即使完全不了解模型内部结构,只要耐心足够,AI 一样可以被一步步“骗”过去。

fitness(x′)=P(ytarget∣x′)\displaystyle \text{fitness}(x') = P(y_{\text{target}} \mid x')
这里衡量的是:“在当前这批赝品中,这幅画被 AI 专家认成目标名画的概率有多高?”概率越高,这个体的繁殖权越大。
  1. 候选个体 \(x'\)种群中的一个样本,即原始图像叠加了某个候选扰动后的结果。
    x′x'
  2. 目标标签 \(y_{\text{target}}\)攻击者希望模型输出的错误类别,例如把“猫”伪装成“狗”。
    ytargety_{\text{target}}
  3. 条件概率 \(P(y_{\text{target}} \mid x')\)模型将输入 \(x'\) 判别为目标类别的置信度,也是遗传算法中的适应度。
    P(ytarget∣x′)P(y_{\text{target}} \mid x')
  4. 适应度定义用置信度作为进化选择的依据,置信度越高的个体越容易进入下一代。
    fitness(x′)=P(ytarget∣x′)\text{fitness}(x') = P(y_{\text{target}} \mid x')

扰动评估指标

赝品造好了,怎么验收它是否合格?造假集团需要两个数据:一是“送检成功率”,二是“与真品的相似度”。在对抗攻击中,这两项分别对应攻击成功率(ASR) 和扰动幅度度量,共同构成评估攻击效果的核心指标。

攻击成功率衡量的是“骗过专家的比例”:在测试集 \(N\) 个样本全部被施加攻击后,模型预测出错的比例。它是最直观的攻击强度指标——成功率越高,说明模型越脆弱。注意,这里统计的是“被判错的样本数”,而非“被正确识别的样本数”。

攻击成功率之外,扰动幅度决定“赝品是否暴露”。最常用的是 \(L_\infty\) 范数,衡量所有像素中最大的改动量:

它的含义很直观:赝品与原作之间最扎眼的那处差别有多大。评测团队通常要求“ASR 越高越好、扰动越小越好”,两者结合才能判断攻击是否真正具有威胁。如果一幅“赝品”需要大改特改才能骗过专家,那它在现实中根本不具备隐蔽性,也就构不成真正的安全风险。

ASR=1N∑i=1NI(f(xadv,i)≠yi)\displaystyle \text{ASR} = \frac{1}{N}\sum_{i=1}^{N} \mathbb{I}\left(f(x_{\text{adv}, i}) \ne y_i\right)
这个公式计算出所有对抗样本中,让模型发生误判的样本所占比例。\(\mathbb{I}\) 是“记录器”:条件成立记 1,不成立记 0。
  1. 样本总数 \(N\)参与评估的对抗样本数量,样本越多,统计结果越可靠。
    NN
  2. 指示函数 \(\mathbb{I}(\cdot)\)一个判断开关,当内部条件为真时返回 1,否则返回 0,用来记录每次攻击是否成功。
    I(f(xadv,i)≠yi)\mathbb{I}\left(f(x_{\text{adv}, i}) \ne y_i\right)
  3. 求和累加将所有成功的攻击次数加总,得到攻击成功的样本总数。
    ∑i=1NI(⋅)\sum_{i=1}^{N} \mathbb{I}(\cdot)
  4. 平均除以样本总数,得到 0 到 1 之间的攻击成功率。
    ∥δ∥∞=max⁡i∣xadv,i−xi∣\displaystyle \|\delta\|_\infty = \max_i \left| x_{\text{adv}, i} - x_i \right|

防御与评测应用

知道了造假集团的种种手法,博物馆该如何应对?答案是:主动用这些赝品来训练鉴宝专家。AI 安全领域把这套思路称为对抗训练——在训练过程中不断生成对抗样本并让模型学习识别它们,相当于让专家反复观摩各种高仿赝品,练出火眼金睛。对抗训练是最经典、也最有效的鲁棒性提升手段。

不过,防守方还需要一套炼金术式的验证体系:模型到底能扛住多强的攻击?这就轮到评估指标登场了。评测团队用对抗样本对模型发起攻击,并记录鲁棒精度——即在对抗攻击下仍能正确分类的样本比例:

在真实安全测试中,评测团队会综合使用 FGSM、PGD、遗传算法等多种攻击手段,分别测试模型在不同威胁模型下的表现,然后输出一份鲁棒性报告。正如博物馆不会只请一位专家看画,而是让多位专家反复交叉检验,AI 模型的防御能力也需要在持续攻击中不断被锤炼和证明。

Racc=1N∑i=1NI(f(xadv,i)=yi)\displaystyle R_{\text{acc}} = \frac{1}{N}\sum_{i=1}^{N} \mathbb{I}\left(f(x_{\text{adv}, i}) = y_i\right)
与攻击成功率正好互补:ASR 关注“被骗了多少”,鲁棒精度关注“守住多少”。两者相加不为 1 时,通常是因为存在置信度等附加条件。
  1. 鲁棒精度定义统计在对抗样本攻击下模型仍保持正确预测的样本占比。
    Racc=1N∑i=1NI(f(xadv,i)=yi)R_{\text{acc}} = \frac{1}{N}\sum_{i=1}^{N} \mathbb{I}\left(f(x_{\text{adv}, i}) = y_i\right)
  2. 正确分类条件指示函数内部要求模型预测等于真实标签,即“没被骗”。
    I(f(xadv,i)=yi)\mathbb{I}\left(f(x_{\text{adv}, i}) = y_i\right)
  3. 评测流程闭环原始精度 → 攻击生成 → 对抗评估 → 防御迭代,形成安全测试的完整闭环。
    评测=攻击+防御+度量\text{评测} = \text{攻击} + \text{防御} + \text{度量}

AI 应用场景

自动驾驶视觉模型鲁棒性验收

阶段:模型上线前的安全测试与鲁棒性评估

解决的问题:传统测试只用真实拍摄的路况图片,无法覆盖极端干扰场景。自动驾驶的感知模型一旦被对抗样本欺骗(如把“停车标志”识别成“限速标志”),后果不堪设想。白盒 FGSM/PGD 攻击可以在不改变交通标志物理外观的前提下,生成让模型误判的对抗图案,从而提前暴露风险。

具体案例:某自动驾驶团队在车辆上线前,使用 PGD 方法对视觉识别模型进行 1000 张交通标志的对抗样本测试。结果发现模型对“停止”标志的攻击成功率高达 72%,团队随即启动对抗训练加固模型,将攻击成功率降至 15% 以下,并输出了一份完整的鲁棒性验证报告。

人脸识别门禁系统的黑盒安全评估

阶段:AI 系统部署后的安全审计与渗透测试

解决的问题:商业门禁系统通常只提供 API 接口,评测方拿不到模型权重与梯度,传统白盒攻击无法使用。遗传算法攻击只需向 API 发送图像并读取识别结果,就能迭代生成眼镜框、贴纸等物理对抗扰动,模拟真实攻击者的行为。

具体案例:某安防评测机构受委托评估一家人脸识别门禁系统。评测团队用遗传算法生成 500 代对抗眼镜框样本,最终使系统将“受试者 A”误识别为“受试者 B”的概率从 2% 提升到 68%,证明该系统存在严重安全隐患,推动了厂商升级活体检测模块。

AI 医疗影像模型的防御效果验证

阶段:模型开发完成后的鲁棒性评测阶段

解决的问题:医学影像模型直接关系到诊断安全,而细微的对抗扰动可能导致病灶被漏检或误判。评测团队需要在模型提交监管部门前,量化其对抗鲁棒性,用统一的评估指标(ASR、扰动幅度、鲁棒精度)给出科学结论。

具体案例:某医院影像 AI 项目在临床试用前,评测团队用 FGSM 和 PGD 对肺结节检测模型发起攻击,并计算不同扰动预算下的 ASR 曲线。测试发现当 \(\varepsilon=0.05\) 时,模型对微小结节的召回率显著下降。医院随即调整模型输入预处理策略,并补充对抗训练数据,最终通过了安全验收。

Python 演示

python49 行
import torchimport torch.nn as nnimport torch.nn.functional as F class Net(nn.Module):    def __init__(self):        super().__init__()        self.conv1 = nn.Conv2d(1, 8, 3, padding=1)        self.fc = nn.Linear(8 * 14 * 14, 10)     def forward(self, x):        x = F.relu(F.max_pool2d(self.conv1(x), 2))        return self.fc(x.flatten(1)) def fgsm(model, x, y, eps=0.3):    xa = x.clone().detach().requires_grad_(True)    loss = F.cross_entropy(model(xa), y)    model.zero_grad()    loss.backward()    return xa.detach() + eps * xa.grad.sign() def attack_accuracy(model, loader, eps):    total = ok = 0    for x, y in loader:        pred = model(fgsm(model, x, y, eps)).argmax(1)        ok += (pred != y).sum().item()        total += y.size(0)    return ok / total def main():    torch.manual_seed(0)    model = Net()    opt = torch.optim.Adam(model.parameters(), lr=1e-3)    xb = torch.randn(64, 1, 28, 28)    yb = torch.randint(0, 10, (64,))    for _ in range(300):        loss = F.cross_entropy(model(xb), yb)        opt.zero_grad()        loss.backward()        opt.step()    xt = torch.randn(64, 1, 28, 28)    yt = torch.randint(0, 10, (64,))    clean = (model(xt).argmax(1) == yt).float().mean().item()    asr = attack_accuracy(model, [(xt, yt)], eps=0.3)    print("clean acc:", round(clean, 4))    print("attack success:", round(asr, 4)) if __name__ == "__main__":    main()
目的:演示 FGSM 白盒攻击的完整流程——训练一个简单卷积网络,然后在随机测试集上计算原始准确率与攻击成功率。
  1. xa = x.clone().detach().requires_grad_(True)复制输入张量并开启梯度记录,避免污染原始数据。
  2. loss = F.cross_entropy(model(xa), y)计算模型对当前输入的预测损失,攻击的目标就是让这个损失变大。
  3. xa.grad.sign()提取梯度符号,得到“最能让损失变大的方向”。
  4. return xa.detach() + eps * xa.grad.sign()沿方向偏移 \(\varepsilon\) 并停止梯度追踪,返回对抗样本。
  5. model(fgsm(model, x, y, eps)).argmax(1)用模型推理攻击结果并取最高概率类别。
  6. (pred != y).sum().item()统计被成功欺骗的样本个数,用于计算攻击成功率。
  7. attack_accuracy(model, [(xt, yt)], eps=0.3)封装攻击评估流程,输入测试数据与扰动预算 \(\varepsilon\)。

常见误区

误区“对抗样本就是给图片加一点随机噪点,跟噪声污染是一回事,随机加噪声就能让模型出错。”

正解对抗样本与随机噪声有本质区别。随机噪声没有方向性,对模型的干扰是有限的;而对抗样本的扰动是精确计算出来的——沿着损失函数的梯度方向施加,好比造假者专门挑专家最敏感的笔触下功夫,而不是在整幅画上乱涂。实验中同样大小的随机噪声通常几乎不影响模型判断,而对抗扰动却能以接近 100% 的概率骗过模型。

为何常见:因为对抗样本图像在肉眼看来就是“有点糊、有点花”,人们自然把它等同于噪声。只有对比过同一噪声幅度下随机噪声与对抗噪声的效果差异,才能领会“定向”与“随机”的天壤之别。

误区“只要用了 FGSM 公式,扰动也设了,生成的样本就一定能让模型认错。”

正解FGSM 是单步攻击,只沿着当前梯度方向走一步,可以理解为“只看了一眼鉴定手册就下笔”。如果模型的决策边界在局部弯曲复杂,这一步可能跨不过去。实际评测中 FGSM 的攻击成功率往往低于 PGD,这也是为什么严格评测需要同时报告多种攻击方法的结果。

为何常见:初学者看到 FGSM 简洁的公式和“对抗样本之父”的光环,容易误以为它是万能钥匙。实际上它只是基线方法,迭代式的 PGD 才是更强攻击的代表。

误区“黑盒攻击不知道模型参数,效果肯定比白盒差一截,所以评测只用白盒就够。”

正解黑盒攻击确实“情报”更少,但遗传算法等方法通过大量查询反馈同样可以达到甚至超过白盒攻击的成功率,尤其是当模型有较强过拟合时,进化搜索能找到白盒梯度很难发现的脆弱点。真实威胁场景中,攻击者通常就是黑盒的,因此黑盒攻击的评测结论更有实战参考价值。

为何常见:人们天然认为“知道越多越厉害”,却忽略了黑盒攻击拥有“无限试错”的灵活性和迁移性。评测若只看白盒结果,会严重高估模型在现实中的安全性。

误区“攻击成功率不够就调大 \(\varepsilon\),反正目标只是骗过模型。”

正解\(\varepsilon\) 越大,对抗样本越容易被“投影裁剪”逻辑拦下,同时人眼也会察觉扰动,违背对抗样本“不可感知”的前提。更重要的是,评测体系要求攻击在隐蔽约束内有效,一个需要大幅改动才能成功的攻击,在实际场景中没有应用价值。评测报告应同时给出不同 \(\varepsilon\) 下的 ASR 曲线,而非追求单一数值最大化。

为何常见:初学者容易以为“攻击就是对抗”,忽略对抗样本的核心约束——既骗得过 AI,又瞒得过人类。一旦 \(\varepsilon\) 突破感知阈值,问题就变成了“普通图像篡改”而非对抗攻击。

误区“模型做过对抗训练就万事大吉,以后所有对抗样本都骗不了它。”

正解对抗训练只是把模型对训练时见过的攻击类型的抵抗力提高了,但它存在“鲁棒性过拟合”问题:面对更强的 PGD 攻击、未知的攻击算法,或者攻击者改变了扰动预算,模型依然可能被攻破。就像鉴宝专家练熟了赝品 A 的套路,却可能在赝品 B 面前翻车。防御是持续对抗的过程,不存在一劳永逸的免疫力。

为何常见:对抗训练在标准测试集上确实能把攻击成功率压得很低,给人一种“已免疫”的错觉。实际上安全评测必须持续引入新攻击手段,才能防止防御措施被针对性地绕过。

面试题

Q1. 对抗样本的核心定义是?

单选题 · easy

  • A.给图片添加随机颜色噪声
  • B.对模型训练数据的随机增广
  • C.刻意扰动人眼识别的干扰
  • D.扰动输入使模型错误预测← 正确答案

答案:D。对抗样本的关键在于“刻意”和“误导模型”:在输入上叠加精心计算的微小扰动,使模型预测出错,同时人眼难以察觉。A 是随机噪声,B 是训练技巧,C 描述的是面向人类的干扰,都不符合定义。

Q2. FGSM 中参数 ε 的主要作用是?

单选题 · easy

  • A.控制扰动幅度上限← 正确答案
  • B.决定模型训练轮数
  • C.调节梯度下降速度
  • D.指定攻击目标类别

答案:A。ε 是扰动预算,约束对抗样本与原始样本的最大差异,对应“赝品与原作的最大改动额度”。它不控制训练轮数、学习率,也不负责指定目标类别,后者由损失函数中的目标标签决定。

Q3. 白盒攻击与黑盒攻击的主要区别是?

单选题 · easy

  • A.白盒可使用模型梯度← 正确答案
  • B.黑盒攻击速度更快
  • C.白盒不需要任何信息
  • D.黑盒无法实施攻击

答案:A。白盒攻击能访问模型权重与梯度,可精确计算扰动方向,如同拿到专家鉴定手册;黑盒攻击只能通过输入输出交互试探。黑盒速度通常更慢但依然高效,并非无法攻击。

Q4. FGSM 使用符号函数的主要原因是什么?

单选题 · mid

  • A.只保留梯度方向信息← 正确答案
  • B.加快模型推理速度
  • C.绕过梯度消失问题
  • D.让损失函数值变小

答案:A。符号函数把梯度的幅度归一化,只保留方向信息,使每个维度的扰动幅度统一为 ε。它不是为提速、防梯度消失,也不是为了降低损失——恰恰相反,它要让损失增大。

Q5. PGD 攻击相比 FGSM 的显著优势是?

单选题 · mid

  • A.无需任何模型反馈
  • B.通过多步迭代更强← 正确答案
  • C.计算速度大幅提升
  • D.不需要设置扰动

答案:B。PGD 由多轮“小步走 + 投影裁剪”组成,每轮都能微调扰动,使对抗样本逐步逼近最强的攻击状态,因此成功率通常更高。它需要模型反馈、计算量更大,也必须设置扰动预算。

Q6. 攻击成功率 ASR 度量的是?

单选题 · mid

  • A.模型训练的收敛速度
  • B.对抗样本被误判比例← 正确答案
  • C.扰动幅度的平均值
  • D.原始数据的准确率

答案:B。ASR = 被模型误判的对抗样本数 / 总样本数,衡量“赝品骗过专家的比例”。它不关心训练速度、扰动大小,也不评估干净数据上的精度。ASR 越高说明模型越脆弱。

Q7. PGD 中投影裁剪操作的主要目的是?

单选题 · mid

  • A.让噪声分布更均匀
  • B.提高梯度的计算速度
  • C.保持扰动在预算范围← 正确答案
  • D.增加模型的输出置信度

答案:C。投影裁剪将每轮更新后的扰动拉回以原始样本为中心、半径为 ε 的邻域,确保对抗样本不超出不可感知范围。它不是均匀化噪声,也不管梯度速度或置信度。

Q8. 遗传算法攻击的组成部分包括?

多选题 · mid

  • A.初始化候选扰动种群← 正确答案
  • B.按适应度筛选个体← 正确答案
  • C.计算模型输入梯度
  • D.交叉变异生成新个体← 正确答案

答案:ABD。遗传算法包含种群初始化、适应度评估、选择、交叉、变异等进化步骤,整个流程不依赖梯度计算。选项 C 是白盒攻击的操作,不属于遗传算法的必要组成。

Q9. 关于对抗训练的正确说法是?

单选题 · hard

  • A.可以完全消除模型漏洞
  • B.只能防住训练时攻击类型← 正确答案
  • C.对抗训练后模型不会错
  • D.会让模型参数数量减少

答案:B。对抗训练通过把对抗样本加入训练集提升鲁棒性,但存在鲁棒性过拟合,对未见过攻击仍可能失效。它无法消除所有漏洞,也不减少参数,只是增强特定扰动下的防御能力。

Q10. 评估模型鲁棒性时,应该报告哪些指标?

多选题 · hard

  • A.攻击成功率 ASR← 正确答案
  • B.扰动幅度预算曲线← 正确答案
  • C.鲁棒精度下降幅度← 正确答案
  • D.模型训练集大小

答案:ABC。完整的鲁棒性评估需要同时报告 ASR、不同 ε 下的扰动幅度曲线、以及鲁棒精度等指标,才能综合判断攻击威胁与隐蔽性。训练集大小与模型鲁棒性没有直接因果关系。