对抗攻击文生图模型
Yale 发表于 北京 AI专栏 1614浏览 · 2024-09-04 14:47

前言

近年来,扩散模型是一个非常火爆的领域,它彻底改变了图像生成领域,在生成内容的多样性和质量方面达到了最先进的水平。


而视觉-语言模型的进步进一步增强了扩散模型的能力,催生了文本生成图像(T2I)生成中的新应用。

不过T2I生成最近带来了新的风险,模型可能被恶意利用来生成有害或敏感内容。比如在网上有很多教程指导如何生成色情图像的


那么除了这类风险之外,文生图模型面临的另一类风险就是对抗攻击,即通过在原始提示中添加欺骗性后缀,是实现对抗性攻击操纵T2I扩散模型生成的AI生成内容(AIGC)。

本文将介绍一种定向对抗攻击方法MMP-Atatck,通过引入欺骗性后缀来利用多模态特征。攻击的目标是在生成的图像中添加一个特定目标对象,同时移除原始对象。这其中会涉及一种基于梯度的算法,在文本特征空间和图像特征空间中自动最小化原始提示与目标类别(要添加的)之间的距离,从而有效地发现欺骗性后缀,进而操纵T2I扩散模型生成的内容。

下图就是一个例子,原始提示是“一个人的照片”,要擦除的对象是人,而目标类别(要添加的)设为鸟,我们优化并添加了一个欺骗性后缀“wild blers rwby migrant”。


将新提示输入开源T2I模型Stable Diffusion v1.4 后,它生成了鸟的图像而不是人。

扩散模型


扩散模型(Diffusion Model)是一种生成模型,近年来在图像生成等领域取得了突破性进展

它的基本原理:扩散模型通过逐步向数据添加噪声,然后学习如何逆转这个过程来生成新的数据。

其中会涉及两个主要过程:

  • 前向过程:逐步向原始数据添加噪声,直到完全变成噪声。
  • 反向过程:学习如何从噪声中逐步恢复原始数据。

  • 训练:模型学习如何在每一步中预测并去除一小部分噪声。

  • 生成:从纯噪声开始,逐步去除噪声,最终生成所需的数据(如图像)。
  • 优点:
    • 生成质量高
    • 训练稳定
    • 可以进行条件生成

扩散模型是当前最先进的生成模型之一,被用于许多流行的AI图像生成工具中。

这里存在一些简单的数学知识,我们就快速过一下

  1. 马尔可夫链:
    扩散过程可以被视为一个马尔可夫链,其中每一步的状态只依赖于前一步的状态。

  2. 前向过程(加噪):
    假设x₀是原始数据,我们定义一个逐步加噪的过程:
    x₁ = √(1-β₁)x₀ + √β₁ε₁
    x₂ = √(1-β₂)x₁ + √β₂ε₂
    ...
    xₜ = √(1-βₜ)xₜ₋₁ + √βₜεₜ

其中,βₜ是预定义的方差调度,εₜ是标准正态分布的噪声。

  1. 封闭形式:
    可以证明,对于任意时间步t,xₜ可以直接从x₀得到:
    xₜ = √ᾱₜx₀ + √(1-ᾱₜ)εₜ
    其中,ᾱₜ = ∏ᵗᵢ₌₁(1-βᵢ)

  2. 反向过程(去噪):
    模型学习预测噪声ε,从而实现去噪。反向过程可以表示为:
    xₜ₋₁ = 1/√(1-βₜ) (xₜ - βₜ/√(1-ᾱₜ) εθ(xₜ,t))

其中,εθ是模型预测的噪声。

  1. 损失函数:
    通常使用简单的均方误差(MSE)作为损失函数:
    L = E[||ε - εθ(xₜ,t)||²]

  2. 采样:
    生成过程从纯高斯噪声xT开始,逐步应用去噪过程直到得到x₀。

  3. 变分下界(ELBO):
    扩散模型的训练可以被解释为优化证据下界(ELBO):
    ELBO = E[log p(x₀) - KL(q(x₁|x₀)||p(x₁|x₀)) - ... - KL(q(xT|xT₋₁)||p(xT|xT₋₁))]

现在我们来解释一下扩散模型的数学原理如何应用于图像生成任务。

a) 数据表示:

  • 图像被表示为高维向量 x₀,例如 256x256x3 的RGB图像可以表示为 196,608 维向量。

