对抗攻击文生图模型
字数 1657 2025-08-24 07:48:23
对抗攻击文生图模型:MMP-Attack方法详解
1. 扩散模型基础
1.1 扩散模型原理
扩散模型(Diffusion Model)是一种生成模型,通过以下两个主要过程工作:
前向过程(加噪):
- 逐步向原始数据添加噪声,直到完全变成噪声
- 数学表示:xₜ = √ᾱₜx₀ + √(1-ᾱₜ)εₜ
- 其中ᾱₜ = ∏(1-βᵢ),βₜ是预定义的方差调度,εₜ是标准正态噪声
反向过程(去噪):
- 学习如何从噪声中逐步恢复原始数据
- 数学表示:xₜ₋₁ = 1/√(1-βₜ) (xₜ - βₜ/√(1-ᾱₜ) εθ(xₜ,t))
- εθ是模型预测的噪声
1.2 训练与生成
训练:
- 使用U-Net架构作为去噪网络εθ(xₜ,t)
- 损失函数:L = E[||ε - εθ(xₜ,t)||²] (均方误差)
- 优化证据下界(ELBO)
生成:
- 从纯高斯噪声xT开始
- 逐步应用去噪过程
- 可通过条件信息(如文本描述)控制生成过程
2. 文生图(T2I)模型架构
2.1 核心组件
-
CLIP模型:
- 图像编码器Fi:图像→demb维嵌入向量
- Token嵌入器Eψ:文本→|s|×dtoken矩阵
- 文本编码器Ft:文本→demb维嵌入向量
-
生成模型G:
- 接收文本嵌入向量v
- 输出条件概率分布G(v)
- 采样x ∼ G(v)生成图像
2.2 工作流程
- 输入提示s通过Eψ和Ft转换为文本嵌入v
- v输入生成模型G生成图像x ∼ G(v)
- 完整流程:x ∼ G(Ft(Eψ(s)))
3. MMP-Attack对抗攻击方法
3.1 攻击定义
目标:
- 原始提示:so (n个token)
- 欺骗性后缀:sa (m个token)
- 完整提示:s = so⊕sa
- 目标类别:t ∈ V (与so无关)
攻击目标函数:
max A(x, t, so),其中x ∼ G(Ft(Eψ(so⊕sa)))
3.2 关键技术
-
词汇表筛选:
- 只保留以结尾的英文单词
- 排除目标类别的前20个同义词
- 相似度计算:cos(ψi, ψj)
-
多模态优化目标:
- 文本目标向量:v_t^text = Ft(Eψ("a photo of t"))
- 图像目标向量:v_t^image = Fi(xt) (xt包含目标类别)
- 多模态损失:L = -[cos(v, v_t^text) + λcos(v, v_t^image)]
3.3 优化方法
-
直通估计(STE)技术:
- 优化变量:Z ∈ ℝ^{m×dtoken} (令牌嵌入矩阵)
- 投影函数:Projψ(Z)i = Zi + sg(ψj - Zi), j = argmin_j' ||ψj' - Zi||₂
- 解码后缀:sa = decode(Projψ(Z))
-
初始化方法:
- EOS:初始化为[eos]令牌
- 随机:从过滤词汇表随机抽取
- 同义词:选择与t最相似的令牌(默认)
-
优化算法:
1. 计算目标向量v_t^text和v_t^image 2. 初始化Z 3. 重复直到收敛: a. 计算Projψ(Z) b. 计算完整嵌入v = Ft(Eψ(so⊕decode(Projψ(Z)))) c. 计算多模态损失L d. 梯度下降更新Z 4. 输出最优sa = decode(Projψ(Z))
4. 攻击实施与复现
4.1 关键代码分析
-
模型加载:
# 加载CLIP模型 clip_model = CLIPModel.from_pretrained(clip_path).to(device) clip_processor = CLIPProcessor.from_pretrained(clip_path) # 加载稳定扩散模型 pipe = StableDiffusionPipeline.from_pretrained(sd_path, torch_dtype=torch.float16).to(device) -
ASCII词汇筛选:
def get_ascii_toks(tokenizer, embed_weights, target_word): # 筛选ASCII可打印字符 ascii_toks = [i for i in range(3, len(tokenizer)) if is_ascii(tokenizer.decode([i])) and tokenizer.decode([i]).endswith('</w>')] # 排除与目标词最相似的20个词 target_embed = get_target_embed(target_word) cosine_sim = nn.CosineSimilarity(dim=0) similarities = [cosine_sim(embed_weights[i], target_embed) for i in ascii_toks] top20 = np.argsort(similarities)[-20:] forbidden = [tokenizer.decode([ascii_toks[i]]) for i in top20] return ascii_toks, forbidden -
嵌入优化:
def optimize_embedding(input_embed, target_embeds, allowed_weights): # 初始化可训练嵌入 adv_token_embed = nn.Parameter(allowed_weights[0:1].clone()) # 优化器设置 optimizer = torch.optim.Adam([adv_token_embed], lr=0.01) for step in range(100): # 量化到最近允许的嵌入 dists = torch.sum((allowed_weights - adv_token_embed)**2, dim=1) q_adv_token_embed = allowed_weights[torch.argmin(dists)] # 计算完整嵌入和损失 full_embed = torch.cat([input_embed[:pos], q_adv_token_embed, input_embed[pos:]], dim=0) adv_emb = get_text_embedding(full_embed) # 多模态损失 loss = 1 - (cosine_sim(adv_emb, target_embeds['text']) + lambda * cosine_sim(adv_emb, target_embeds['image'])) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step()
4.2 攻击示例
原始提示:"a photo of a car"
目标类别:"bird"
优化结果:后缀 "birch bees rwby migrant"
攻击效果:
- Stable Diffusion v1.4:生成鸟的图像而非车
- Stable Diffusion v2.1:生成蜜蜂图像(部分迁移)
- Stable Diffusion 3:生成蜜蜂图像(部分迁移)
5. 防御与缓解
-
输入过滤:
- 检测并过滤异常token组合
- 同义词黑名单机制
-
模型加固:
- 对抗训练增强鲁棒性
- 多模态一致性检查
-
输出审查:
- 生成内容分类检测
- 异常生成阻断机制
6. 参考文献
- Intel:最小确定性扩散模型
- Encord:扩散模型详解
- BetterWaifu:Stable Diffusion NSFW内容
- Lilian Weng:扩散模型教程
- arXiv 2402.01369:MMP-Attack原始论文