想象你是一家拳击俱乐部的老板,斥重金请了一位顶级陪练给拳手特训。陪练有个讲究:每场正式对练前,他要先热身十分钟,把组合拳、闪避、步伐统统过一遍才肯上场。结果一天下来,拳手真正挥拳的时间不足半小时,大部分时间都在等陪练热身,账单却一分不少。这正是传统对抗训练的日常:模型是拳手,对抗样本是陪练的拳头,为了生成一套高质量对抗样本,模型要先挨上十轮 PGD 攻击的“热身”,训练预算的大头都耗在了这里。 本篇文章介绍两条让陪练“少热身、多干活”的破解思路。第一位助教 Free 的巧思是:陪练热身的每一拳,拳手其实都在同步练防守——让一次反向传播既生成扰动又更新参数,再顺势把训练轮数压缩到几分之一。第二位助教 FAST 更激进:干脆取消热身,陪练上来先随机虚晃一枪,紧接着一记直拳,成本低到接近普通训练。两条路都能把对抗训练提速一个数量级,但也各自埋着陷阱——什么时候该重置扰动、如何防止“只防一拳”的假把式,正是本篇文章要拆解的细节。

岗位关联

掌握这两条加速路径,你就能在有限算力下完成模型鲁棒性加固,把对抗训练从“只能周末跑一次的实验”变成“随时可跑的工程标配”。

目录
  1. 可视化演示
  2. 加速背景与动机
  3. FreeAT梯度重用
  4. FreeAT开销分析
  5. FASTAT单步生成
  6. 工程调优技巧
  7. 鲁棒性与评估
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示多层神经网络中的前向信号传播与反向梯度回传过程,切换模式观察训练循环的不同阶段。

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

前向传播阶段 紫色信号从输入层逐层传播至输出层,每层神经元依次激活 连接线亮度随信号强度变化,体现权重加权求和过程 a = σ(Wx + b)

加速背景与动机

拳馆的账本上,最大的一行支出不是拳击手套,而是陪练的热身时间。要训练一位能扛住真实比赛的拳手,教练必须先让陪练打出足够凶狠的组合拳——这个过程每来一次都要耗掉十分钟,真正能练到的防守回合却只有一次。账房先生指着数字说:每练一个回合,成本是普通训练的十倍以上。

在对抗训练里,这套“组合拳热身”被形式化为内层最大化问题:对每个样本,在允许的扰动范围内寻找让损失最大的对抗样本。由于直接求解不可行,实践中最常用的近似手段是投影梯度下降(PGD)——从随机起点出发,沿损失上升的方向迭代 k 步。每一步都是一次完整的前向-反向传播,而模型参数更新还需要额外一次反向传播,于是每处理一个批次,就要支付 k+1 次反向传播的账单。

这 k+1 次反向传播就是拳馆的“热身税”:k 次用来制造最凶的攻击(陪练热身),1 次用来真正训练模型(正式对练)。当 k 取 10 时,对抗训练的开销就是普通训练的 11 倍。要降低成本,无外乎两条路:让热身本身变成对练(把生成扰动和更新参数合二为一),或者砍掉热身(把多步攻击换成单步攻击)。

面对这份天价账单,两位助教给出了截然不同的省钱方案:Free 让热身直接算作对练,FAST 则取消热身只留一记快拳。接下来我们逐一拆解他们的算盘。

