门派里的年轻弟子小武,拳脚利落,可每次和陪练阿攻切磋,总会在同一个地方栽跟头——阿攻只是把拳头角度偏了两厘米,小武就认不出这是直拳,硬生生把它当成摆拳来防,被一招放倒。并非小武反应慢,而是他对“细微走样”毫无防备。深度学习模型也一样:给它看一张熊猫照片,像素被悄悄改动一点点,人眼完全无感,它却斩钉截铁地说是“长臂猿”。这种被精心打扮过、专门用来骗倒模型的输入,就叫对抗样本。 如何让模型像小武一样练就“任你微变招、我心如明镜”的本事?答案就是标准对抗训练(Adversarial Training,AT)。它像门派的日常对练:一个扮演进攻者的陪练不断寻找模型最薄弱的角落,模型则在这种“被针对”的训练下,把防守一步步练扎实。从对抗样本的定义、FGSM 与 PGD 两种攻击招式,到 min-max 博弈的训练公式、工程落地与评估,本文会跟着小武的练功日记,把 AT 的原理、算法、调配和落地讲得明明白白。

岗位关联

掌握标准对抗训练,是 AI 工程师走向安全防御方向的必修课。学会它,你就能主动找出模型的软肋并低成本补强,在自动驾驶、金融风控等安全敏感领域成为团队中不可替代的“防守大师”。

目录
  1. 可视化演示
  2. AT基本概念
  3. 对抗攻击方法
  4. 极小极大原理
  5. 算法实现
  6. 性能特性
  7. 优化策略
  8. 工程实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示归并排序的分治合并过程,观察子数组逐步合并为有序序列,理解时间复杂度的构成。

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

归并排序分治合并 红色为当前合并区间 绿色为已排序部分 T(n)=O(n log n) 自底向上逐层合并有序子数组。

AT基本概念

小武是门派里最认真的弟子,但每次与陪练阿攻切磋,总会被对方用“看似一样的招数”骗倒——阿攻只是把出拳角度歪了一点点,小武就判断成踢腿。不是小武笨,而是他对“细微变化”太敏感。机器学习模型也是这样:把一张熊猫照片的像素稍稍扰动几个数值,人类完全看不出区别,模型却会信心满满地说是“长臂猿”。

这些被精心改动过、专门让模型出错的输入,就叫对抗样本。它和随机噪声完全不同:随机噪声像路上尘土,谁都可能蹭到但杀伤不大;对抗样本像阿攻观察了你三个月后,专门朝你旧伤处打的那一下——有方向、有目的、专挑最痛的点。

为了严格刻画“怎么算抗揍”,我们需要一个数学约定:给定样本 \(x_0\) 和预算 \(\varepsilon\),只要与 \(x_0\) 距离不超过 \(\varepsilon\) 的扰动 \(\delta\) 都不能改变模型的判断,就说模型在这个点上是 \(\varepsilon\)-鲁棒的。这个定义是标准对抗训练一切讨论的出发点。

就像小武给自己定的目标不是“打赢阿攻”,而是“阿攻在限定力度内无论怎么变招都骗不到我”——鲁棒性定义锁定了这个标准,后面所有的攻击和训练都围着它转。

∀ δ∈Bε(x0):fθ(x0+δ)=y0\forall\,\delta\in B_\varepsilon(x_0):\quad f_\theta(x_0+\delta)=y_0
这个公式翻译成大白话:在允许的“出手力度”内,随便你怎么变招,我的判断都不变。
  1. 全称量词 \(\forall\)表示“对任意一个”,这里指对球内所有可能的扰动都要成立,一个都不能漏。
    ∀\forall
  2. 扰动 \(\delta\)对抗样本相对原始输入的改动量,可以理解为阿攻那一拳偏移的角度。
    δ\delta
  3. 球邻域 \(B_\varepsilon(x_0)\)以 \(x_0\) 为球心、\(\varepsilon\) 为半径的球,是所有被允许的扰动范围的集合,相当于比武前约定的“出手力度上限”。
    Bε(x0)B_\varepsilon(x_0)
  4. 模型输出 \(f_\theta(x_0+\delta)\)模型在被扰动后的输入上的预测结果,\(\theta\) 是模型的全部参数(小武的招式和习惯)。
    fθ(x0+δ)f_\theta(x_0+\delta)
  5. 标签相等 \(=y_0\)要求预测结果仍然等于原始的正确标签,即不管怎么扰动都骗不到我。
    =y0=y_0

