PGD迭代攻击

wen IT资讯 23

本文目录导读:

PGD迭代攻击

  1. 核心思想
  2. 数学定义与步骤
  3. 关键参数
  4. 为什么 PGD 比 FGSM 更强?
  5. 应用场景
  6. PGD 的变体
  7. 代码示例(PyTorch,$L_\infty$ 约束)

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 的迭代过程如下:

  1. 初始化: $x^{(0)} = x + \text{uniform}(-\epsilon, \epsilon)$
    (在 $\epsilon$ 球内随机初始化一个点,增加多样性,避免陷入局部最优)

  2. 迭代(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])
  3. 输出: $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 是目前最强大的一阶攻击(仅利用梯度信息,不涉及高阶信息)。

应用场景

  1. 对抗训练(Adversarial Training):
    PGD 是训练鲁棒模型的核心手段,在训练过程中,每一批数据都先被 PGD 攻击生成对抗样本,然后用这些样本进行训练,这种方法非常有效,但计算成本较高(通常需要几十步反向传播/样本)。
  2. 模型鲁棒性评估:
    在对比不同防御方法时,PGD 攻击是必测的基线,如果一个模型连 PGD 都防不住,那它的鲁棒性就值得怀疑。
  3. 理论研究:
    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 来绕过某些防御,可以进一步讨论。

上一篇C

下一篇FGSM攻击

抱歉,评论功能暂时关闭!