min⁡θ E(x,y)∼D[max⁡∥δ∥∞≤εL(fθ(x+δ), y)]\displaystyle \min_{\theta}\ \mathbb{E}_{(x,y)\sim\mathcal{D}}\left[\max_{\|\delta\|_{\infty}\le\varepsilon} L\big(f_\theta(x+\delta),\, y\big)\right]
这个公式是“教练的训练目标”:外层 min 是训练出最抗打的拳手,内层 max 是找到最凶的攻击,两者互为对手。
  1. 最外层最小化训练的目标是寻找一组参数 θ,使模型在最坏情况下的损失尽可能小。
    min⁡θ\displaystyle \min_{\theta}
  2. 数据分布期望对训练数据分布 D 上采样的每个样本求平均,衡量模型在全体数据上的整体表现。
    E(x,y)∼D\displaystyle \mathbb{E}_{(x,y)\sim\mathcal{D}}
  3. 内层最大化对每个样本,在允许的扰动范围内找出让损失最大的对抗样本,模拟“最凶的陪练”。
    max⁡∥δ∥∞≤ε\displaystyle \max_{\|\delta\|_{\infty}\le\varepsilon}
  4. 无穷范数约束扰动 δ 的每个分量绝对值都不超过 ε,保证对抗样本与原样本“肉眼无差”。
    ∥δ∥∞≤ε\displaystyle \|\delta\|_{\infty}\le\varepsilon
  5. 分类损失模型在加噪样本上的损失值,损失越大代表被攻击得越狠。
    L(fθ(x+δ), y)L\big(f_\theta(x+\delta),\, y\big)

FreeAT梯度重用

Free 助教注意到一个细节:陪练热身挥出的每一拳,拳手其实都在下意识地格挡。既然这样,为什么非要等到热身结束才开始正式对练?不如让每一次热身出拳直接计入训练量——一次挥拳,两笔收益。

放到技术里,“一次挥拳”就是一次反向传播。传统流程中,用于生成对抗样本的 k 次反向传播,和用于更新模型参数的那 1 次反向传播各算各的账。Free AT 的核心观察是:反向传播时,计算图里同时藏着两个梯度——损失对扰动 δ 的梯度,和损失对参数 θ 的梯度。前者告诉陪练“往哪打更疼”,后者告诉拳手“哪里防守稀松”,它们本就是同一次挥拳带出的两个信息。

具体流程是 Free-m 算法:取一个批次 (x, y),重复 m 次内层循环。每次循环只做一件事——前向计算损失,反向传播拿到梯度,用梯度符号推进扰动 δ,再用同一份梯度更新参数 θ。因为扰动在 m 步内逐步变强,模型也在同一批次上连续学习 m 次,所以总训练轮数可以压缩为原来的 1/m。为防止扰动“恋战”太久,算法每隔 B 个批次(通常 B≈4)就把 δ 重置为零,重新开始累积——好比陪练每练四组就换一套打法,避免拳手背下固定套路。

就这样,陪练的每一记热身拳都变成了实战回合,拳手在同一个回合里既挨打又长进。账房先生翻开新账本:总成本没涨,训练量却翻了几倍——这正是论文标题"Adversarial Training for Free"(对抗训练免费)的由来。

δ(t+1)=Πε(δ(t)+α⋅sign(∇δ(t)L(fθ(x+δ(t)), y)))\displaystyle \delta^{(t+1)} = \Pi_{\varepsilon}\Big(\delta^{(t)} + \alpha\cdot\mathrm{sign}\big(\nabla_{\delta^{(t)}} L(f_\theta(x+\delta^{(t)}),\, y)\big)\Big)
这个公式是“陪练的出拳路线图”:每迈出一步都沿损失上升最快的方向,走完再被裁判拉回界限内。
  1. 当前扰动δ^(t) 是第 t 次内层循环开始时的扰动,由前几次的移动累积而来。
    δ(t)\delta^{(t)}
  2. 上升最快的方向对扰动求梯度,梯度指向“让模型错得最离谱”的进攻方向。
    ∇δ(t)L(fθ(x+δ(t)), y)\nabla_{\delta^{(t)}} L(f_\theta(x+\delta^{(t)}),\, y)
  3. 符号步长只取梯度的正负号,用固定步长 α 前进,保证每步移动幅度稳定可控。
    α⋅sign(⋅)\alpha\cdot\mathrm{sign}(\cdot)
  4. 投影回界Π_ε 把更新后的扰动拉回 [-ε, ε] 区间,禁止对抗样本“变形过度”。
    Πε(⋅)\Pi_{\varepsilon}(\cdot)

FreeAT开销分析