对抗攻击方法

阿攻怎么快速发现小武的弱点?他不需要试遍所有招式——只要观察小武的“应激反应”,看清哪个方向他最不设防,就全力往那个方向打。对模型而言,这个“应激反应”就是损失函数对输入求梯度:梯度指向“最能让模型犯错”的方向。取它的符号得到方向,再乘以力度 \(\varepsilon\),就得到了对抗样本。这就是 FGSM(快速梯度符号法),一步到位,像一记又快又狠的直拳。

FGSM 只打一步,像快拳;如果小武调整了防守呢?更老练的做法是 PGD——打完一步,观察新破绽,再打一步,重复多次,每一步都限制在“出脚范围”内。PGD 生成的对抗样本质量通常更高,但代价是计算量成倍增加。攻击强度由 \(\varepsilon\) 控制:\(\varepsilon\) 太小,模型感受不到压力;太大,样本明显变形,不再是“看起来没变”的隐蔽攻击了。

xadv=x+ε×sign⁡(∇x L(fθ(x),y))x_{\rm adv}=x+\varepsilon\times\operatorname{sign}\bigl(\nabla_x\,\mathcal{L}(f_\theta(x),y)\bigr)
公式说的是:先看模型对输入“哪个方向最敏感”,朝那个方向走上 \(\varepsilon\) 步,就能造出一个骗倒模型的样本。
  1. 原始输入 \(x\)一张正常的熊猫照片,或者小武还没被攻击时的标准防守姿势。
    xx
  2. 扰动预算 \(\varepsilon\)允许改动的最大幅度,相当于陪练的出拳力度上限,值越大攻击越狂暴。
    ε\varepsilon
  3. 梯度 \(\nabla_x\,\mathcal{L}\)损失对输入的变化率,指明“往哪个方向改最容易让模型出错”,是阿攻眼中的破绽。
    ∇x L(fθ(x),y)\nabla_x\,\mathcal{L}(f_\theta(x),y)
  4. 符号函数 \(\operatorname{sign}\)只保留梯度的方向、去掉大小,让每一步的扰动都是均匀的 \(\varepsilon\),不会某方向用力过猛。
    sign⁡(⋅)\operatorname{sign}(\cdot)
  5. 相加 \(x+\cdots\)把原始输入沿最坏方向移动,得到最终对抗样本 \(x_{\rm adv}\)。
    xadv=x+ε×sign⁡(∇x L)x_{\rm adv}=x+\varepsilon\times\operatorname{sign}(\nabla_x\,\mathcal{L})

极小极大原理

门派训练的本质是双人博弈:阿攻负责出最狠的招,让小武失分最多;小武负责把这些狠招都学会防住,让自己失分最少。两者反复对抗,小武的水平螺旋上升。标准对抗训练的数学形式正是这场博弈的精确刻画。

给定一个样本和当前模型,内层先找一个在 \(\varepsilon\) 球内让损失最大的扰动——这是阿攻全力进攻;外层调整模型参数,让这个“最坏情况下的损失”尽量小——这是小武针对性地练功。两者交替进行,就是著名的 min-max 优化。

注意内层攻击用的是“当前”模型——训练初期模型弱,阿攻一招就倒;训练后期模型变强,阿攻要多步试探才找得到破绽。这正是 PGD 在训练中派上用场的场景。

