想象小区门口新装了一套 AI 门禁系统,它能一秒认出所有住户。淘气包豆豆偏要让它出丑——他被一根长度为 ε 的绳子拴在门柱上,只能在绳圈半径内活动。豆豆的捣乱策略很聪明:每次先观察哪个方向最能让门禁“犯迷糊”(这就是梯度方向),然后朝那里迈一小步;如果步子太猛要冲出绳圈,妈妈会一把把他拽回绳圈边缘(这就是投影)。他一遍遍重复“试探→迈步→被拽回”,最终停在绳圈里最让门禁头疼的位置。这个“捣乱流程”,正是 AI 安全里大名鼎鼎的 PGD 攻击——投影梯度下降(Projected Gradient Descent)。听起来高深,拆开不过是“沿着最气人的方向小步走 + 超界就被拉回来”。本文将带你从数学原理、参数设置、代码实现到对抗训练防御,彻底看懂这位“绳圈里的淘气包”。

岗位关联

掌握 PGD 是 AI 安全测评的必修课:用最小扰动暴露模型最脆弱的环节,是你做红队测试、对抗训练和模型上线前的核心武器。

目录
  1. 可视化演示
  2. 威胁模型:先给捣乱圈一块合法地盘
  3. 梯度攻击:每一步都踩在“最滑”的方向
  4. 投影运算:绳子一紧就被拽回
  5. 参数调优:步长与次数如何搭配
  6. 与 FGSM 的渊源:从猛冲一步到谨慎连击
  7. 对抗训练:用“毒样本”练出百毒不侵的守卫
  8. 实战攻击流程:从拿到模型到输出评估报表
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示PGD投影梯度下降攻击原理与的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。

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

PGD投影梯度下降攻击原理与:PGD攻 PGD攻击的基本原理与定位 投影操作的作用与实现 核心机制可视化 PGD投影梯度下降攻击原理与整体架构与关键组件

威胁模型:先给捣乱圈一块合法地盘

豆豆捣乱前,妈妈跟他约法三章:绳子只有 ε 长,你只能在以门柱为圆心、半径 ε 的圆里折腾,出圈就拽回;同时不许把脸涂得亲妈都认不出。这两条规则,正是攻击里的“威胁模型”——它把“能改多少、怎么算超界”提前钉死。

在对抗攻防中,威胁模型定义了攻击者的能力边界。PGD 是白盒攻击:攻击者拿到模型全部参数、梯度甚至损失函数,就像豆豆不仅知道门禁的规则,还能偷看到探测器的“思考过程”。有了这份情报,他才能精准计算“最气人的方向”。

技术上,对抗样本 x' 被要求与原图 x₀ 足够接近,用范数约束表达:

有了威胁模型,豆豆的行为就被“圈定”了——不是在院子里乱跑,而是在绳子许可的圆周里寻找最佳捣乱点。这也是对抗攻击合法性的前提:微小、隐蔽、有边界。

∥x′−x0∥∞≤ε\|x' - x_0\|_\infty \le \varepsilon
这个公式说:无论如何捣乱,改动最大的那个像素也不能超过 ε——这就是绳子的长度。
  1. 扰动增量$x' - x_0$ 表示攻击者给每个像素注入的偏移量,是“改了多少”的量化。
    x′−x0x' - x_0
  2. 无穷范数$\| \cdot \|_\infty$ 取出所有分量中绝对值最大的那个,代表最出格的一笔改动。
    ∥Δ∥∞=max⁡i∣Δi∣\|\Delta\|_\infty = \max_i |\Delta_i|
  3. 预算约束$\le \varepsilon$ 要求最大改动不超过 ε,等价于豆豆的绳长封顶。
    max⁡i∣xi′−x0,i∣≤ε\max_i |x'_i - x_{0,i}| \le \varepsilon

梯度攻击:每一步都踩在“最滑”的方向