“免费”不代表没有账。Free 助教把账本摊开:以前陪练热身十拳,拳手打一回合;现在热身一拳,拳手就打一回合。如果总训练量不变,那么陪练需要“出勤”的次数明显变少了,省下的正是陪练往返休息室的时间。

这个“出勤次数”对应训练总轮数。传统 PGD-k 要在 n 轮中每轮都做 k 步攻击;Free-m 把每轮拆成 m 个内层循环,但每一轮内拳手已经练了 m 次,因此只要 n/m 轮就能达到同样的参数更新总量。两个方案的总账一列出来,差距就清楚了。

具体数字上:传统 PGD-10 每批次需要 1 次参数更新 + 10 次攻击生成 = 11 次反向传播;Free-8 每批次 8 次反向传播,但训练轮数只有原来的 1/8,总计算量 = 普通训练 ×(8 × 1/8)= 普通训练。换句话说,Free-m 把对抗训练的账单降到了与普通训练同一水平,这正是“免费”二字的底气。

拳馆算完账后还留了个心眼:Free 也不是无条件的。内层步数 m 太大时,扰动一直在同一批样本上打转,多样性不足,拳手反而见不了世面;重置周期 B 也要把握好,否则扰动累积过头,跟新来的对手完全对不上号。有限的“免费”要配上恰到好处的超参数,才真能省钱。

TPGD−kTFree−m=B⋅n⋅(k+1)B⋅(n/m)⋅m=k+1\displaystyle \frac{T_{\mathrm{PGD}\mathrm{-}k}}{T_{\mathrm{Free}\mathrm{-}m}} = \frac{B\cdot n\cdot(k+1)}{B\cdot (n/m)\cdot m} = k+1
这是“账房先生的约分”:分子分母的批次、轮数、内层步数全部抵消,最后只剩下 k+1。
  1. 分子传统方案的账单:B 个批次、n 轮、每批次 k+1 次反向传播,三者相乘得到总次数。
    B⋅n⋅(k+1)B\cdot n\cdot(k+1)
  2. 分母Free 方案的账单:同样 B 个批次,轮数压缩为 n/m,每批次 m 次反向传播。
    B⋅nm⋅mB\cdot\frac{n}{m}\cdot m
  3. 约分得加速比B、n、m 相互抵消,加速比恰好等于 k+1,即传统方案中“攻击生成 + 参数更新”的总次数。
    TPGDTFree=k+1\frac{T_{\mathrm{PGD}}}{T_{\mathrm{Free}}}=k+1

FASTAT单步生成

另一位助教 FAST 的提议更激进:既然热身这么贵,干脆砍掉热身,陪练上场先虚晃一枪,紧接着一记直拳。成本压到最低,拳馆上下半信半疑。

技术上,这套“虚晃直拳”就是带随机起手的单步 FGSM:先从一个随机扰动 η 出发(虚晃),做一次反向传播求出让损失上升最快的方向,沿符号方向走一步(直拳),再把结果投影回允许范围。随机起手不是可有可无的花架子——研究表明,纯 FGSM(无随机起手)训练的模型会迅速陷入“灾难性过拟合”:看起来鲁棒精度很高,换一种攻击立刻崩盘。随机起手相当于给单步攻击注入了方向多样性,用广度弥补深度。

成本账同样漂亮:每个样本只需要两次反向传播——一次算扰动,一次更新参数。相比 PGD-10 的 11 次,直接省掉约八成计算,这也是论文标题"Fast is better than free"的底气:FAST AT 不仅比传统方案快,甚至比需要多轮内层循环的 Free AT 更快。

但 FAST 助教也警告拳馆:单拳练习虽然便宜,陪练却容易被拳手“读死”——一旦拳手只防这一拳,遇到真实对手就要挨揍。于是教练组总结了一套备赛技巧,把快拳稳稳变成真功夫。