b) 噪声添加:

  • 使用前向过程逐步向图像添加高斯噪声。
  • xₜ = √ᾱₜx₀ + √(1-ᾱₜ)εₜ
  • 最终得到纯噪声图像 xT。

c) 去噪网络:

  • 通常使用U-Net架构作为去噪网络 εθ(xₜ,t)。
  • 网络学习预测每一步中的噪声。

d) 条件生成:

  • 可以将条件信息 y (如类别标签或文本描述) 加入到去噪网络中:εθ(xₜ,t,y)。
  • 这允许控制生成过程,例如根据文本提示生成特定图像。

e) 采样过程:

  • 从随机噪声 xT 开始。
  • 逐步应用去噪过程:xₜ₋₁ = 1/√(1-βₜ) (xₜ - βₜ/√(1-ᾱₜ) εθ(xₜ,t,y))
  • 最终得到生成的图像 x₀。

无论是图像还是文本生成,扩散模型的核心思想都是一样的:

  • 学习从噪声数据中恢复原始信号。
  • 利用逐步去噪的过程来生成高质量、多样化的样本。
  • 可以通过条件信息来控制生成过程。

这种方法之所以强大,是因为它将复杂的生成任务分解为一系列简单的去噪步骤,每一步只需要预测和移除一小部分噪声。

方案

基本原理

我们首先来看看文生图模型的流程。

假设候选词汇的词汇表为一个集合V = {w1, w2, ···, w|V|},一个输入提示可以表示为s ∈ V*。一个训练良好的扩散模型由两个部分组成:一个CLIP模型和一个生成模型G。CLIP模型包括一个图像编码器Fi,它接收图像作为输入并输出一个demb维度的图像嵌入向量。它还包括一个token嵌入器Eψ和一个文本编码器Ft,它们共同将文本提示嵌入到一个demb维度的文本嵌入向量中。这里,ψ ∈ R|V|×dtoken 作为嵌入词典。对于输入提示s,Eψ(s)是一个形状为|s|×dtoken的矩阵,其中Eψ(s)i=ψj,并且满足wj = si。这个token嵌入矩阵Eψ(s)随后被输入到文本编码器Ft,并嵌入为一个demb维度的文本嵌入向量。

在训练阶段,图像编码器将图像转换为图像嵌入向量。同时,它的标题(文本数据)通过token嵌入器和文本编码器被转换为文本嵌入向量。两个向量之间的距离被最小化,使CLIP模型能够对齐图像空间和文本空间。

在T2I生成阶段,输入提示s首先通过token嵌入器和文本编码器嵌入为一个文本嵌入向量v。然后,它被输入到后续的生成模型G以采样x ∼ G(v),其中G(v)是一个条件于v的概率分布,x代表一个采样的图像。因此,从输入提示s生成T2I的过程可以理解为从概率分布x ∼ G(Ft(Eψ(s)))中采样的过程。

形式化


是包含 n 个 token 的原始提示词,( m ) 是作弊后缀的 token 数量。待优化的作弊后缀可以表示为


它将与原始提示词 ( so ) 连接得到完整提示词


其中运算符


表示连接运算符。

为了进行定向攻击,我们假设有一个目标类别 ( t \in V )(例如,狗、鸟等)。这个目标类别与原始提示词 ( so ) 无关。我们需要搜索一个作弊后缀,当它与原始提示词 ( so ) 连接时,能够引导 T2I 扩散模型生成包含目标类别但与 ( so ) 无关的图像。优化目标如下:


其中,( x ) 表示基于完整提示词随机生成的图像。( A(x, t, so) ) 是评估攻击性能的评价指标。根据相关工作的假设 [8],在优化过程中,我们只能访问 CLIP 模型,而对生成模型 ( G ) 一无所知,生成模型 ( G ) 只能用于评估作弊后缀的攻击性能。

为了确保作弊后缀的自然性和隐蔽性,我们对词汇表 ( V ) 进行了筛选。首先,我们精炼了词汇表,只保留以符号w结尾的英文单词,表示空格。此步骤是必要的,因为 CLIP 词汇表包含不以w结尾的前缀 token,这些 token 的连接可能导致优化后的作弊后缀包含不存在的单词,从而降低提示词的自然性。其次,我们从词汇表中筛除了目标类别的前20个同义词,以增强隐蔽性并模拟现实世界中屏蔽敏感词的系统。我们使用嵌入词典 ( \psi ) 来定义两个 token ( w_i ) 和 ( w_j ) 之间的相似度为 ( \cos(\psi_i, \psi_j) ),其中