绳圈画好后,豆豆开始琢磨:怎么在圈里找到最气人的点?他想到一个笨办法——每走一步,先感受脚下哪边“地最滑”(门禁最容易错乱的方向),就朝那边挪一脚。这个“最滑方向”,在数学里就是梯度。

深度学习模型是端到端可微函数,损失函数对输入的梯度恰好告诉攻击者:“往这个方向改,模型的错乱程度上升最快。”PGD 于是做梯度上升——不是更新模型参数,而是更新输入样本本身,反复恶心模型。这正是“梯度攻击”三个字的来源:用梯度做导航。

PGD 的迭代更新公式如下:

豆豆每一步都踩在“最滑”的点子上,越走越让门禁糊涂。但光知道方向还不够,步子大了总会被绳子拽疼——于是“投影”这个动作正式登场。

xt+1=ΠB∞(x0,ε)(xt+α⋅sign⁡(∇xL(xt,y)))x_{t+1} = \Pi_{B_\infty(x_0, \varepsilon)}\left(x_t + \alpha \cdot \operatorname{sign}\left(\nabla_x \mathcal{L}(x_t, y)\right)\right)
每次迭代分两步:先沿符号梯度方向迈一小步,再用投影把样本拉回 ε 球内。
  1. 计算梯度$\nabla_x \mathcal{L}(x_t, y)$ 在当前攻击样本上求损失对输入的梯度,告诉攻击者哪个方向“最气人”。
    ∇xL(xt,y)\nabla_x \mathcal{L}(x_t, y)
  2. 取符号$\operatorname{sign}(\cdot)$ 只保留方向、每像素只取 ±1,确保改动的“力度”均匀,不因某像素梯度特别大而失衡。
    sign⁡(∇xL)\operatorname{sign}(\nabla_x \mathcal{L})
  3. 乘步长$\alpha \cdot$ 每次迈出的实际距离由步长 α 控制,步子大小决定了攻击的细腻程度。
    α⋅sign⁡(∇xL)\alpha \cdot \operatorname{sign}(\nabla_x \mathcal{L})
  4. 累加更新$x_t + \cdots$ 把这一步的“冲动”加到当前样本上,形成新的候选扰动。
    xt+α⋅sign⁡(∇xL(xt,y))x_t + \alpha \cdot \operatorname{sign}(\nabla_x \mathcal{L}(x_t, y))
  5. 投影拉回$\Pi_{B_\infty}(\cdot)$ 若超出 ε 球,就把样本拽回边界,保证始终不越绳。
    ΠB∞(x0,ε)(⋅)\Pi_{B_\infty(x_0, \varepsilon)}(\cdot)

投影运算:绳子一紧就被拽回

豆豆刚开始撒腿就跑,每次都被妈妈拽回来,疼得直咧嘴。后来他学会“跑出去半步就主动收脚”——只要感觉绳子绷紧,就退回到半径 ε 的边界上。这个“收脚”动作,就是投影。

没有投影的迭代会越走越远,最后变成一张大花脸,既不符合威胁模型也失去隐蔽意义。投影的作用,是让每一次更新后的样本都“回到绳圈内”,保证始终满足 L∞ 约束。在 L∞ 球上,投影退化为逐元素裁剪:

工业实现里,做完 ε 球投影后通常还要再 clip 到图像像素域 [0, 1],因为像素值本身有物理上限。豆豆终于明白:绳子不是限制,而是保护——它让每一次捣乱都保持在“人眼看不出”的范围内,投影就是那个温柔又坚决的妈妈。

