相关深入内容:
概述
扩散模型(Diffusion Models)作为当前最强大的生成式AI技术,在图像、视频、音频生成领域取得了突破性进展。然而,与判别式深度学习模型类似,扩散模型同样面临对抗攻击的威胁。研究者发现,精心设计的微扰动可以显著改变扩散模型的生成结果,这一发现引发了学术界对扩散模型鲁棒性的广泛关注。1
核心问题:扩散模型为何容易受到对抗攻击?其脆弱性的根源在哪里?
1. 扩散模型对抗脆弱性基础
1.1 对抗样本在扩散模型中的特殊性
与判别模型不同,扩散模型的对抗样本具有独特的特性:
| 特性 | 判别模型 | 扩散模型 |
|---|---|---|
| 攻击目标 | 改变预测标签 | 改变生成内容 |
| 评估方式 | 分类准确率 | 生成质量/语义一致性 |
| 对抗空间 | 输入空间 | 潜空间+条件空间 |
| 攻击阶段 | 推理时 | 可在训练/推理时攻击 |
1.2 对抗脆弱性的数学描述
设扩散模型为 ,其中 是生成的图像, 是纯噪声。给定干净图像 和对抗扰动 ,目标函数为:
其中 是条件信息(如文本提示), 是损失函数(如CLIP相似度)。
关键发现:即使是 范数约束下的小扰动(),也能显著改变生成图像的语义内容。2
2. 前向过程的信息泄露
2.1 噪声预测与数据恢复
扩散模型的前向过程 逐步向数据添加噪声。反向过程 学习从噪声中恢复数据。这一双向过程为攻击者提供了多个攻击面。
信息泄露路径:
- 噪声预测网络: 预测噪声
- 潜变量重构:
- 梯度反向传播:通过噪声预测网络反向传播对抗梯度
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 |
|---|---|---|---|
| FGSM | 67.3% | 23.4 | 0.3s |
| PGD-20 | 89.2% | 18.7 | 2.1s |
| Carlini-Wagner | 94.5% | 15.2 | 15.6s |
| Diffusion-Attack | 91.8% | 16.9 | 8.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 -similarity6.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 sensitivities7. 防御方向概述
针对扩散模型的对抗脆弱性,现有防御策略可分为:
| 防御类别 | 代表方法 | 核心思想 |
|---|---|---|
| 对抗训练 | AdvDM, DiffATR | 在对抗样本上训练 |
| 认证鲁棒性 | DiffSmooth | 随机平滑认证 |
| 输入净化 | DiffGuard | 检测并移除对抗扰动 |
| 架构改进 | Robust U-Net | 增强网络鲁棒性 |
详细防御策略见后续文档。
8. 总结与展望
核心发现
- 多层次攻击面:扩散模型在像素空间、潜空间、条件空间均存在攻击面
- 时间步依赖:中间时间步最脆弱,扰动累积效应最明显
- CFG放大效应:引导机制在提升质量的同时也放大了攻击效果
- 质量-鲁棒性权衡:高质量生成与鲁棒性存在基本权衡
未来方向
- 理论理解:建立扩散模型对抗脆弱性的统一理论框架
- 高效攻击:开发针对大规模扩散模型的高效攻击方法
- 实用防御:设计计算高效、效果显著的防御策略
- 跨模型迁移:研究对抗样本在不同扩散模型间的迁移性