δ=Πε(η+α⋅sign(∇x+ηL(fθ(x+η), y))),η∼U(−ε,ε)\displaystyle \delta = \Pi_{\varepsilon}\Big(\eta + \alpha\cdot\mathrm{sign}\big(\nabla_{x+\eta} L(f_\theta(x+\eta),\, y)\big)\Big), \qquad \eta\sim\mathcal{U}(-\varepsilon,\varepsilon)
这个公式是“虚晃直拳”的完整动作:先随机晃一下身体(η),再朝最狠的方向打出一拳,最后收住力道不出界。
  1. 随机起手在 [-ε, ε] 内均匀采样 η 作为出拳前的虚晃,让每次攻击起点都不同,避免模型背熟单一套路。
    η∼U(−ε,ε)\eta\sim\mathcal{U}(-\varepsilon,\varepsilon)
  2. 起手点的梯度在加了虚晃的 x+η 处做一次反向传播,梯度指向“让模型最难受”的进攻方向。
    ∇x+ηL(fθ(x+η), y)\nabla_{x+\eta} L(f_\theta(x+\eta),\, y)
  3. 一步到位的符号推进沿梯度符号方向移动 α,不迭代、不回头,把多步攻击压缩成单拳。
    α⋅sign(⋅)\alpha\cdot\mathrm{sign}(\cdot)
  4. 投影收力Π_ε 把拳头收在界内,保证最终扰动不超出视觉可容忍的 ε 范围。
    Πε(⋅)\Pi_{\varepsilon}(\cdot)

工程调优技巧

拳馆教练组把 FAST 的训练手册翻出来,圈出三件套:及时叫停、负重训练、循序渐进。每一条都是在防同一个暗雷——灾难性过拟合。

灾难性过拟合是单步对抗训练特有的现象:训练过程中,模型鲁棒精度有时会突然大幅下跌,而干净精度依旧正常。原因是模型学会了“抄近道”——利用单步攻击的固定模式。应对思路有三。第一,早停:每隔两三个 epoch 用 PGD-10 在验证集上测一次鲁棒精度,一旦开始持续下滑就立即停止训练。第二,权重扰动:每步更新前给参数 θ 叠加一个微小的均匀随机噪声(幅度约 ±0.0005),让损失曲面被“打散”,模型不容易记住单步攻击的捷径。第三,课程学习:一开始用很小的扰动强度 ε,随训练进度线性增大到目标值,让模型先适应轻度攻击再迎接高强度攻击。

这三个技巧并非只属于 FAST,Free AT 同样适用。具体参数上,权重扰动幅度过大会损伤干净精度,课程学习的起始强度一般取目标值的 0.1 倍,早停的触发阈值则要看验证集规模,通常连续两到三次评估下滑就停止。学习率也值得留意:偏大的学习率配合偏小的批次,往往能让单步训练更稳定。

教练组反复叮嘱:快拳本身没有错,错的是只练快拳。早停是看表,权重扰动是负重,课程学习是加码——三件套配齐,FAST 这位急性子陪练才能既快又稳地出师。

εt=εmin⁡+tT (εmax⁡−εmin⁡)\displaystyle \varepsilon_t = \varepsilon_{\min} + \frac{t}{T}\,\big(\varepsilon_{\max}-\varepsilon_{\min}\big)
这是“循序渐进”的数学写法:扰动强度随训练进度从轻到重线性爬坡。
  1. 训练进度t 是当前轮次,T 是课程总轮数,比值 t/T 表示训练走过了百分之几。
    tT\frac{t}{T}
  2. 强度插值用进度比例在 ε_min 与 ε_max 之间线性插值,让模型先练轻拳再练重拳。
    εmin⁡+(εmax⁡−εmin⁡)⋅tT\varepsilon_{\min} + (\varepsilon_{\max}-\varepsilon_{\min})\cdot\frac{t}{T}

鲁棒性与评估

训练营结束,真正的考验来了:陪练说拳手出师了,但教练要求上擂台打一场“真刀真枪”的验收赛——对手不再是熟悉的陪练,而是换着花样进攻的全新拳手。