表示两个向量之间的余弦相似度。例如,当目标类别 ( t ) 是‘person’时,筛除的前5个同义词包括‘person’、‘people’、‘persons’、‘woman’和‘ppl’。

优化目标

优化目标

直接求解之前提到的公式是不可行的,因为在我们的假设中涉及了一个未知的生成模型 ( G )。一种替代方法是首先构建一个目标向量 ( v_t ),该向量为以下优化目标提供了一个有利的解决方案:


假设存在这样的 ( v_t ),我们可以通过最大化 ( so \oplus sa ) 的文本嵌入向量和目标向量 ( v_t ) 之间的相似性来实现公式的有利解决方案。因此,优化目标被转化为一个仅涉及 ( Fi ) 和 ( E\psi ) 的简化问题:


虽然 ( G ) 是未知的,但构建上述公式的有利解决方案并不困难,因为我们可以使用一些启发式解决方案。例如,由手动编写的提示词 ( s' = ‘a photo of t’ ) 生成的图像无疑会满足我们目标攻击的要求。因此,我们可以利用其文本嵌入向量 ( v_t^{text} = Ft(E\psi(s')) ) 作为目标向量来指导作弊后缀的优化。

此外,我们结合图像模态信息和文本模态,以更好地利用 T2I 模型的多模态能力。我们使用一个基于图像模态的目标向量。具体来说,给定包含目标类别的参考图像 ( x_t ),我们计算其图像嵌入向量 ( v_t^{image} = F_i(x_t) ),其中 ( F_i ) 是 CLIP 模型的图像编码器。CLIP 模型具有图像-文本对相关性越高,其嵌入向量的余弦相似度越大的特点,使得 ( v_t^{image} ) 成为问题的解决方案。最终,我们在图像和文本模态中同时优化,多模态损失被设计为最大化 ( so \oplus sa ) 的文本嵌入向量与两个目标向量之间的相似性。优化目标如下:


其中lambda 是平衡图像和文本模态损失项的权重因子。

优化方法

剩余挑战

解决上面的公式的主要挑战在于优化变量定义在离散空间中,这带来了一个非可微且通常是 NP 难的组合优化问题。为了解决这个问题,常用的一种技术是直通估计(Straight-Through Estimation, STE)技术,它引入了一个可微函数 ( sg(\cdot) ),该函数在前向传播过程中定义为恒等函数,并且具有零偏导数。我们利用 ( sg(\cdot) ) 函数来解决。

具体来说,我们优化作弊后缀的令牌嵌入矩阵 ( Z \in \mathbb{R}^{m \times d_{token}} ),并定义一个可微函数


其中 ( Proj_\psi(Z)_i = Z_i + sg(\psi_j - Zi) ),满足 ( j = \arg\min{j'} |\psi_{j'} - Z_i|2 )。注意矩阵 ( Proj\psi(Z) ) 中的每一行对应于代码簿 ( \psi ) 中的一个条目,因此我们可以解码作弊后缀


此外,由于如下性质


公式可以重新表述为以下优化问题:


由于 Proj 函数是可微的,公式可以使用基于梯度的优化器来解决。优化方法总结在如下算法中。


目标条件向量首先在步骤 1-3 中计算。然后,优化变量 ( Z ) 被初始化并通过梯度下降算法进行优化(步骤 4-13)。最后,根据优化后的 ( Z ) 解码作弊后缀(步骤 14)。

一个良好的初始化(步骤 4)通常有助于减少优化问题的复杂性,从而得到更好的解决方案。为了解决公式,我们可以使用如下三种初始化方法:

  1. EOS:将所有 ( Z_i ) 初始化为 [eos] 的令牌嵌入,其中 [eos] 是 CLIP 词汇表中表示字符串结束的特殊令牌。
  2. 随机:从过滤后的词汇表中随机抽取 m 个令牌,并使用它们的嵌入作为 ( Z ) 的初始值。
  3. 同义词:选择过滤词汇表中与目标类别 ( t ) 余弦相似度最高的令牌,并使用其令牌嵌入作为所有 ( Z_i ) 的初始值。

默认情况下使用同义词初始化方法。

完整的攻击流程如下图所示

复现

首先分析关键代码