min⁡θ  max⁡∥δ∥∞≤ε  L(fθ(x+δ),y)\min_{\theta}\;\max_{\|\delta\|_{\infty}\le\varepsilon}\;\mathcal{L}\bigl(f_\theta(x+\delta),y\bigr)
这个公式是标准对抗训练的“总纲”:先让攻击者使出最大力气,再让模型在这种压力下学会站得稳。
  1. 外层最小化 \(\min_{\theta}\)以小武(模型)为主语,调整参数让整体失分最小,是日常练功的方向。
    min⁡θ\min_{\theta}
  2. 内层最大化 \(\max_{\|\delta\|_{\infty}\le\varepsilon}\)以阿攻(攻击)为主语,在力度上限内找到让小武最难受的扰动。
    max⁡∥δ∥∞≤ε\max_{\|\delta\|_{\infty}\le\varepsilon}
  3. 无穷范数约束 \(\|\delta\|_{\infty}\le\varepsilon\)规定扰动每个维度的最大幅度都不能超过 \(\varepsilon\),防止阿攻打出桌外。
    ∥δ∥∞≤ε\|\delta\|_{\infty}\le\varepsilon
  4. 最坏情况损失 \(\mathcal{L}(f_\theta(x+\delta),y)\)把“被重点针对”时的损失作为训练标准,不是平均情况,而是最坏情况。
    L(fθ(x+δ),y)\mathcal{L}(f_\theta(x+\delta),y)

算法实现

把 min-max 公式翻译成训练代码,流程像小武的日常训练清单。一个批次的数据到了之后,先让“当前”模型对它们执行内层攻击,生成一批对抗样本;然后把干净样本和对抗样本混在一起喂给模型更新参数,如此循环。内层攻击最常用的是 PGD 迭代更新公式,每一步都往梯度方向走一小步,再投影回 \(\varepsilon\) 球内,防止出界。

外层更新则用普通的 SGD 或 Adam,把对抗样本当成训练数据,“生成→混合→更新”循环往复直到验证集鲁棒性饱和。训练时 \(T\) 通常取 1-3 步,因为训练追求速度;评估时取 20-50 步甚至更多,因为评估追求狠。

xt+1=Clip⁡Bε(x)(xt+α×sign⁡(∇xL(fθ(xt),y)))x^{t+1}=\operatorname{Clip}_{B_\varepsilon(x)}\Bigl(x^{t}+\alpha\times\operatorname{sign}\bigl(\nabla_{x}\mathcal{L}(f_\theta(x^{t}),y)\bigr)\Bigr)
这个公式描述陪练如何“一步一试探”:每次朝最痛的方向挪一小步,但不准超过事先约定的出手范围。
  1. 当前候选 \(x^{t}\)第 \(t\) 步的对抗候选样本,训练时从原始 \(x\) 出发,也可以加一点随机起点。
    xtx^{t}
  2. 步长 \(\alpha\)每一步移动的幅度,通常取 \(\alpha=\varepsilon / T\),\(T\) 是总步数,保证多步加起来不超预算。
    α\alpha
  3. 梯度方向 \(\operatorname{sign}(\nabla_{x}\mathcal{L})\)沿着让损失增加最快的方向前进,即阿攻每招都朝新暴露的破绽打。
    sign⁡(∇xL(fθ(xt),y))\operatorname{sign}(\nabla_{x}\mathcal{L}(f_\theta(x^{t}),y))
  4. 投影 \(\operatorname{Clip}_{B_\varepsilon(x)}\)把越界的候选样本拉回 \(\varepsilon\) 球内,相当于比武规则实时生效。
    Clip⁡Bε(x)\operatorname{Clip}_{B_\varepsilon(x)}
  5. 迭代更新重复 \(T\) 次后得到最终对抗样本 \(x_{\rm adv}=x^{T}\),它比 FGSM 更接近真正的“最痛点”。
    xTx^{T}

性能特性

训练一段时间后,小武发现:面对阿攻熟悉的刁钻角度,他几乎不失分了(鲁棒性提升),但面对普通路人的常规出拳,他有时反而反应慢半拍(干净准确率下降)。这不是他变笨,而是他把一部分注意力分给了“防备歪招”。这就是对抗训练著名的“鲁棒-准确权衡”。