ΠB∞(z)=clip⁡(z,  x0−ε,  x0+ε)\Pi_{B_\infty}(z) = \operatorname{clip}\left(z, \; x_0 - \varepsilon, \; x_0 + \varepsilon\right)
投影就是把每个越界的像素值压回区间,像妈妈把豆豆轻轻拽回绳圈边缘。
  1. 下界$x_0 - \varepsilon$ 每个像素允许取到的最小值,对应绳圈的“内侧墙”。
    x0−εx_0 - \varepsilon
  2. 上界$x_0 + \varepsilon$ 每个像素允许取到的最大值,对应绳圈的“外侧墙”。
    x0+εx_0 + \varepsilon
  3. clip 作用$\operatorname{clip}(z, \cdot, \cdot)$ 把越界的值压回上下界之间,等价于把点垂直拉到 ε 球表面——超一分拉一分,不多不少。
    clip⁡(z,a,b)=min⁡(max⁡(z,a),b)\operatorname{clip}(z, a, b) = \min(\max(z, a), b)

参数调优:步长与次数如何搭配

妈妈发现豆豆老撞绳圈,于是教他两个诀窍:步子别迈太大(步长 α 要小),多试几次(迭代步数 T 要多)。步子太大容易一步撞墙,步子太小又半天到不了好位置。

PGD 的两个核心超参数正是迭代步数 T 与步长 α。T 太小找不到最差点,T 太大浪费算力;α 太大频繁撞界,α 太小收敛缓慢。常用的启发式是把总预算分摊到每一步:

除步长外,还有个实用技巧:从均匀噪声的随机起点出发,而非直接复制原图。这能帮助梯度上升跳出局部“不气人”的区域,往往得到更强的攻击效果。豆豆调整节奏后,既不撞绳圈又能深入绳圈最刁钻的角落——同样的绳子,不同的步法,效果天差地别。

α=εT\alpha = \frac{\varepsilon}{T}
把总预算 ε 均分给 T 次迭代,每次只走一小步。
  1. 总预算$\varepsilon$ 允许改动的总幅度,即绳子的物理长度。
    ε\varepsilon
  2. 步数$T$ 一共迈多少小步,决定探测的精细程度。
    TT
  3. 单步步长$\frac{\varepsilon}{T}$ 每步最大移动量,保证 T 步的总移动量刚好不超预算。
    εT\frac{\varepsilon}{T}

与 FGSM 的渊源:从猛冲一步到谨慎连击

豆豆的表哥大壮也想捣乱,但他懒得一步步试探,直接铆足劲朝“最滑”方向猛冲一大步——结果要么撞绳圈被拽疼,要么冲过头跑到圈外。这个“一步到位的莽夫”,就是 FGSM。

FGSM(Fast Gradient Sign Method)是 PGD 的前身,只做一次更新,把全部预算 ε 一次性押在初始梯度方向上:

PGD 相当于把 FGSM 重复 T 次,每步用 α = ε/T 的小步长,并且每步投影回 ε 球。多步的妙处在于“边试探边修正”——梯度信息不断用最新位置刷新,而不是凭初始印象一条路走到黑。经验上 PGD(通常 T ≥ 7)攻击成功率远高于 FGSM,代价是 T 倍的计算开销。大壮每次莽撞都被绳子拽回,豆豆却一点点摸到了绳圈边缘最刁钻的死角——精准,永远比大力更重要。

xFGSM=x0+ε⋅sign⁡(∇xL(x0,y))x_{FGSM} = x_0 + \varepsilon \cdot \operatorname{sign}\left(\nabla_x \mathcal{L}(x_0, y)\right)
FGSM 是 PGD 的“一步版”,把所有预算押在一次猛冲上,快但粗糙。
  1. 单步扰动$\varepsilon \cdot \operatorname{sign}(\cdot)$ 一步用满全部预算,像大壮一脚蹬到极限。
    ε⋅sign⁡(∇xL)\varepsilon \cdot \operatorname{sign}(\nabla_x \mathcal{L})
  2. 初始梯度$\nabla_x \mathcal{L}(x_0, y)$ 只在原始样本处算一次梯度,之后不再回头。
    ∇xL(x0,y)\nabla_x \mathcal{L}(x_0, y)
  3. PGD 的嵌套对比$x_t + \alpha \operatorname{sign}(\nabla_x \mathcal{L}(x_t, y))$ PGD 每步都重新计算梯度,逐步逼近比“一步到位”更坏的点。
    xt+1=xt+αsign⁡(∇xL(xt,y))x_{t+1} = x_t + \alpha \operatorname{sign}(\nabla_x \mathcal{L}(x_t, y))