这个代码片段涉及使用深度学习模型进行文本嵌入和图像生成:

  1. 设备和路径设置

    • 指定使用 cuda 设备进行计算。
    • 设置两个模型的目录路径,一个是 CLIP 模型,另一个是稳定扩散模型。
  2. 加载模型

    • 从指定路径加载 CLIP 模型,并将其移动到 cuda 设备上。
    • 加载 CLIP 处理器,用于预处理输入数据。
    • 加载 CLIP 分词器,用于将文本转换为模型可处理的格式。
    • 从指定路径加载稳定扩散管道模型,并将其移动到 cuda 设备上。这个模型的某些部分(如数据类型和安全检查)进行了配置。
  3. 目标句子

    • 构建一个目标句子,其中包含用户指定的目标词。
  4. 构建因果注意力掩码

    • 定义一个函数来构建因果注意力掩码。该掩码用于在序列处理过程中屏蔽某些位置,以确保每个位置只关注之前的元素。
    • 掩码初始化后,填充为数据类型的最小值,并屏蔽上三角部分,扩展掩码维度以匹配输入。
  5. 获取文本嵌入

    • 定义一个函数,用于获取输入文本的嵌入表示。
    • 如果输入是字符串,则使用分词器将其转换为张量格式,进行填充和截断,并转换为 CUDA 张量。
    • 如果输入已经是张量,则直接处理。
    • 将输入扩展维度,使用稳定扩散模型的文本编码器进行编码,获取池化输出。
    • 使用 CLIP 模型的文本投影层将池化输出投影到嵌入空间,返回投影后的嵌入。


这个代码片段实现了一个函数,用于获取特定语言模型中仅包含 ASCII 字符的词汇,并筛选出与目标词汇最相似的前 20 个词汇。具体步骤如下:

  1. 辅助函数

    • 定义一个辅助函数 is_ascii(s),用于判断一个字符串是否为 ASCII 可打印字符。
  2. 筛选 ASCII 词汇

    • 初始化一个空列表 ascii_toks 来存储符合条件的词汇。
    • 遍历词汇表中的每个词汇(从索引 3 开始,以跳过特殊标记)。
    • 如果词汇是 ASCII 可打印字符,并以 </w> 结尾,则进一步检查。
    • 如果词汇中除了 </w> 之外的部分全是字母,则继续处理。
    • 对该词汇进行解码并再次编码,确保编码前后的一致性。
    • 如果词汇解码前后保持一致,则将其索引添加到 ascii_toks 列表中。
  3. 筛选与目标词汇最相似的词汇

    • 初始化一个空列表 forbidden_tokens 来存储与目标词汇最相似的词汇。
    • 获取目标词汇的嵌入权重。
    • 初始化余弦相似度计算器。
    • 计算每个 ASCII 词汇与目标词汇的余弦相似度。
    • 将相似度值存储到 cosine_values 列表中。
    • 将相似度值转换为张量,并找到前 20 个最相似的词汇索引。
    • 将这些最相似的词汇解码并添加到 forbidden_tokens 列表中。
    • ascii_toks 列表中移除这些最相似的词汇。
  4. 返回结果

    • 返回一个张量形式的 ascii_toksforbidden_tokens 列表。

这个函数的主要目的是筛选出仅包含 ASCII 字符的词汇,并根据余弦相似度排除与目标词汇最相似的前 20 个词汇,最终返回筛选后的词汇和被排除的词汇。


这个代码片段使用 CLIP 模型和稳定扩散模型来处理图像和文本特征,并尝试生成与目标词汇相似的替代词汇。具体步骤如下:

  1. 定义损失函数

    • 使用余弦相似度来定义一个损失函数,计算两个向量之间的距离。具体来说,损失函数为 1 - 余弦相似度
  2. 提取目标词汇的嵌入

    • 初始化一个空列表 tar_embs 来存储目标词汇的嵌入。
    • 获取目标词汇的编码(包括 </w> 后缀)。
    • 加载对应目标词汇的参考图像,并对图像进行预处理。
    • 无需计算梯度,获取图像和文本的特征嵌入。
  3. 获取输入文本的 ID

    • 使用分词器对输入句子进行编码,添加填充和截断,并转换为 CUDA 张量。
    • 找到输入序列中结束标记的位置。
  4. 获取 ASCII 词汇

    • 获取嵌入层的权重。
    • 调用 get_ascii_toks 函数,获取允许的词汇和被排除的词汇。
    • 输出被排除的词汇。
  5. 处理不允许的词汇

    • 创建一个集合,包含所有不允许的词汇索引。
    • 转换为 CUDA 张量。
  6. 初始化变量

    • 初始化最优解码字符串和最优输入 ID。
    • 获取输入 ID 的嵌入。
    • 初始化原始损失。
    • 打印分隔线。
  7. 寻找最佳替代词汇

    • 获取目标词汇的嵌入。
    • 初始化最大相似度为一个非常小的值。
    • 遍历允许的词汇,计算每个词汇与目标词汇的余弦相似度。
    • 找到相似度最大的词汇,作为替代词汇。
    • 更新输入 ID,在结束标记之前插入新的词汇。
    • 获取替代词汇的嵌入,并设置 requires_grad_True