对应到评估环节,就是不能只用训练时的攻击方式(FGSM 或短步 PGD)来验证鲁棒性。单步训练尤其容易踩中“梯度遮蔽”的坑:模型把损失曲面抹平,单步攻击找不到梯度就“看起来”攻不破,但换成更强的 PGD-20 甚至 AutoAttack,防御立刻现出原形。因此业界通行做法是:用至少 20 步的强攻击在测试集上重新攻击一遍,得到的鲁棒精度才是可信的成绩单。

加速训练还要面对精度与鲁棒性的经典权衡:对抗鲁棒性越强,干净样本上的精度往往越低。Free AT 和 FAST AT 通过扰动强度 ε、内层步数 m、课程计划等旋钮,在这两头之间找平衡。工程上建议同时记录两类指标——干净精度和鲁棒精度——画出它们的曲线,而不是只盯一个数字。

教练最后把一句训话贴在墙上:加速的钱可以省,验收的擂台不能省。无论 FAST 还是 Free,只有经得起多轮强攻击复查的模型,才配得上“鲁棒”二字——这也是加速方法走出实验室、进入生产环境的最后一道关口。

Accrobust=1N∑i=1N1[arg⁡max⁡c fc(xi+δi∗)=yi]\displaystyle \mathrm{Acc}_{\mathrm{robust}} = \frac{1}{N}\sum_{i=1}^{N} \mathbb{1}\Big[\arg\max_{c}\, f_c\big(x_i+\delta_i^{*}\big) = y_i\Big]
这是“验收赛计分表”:逐个测试样本看模型在强攻击下是否依然答对,最后求平均。
  1. 平均计数对 N 个测试样本逐一判断,求和后除以 N,得到 0 到 1 之间的鲁棒准确率。
    1N∑i=1N\frac{1}{N}\sum_{i=1}^{N}
  2. 指示函数中括号里的条件成立记 1、否则记 0,等价于“这一拳有没有扛住”。
    1[⋅]\mathbb{1}[\cdot]
  3. 强攻击下的预测δ* 是 PGD-20 等高强度攻击找到的扰动,argmax_c 是模型在该攻击下的预测类别,与真实标签 y_i 比较。
    arg⁡max⁡c fc(xi+δi∗)=yi\arg\max_{c}\, f_c(x_i+\delta_i^{*}) = y_i

AI 应用场景

场景一:金融风控模型的每日对抗加固

阶段:模型训练与安全加固

解决的问题:信贷风控模型容易被攻击者用精心构造的“敌对特征”绕过(例如伪造流水特征)。传统 PGD 对抗训练在 GPU 集群上跑一轮要两天,跟不上每日更新的节奏。采用 FAST AT 后,每天凌晨用 FGSM-RS 快速重训一遍,成本接近普通训练,模型对欺诈样本的鲁棒性稳中有升。

具体案例:某消费金融公司的反欺诈团队把 FAST AT 接入每日训练流水线。随机起手生成的对抗样本覆盖更多特征组合,配合早停策略,线上欺诈拦截率提升 12%,训练耗时从 26 小时降到 3 小时。

场景二:自动驾驶感知模型的夜间增量训练

阶段:模型微调与鲁棒性更新

解决的问题:感知模型对贴纸、光照等物理扰动敏感,需要在夜间窗口内完成对抗训练增量更新。Free AT 让总轮数压缩为原来的 1/8,一次反向传播同时更新扰动与参数,模型可在 4 小时内完成原本需要 30 小时的加固。

具体案例:某自动驾驶公司用小步长、周期重置的 Free-8 在夜间重新训练目标检测头,验证集上对 PGD-20 攻击的鲁棒精度提升 9 个百分点,且不影响白天正常出车。

场景三:大模型内容安全微调

阶段:安全对齐与红队测试

解决的问题:大模型需要防御针对提示词的对抗注入。完整 PGD 对抗训练成本高昂,借助 FAST AT 的单步攻击加课程学习,可以快速微调出对恶意改写更稳健的模型。

具体案例:某安全团队对开源对话模型做安全微调,先用小 ε 的 FGSM-RS 训练弱扰动,再逐步加大强度,最终在保留 95% 干净回答质量的前提下,将恶意提示绕过率从 34% 压到 9%。