对抗训练:用“毒样本”练出百毒不侵的守卫

门禁管理员发现豆豆总钻空子,灵机一动:干脆把豆豆最常捣乱的几个位置拍成照片,天天让门禁反复看这些“反面教材”。看多了,门禁自然学会了在这些位置也不犯错——这就是对抗训练。

对抗训练的思路是“用攻击生成的数据增强训练集”。训练过程中,每个 batch 先跑一遍 PGD 生成对抗样本,然后把“毒样本”连同干净样本一起喂给模型,迫使它在整个 ε 球内部都保持稳定。数学上,这是一个 min-max 问题:

PGD 常被当作内层攻击器,因为它是目前最接近“最坏扰动”的实用攻击;因此它也顺理成章成为评测防御模型的基准考官。豆豆发现,自己精心挑选的捣乱点,门禁居然全都“见过”了。对抗训练不能让模型无敌,但确实让 PGD 的命中率大幅下降——防守方也在进步。

min⁡θ  E(x,y)∼D[max⁡∥δ∥∞≤εL(fθ(x+δ),y)]\min_\theta \; \mathbb{E}_{(x,y)\sim \mathcal{D}}\left[\max_{\|\delta\|_\infty \le \varepsilon} \mathcal{L}\left(f_\theta(x+\delta), y\right)\right]
内层攻击者找最坏扰动,外层训练者让模型适应最坏情况——攻防双方在一句话里较劲。
  1. 内层 max$\max_{\|\delta\|_\infty \le \varepsilon} \mathcal{L}$ 攻击者在 ε 球内寻找最让模型丢脸的扰动 δ。
    max⁡∥δ∥∞≤εL(fθ(x+δ),y)\max_{\|\delta\|_\infty \le \varepsilon} \mathcal{L}(f_\theta(x+\delta), y)
  2. 外层 min$\min_\theta$ 不断更新模型参数,让这个“最坏损失”尽量变小。
    min⁡θ\min_\theta
  3. 期望$\mathbb{E}_{(x,y)\sim \mathcal{D}}$ 对训练分布里的所有样本求平均,保证整体鲁棒而非个别样本。
    E(x,y)∼D\mathbb{E}_{(x,y)\sim \mathcal{D}}

实战攻击流程:从拿到模型到输出评估报表

现在,豆豆的捣乱手册终于成书。管理员想验证自家门禁有多抗造,就按手册走一遍:加载模型、放出豆豆(配好参数)、统计被耍了几次、把几张“杰作”打印出来张贴对比——这就是一次标准的 PGD 测评。

在真实项目中,PGD 攻击按固定流程执行:加载目标模型与测试集 → 配置攻击参数(ε、α、T、是否随机起点)→ 逐 batch 生成对抗样本 → 计算攻击成功率 ASR → 可视化对比原图与对抗样本。攻击成功率的定义是:

测评报告通常同时报干净样本准确率与 ASR,观察攻击在“有效性”与“隐蔽性”之间的平衡。手册合上,豆豆的“捣乱十八式”已经变成工程师手中的标准攻击器。PGD 从原理到实现,不过如此——一条绳子、一个方向、几步试探,外加一个随时把你拉回边界的投影。