通过这些步骤,代码实现了从图像和文本特征中提取嵌入,并寻找与目标词汇最相似的替代词汇。最终的替代词汇嵌入将被用于进一步的梯度计算和优化。


这个代码片段用于优化替代词汇的嵌入,使其在 CLIP 模型中与目标文本和图像特征的相似度最大化

  1. 初始化

    • embed_weights 中选择允许的词汇权重。
    • 初始化优化器 Adam,用于更新替代词汇的嵌入 adv_token_embed
  2. 提取输入嵌入

    • 获取文本模型的输入嵌入 input_embed,这是输入 ID 的嵌入表示。
  3. 优化过程

    • 在每次迭代中,使用量化表 embed_weightsadv_token_embed 进行量化。量化的过程是通过计算 adv_token_embed 与每个允许词汇嵌入之间的平方差来实现的,从而找到与 adv_token_embed 最接近的嵌入 q_adv_token_embed
    • 量化后的嵌入 q_adv_token_embed 被更新为 adv_token_embed 的当前值。
    • 构造新的完整嵌入 full_embed,将量化后的嵌入插入到原始输入嵌入中的相应位置。
  4. 模型计算

    • 使用 CLIP 模型的文本编码器计算隐藏状态。
    • 生成因果注意力掩码,并将其用于编码器的输入。
    • 获取编码器的输出,并对最后的隐藏状态进行规范化。
    • 从最后的隐藏状态中提取池化输出,并使用 CLIP 模型的文本投影层计算嵌入 adv_emb
  5. 计算损失

    • 计算 adv_emb 与目标文本嵌入和图像嵌入之间的相似度损失。
    • 更新当前的输入 ID,以反映量化后的词汇。
    • 如果当前损失优于之前的最优损失,则更新最优损失和最优结果。
  6. 优化步骤

    • 清除优化器的梯度。
    • 执行反向传播以计算梯度。
    • 更新 adv_token_embed
  7. 输出最佳结果

    • 打印出优化过程中的最佳结果,即与目标特征最匹配的替代词汇。

总的来说,代码通过优化过程逐步调整替代词汇的嵌入,使其能够在 CLIP 模型中产生与目标文本和图像特征相似的嵌入,从而达到预期的效果。

现在我们来尝试攻击,本来的prompt是生成一张车的图像,但是我们希望找到后缀,使得其生成鸟的图像


正在优化当中


求解出了所需的后缀,即下图所示的birch bees rwby migrant


然后进行测试,我们先使用stable diffusion提供的代码


执行后如下所示


可以看到在下图生成了宇航员骑马的图片


然后来测试得到的prompt


执行后如下所示,可以虽然prompt要求生成的是车、蜜蜂等,但是我们最终得到的是鸟的图片


这表明攻击成功

注意,这里的prompt是我们攻击stable diffusion1-4得到的,现在也可以尝试将其迁移到stable diffusion2-1试试
比如大家可以使用在线的网站

https://huggingface.co/spaces/stabilityai/stable-diffusion

测试结果如下


得到了蜜蜂的图像,没有鸟的图像,说明迁移效果不是很好

再比如使用stable-diffusion3进行攻击

在线网址如下:https://huggingface.co/spaces/stabilityai/stable-diffusion-3-medium

测试结果如下


生成的不是鸟,但是也不是车,而是生成了蜜蜂。表明迁移效果也不太行。

参考

1.https://www.intel.cn/content/www/cn/zh/developer/articles/technical/a-minimalist-deterministic-diffusion-model.html

2.https://encord.com/blog/diffusion-models/

3.https://betterwaifu.com/blog/stable-diffusion-nsfw

4.https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

5.https://arxiv.org/abs/2402.01369

6.https://huggingface.co/spaces/stabilityai/stable-diffusion

1 条评论
某人
表情
可输入 255