Python 演示

python69 行
import torchimport torch.nn as nnimport torch.optim as optim torch.manual_seed(0)  class TinyNet(nn.Module):    def __init__(self, dim=16, num_classes=2):        super().__init__()        self.net = nn.Sequential(            nn.Linear(dim, 32), nn.ReLU(), nn.Linear(32, num_classes)        )     def forward(self, x):        return self.net(x)  def fgsm_rs(model, x, y, eps, alpha, criterion):    # FAST AT 攻击: 随机起手 + 单步 FGSM    delta = torch.empty_like(x).uniform_(-eps, eps)    delta.requires_grad_(True)    loss = criterion(model(x + delta), y)    grad = torch.autograd.grad(loss, delta)[0]    delta = torch.clamp(delta + alpha * grad.sign(), -eps, eps)    return delta.detach()  def free_inner_loop(model, x, y, delta, inner_steps, alpha, eps, criterion, optimizer):    # Free AT 内层循环: 一次反向传播同时更新扰动与模型参数    for _ in range(inner_steps):        delta.requires_grad_(True)        loss = criterion(model(x + delta), y)        optimizer.zero_grad()        loss.backward()        delta = torch.clamp(delta + alpha * delta.grad.sign(), -eps, eps)        delta = delta.detach()        optimizer.step()    return delta  def main():    x = torch.randn(64, 16)    y = torch.randint(0, 2, (64,))    eps, alpha = 0.3, 0.3    criterion = nn.CrossEntropyLoss()     print('--- FAST AT: 每批次 2 次反向传播 ---')    model_fast = TinyNet()    opt_fast = optim.SGD(model_fast.parameters(), lr=0.1)    for epoch in range(3):        delta = fgsm_rs(model_fast, x, y, eps, alpha, criterion)        loss = criterion(model_fast(x + delta), y)        opt_fast.zero_grad()        loss.backward()        opt_fast.step()        print('epoch', epoch, 'loss', round(loss.item(), 4))     print('--- Free AT: 内层 4 步, 轮数压缩为 1/4 ---')    model_free = TinyNet()    opt_free = optim.SGD(model_free.parameters(), lr=0.1)    delta = torch.zeros_like(x)    for outer in range(2):        delta = free_inner_loop(model_free, x, y, delta, 4, alpha, eps, criterion, opt_free)        print('outer', outer, 'done')  if __name__ == '__main__':    main()
目的:用两个迷你模型分别演示 FAST AT(随机起手 + 单步 FGSM)和 Free AT(梯度重用内层循环)的最简训练流程,直观对比两种加速方法的反向传播次数。
  1. delta = torch.empty_like(x).uniform_(-eps, eps)随机起手:在 [-ε, ε] 内均匀采样初始扰动,模拟“虚晃一枪”。
  2. grad = torch.autograd.grad(loss, delta)[0]只求损失对扰动的梯度,得到“最疼的进攻方向”,不触碰模型参数。
  3. delta = torch.clamp(delta + alpha * grad.sign(), -eps, eps)沿梯度符号走一步并投影回界,得到最终对抗样本。
  4. delta.requires_grad_(True)让扰动重新成为计算图的叶子节点,准备下一轮梯度计算。
  5. loss.backward()这一次反向传播同时算出扰动梯度和参数梯度,是梯度重用的核心。
  6. optimizer.step()用同一个计算图产出的参数梯度更新模型,实现“一鱼两吃”。

常见误区

误区FAST AT 听起来很简单,就是把 PGD 的 10 步换成 FGSM 的 1 步,其他什么都不用改。既然名字叫“快速对抗训练”,那核心就是减少攻击步数而已。

正解减少步数只是表象,随机起手才是灵魂。纯 FGSM 训练几乎必然陷入灾难性过拟合,而加上 η 的均匀随机初始化后,单步攻击覆盖的方向变得多样,训练才可能稳定。此外,早停、权重扰动、课程学习等配套手段也缺一不可。就好比“快拳”的威力不在快,而在出拳前的虚晃让对方猜不透方向。

