3. 对抗样本攻击与防御面试题

对抗样本是 AI 安全面试中区分度最高的话题之一。面试官通常不会只问“什么是对抗样本”,而是要求你讲清攻击的数学本质、能写出关键公式、能解释参数含义,并能针对具体防御方案说出其局限。本章围绕三类代表性攻击(FGSM、PGD、C&W)和两类主流防御(对抗训练、输入变换)展开,并给出可复现的实现细节与判断依据。

一、对抗样本的基本设定

给定一个已训练好的分类器 f(x) 和一张干净样本 x,其真实标签为 y。对抗样本的目标是构造扰动 δ,使 x' = x + δ 满足两个条件:一是 f(x') ≠ y(非目标攻击)或 f(x') = ytarget(目标攻击);二是扰动足够小,人眼难以察觉。常用约束是 L∞ 范数 ‖δ‖∞ ≤ ε,即每个像素的改动不超过 ε。面试中若被问到“为什么用 L∞”,可以回答:它对应像素级最大改动上限,便于在图像任务中控制视觉不可感知性,且与梯度符号法天然契合。

二、FGSM:一步到位的快速攻击

FGSM(Fast Gradient Sign Method)由 Goodfellow 等人提出,核心思想是沿着损失函数对输入梯度的符号方向,一次性加上最大扰动。公式为:

x' = x + ε · sign(∇<sub>x</sub> J(x, y))

其中 J 是交叉熵损失,∇x J 表示损失对输入的梯度。sign 函数只取梯度方向,保证每个像素改动幅度恰好为 ε。以 PyTorch 为例,关键实现如下:

loss = criterion(model(x), y)
loss.backward()
x_adv = x + eps * x.grad.sign()
x_adv = torch.clamp(x_adv, 0, 1)

注意 torch.clamp 用于将像素值限制在合法范围。FGSM 的优点是计算极快,一次前向+反向即可;缺点是攻击成功率有限,尤其对已做对抗训练的模型几乎无效。面试中常被追问“FGSM 为什么容易失败”,标准回答是:它只利用单步线性近似,当损失曲面局部非线性较强时,一步走不到真正的决策边界外。

三、PGD:迭代式攻击的基准

PGD(Projected Gradient Descent)可视为 FGSM 的多步迭代版本,也是目前评估鲁棒性的“标准攻击”。其迭代过程为:

x<sup>t+1</sup> = Π<sub>ε</sub>( x<sup>t</sup> + α · sign(∇<sub>x</sub> J(x<sup>t</sup>, y)) )

其中 α 是步长,Πε 表示投影到 ‖x' - x‖∞ ≤ ε 的球内。通常还会在初始点加入随机噪声,形成 PGD-Random Start。典型参数:ε=8/255,α=2/255,迭代 20 步。实现时需注意每步后都要裁剪回 ε 球内:

x_adv = x + torch.empty_like(x).uniform_(-eps, eps)
for _ in range(steps):
    x_adv.requires_grad = True
    loss = criterion(model(x_adv), y)
    loss.backward()
    x_adv = x_adv + alpha * x_adv.grad.sign()
    delta = torch.clamp(x_adv - x, -eps, eps)
    x_adv = torch.clamp(x + delta, 0, 1).detach()

PGD 的攻击成功率显著高于 FGSM,且常被用作对抗训练的内层攻击。面试中若问“PGD 与 FGSM 的本质区别”,应回答:FGSM 是单步线性攻击,PGD 是多步迭代并带投影,能更充分地探索 ε 球内的损失上升方向。

四、C&W:优化式攻击的精细代表

C&W(Carlini & Wagner)攻击不依赖梯度符号,而是把对抗样本构造转化为优化问题。以 L2 版本为例,目标是最小化扰动范数,同时使模型误分类。常用形式为:

minimize ‖δ‖<sub>2</sub><sup>2</sup> + c · f(x + δ)
such that x + δ ∈ [0,1]<sup>n</sup>

其中 f 是自定义的误分类损失,例如 f(x') = max(Z(x')y - maxi≠y Z(x')i, -κ),Z 为 logits,κ 控制置信度。C&W 通过变量替换 δ = 0.5(tanh(w)+1) - x 自动满足像素范围约束,再用 Adam 优化 w。其特点是扰动更小、成功率更高,但计算开销大。面试中常问“C&W 为什么比 PGD 更强”,可答:它直接优化扰动范数而非固定 ε,且能绕过梯度掩蔽类防御。

五、对抗训练:最有效的防御基线

对抗训练的核心思想是把对抗样本加入训练集,让模型在扰动下仍能正确分类。最常用的是 PGD 对抗训练,即每次训练时先用 PGD 生成对抗样本,再用其更新模型参数。损失函数为:

min<sub>θ</sub> E<sub>(x,y)</sub> [ max<sub>‖δ‖≤ε</sub> J(f<sub>θ</sub>(x+δ), y) ]

实现时,内层用 PGD 求对抗样本,外层用 SGD/Adam 更新权重。典型配置:ε=8/255,α=2/255,7 步 PGD,训练轮数比正常训练多 3~5 倍。对抗训练能显著提升鲁棒性,但会降低干净样本精度,且对未见过的攻击类型泛化有限。面试中若问“对抗训练为什么慢”,应回答:每步都要多算 K 次前向+反向,计算量约为正常训练的 K+1 倍。

六、输入变换:轻量但有限的防御

输入变换通过在推理前对输入做预处理,破坏对抗扰动的结构。常见方法包括:位深压缩(如将 8 位降到 4 位)、JPEG 压缩、总变差最小化、随机缩放与填充。以位深压缩为例:

x_reduced = torch.round(x * 15) / 15

该操作会把小幅扰动“抹平”,但对较大扰动或自适应攻击无效。面试中常被追问“输入变换能否作为独立防御”,标准回答是:不能,它只能作为辅助手段,因为攻击者可在变换后重新优化扰动,且变换本身会损失干净样本精度。

七、面试实战:如何组织回答

当被问到“请对比 FGSM、PGD、C&W”时,可按以下结构回答:先给统一设定(L∞ 约束、损失函数),再分别说明三者的优化方式(单步符号、多步投影、无约束优化),最后给出适用场景(FGSM 快速评估、PGD 标准基准、C&W 精细评估)。若被问到“如何防御”,先讲对抗训练是基线,再讲输入变换的局限,最后补充检测类方法(如特征压缩、对抗训练+检测)作为组合方案。

下面给出一份可直接用于面试复习的对比表,字段均围绕攻击/防御的核心属性设计:

方法 类型 核心操作 关键参数 优点 局限
FGSM 攻击 单步符号梯度 ε 极快 成功率低
PGD 攻击 多步迭代+投影 ε, α, 步数 成功率高,基准 计算开销大
C&W 攻击 优化扰动范数 c, κ 扰动小,可绕防御 速度慢
对抗训练 防御 PGD 生成样本训练 ε, 步数, 轮数 鲁棒性强 慢,干净精度降
输入变换 防御 压缩/量化/缩放 位深、质量因子 轻量 易被自适应攻击绕过

最后提醒:面试中若被要求手写 PGD 代码,务必写清投影步骤和 detach,否则计算图会累积导致显存爆炸。若被问到“对抗训练后模型是否绝对安全”,应回答:不,它只对训练时使用的 ε 和攻击类型有较好鲁棒性,对更大 ε 或 C&W 等优化攻击仍可能失效,因此需要持续评估与组合防御。