ASR=1N∑i=1N1[fθ(xi′)≠yi]ASR = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}\left[f_\theta(x_i') \neq y_i\right]
攻击成功率 = 被成功骗过的样本占比,ASR 越高说明模型越脆弱。
  1. 指示函数$\mathbb{1}[\cdot]$ 条件成立记 1、否则记 0,用来给“是否被骗”计数。
    1[fθ(xi′)≠yi]\mathbb{1}[f_\theta(x_i') \neq y_i]
  2. 平均$\frac{1}{N}\sum_{i=1}^{N}$ 在 N 个测试样本上求平均,得到整体成功率。
    1N∑i=1N\frac{1}{N}\sum_{i=1}^{N}
  3. 判据$f_\theta(x_i') \neq y_i$ 模型在对抗样本上预测错,即攻击成功。
    fθ(xi′)≠yif_\theta(x_i') \neq y_i

AI 应用场景

模型上线前的红队安全测评

阶段:模型评测与安全验证

解决的问题:传统测试只盯着干净样本的准确率,无法暴露模型对微小扰动的脆弱性。PGD 能生成当前最接近“最坏情况”的对抗样本,把模型脆弱的底线一次性试出来。

具体案例:某银行对人脸识别门禁做白盒测评,用 PGD(ε=0.05,T=20)攻击测试集,发现攻击成功率高达 78%,且人眼几乎看不出改动。评测报告直接导致上线计划推迟,团队随后引入对抗训练。

对抗训练数据工厂

阶段:数据增强与模型训练

解决的问题:真实对抗样本收集成本高、覆盖不全。用 PGD 在训练过程中现场生成“毒样本”,动态注入训练集,让模型在每个 batch 里都见到自己的软肋。

具体案例:自动驾驶团队的交通标志分类器,每次迭代先用 PGD 生成一批对抗标志,再与真实样本混合训练。三个月后,野外场景误识率下降 43%,通过车规级安全评审。

Python 演示

python41 行
import torchimport torch.nn.functional as F  def pgd_attack(model, x0, y_true, eps=0.3, alpha=0.01, steps=40, random_start=True):    # 白盒 PGD 攻击: 在 L_inf 球内迭代寻找使损失最大的扰动.    model.eval()    x_adv = x0.clone().detach()    if random_start:        noise = torch.empty_like(x0).uniform_(-eps, eps)        x_adv = torch.clamp(x0 + noise, 0.0, 1.0)    x_adv.requires_grad_(True)    for _ in range(steps):        loss = F.cross_entropy(model(x_adv), y_true)        grad = torch.autograd.grad(loss, x_adv)[0]        x_adv = x_adv + alpha * grad.sign()        x_adv = torch.clamp(x_adv, x0 - eps, x0 + eps)  # 投影回 L_inf 球        x_adv = torch.clamp(x_adv, 0.0, 1.0)            # 回到像素合法区间        x_adv = x_adv.detach().requires_grad_(True)    return x_adv.detach()  def main():    torch.manual_seed(0)    # 用随机权重的小网络模拟被攻击的模型    model = torch.nn.Sequential(        torch.nn.Flatten(),        torch.nn.Linear(784, 128),        torch.nn.ReLU(),        torch.nn.Linear(128, 10),    )    x0 = torch.rand(1, 28, 28)    y_true = torch.tensor([2])    x_adv = pgd_attack(model, x0, y_true, eps=0.3, alpha=0.01, steps=40)    before = model(x0).argmax(dim=1).item()    after = model(x_adv).argmax(dim=1).item()    print(f"原始预测: {before}, 攻击后预测: {after}")  if __name__ == "__main__":    main()
目的:实现一个完整的白盒 PGD 攻击器,演示“随机起点 → 符号梯度更新 → 投影回 L∞ 球 → 再裁剪到像素域”的完整流程,可直接套用到真实模型的鲁棒性测评中。
  1. noise = torch.empty_like(x0).uniform_(-eps, eps)生成 ε 球内的均匀随机起点,对应“随机扰动起点”技巧。
  2. loss = F.cross_entropy(model(x_adv), y_true)计算当前对抗样本上的交叉熵损失,值越大代表模型越糊涂。
  3. grad = torch.autograd.grad(loss, x_adv)[0]对输入求梯度,得到“最气人”的方向。
  4. x_adv = x_adv + alpha * grad.sign()沿符号梯度方向上升一小步,保证每个像素改动幅度均匀。
  5. x_adv = torch.clamp(x_adv, x0 - eps, x0 + eps)投影回 L∞ 球,越界的像素被拽回边界。
  6. x_adv = torch.clamp(x_adv, 0.0, 1.0)再裁剪到图像像素合法区间,避免产生非法像素值。
  7. x_adv = x_adv.detach().requires_grad_(True)断开旧计算图并为下一步重新挂梯度,避免内存爆炸。
  8. before = model(x0).argmax(dim=1).item()查看攻击前模型预测,与攻击后预测对比判断是否成功。

常见误区

误区我一开始以为 PGD 攻击就是随机抖动像素,把图片弄得花一点,噪声够大就能骗过模型。

正解PGD 的扰动是定向的,由损失函数对输入的梯度引导,每一步都朝“最让模型生气”的方向移动。随机噪声大多被模型免疫,而梯度引导能用极小扰动撬动巨大错误——就像豆豆专门挑监控的死角试探,而不是满院子乱蹦。

为何常见:因为最终效果都是图片上叠加了肉眼难辨的像素变化,表面形式相似,容易混淆随机与定向的本质。

误区以为把扰动预算 ε 拉满就能万无一失,比如直接取 10,让每个像素都大改特改。

正解预算太大,扰动肉眼可见,攻击就失去了隐蔽性,还可能被防御端的高斯滤波等预处理直接洗掉。真实攻击的价值在于“别人看不出被改过,模型却认错”。就像豆豆不能拆掉围栏去捣乱,只能在绳子允许的范围内钻空子。

为何常见:直觉上“空间越大越好发挥”,忽略了攻击的隐蔽性约束和部署场景的现实限制。

误区认为投影只是简单的像素后处理,和平时把越界像素值写回合法区间没什么区别。

正解投影是把点拉回以原始样本为中心的 ε 球,L∞ 下用 clip 把每个像素限制在 [x₀−ε, x₀+ε];之后还要再 clamp 到 [0,1] 图像域。两者的几何语义完全不同:一个是“不偏离原图太远”,一个是“符合物理像素格式”,缺一不可。

为何常见:因为代码里都是一行 clip/clamp,看不出几何对象之间的差别,只有画出 ε 球才能理解。

误区觉得往训练集里加一轮 PGD 生成的样本,模型从此对一切攻击免疫,可以高枕无忧。

正解对抗训练只对特定攻击族(如 L∞ 下的 PGD)有效,PGD 只是逼近最坏扰动而非穷尽一切可能。换了更大的 ε、更强的攻击器或自适应攻击,模型仍可能被击穿。防御是持续的对抗升级过程,而非一锤子买卖。

为何常见:因为看到实验报告里 PGD 攻击率大幅下降,便误以为鲁棒性已普适,忽略了威胁模型本身的限定条件。

面试题

Q1. PGD 中的 P(Projected)代表什么?

单选题 · easy

  • A.概率梯度下降
  • B.投影梯度下降← 正确答案
  • C.梯度下降投影
  • D.投影梯度更新

答案:B。PGD 全称 Projected Gradient Descent,即投影梯度下降。核心思想是每步沿梯度方向更新后,再把结果投影回允许的扰动范围内,保证不越界。选项 A 是杜撰,C 和 D 颠倒了词序,语义不对。

Q2. PGD 更新时,沿什么方向增加损失?

单选题 · easy

  • A.梯度的模长方向
  • B.梯度的二阶方向
  • C.梯度的随机方向
  • D.梯度的符号方向← 正确答案

答案:D。PGD 使用符号函数 sign 提取梯度的方向信息,每个像素只取 +1 或 −1,确保改动幅度均匀。模长方向会让个别像素被过度放大,二阶方向是牛顿法的思路,随机方向则完全丢失了梯度信息。

Q3. 在 L∞ 约束下,投影操作的本质是什么?

单选题 · easy

  • A.压缩像素取均值
  • B.计算矩阵点积
  • C.裁剪到合法区间← 正确答案
  • D.做傅里叶变换

答案:C。L∞ 球在坐标轴上是一个超立方体,投影到立方体上的操作就是逐元素裁剪(clip),把越界像素压回 [x₀−ε, x₀+ε]。取均值、点积、傅里叶变换都不是“把点拉回可行域”的投影运算。

Q4. PGD 相比 FGSM 的核心区别是什么?

单选题 · mid

  • A.多步迭代并投影← 正确答案
  • B.无需计算梯度
  • C.属于黑盒攻击
  • D.只修改样本标签

答案:A。FGSM 一步用满所有预算,PGD 则把预算拆成 T 小步,每步重新算梯度并投影回 ε 球,因此能找到更强的对抗样本。PGD 同样需要梯度(白盒),也不修改标签,所以 B、C、D 均错误。

Q5. PGD 每步对图像做投影时,需要同时裁剪到哪些范围?

多选题 · mid

  • A.原始样本的 ε 邻域← 正确答案
  • B.像素值的合法区间← 正确答案
  • C.模型参数的取值区间
  • D.数据集标签的取值域

答案:AB。每次更新后必须先裁剪回以原始样本为中心的 ε 球(保证扰动不超界),再裁剪到像素合法区间 [0,1](保证图像物理有效)。模型参数和标签是训练阶段的对象,攻击阶段不会去修改它们。

Q6. PGD 使用随机噪声作为起点的好处是?

单选题 · mid

  • A.帮助减少迭代步骤
  • B.帮助保护模型隐私
  • C.帮助跳出不良局部解← 正确答案
  • D.帮助提升投影精度

答案:C。PGD 做的是非凸优化中的梯度上升,容易陷入局部“不够气人”的区域。随机起点相当于让豆豆换一个角落开始试探,更可能逼近全局最坏扰动。它并不减少步数、不涉及隐私,也与投影精度无关。

Q7. 在白盒攻击流程中,PGD 可以承担哪些角色?

多选题 · mid

  • A.替代损失函数
  • B.生成强对抗样本← 正确答案
  • C.评估模型鲁棒性← 正确答案
  • D.修改训练标签

答案:BC。PGD 既能作为攻击器生成高强度的对抗样本,也常作为鲁棒性基准来评判防御模型的底线。它不替代损失函数,也不修改标签——它只是利用损失函数的梯度来制造扰动。

Q8. 迭代步数 T 固定时,步长 α 设置过大会导致什么?

单选题 · hard

  • A.过早碰界并反复裁剪← 正确答案
  • B.损失函数立即归零
  • C.梯度变为零向量
  • D.模型参数被重置

答案:A。步长过大时,每步都会大幅冲出 ε 球,投影被迫把点拽回边界,轨迹变成“一路贴墙弹跳”,反而错过圈内更刁钻的位置。损失函数不会归零、梯度不会消失,模型参数更不会被攻击改变。

Q9. 攻击成功率 ASR 的分子统计的是什么?

单选题 · hard

  • A.模型损失函数为零
  • B.攻击成功指示为真← 正确答案
  • C.扰动范数超过预算
  • D.迭代次数达到上限

答案:B。ASR = (攻击成功的样本数) / (总样本数),其中“攻击成功”由指示函数 1[f(x′) ≠ y] 判定,即模型在对抗样本上预测错误。损失大小、扰动是否超预算、迭代次数都与成功率定义无关。

Q10. 关于对抗训练与 PGD 的搭配,说法正确的有?

多选题 · hard

  • A.对抗训练可增强鲁棒性← 正确答案
  • B.训练时注入 PGD 样本← 正确答案
  • C.增大 ε 必能完全防御
  • D.PGD 可衡量防御强度← 正确答案

答案:ABD。对抗训练通过把 PGD 生成的对抗样本混入训练集,迫使模型在 ε 球内保持稳定,从而提升鲁棒性;同时 PGD 也常作为基准攻击来量化防御强度。但盲目增大 ε 会破坏隐蔽性,且无法保证对所有攻击完全免疫。