模型容量有限,决策边界向外扩张保护对抗样本的同时,一些原本站在边界附近的正常样本可能被牺牲。如何衡量鲁棒性?不能只看训练时的表现,要用固定的攻击流程在测试集上重新攻击一遍,统计模型在这些对抗样本上的正确率,即对抗准确率。

标准 AT 的另一个特征是收敛慢:每次迭代都要先生成对抗样本再做参数更新,相当于一份数据练了两遍,训练时间通常是普通训练的 2-3 倍。练武之人防守变强,但全面进攻未必更强——要分清“抗揍”和“能打”。

RobAcc=1N∑i=1N1[arg⁡max⁡c fθ(xi′)c=yi],xi′=Attack(xi)\mathrm{RobAcc}=\frac{1}{N}\sum_{i=1}^{N}\mathbb{1}\bigl[\arg\max_{c}\,f_\theta(x_i')_{c}=y_i\bigr],\quad x_i'=\mathrm{Attack}(x_i)
对抗准确率相当于“换了十个不同风格的陪练来车轮战,看你能不能站到最后”。
  1. 样本总数 \(N\)测试集里用来评估的样本个数,样本越多评估越可靠。
    NN
  2. 指示函数 \(\mathbb{1}[\cdot]\)中括号里的条件成立记 1,不成立记 0,简单说就是“这一局守住没有”。
    1[⋅]\mathbb{1}[\cdot]
  3. 预测类别 \(\arg\max_{c}\,f_\theta(x_i')_{c}\)模型对对抗样本输出各类别得分,取最高分对应的类别作为预测。
    arg⁡max⁡c fθ(xi′)c\arg\max_{c}\,f_\theta(x_i')_{c}
  4. 攻击生成 \(x_i'=\mathrm{Attack}(x_i)\)用评估用的攻击方法(如 PGD)对每个测试样本生成对抗版本。
    xi′=Attack(xi)x_i'=\mathrm{Attack}(x_i)

优化策略

想让小武既抗揍又不丢基本功,得调“练功配方”。最常见的做法是把干净样本的损失和对抗样本的损失按比例混合,用系数 \(\lambda\) 控制两者的权重,让模型既照顾正常样本,又重点防御坏样本。

其他常用策略:训练时用 1-2 步 FGSM 加快速度;为 \(\varepsilon\) 设合理值(图像任务常用 8/255 量级);配合标签平滑防止模型过度自信。还有一个容易被忽视的细节:攻击步长 \(\alpha\) 要和 \(\varepsilon\) 匹配,一般取 \(\alpha=\varepsilon / T\)。步长太大容易“走过头”,找不到最痛点;太小又要在更多迭代中消耗算力。陪练的力度、步法都要精确设计,否则练不出真功夫。

Ltotal=1∣B∣∑(x,y)∈B(L(fθ(x),y)+λ×L(fθ(xadv),y))\mathcal{L}_{\rm total}=\frac{1}{|\mathcal{B}|}\sum_{(x,y)\in\mathcal{B}}\Bigl(\mathcal{L}(f_\theta(x),y)+\lambda\times\mathcal{L}(f_\theta(x_{\rm adv}),y)\Bigr)
公式表达的是“一半时间练基本功,一半时间做对抗防守”的训练比例,\(\lambda\) 就是防守训练的分量。
  1. 批次 \(\mathcal{B}\)当前这次更新用的一小撮数据,标准做法是一个 mini-batch。
    B\mathcal{B}
  2. 干净损失项 \(\mathcal{L}(f_\theta(x),y)\)在原始数据上的常规损失,保证模型“基本功”不丢。
    L(fθ(x),y)\mathcal{L}(f_\theta(x),y)
  3. 对抗损失项 \(\mathcal{L}(f_\theta(x_{\rm adv}),y)\)在对抗样本上的损失,让模型学会在歪招面前不失守。
    L(fθ(xadv),y)\mathcal{L}(f_\theta(x_{\rm adv}),y)
  4. 权衡系数 \(\lambda\)控制两项目标的比重,\(\lambda\) 太大模型过于保守,太小防御形同虚设。
    λ\lambda

工程实践

小武学成后要去守镖局大门。真实世界的威胁不止一种:有人用贴纸篡改路牌,有人用装饰物干扰人脸识别,有人在验证码里嵌入隐形纹理。用标准对抗训练练过的模型,遇到这些场景时明显更稳。不过在部署前,必须严格评估——不能只用训练时的攻击自评,那相当于“和自己熟络的陪练对打来证明武功高强”。

评估时要用更强的攻击(如多步 PGD、多种随机起点重试)来检验,还可以计算“离最近的对抗样本有多远”。这个距离越大,说明要付出的攻击成本越高,模型越难被击倒。它被称为最小对抗扰动距离,是衡量防守强度的标尺。

工程上还要注意:图像分类(如车牌识别)可直接采用 AT 加基本的图像变换;支付人脸、自动驾驶等安全敏感场景必须把鲁棒性当作和准确率并列的 KPI;上线后持续监控对抗样本攻击率,定期用新攻击重测。守门不是比谁招数漂亮,而是比谁在歪招面前不失守。

ρ(x)=min⁡δ: fθ(x+δ)≠y∥δ∥p\rho(x)=\min_{\delta:\,f_\theta(x+\delta)\ne y}\|\delta\|_{p}
最小对抗扰动距离的意思是:要骗倒模型,至少得付出多大的“变招成本”,成本越高,模型越抗揍。
  1. 条件集合 \(\delta\,f_\theta(x+\delta)\ne y\):所有能让模型预测错误的扰动构成的集合,即所有“能骗到人”的招数。
    δ: fθ(x+δ)≠y\delta:\,f_\theta(x+\delta)\ne y
  2. 最小化 \(\min\)在所有“能骗到人”的招数里找代价最小的那一个,也就是攻击者的最省力选择。
    min⁡δ\min_{\delta}
  3. 范数 \(\|\delta\|_{p}\)度量扰动的大小,\(p\) 常用 2(欧氏距离)或无穷范数(最大像素变化),相当于丈量出招偏移量的尺子。
    ∥δ∥p\|\delta\|_{p}

AI 应用场景

自动驾驶视觉感知防御

阶段:模型训练与部署

解决的问题:自动驾驶的交通标志识别模型,可能被路旁的恶意贴纸攻击——在“停”字标志上贴几块小胶带,模型就把它识别成“限速 40”。传统方法只关注正常天气下的准确率,对这类刻意攻击毫无防备。用标准对抗训练在训练阶段就生成大量被扰动的路牌样本,让模型提前“见过”这些歪招。

具体案例:某无人配送车团队在感知模型训练中引入 AT,对停车标志、人行横道标志加入 \(\varepsilon=8/255\) 的对抗样本,攻击成功率从 61% 降到 7%,同时正常场景准确率仅下降 1.2 个百分点。

人脸识别门禁防攻击

阶段:安全评测与模型加固

解决的问题:人脸识别门禁可能被“对抗眼镜框”绕过——攻击者戴上一副印有特殊纹理的镜框,系统就把他识别成注册用户。标准对抗训练可以模拟这类“局部扰动”攻击,让人脸模型在训练时见过被补丁遮挡的对抗样本,从而在真实攻击面前保持警惕。

具体案例:某写字楼门禁系统对注册人脸数据集做 PGD 对抗训练,并用 30 步攻击重新评估,绕过率从 28% 降至 3%,员工正常刷脸通过率维持在 99% 以上。

内容安全与文本对抗防御

阶段:数据增强与模型迭代

解决的问题:垃圾评论和有害内容检测模型,可能被“同音字替换”“添加不可见字符”等文本对抗手段绕过。虽然经典 AT 多用于图像,但其“先攻击再防御”的思想同样适用于文本——在嵌入空间对词向量做扰动训练,提升模型对恶意改写文本的鲁棒性。

具体案例:某社区平台对违规评论检测模型引入词向量扰动训练,针对“赌 场”替换为“堵 场”这类变形攻击,召回率从 54% 提升到 86%,误伤正常评论的比例仅小幅上升。

Python 演示

python91 行
import numpy as np  def sigmoid(z):    return 1.0 / (1.0 + np.exp(-z))  def make_data(n=200, seed=0):    rng = np.random.default_rng(seed)    x1 = rng.normal(0.7, 0.5, (n, 2))    x2 = rng.normal(-0.7, 0.5, (n, 2))    X = np.vstack([x1, x2])    y = np.concatenate([np.ones(n), -np.ones(n)])    return X, y  def forward(X, w1, b1, w2, b2):    H = np.maximum(0.0, X.dot(w1) + b1)    return H, H.dot(w2) + b2  def predict(X, w1, b1, w2, b2):    _, z = forward(X, w1, b1, w2, b2)    return np.sign(z)  def grad_input(X, y, w1, b1, w2, b2):    H, z = forward(X, w1, b1, w2, b2)    rho = sigmoid(-y * z)    dh = (-y * rho)[:, None] * w2[None, :]    dh = dh * (H > 0)    return dh.dot(w1.T)  def attack(X, y, w1, b1, w2, b2, eps):    gx = grad_input(X, y, w1, b1, w2, b2)    return X + eps * np.sign(gx)  def batch_step(Xb, yb, w1, b1, w2, b2, eps, lr):    Xa = attack(Xb, yb, w1, b1, w2, b2, eps)    gw1 = np.zeros_like(w1)    gb1 = np.zeros_like(b1)    gw2 = np.zeros_like(w2)    gb2 = np.zeros_like(b2)    for Xv, coef in ((Xb, 0.5), (Xa, 0.5)):        H, z = forward(Xv, w1, b1, w2, b2)        rho = sigmoid(-yb * z)        dz = -yb * rho        gw2 += coef * H.T.dot(dz) / len(Xb)        gb2 += coef * dz.mean()        dh = dz[:, None] * w2[None, :]        dh = dh * (H > 0)        gw1 += coef * Xv.T.dot(dh) / len(Xb)        gb1 += coef * dh.mean(axis=0)    w1 -= lr * gw1    b1 -= lr * gb1    w2 -= lr * gw2    b2 -= lr * gb2  def accuracy(X, y, w1, b1, w2, b2, eps=0.0):    Xv = attack(X, y, w1, b1, w2, b2, eps) if eps > 0 else X    return float((predict(Xv, w1, b1, w2, b2) == y).mean())  def main():    X, y = make_data()    eps = 0.4    rng = np.random.default_rng(1)    w1 = rng.normal(0, 0.2, (2, 16))    b1 = np.zeros(16)    w2 = rng.normal(0, 0.2, (16,))    b2 = 0.0    print("初始      干净=%.3f 对抗=%.3f" % (        accuracy(X, y, w1, b1, w2, b2),        accuracy(X, y, w1, b1, w2, b2, eps=eps)))    for epoch in range(60):        order = np.random.permutation(len(X))        for s in range(0, len(X), 64):            ids = order[s:s + 64]            batch_step(X[ids], y[ids], w1, b1, w2, b2, eps, lr=0.5)        if (epoch + 1) % 20 == 0:            print("epoch %2d  干净=%.3f 对抗=%.3f" % (                epoch + 1,                accuracy(X, y, w1, b1, w2, b2),                accuracy(X, y, w1, b1, w2, b2, eps=eps)))  if __name__ == "__main__":    main()
目的:在合成数据上演示标准对抗训练的完整流程,直观对比训练前后模型在对抗样本上的表现变化。
  1. grad_input` 中 `dh = dh * (H > 0)用 ReLU 的开关关闭未激活神经元的梯度通道,保证反向传播正确。
  2. gx = grad_input(X, y, w1, b1, w2, b2)计算损失对输入的梯度,这是 FGSM 攻击要找的“最坏方向”。
  3. Xa = attack(Xb, yb, w1, b1, w2, b2, eps)内层最大化:生成对抗样本。
  4. for Xv, coef in ((Xb, 0.5), (Xa, 0.5))干净样本与对抗样本各占一半,实现混合批次更新。
  5. w1 -= lr * gw1外层最小化:用混合梯度更新模型参数。
  6. accuracy(X, y, w1, b1, w2, b2, eps=eps)用 FGSM 对抗样本评估模型的对抗准确率。

常见误区

误区给训练数据加上高斯噪声就算对抗训练了,模型应该能抵御对抗攻击。但实际测试发现模型还是被一招放倒。

正解随机噪声的方向是各向同性的,平均下来互相抵消,很难让模型真正失分。对抗扰动是沿着“最坏方向”精心设计的——就像阿攻不是乱挥拳头,而是盯着你旧伤处打。对抗训练的核心是“找最痛的点再练防守”,随机加噪少了“找点”这一步,效果天差地别。

为何常见:往数据里加噪声实现成本极低,而且“噪声能提高鲁棒性”的说法流传很广,容易让人误以为两者等价。

误区评估时 PGD 步数多攻击效果好,那训练时也应该用 50 步甚至更多的 PGD,这样练出来的模型一定更抗揍。

正解训练关注的是“学得会”,不是“攻得狠”。多步攻击计算开销巨大,还会让模型过拟合到特定攻击路径,反而降低泛化性。标准做法是训练用 1-3 步 FGSM/PGD 快速逼近最坏方向,评估再用 20-50 步的强攻击检验真实水平。就像陪练日常训练用固定套路帮弟子练功,考核时才换最狠的招数。

为何常见:评估任务中多步攻击表现更好,容易让人把评估策略直接照搬到训练环节。

误区用了对抗训练,模型就变得相当保守,正常样本准确率会崩掉,所以不敢用。

正解鲁棒性确实会与干净准确率存在权衡,但幅度取决于具体设置。通过调整混合比例 \(\lambda\)、合理设置 \(\varepsilon\)、使用更宽的模型结构,可以在两者之间取得良好平衡。多数实际案例中,对抗准确率大幅提升的同时,干净准确率只下降 1-3 个百分点。

为何常见:论文里展示的权衡曲线往往来自极端设置,读者容易忽略具体的超参数背景,把最坏情况当成普遍规律。

误区训练时用 FGSM,评估时也报 FGSM 的准确率,模型鲁棒性高达 95%,直接上线。

正解训练用的攻击强度较弱,模型可能只是“背熟了”这一种攻击,换一种更强的 PGD 或换个随机起点就露馅。严谨的评估要用多种强度、多种初始化方式的攻击交叉验证,甚至用 AutoAttack 等集成工具。这就好比考核不能只让熟悉的陪练出招,得让陌生高手车轮战才算数。

为何常见:强攻击评估计算量大,团队为了省时间偷懒只用同一种攻击自评,结果上线后被真实攻击打穿。

面试题

Q1. 关于“对抗样本”,下列理解最准确的是?

单选题 · easy

  • A.随机添加噪声的图像样本
  • B.针对模型弱点精心构造的扰动← 正确答案
  • C.数据增强产生的新样本
  • D.分辨率更高的清晰样本

答案:B。对抗样本不是随机噪声,而是沿梯度最坏方向精心构造的扰动,目标是在人眼无感的前提下让模型犯错。就像陪练专挑旧伤处打,而不是乱挥拳。数据增强和分辨率提升都不具备“针对性”。

Q2. FGSM 中 sign 函数的主要作用是什么?

单选题 · easy

  • A.让扰动方向取整
  • B.只保留梯度的方向← 正确答案
  • C.放大梯度的大小
  • D.消除梯度的噪声

答案:B。sign 把梯度变成 +1 或 -1,只保留方向、抹掉大小,从而让每个维度的扰动幅度统一为 \(\varepsilon\)。它的作用不是取整、放大或降噪,而是固定攻击步长,使扰动均匀且有方向性。

Q3. 对抗训练目标 \(\min_{\theta}\max_{\delta}\mathcal{L}(f_\theta(x+\delta),y)\) 理解正确的是?

单选题 · mid

  • A.先找最坏扰动再优化模型← 正确答案
  • B.先优化模型再找扰动
  • C.同时优化模型和扰动
  • D.随机生成扰动后训练

答案:A。min-max 中内层 max 先行动:用当前模型找最坏扰动(阿攻出招),外层 min 再用这个扰动优化模型(小武练功),两者交替而非同时。D 选项的随机扰动缺少“最坏”的意义。

Q4. 训练时常用单步 FGSM、评估时用多步 PGD 的原因是?

单选题 · mid

  • A.FGSM 攻击效果比 PGD 更强
  • B.训练求效率评估求强度← 正确答案
  • C.PGD 无法生成对抗样本
  • D.两者在训练中完全等价

答案:B。训练要跑很多轮,每轮都要生成对抗样本,单步攻击能显著节约算力且已能提供有效梯度信号;评估只跑一次,追求的是找出模型真实漏洞,所以用更强的多步 PGD。A、C、D 都与事实相反。

Q5. 标准对抗训练的训练流程包含以下哪些环节?

多选题 · mid

  • A.用当前模型生成对抗样本← 正确答案
  • B.混合干净与对抗样本← 正确答案
  • C.只修改对抗样本的标签
  • D.对混合批次更新模型← 正确答案

答案:ABD。标准 AT 的流程是:用当前模型对每批数据做内层攻击生成对抗样本,把干净样本和对抗样本混合成一个批次,最后计算混合损失并更新参数。对抗样本的标签保持不变,依然是原始正确标签,所以 C 错误。

Q6. 扰动预算 \(\varepsilon\) 设置过大会出现哪些问题?

多选题 · mid

  • A.生成的样本明显失真← 正确答案
  • B.模型很难有效学习← 正确答案
  • C.鲁棒性未必提升← 正确答案
  • D.只需依赖数据增强

答案:ABC。\(\varepsilon\) 过大会让对抗样本超出“人眼难察”的范畴,变得明显失真,而且样本与原始类别差异过大,模型难以从中学到有效防守,鲁棒性未必提升。D 是错误结论,数据增强不能替代对抗训练。

Q7. 下列哪些属于内层最大化(攻击)的关键设置?

多选题 · hard

  • A.攻击迭代的步数← 正确答案
  • B.扰动预算 \(\varepsilon\) 大小← 正确答案
  • C.投影到球邻域方式← 正确答案
  • D.损失曲线可视化

答案:ABC。内层攻击的质量由迭代步数、扰动预算 \(\varepsilon\)、以及每步后如何投影回 \(\varepsilon\) 球约束共同决定。损失曲线可视化只是调试工具,不影响攻击本身,因此 D 不正确。

Q8. 为什么对抗训练可能导致干净准确率下降?

单选题 · hard

  • A.模型参数数量变少
  • B.边界外移牺牲部分样本← 正确答案
  • C.梯度计算变得更加复杂
  • D.训练损失函数失效

答案:B。对抗训练会把决策边界外移,让界内样本对 \(\varepsilon\) 扰动保持鲁棒。原本靠近边界的正常样本可能因此被划到另一侧,导致干净准确率微降。这是“鲁棒-准确权衡”的本质,与参数数量、梯度复杂度无关。

Q9. 对抗训练目标中“内层最大化”由谁执行?

单选题 · easy

  • A.训练时的攻击算法← 正确答案
  • B.训练时的优化器
  • C.推理阶段的模型
  • D.数据标注人员

答案:A。内层最大化是在训练过程中由攻击算法(FGSM、PGD 等)执行的——它们求出使损失最大的扰动。优化器负责外层最小化更新模型参数,推理阶段模型只做预测不生成攻击。

Q10. 关于白盒攻击和黑盒攻击,下列正确的是?

单选题 · hard

  • A.白盒攻击能利用模型梯度← 正确答案
  • B.白盒攻击速度一定更慢
  • C.黑盒攻击无需任何信息
  • D.两者攻击效果完全相同

答案:A。白盒攻击能拿到模型结构和梯度,直接沿梯度方向构造扰动,效率高;黑盒攻击只能靠查询输出或迁移攻击,并非“无需任何信息”,且效果通常弱于白盒。因此 A 正确,其余说法均不成立。