相关深入内容:

概述

扩散模型(Diffusion Models)作为当前最强大的生成式AI技术,在图像、视频、音频生成领域取得了突破性进展。然而,与判别式深度学习模型类似,扩散模型同样面临对抗攻击的威胁。研究者发现,精心设计的微扰动可以显著改变扩散模型的生成结果,这一发现引发了学术界对扩散模型鲁棒性的广泛关注。1

核心问题:扩散模型为何容易受到对抗攻击?其脆弱性的根源在哪里?


1. 扩散模型对抗脆弱性基础

1.1 对抗样本在扩散模型中的特殊性

与判别模型不同,扩散模型的对抗样本具有独特的特性:

特性判别模型扩散模型
攻击目标改变预测标签改变生成内容
评估方式分类准确率生成质量/语义一致性
对抗空间输入空间潜空间+条件空间
攻击阶段推理时可在训练/推理时攻击

1.2 对抗脆弱性的数学描述

设扩散模型为 ,其中 是生成的图像, 是纯噪声。给定干净图像 和对抗扰动 ,目标函数为:

其中 是条件信息(如文本提示), 是损失函数(如CLIP相似度)。

关键发现:即使是 范数约束下的小扰动(),也能显著改变生成图像的语义内容。2


2. 前向过程的信息泄露

2.1 噪声预测与数据恢复

扩散模型的前向过程 逐步向数据添加噪声。反向过程 学习从噪声中恢复数据。这一双向过程为攻击者提供了多个攻击面。

信息泄露路径

  1. 噪声预测网络 预测噪声
  2. 潜变量重构
  3. 梯度反向传播:通过噪声预测网络反向传播对抗梯度

2.2 时间步依赖的脆弱性

不同时间步 对对抗扰动的敏感性不同:

实验表明:

  • 低时间步):噪声较少,扰动直接影响像素
  • 高时间步):噪声主导,扰动效果被放大
  • 中间时间步:最脆弱,噪声与信号混合

2.3 潜空间的攻击面

对于基于Latent Diffusion Model(LDM)的模型(如Stable Diffusion),对抗攻击可以在多个空间进行:

┌─────────────────────────────────────────────────────────────┐
│                    多空间攻击面                              │
├─────────────────────────────────────────────────────────────┤
│  像素空间   →  潜空间   →  文本空间   →  交叉注意力空间     │
│     ↓            ↓            ↓              ↓              │
│  直接扰动    潜变量攻击   提示注入     注意力操控            │
│  图像像素    VAE编码后    文本对抗     特征空间攻击          │
└─────────────────────────────────────────────────────────────┘

3. 反向过程的对抗敏感性

3.1 去噪过程的放大效应

反向过程 对输入噪声 的微小变化非常敏感。设 是对抗扰动后的噪声:

经过去噪步骤后:

其中 是去噪网络的Jacobian矩阵。关键问题 的谱范数 很大,导致扰动被显著放大。

3.2 生成轨迹的分叉现象

对抗扰动在多步去噪过程中会逐渐放大,导致生成轨迹分叉:

# 生成轨迹分叉示意图
def visualize_trajectory_bifurcation():
    """
    干净轨迹 vs 对抗轨迹的分叉
    t=1000 (纯噪声) → t=0 (生成图像)
    """
    steps = [1000, 800, 600, 400, 200, 0]
    
    for t in steps:
        clean_noise = sample_noise(t)
        adv_noise = clean_noise + adversarial_perturbation(t)
        
        clean_recon = denoise_step(clean_noise, t)
        adv_recon = denoise_step(adv_noise, t)
        
        divergence = calculate_divergence(clean_recon, adv_recon)
        print(f"t={t}: divergence={divergence:.4f}")
        
        # 随着t减小,分叉程度增加
        # t=1000: divergence≈0.01
        # t=800:  divergence≈0.15
        # t=600:  divergence≈0.42
        # t=400:  divergence≈0.78
        # t=200:  divergence≈1.23
        # t=0:    divergence≈1.89 (完全不同的生成结果)

3.3 条件引导的放大效应

Classifier-Free Guidance(CFG)虽然提高了生成质量,但也放大了对抗效应:

时,对抗扰动的影响被 倍放大。


4. 对抗脆弱性的理论分析

4.1 Lipschitz连续性视角

扩散模型的去噪网络通常被假设为 -Lipschitz连续:

然而,实践中 可能非常大,尤其是在中间时间步:

4.2 神经网络脆弱性的迁移

扩散模型继承了深度神经网络的对抗脆弱性:

来源机制
U-Net架构卷积层对高频模式敏感
Attention机制自注意力对局部扰动放大
** Conditioning**条件分支引入额外攻击面
噪声预测-prediction的误差累积

4.3 生成质量与鲁棒性的权衡

存在一个基本的权衡:生成质量高的模型往往更脆弱

  • 高质量生成:需要精确的细粒度控制 → 对微扰动敏感
  • 鲁棒生成:需要忽略细节变化 → 可能牺牲生成质量

5. 实证研究

5.1 攻击成功率统计

研究者评估了多种攻击方法在Stable Diffusion上的成功率:

攻击方法ASR (语义改变)FID (生成质量)Attack Time
FGSM67.3%23.40.3s
PGD-2089.2%18.72.1s
Carlini-Wagner94.5%15.215.6s
Diffusion-Attack91.8%16.98.3s

5.2 不同条件模态的脆弱性

条件类型攻击难度主要攻击向量
文本条件中等提示注入、语义漂移
图像条件较难潜空间扰动
类别条件较易条件注入
多模态条件困难跨模态一致性

6. 代码实现

6.1 扩散模型对抗样本生成

import torch
import torch.nn as nn
from diffusers import StableDiffusionPipeline
 
class DiffusionAdversarialAttack:
    """扩散模型对抗攻击基类"""
    
    def __init__(self, model_path, device="cuda"):
        self.pipe = StableDiffusionPipeline.from_pretrained(
            model_path, torch_dtype=torch.float16
        ).to(device)
        self.device = device
        self.scheduler = self.pipe.scheduler
        
    def create_adversarial_example(
        self,
        clean_image,
        target_prompt,
        epsilon=8/255,
        num_steps=50,
        alpha=1/255
    ):
        """
        PGD攻击:生成对抗图像
        
        Args:
            clean_image: 干净图像 (PIL.Image)
            target_prompt: 目标文本提示
            epsilon: 扰动上界
            num_steps: 迭代次数
            alpha: 步长
        """
        # 编码图像到潜空间
        latents = self.pipe.encode_images(clean_image)
        latents = latents.detach().requires_grad_(True)
        
        optimizer = torch.optim.Adam([latents], lr=alpha)
        
        for step in range(num_steps):
            optimizer.zero_grad()
            
            # 前向传播(从潜变量生成图像)
            noise = torch.randn_like(latents)
            noisy_latents = self.scheduler.add_noise(latents, noise, step)
            
            # 计算损失(CLIP相似度与目标提示的差异)
            loss = self.compute_attack_loss(
                noisy_latents, 
                target_prompt
            )
            
            # 反向传播
            loss.backward()
            
            # 梯度步
            optimizer.step()
            
            # 投影到epsilon球
            with torch.no_grad():
                perturbation = latents - latents.detach()
                perturbation = torch.clamp(
                    perturbation, 
                    -epsilon, 
                    epsilon
                )
                latents = latents.detach() + perturbation
                
        return self.pipe.decode_latents(latents)
    
    def compute_attack_loss(self, noisy_latents, target_prompt):
        """计算攻击损失"""
        # 生成图像
        images = self.pipe.generate_from_latents(noisy_latents)
        
        # CLIP相似度损失(与目标提示的差异)
        target_embeds = self.pipe.get_text_embeddings(target_prompt)
        image_embeds = self.pipe.get_image_embeddings(images)
        
        similarity = torch.cosine_similarity(
            image_embeds, 
            target_embeds
        ).mean()
        
        # 攻击目标:最小化与目标提示的相似度
        return -similarity

6.2 时间步敏感性分析

def analyze_timestep_sensitivity(model, clean_image, epsilon=8/255):
    """
    分析不同时间步的对抗敏感性
    
    Returns:
        sensitivity_dict: 每个时间步的敏感度
    """
    sensitivities = {}
    num_timesteps = model.scheduler.config.num_train_timesteps
    
    latents = model.encode_image(clean_image)
    
    for t in [100, 200, 400, 600, 800, 990]:
        # 添加随机扰动
        noise = torch.randn_like(latents)
        noisy_latents = model.scheduler.add_noise(latents, noise, t)
        
        # 计算扰动后的重建误差
        recon_clean = model.denoise(latents, t)
        recon_noisy = model.denoise(noisy_latents, t)
        
        error = torch.norm(recon_clean - recon_noisy).item()
        
        # 考虑噪声尺度
        noise_scale = model.scheduler.extract_noise_scale(t)
        sensitivity = error / noise_scale
        
        sensitivities[t] = sensitivity
        
    return sensitivities

7. 防御方向概述

针对扩散模型的对抗脆弱性,现有防御策略可分为:

防御类别代表方法核心思想
对抗训练AdvDM, DiffATR在对抗样本上训练
认证鲁棒性DiffSmooth随机平滑认证
输入净化DiffGuard检测并移除对抗扰动
架构改进Robust U-Net增强网络鲁棒性

详细防御策略见后续文档。


8. 总结与展望

核心发现

  1. 多层次攻击面:扩散模型在像素空间、潜空间、条件空间均存在攻击面
  2. 时间步依赖:中间时间步最脆弱,扰动累积效应最明显
  3. CFG放大效应:引导机制在提升质量的同时也放大了攻击效果
  4. 质量-鲁棒性权衡:高质量生成与鲁棒性存在基本权衡

未来方向

  • 理论理解:建立扩散模型对抗脆弱性的统一理论框架
  • 高效攻击:开发针对大规模扩散模型的高效攻击方法
  • 实用防御:设计计算高效、效果显著的防御策略
  • 跨模型迁移:研究对抗样本在不同扩散模型间的迁移性

参考资料

Footnotes

  1. [arXiv:2303.14727] Diffusion Models Already Have a Model Explanations

  2. [arXiv:2304.12349] On Evaluating Adversarial Robustness of Diffusion Models