为何常见:从公式上看,FGSM-RS 和 FGSM 只差一个随机初始化项,初学者容易把这个“小差异”当成无关紧要的实现细节。

误区论文叫"Adversarial Training for Free",那 Free AT 应该完全不需要额外算力,任何模型都能白拿鲁棒性,也不需要调参。

正解“免费”是相对普通训练而言:每批次 m 次反向传播、总轮数压缩为 1/m,两者相乘后总计算量与普通训练相当。但相比不设防的普通训练,它依然多付出了 m 倍的单批次计算;而且内层步数 m、重置周期 B 都需要精心设置——m 太大扰动多样性不足,B 太大会让扰动与当前批次失配。免费午餐的菜谱还是得照着做。

为何常见:"Free"这个营销化命名极具迷惑性,让人误以为算法不需要任何成本或调参。

误区训练完成后,用 FGSM 在测试集上打一遍,发现鲁棒精度 90% 多,觉得模型已经很安全,可以上线了。

正解单步评估极易落入梯度遮蔽陷阱。模型可能只是把损失曲面“抹平”,让单步攻击找不到梯度,看起来攻不破;一旦换成 PGD-20 甚至 AutoAttack,防御立刻现出原形。正确的做法是用多步强攻击交叉验证——拳手只在陪练虚晃时防守出色,不代表能扛住真实擂台上的重拳。

为何常见:训练时用什么攻击,评估时就用什么攻击,这种“就近原则”让人忽略了模型可能针对特定攻击方式过拟合。

误区两者都是加速对抗训练的方法,名字也像,效果应该差不多,选哪个都行。

正解两者的思路截然不同:Free AT 靠梯度重用和轮数压缩省钱,适合算力中等、希望贴近 PGD 效果的场景;FAST AT 追求极致速度,单样本仅 2 次反向传播,但需要早停等技巧防过拟合,尤其适合快速迭代的工程环境。实际选择取决于算力预算、精度要求和数据规模,好比一位是“精打细算的陪练”,一位是“雷厉风行的陪练”,风格不同。

为何常见:两者名字相似、目标一致,容易误以为是同一方法的两种叫法。

面试题

Q1. Free AT 加速对抗训练的核心机制是什么?

单选题 · easy

  • A.用更强的 PGD-20 攻击替代弱攻击
  • B.一次反向传播同时更新扰动与参数← 正确答案
  • C.用更大的批次一次性处理更多样本
  • D.削减模型参数量以减少计算需求

答案:B。Free AT 的关键是梯度重用——同一个计算图里的反向传播既产出扰动梯度用于增强攻击,又产出参数梯度用于更新模型,相当于陪练热身的一拳被同时算作实战回合。其余选项都不是 Free AT 的思想。

Q2. FAST AT 在 FGSM 前加入随机扰动的根本原因是什么?

单选题 · easy

  • A.缩小扰动搜索空间以提升效率
  • B.防止单步攻击失效造成过拟合← 正确答案
  • C.让对抗样本看起来更自然一些
  • D.减少反向传播的次数与开销

答案:B。纯 FGSM 只有固定攻击方向,模型容易学会抄近道,出现灾难性过拟合。随机起手 η 让每次攻击起点不同,用方向多样性弥补单步攻击的深度不足,本质上是一个“虚晃一枪”的防背诵手段。

Q3. 下列哪种验证方式最能反映模型的真实对抗鲁棒性?

单选题 · easy

  • A.仅用 FGSM 单步攻击快速检测
  • B.仅观察干净测试集上的精度
  • C.使用 PGD-20 等多步强攻击复核← 正确答案
  • D.查看训练过程中的损失曲线

答案:C。单步攻击和干净精度都可能被梯度遮蔽蒙骗,只有 PGD-20 以上的强攻击才是“验收赛擂台”。这就好比陪练说拳手出师了,必须找陌生对手打真比赛才算数。

Q4. Free 算法中的超参数 m 表示什么意思?

