本文目录导读:

PGD迭代攻击(Projected Gradient Descent,投影梯度下降)是对抗性攻击领域中最经典、最强大的白盒迭代攻击方法之一,它由 Madry 等人在 2017 年的论文《Towards Deep Learning Models Resistant to Adversarial Attacks》中提出,旨在生成比 FGSM(快速梯度符号法)更强的对抗样本。
核心思想
PGD 攻击可以理解为 “FGSM 的多步迭代版本 + 投影约束”,它的目标是找到一个在输入空间(通常是 $\epsilon$-球内部)且能使模型损失函数最大化的点。
它沿着损失函数梯度上升的方向(因为目标是使模型犯错)迈小步,每迈一步后,如果这一步跨出了允许的扰动范围,就把它“拉回”到边界上(投影)。
数学定义与步骤
给定一个分类器 $f\theta$,原始样本 $x$,真实标签 $y$,扰动预算 $\epsilon$(通常用 $L\infty$ 或 $L_2$ 范数度量)。
目标: 找到对抗样本 $x{adv}$,使得 $||x{adv} - x||p \leq \epsilon$ 且 $f\theta(x_{adv}) \neq y$。
PGD 的迭代过程如下:
-
初始化: $x^{(0)} = x + \text{uniform}(-\epsilon, \epsilon)$
(在 $\epsilon$ 球内随机初始化一个点,增加多样性,避免陷入局部最优) -
迭代(T 步): 对于 $t = 0, 1, ..., T-1$:
- 计算梯度: $g^{(t)} = \nabla_{x} J(x^{(t)}, y)$
($J$ 是损失函数,如交叉熵) - 梯度上升更新:
$x^{(t+1)} = x^{(t)} + \alpha \cdot \text{sign}(g^{(t)})$ (针对 $L_\infty$ 范数攻击)
或
$x^{(t+1)} = x^{(t)} + \alpha \cdot \frac{g^{(t)}}{||g^{(t)}||_2}$ (针对 $L_2$ 范数攻击)
($\alpha$ 是步长,通常设为 $\epsilon \cdot \frac{1}{4}$ 或更小) - 投影操作: $\text{clip}(x^{(t+1)}, x - \epsilon, x + \epsilon)$
(将 $x^{(t+1)}$ 投影到以 $x$ 为中心、半径为 $\epsilon$ 的 $L_\infty$ 球内;如果是 $L_2$,则需缩放至 $L_2$ 球内) - 像素裁剪: $x^{(t+1)} = \text{clip}(x^{(t+1)}, 0, 1)$
(确保像素值在合法范围,如 [0,1])
- 计算梯度: $g^{(t)} = \nabla_{x} J(x^{(t)}, y)$
-
输出: $x_{adv} = x^{(T)}$
关键参数
| 参数 | 含义 | 典型值(ImageNet) |
|---|---|---|
| $\epsilon$ | 最大扰动幅度 | 8/255($L_\infty$)或 1-2($L_2$) |
| $\alpha$ | 步长 | 1-2/255(约为 $\epsilon/4$ 到 $\epsilon/10$) |
| $T$ | 迭代次数 | 40 或 100(越多越强,但更慢) |
| 范数 | 约束类型 | $L_\infty$ PGD 最常用,$L_2$ PGD 也常见 |
为什么 PGD 比 FGSM 更强?
- FGSM 是一次性沿着梯度方向跨一大步,容易走出“好”的对抗方向,但经常“跨过头”或走到局部平坦区域。
- PGD 通过多次小步迭代,就像盲人爬山(这里是“爬损失函数山”),每次只迈一小步,不断调整方向,能更精确地找到使模型损失最大的点。
- 理论性质:Madry 等人证明了,在线性模型或凸损失函数下,PGD 可以找到全局最优的对抗样本,对于深度神经网络,PGD 是目前最强大的一阶攻击(仅利用梯度信息,不涉及高阶信息)。
应用场景
- 对抗训练(Adversarial Training):
PGD 是训练鲁棒模型的核心手段,在训练过程中,每一批数据都先被 PGD 攻击生成对抗样本,然后用这些样本进行训练,这种方法非常有效,但计算成本较高(通常需要几十步反向传播/样本)。 - 模型鲁棒性评估:
在对比不同防御方法时,PGD 攻击是必测的基线,如果一个模型连 PGD 都防不住,那它的鲁棒性就值得怀疑。 - 理论研究:
PGD 是研究对抗性样本成因、鲁棒边界、特征崩溃等理论问题的重要工具。
PGD 的变体
- PGD with Momentum: 增加动量项,帮助跳出局部最优点。
- Multi-Targeted PGD: 针对每个目标类别生成不同的对抗样本。
- Auto-PGD: 自动调整步长(如 $\alpha$ 根据损失变化动态调整),是目前最强的免费(无需验证集)一阶攻击之一。
- Perceptual PGD: 将约束从简单的 $L_p$ 范数改为感知相似度度量(如 LPIPS)。
代码示例(PyTorch,$L_\infty$ 约束)
import torch
import torch.nn.functional as F
def pgd_attack(model, x, y, eps=8/255, alpha=2/255, steps=40, random_start=True):
"""
PGD L_infinity 白盒攻击
x: 原始图像 [B, C, H, W]
y: 真实标签
"""
model.eval()
x_adv = x.clone().detach()
# 1. 随机初始化
if random_start:
x_adv = x + torch.empty_like(x).uniform_(-eps, eps)
x_adv = torch.clamp(x_adv, 0.0, 1.0) # 像素有效范围
for _ in range(steps):
x_adv.requires_grad_()
# 前向传播 + 计算损失
outputs = model(x_adv)
loss = F.cross_entropy(outputs, y)
# 反向传播
model.zero_grad()
loss.backward()
# 梯度上升 + 投影
with torch.no_grad():
# 更新
x_adv = x_adv + alpha * x_adv.grad.sign()
# 投影到 eps 球内
delta = torch.clamp(x_adv - x, min=-eps, max=eps)
x_adv = torch.clamp(x + delta, min=0.0, max=1.0)
return x_adv
# 使用示例
# x_adv = pgd_attack(model, x, y, eps=8/255, alpha=2/255, steps=40)
| 特性 | PGD 迭代攻击 |
|---|---|
| 类型 | 白盒、多步迭代、基于梯度 |
| 攻击强度 | 非常高(目前一线白盒攻击) |
| 计算开销 | 高(需要多次前向 + 反向传播) |
| 可扩展性 | 容易并行化,适合对抗训练 |
| 应用 | 鲁棒性评估、对抗训练、理论研究 |
如果你对 PGD 与 CW 攻击 的区别感兴趣,或者想了解如何修改 PGD 来绕过某些防御,可以进一步讨论。