单选题 · mid

  • A.对抗训练安排的总轮数
  • B.每个批次内的对抗迭代次数← 正确答案
  • C.扰动投影的上界大小 ε
  • D.学习率衰减的周期长度

答案:B。Free-m 中每个批次要在同一批样本上做 m 次内层循环,每轮都同时增强扰动并更新参数,因此总轮数可以压缩为原来的 1/m。m 是“内层循环次数”,不是总轮数或扰动上界。

Q5. 关于 Free AT 的训练流程,下列说法正确的有?

多选题 · mid

  • A.同一批次内扰动会被逐步增强← 正确答案
  • B.扰动每隔若干批次需要重置← 正确答案
  • C.总训练轮数可压缩为原来的 1/m← 正确答案
  • D.每次反向传播只用于更新参数

答案:ABC。Free AT 内层循环里扰动沿梯度符号逐步变强;为避免扰动累积过强与当前批次失配,每隔 B 批重置;总轮数压缩为 1/m 是“免费”的来源。D 恰恰相反——同一次反向传播同时更新扰动和参数。

Q6. 灾难性过拟合最典型的表现是什么?

单选题 · mid

  • A.对抗鲁棒精度骤降而干净精度正常← 正确答案
  • B.干净样本精度突然跌至接近零
  • C.训练损失出现剧烈的震荡发散
  • D.模型对任意输入都输出同一类别

答案:A。灾难性过拟合的特征是模型“抄近道”记住了单步攻击的固定模式,导致对抗鲁棒精度突然下跌,但干净精度看起来依然正常——拳手只会躲那一种虚晃直拳,遇到真拳就垮。

Q7. 与传统 PGD-10 相比,Free-8 的说法正确的是?

多选题 · hard

  • A.每批次反向传播次数由 11 次降为 8 次← 正确答案
  • B.训练总轮数可压缩为原来的八分之一← 正确答案
  • C.参数总更新次数在同等算力下基本不变← 正确答案
  • D.每次反向传播只用于生成对抗扰动

答案:ABC。PGD-10 每批次 1+10=11 次反向传播,Free-8 是 8 次且每次两用;轮数压缩为 1/8 后,总计算量与普通训练相当,参数更新总次数也大致不变。D 是传统方案的做法,与 Free 的梯度重用正好相反。

Q8. 梯度遮蔽(gradient masking)的典型危害是什么?

单选题 · hard

  • A.弱攻击下表现鲁棒强攻击下却崩盘← 正确答案
  • B.强攻击下表现鲁棒弱攻击下却崩盘
  • C.训练过程中梯度频繁出现爆炸消失
  • D.模型参数量过大致使训练速度过慢

答案:A。梯度遮蔽让损失曲面被“抹平”,单步弱攻击找不到有效梯度,显得模型很安全;但换成 PGD-20 强攻击后防御立刻崩溃。这提醒我们必须用强攻击做验收,不能只看训练时的攻击表现。

Q9. Free AT 中扰动每隔 B 个批次需要重置的主要原因是什么?

单选题 · single

  • A.防止扰动累积过强与当前批次失配← 正确答案
  • B.释放显存以便训练更大的批次
  • C.使每个批次从更干净的样本出发
  • D.避免单步攻击落入局部最优陷阱

答案:A。扰动随内层循环不断累积,但新批次的数据分布会变化,旧扰动可能不再是当前批次的最优攻击。定期重置相当于陪练每练几组就换一套打法,防止拳手背下固定套路,也与“扰动多样性”密切相关。

Q10. 缓解 FAST AT 灾难性过拟合的常用工程手段包括?

多选题 · mid

  • A.在验证集上持续监控并提前早停← 正确答案
  • B.对模型权重施加微小的随机扰动← 正确答案
  • C.课程式逐步增大扰动的强度上限← 正确答案
  • D.放弃对抗训练改用普通干净训练

答案:ABC。早停能在鲁棒精度开始下滑时及时止损;权重扰动打散损失曲面,让模型难以记住单步攻击的捷径;课程学习从弱扰动起步,让模型循序渐进。D 是放弃治疗,与加固目标背道而驰。