PhoenixPeng's blog.

扩散模型——14.DDIM Inversion

2024/08/19

1.概况

  本次主题将要介绍DDIM inversion技术,它常用于文生图、基于文本的图像编辑和视频编辑。给定一个输入图像和描述该图像的源prompt,DDIM inversion的目标是仅修改prompt对原始输入图像进行编辑,它不仅能够将源prompt提供给模型来对输入图像进行近乎完美的重建,同时保留了直观的基于文本引导编辑能力。

  我分为三个大部分介绍这次的主题:1️⃣首先,将介绍DDIM inversion所涉及到的相关技术,包括DDIM sampling、Classifier-free guidance等等;2️⃣描述DDIM inversion的工作和在实际应用当中所出现的问题。3️⃣详细介绍DDIM inversion的改进工作,例如:null text inversion、Prompt Tuning Inversion 。

2.背景

2.1 diffusion and denoising

  加噪过程,是指给定一张真实图片的 latent \(\textcolor{blue}{x_0}\) ,不断地采样高斯噪声 \(\textcolor{blue}{ϵ ∼ N (0, I)}\) ,按照预先定义的 scheduler 加到 latent 上。从第 \(\textcolor{blue}{t-1}\) 步到第 \(\textcolor{blue}{t}\) 步的加噪过程可以表示为:

\[\huge x_t = \sqrt{\alpha_t}x_{t-1} + \sqrt{1-\alpha_t}\epsilon_t\]

  考虑到每一步采样的高斯噪声 \(\textcolor{blue}{z_t}\) 彼此之间是独立的,从 \(\textcolor{blue}{x_0}\) 到第 \(\textcolor{blue}{t}\) 步的加噪过程可以通过下面的公式一次性直接完成:

\[\huge x_t = \sqrt{\bar{\alpha_t}}x_{0} + \sqrt{1-\bar\alpha_t}\epsilon\]

  去噪过程,是指对一个随机采样的高斯噪声,使用参数化网络 \(\textcolor{blue}{\epsilon_\theta}\),不断地预测当前步所加的噪声 \(\textcolor{blue}{\epsilon_\theta(x_t,t)}\) 并减去该噪声,从而一步步地生成新图像。从第 \(\textcolor{blue}{t}\) 步到第 \(\textcolor{blue}{t-1}\) 步的去噪过程表示为:

\[\huge x_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta(x_t,t)) + \sigma_tz\]

  值得注意的是,加号前面一项代表的是随机噪声向量减去当前步预测出的噪声,而后一项 \(\textcolor{blue}{\sigma_tz}\) 是指在采样生成当中的每一步所加入的随机噪声,这是为了提升生成图像的多样性。如果没有这一项,那么整个生图过程是完全确定性的。

2.2 DDIM Inversion

  图像编辑需要保证非编辑位置的高度一致性,所以我们至少需要保证整个生图过程是一个确定性映射。DDIM将采样过程的去噪公式改写为:

\[\Large x_{t-1} = \sqrt{\bar{\alpha}_{t-1}}\underbrace{(\frac{x_t - \sqrt{1-\bar{\alpha_t}}\epsilon_\theta(x_t,t)}{\sqrt{\bar{\alpha}_t}})}_{当前步预测的x_0} + \underbrace{\sqrt{1-\bar{\alpha}_{t-1}-\sigma^2_t}\epsilon_\theta(x_t,t)}_{指向x_t的方向} + \underbrace{\sigma_tz}_{每步加的随机噪声}\]

  文本引导扩散模型(SD)旨在将随机噪声向量 \(\textcolor{blue}{z_t}\) 和文本条件 \(\textcolor{blue}{\mathcal{P}}\) 映射到输出图像 \(\textcolor{blue}{z_0}\) ,该图像对应于给定的条件提示。DDIM具有确定性的采样(设置 \(\textcolor{blue}{\sigma_t = 0}\)):

\[\huge z_{t-1} = \frac{\sqrt{\bar{\alpha}_{t-1}}}{\sqrt{\bar{\alpha}_t}}z_t + (\sqrt{\frac{1}{\bar{\alpha}_{t-1}}-1} -\sqrt{\frac{1}{\bar{\alpha}_t}-1})\epsilon_\theta(z_t,t,\mathcal{C})\]

  那么给定一张图片 \(\textcolor{blue}{z_0}\),对应的文本 \(\textcolor{blue}{\mathcal{P}}\) 和一个预训练的扩散模型 \(\textcolor{blue}{\epsilon_\theta}\),我们由 \(\textcolor{blue}{z_0 \rightarrow z_T}\),这就是 DDIM inversion。并且基于ODE过程可以在小步长的限制下进行反转的假设,为DDIM采样提出了一种简单的反演技术:

\[\huge z_{t+1} = \sqrt{\frac{\bar{\alpha_{t+1}}}{\bar{\alpha}_t}}z_{t} + (\sqrt{\frac{1}{\bar{\alpha}_{t+1}}-1} - \sqrt{\frac{1}{\bar{\alpha}_t}-1}) \epsilon_\theta(z_t,t,\mathcal{C})\]

  为什么DDIM可以反转呢?因为DDIM的采样步数 \(\textcolor{blue}{t}\) 较少,反转到\(\textcolor{blue}{z_T}\)比较快,且DDIM是确定性的采样,图片能找到唯一对应的 \(\textcolor{blue}{z_T}\)

2.3 GAN Inversion

  GAN inversion 旨在将给定的真实图像转换回预训练的GAN模型的隐空间中,我们可以改变它某一特定方向的编码来修改响应的对象属性。GAN inversion使得在现有的隐空间中发现可控方向能够适用于真实的图像编辑,这种方式不需要点对点的监督或者耗费高的优化。

2.4 Classifier-free guidance

  当引入文本条件时,每一步的噪声预测变成了 \(\textcolor{blue}{\epsilon_\theta(x_t,t,C)}\),其中 \(\textcolor{blue}{C}\) 为经过编码的文本条件 embedding。目前文生图模型一般采用的是无分类器引导(Classifier-free Guidance)方法。该方法在训练时按一定概率混合训练有条件去噪 \(\textcolor{blue}{\epsilon_\theta(x_t,t,C)}\) 和无条件去噪 \(\textcolor{blue}{\epsilon_\theta(x_t,t,\phi)}\) (其中无条件一般是指空字符串" "的embedding),并根据引导系数 \(\textcolor{blue}{w}\) 来对二者进行插值,则无分类器引导预测被定义为

\[\huge \tilde{\epsilon}_\theta(x_t,t,C,\phi) = w \cdot \epsilon_\theta(x_t,t,C) + (1-w) \cdot \epsilon_\theta(x_t,t,\phi)\]

  当 \(\textcolor{blue}{w=0}\) 即为无条件生成模型,当 \(\textcolor{blue}{w=1}\) 时,为常规的条件生成模型,我们可以通过增大 \(\textcolor{blue}{w}\),从而提高文本条件控制的强度。

  在实践的过程中,每一步的反转都会包含一个微小的误差。如果目标是仅仅通过重构原始图像,使用 \(\textcolor{blue}{w=0}\)的无条件生成模型即可,累积的误差几乎可以忽略不计。但使用稳定扩散模型进行有意义的编辑需要应用比较高的引导系数 \(\textcolor{blue}{w > 1}\)。这样过高的指导尺度会放大反演过程中所累积的误差。最终在无分类器引导的情况下执行DDIM inversion过程会导致生成图像严重偏离原图像,而且所获得的噪声向量可能超出高斯分布,降低其可编辑性。

图1:设置 DDIM 的引导系数。使用不同的引导系数值来评估 DDIM Inversion。在左侧,测量潜在向量 \(z_T\) 相对于多元正态分布的对数似然。这估计了\(z_T\) 理想情况下应该呈现正态分布的可编辑性,并且该分布的偏离会降低编辑图像的能力。右侧,使用 PSNR 测量重建质量。可以看出,使用较小的指导比例(例如 w = 1)会带来更好的可编辑性和重建性。

3. Inversion 相关技术

3.1 Null Text Inversion

  图像编辑需要保证非编辑位置的高度一致性,但是在T2I模型中不是容易的。Inversion可以提供扩散确定性的轨迹,但仅在无条件中成立。因为T2I需要提供文本prompts,如果编辑改变了prompts,就会导致偏离确定的轨迹。Null Text Invesion就是解决这个问题,提出在CFG中的无条件引入一个可优化的编码,这个编码通过提前对特定一张图片优化,使其可以适应高条件权重的轨迹,而不影响扩散模型的先验和文本编码。

  如何修补生成过程中 CFG 文本条件对每步采样造成的影响呢?Null Text Inversion 的作者观察到,\(\textcolor{blue}{w > 1}\)时,DDIM inversion所带来的噪声向量不再服从高斯分布,从而导致生成图像的质量较差,反过来当\(\textcolor{blue}{w=1}\) 时,原图像和生成图像的贴合的还是挺不错的。也就是说它最大限度地提高了生成图像与原始图像的相似性,同时保证了执行有意义编辑的能力。 

  基于这个观察,我们可以进行如下这些操作:

  1️⃣我们先使用 \(\textcolor{blue}{w=1}\) 对真实图像进行 DDIM inversion,得到一个还原程度较高的编码 \(\textcolor{blue}{z_T^*}\),以及所有的中间步骤 \(\textcolor{blue}{z_0^*, z_1^*, ..., z_T^*}\) 并将其作为参考对象。

  2️⃣然后我们将 \(\textcolor{blue}{w}\) 设置为比较大的值(比如\(\textcolor{blue}{w=7.5}\)) ,再将\(\textcolor{blue}{z_T^*}\) 和新的文本prompt 输入到模型中进行图像编辑或重构。

  3️⃣最后,对于每一个中间步骤\(t=1,...,T\),我们尽量缩短对应时间点上两个编码之间的距离 (\(\textcolor{blue}{\bar{z}_t}\)\(\textcolor{blue}{z_t^*}\)),计算二者的 MSE 损失,用于参数更新,即 \(\textcolor{blue}{\min ||z^*_{t-1} - \bar{z}_{t-1}||^2_2}\)。目标是尽可能的接近初始轨迹 \(\textcolor{blue}{z_0^*, z_1^*, ..., z_T^*}\)

  但是这样做,又会出现一个新的问题:更新哪些参数呢?如果去微调每个编码的扩散模型的权重,花费是很大。而且这样做也会损害模型的先验知识,从而损害编辑的语义。

  有CFG的关键特性:无条件预测对最终生成的结果影响比较大。因此为了保证对模型其他部分不造成影响,作者提出仅优化null text  embedding \(\textcolor{blue}{∅_t}\)(即 CLIP text encoder 对空字符串的初始化嵌入),而不去动模型本身。

  Null Text Inversion 的整个算法流程如下所示。给定一张真实图片及其(用 caption 模型得到的)文本 prompt \(\textcolor{blue}{\mathcal{P}}\)。对文本 prompt 进行编码得到 embedding \(\textcolor{blue}{\mathcal{C}}\) 。首先将 CFG scale 设置为 \(\textcolor{blue}{w = 1}\),相当于仅使用文本条件,使用 DDIM Inversion 计算出一系列的潜在噪声 \(\textcolor{blue}{z_T^∗,...,z_0^*}\)。然后将 CFG scale 设置为 \(\textcolor{blue}{w = 7.5}\),将 \(\textcolor{blue}{z_T^*}\) 初始化为 \(\textcolor{blue}{\bar{z}_T}\) ,以及初始化空文本 \(\textcolor{blue}{∅_T}\),对时间步 \(\textcolor{blue}{t=T \rightarrow 1}\)执行一下的优化,并更新当前步的\(\textcolor{blue}{∅_t}\)

  另外需注意,本方法在每一个时间步都会单独优化出一个特定的 null text embedding \(\textcolor{blue}{∅_t}\) 这样,相当于为每张真实图片都训练出一组特定 null text embedding,在该 embedding 下进行图像重构或编辑,就可以保持原始图像的布局。

  这里\(\textcolor{blue}{z_{t-1}(\bar{z}_t, ∅_t, \mathcal{C})}\)是使用 \(\textcolor{blue}{\bar{z}_{t-1}}\)进行DDIM采样生图的简写记号。每个时间步的 \(\textcolor{blue}{∅_t}\) 都要训练,每个时间步训练N次迭代,第 \(\textcolor{blue}{t}\) 步训练结束后,根据训练好的 \(\textcolor{blue}{∅_t}\) 初始化第\(\textcolor{blue}{t-1}\)步的\(\textcolor{blue}{\bar{z}_{t-1}}\)和 \(\textcolor{blue}{∅_{t-1}}\)分别为:

\[\huge \bar{z}_{t-1} = z_{t-1}(\bar{z}_t, ∅_t, \mathcal{C}) \]

\[\huge ∅_{t-1} = ∅_t\]

  一直迭代到最后,我们得到了 inversion latent \(\textcolor{blue}{\bar{z}_T}\) 和原始图片的各个时间步的 null text embedding \(\textcolor{blue}{\{∅_t\}_{t=1}^T}\) 。注意这该图片对应的一组 null text embedding 可以保存下来,再对该图片进行 \(\textcolor{blue}{w > 1}\) 的重构或者其他编辑时,直接复用即可。

  为什么这种方式可以准确改变编辑区域不影响全局?当 \(\textcolor{blue}{w = 1}\) 时,相当于Inversion过程中没有了无条件的输出,轨迹全部来自于有条件的,也就是该估计与prompts高度相关。在你不改变prompt和添加CFG的情况下,可以高度重建。其实无条件部分的作用是提供高保真度和全局信息的,条件更注重语义。那么我们引入Null-text优化的作用就是,让无条件部分对整体高度重建,同时加强prompt的语义关联。简单而言就是,这个优化过程就是削弱条件部分对全局重建的期望,主要Inversion的时候仅用了条件部分。因此,针对特定一张图片的优化是在绑定text的语义和无条件部分的过拟合。

图2:我们的方法在总共 500 次迭代(N = 10)后甚至在 250 次迭代后(在 A100 GPU 上约 1 分钟)收敛到相对于 VQAE 上限的接近最优重建)我们实现了高质量的反演。消融研究。顶部:我们将完整算法(绿线)的性能与不同变体进行比较,通过测量 PSNR 分数作为优化迭代次数和运行时间(以分钟为单位)的函数来评估重建质量。底部:与其他基线相比,我们直观地显示了完整算法 200 次迭代后的反演结果(右侧)。

图3:比较。 Text2LIVE 擅长在局部替换纹理,但难以执行更结构化的编辑,例如用老虎替换孩子。 VQGAN+CLIP的真实感较差。 SDEdit 未能忠实地重建原始图像,导致人类参与时出现身份漂移。我们的方法实现了纹理和结构化对象的真实编辑,同时保持原始图像的高保真度。

3.2 Negative Prompt Inversion

  Null Text Inversion 将 \(\textcolor{blue}{w = 1}\) 时的 \(\textcolor{blue}{z_t^*}\) 作为 pivot,为每个时间步学习出一个特定的 null text embedding \(\textcolor{blue}{∅_t}\),在 CFG scale \(\textcolor{blue}{w > 1}\) 时实现了较好的重构和编辑效果。但是,Null Text Inversion 的优化所需大量的时间,编辑效率比较低。Negative Prompt Embedding 则提出了一种无需优化的 inversion 方案,在编辑效果也不输 Null Text Inversion 的条件下,效率大大提升。

图4:负提示反转。建议方法(负提示反转;Ours)、DDIM inversion 和null text inversion 在重建质量和时间上的比较。最右边一列显示的是使用 prompt-to prompt 和我们的重建方法获得的图像编辑结果

  其实 Negative Prompt Inversion 的做法很简单,就是在重构或编辑的生图过程中,将 Negative Prompt 从空字符串替换成原图 prompt 即可。下面我们介绍一下这个结论的推导:

  回顾一下DDIM inversion中的每一步逆映射通过下面的公式完成:

\[\huge z_{t}^* = \sqrt{\frac{\bar{\alpha_{t}}}{\bar{\alpha}_{t-1}}}z_{t-1}^* + (\sqrt{\frac{1}{\bar{\alpha}_{t}}-1} - \sqrt{\frac{1}{\bar{\alpha}_{t-1}}-1}) \epsilon_\theta(z_{t-1}^*,t-1,\mathcal{C})\]

  Null text inversion利用空文本采样可以得到:

\[\Large \bar{z}_{t-1} =z_{t-1}(\bar{z}_t, t, ∅_t, \mathcal{C}) = \sqrt{\frac{\bar{\alpha_{t-1}}}{\bar{\alpha_{t}}}}\bar{z}_t + (\sqrt{\frac{1}{\alpha_{t-1}}-1}-\sqrt{\frac{1}{\alpha_t}-1})\tilde{\epsilon}_\theta(\bar{z}_t,t,∅_t, \mathcal{C})\]

  这里的 \(\textcolor{blue}{\bar{z}_t}\) 是已优化轨迹的上一个时间步,因此也可以认为  \(\textcolor{blue}{\bar{z}_{t} \approx z_{t}^*}\),那么我们可以结合这两个式子,可以得到:

\[\Large \bar{z}_{t-1} = z^*_{t-1} + (\sqrt{\frac{1}{\alpha_{t-1}}-1}-\sqrt{\frac{1}{\alpha_t}-1})(\tilde{\epsilon}_\theta(\bar{z}_t,t,∅_t, \mathcal{C}) - \epsilon_\theta(z_{t-1}^*,t-1,\mathcal{C}))\]

  这个公式意味着优化的轨迹 \(\textcolor{blue}{\{\bar z_t\}^T_{t=1}}\) 和真实轨迹 \(\textcolor{blue}{\{z^*_t\}^T_{t=1}}\) 之间在右边为0时是完全相等的。

\[\huge \epsilon_\theta(z_{t-1}^*,t-1,\mathcal{C}) = \tilde{\epsilon}_\theta(\bar{z}_t,t,∅_t, \mathcal{C})\]

\[\huge \epsilon_\theta(z_{t-1}^*,t-1,\mathcal{C}) = w\epsilon_\theta(\bar{z}_t,t,\mathcal{C}) + (1-w)\epsilon_\theta(\bar{z}_t,t,∅_t)\]

  作者在这里假设相邻扩散步骤处的预测噪声相等,也就是:

\[\huge \epsilon_\theta(z_{t-1}^*,t-1,\mathcal{C}) = \epsilon_\theta(z_t^*,t,\mathcal{C}) =\epsilon_\theta(\bar{z}_t,t,\mathcal{C})\]

  从而,当以下式子成立时,\(\textcolor{blue}{\bar{z}_{t-1} = z^*_{t-1}}\)

\[\huge \epsilon_\theta(\bar{z}_t,t,\mathcal{C}) = \epsilon_\theta(\bar{z}_t,t,∅_t)\]

  也就是说,Null Text Inversion 的优化结果 \(\textcolor{blue}{∅_t}\)可以直接由原文本条件 embedding \(\textcolor{blue}{\mathcal{C}}\) 来代替。这样我们就可以省略掉麻烦的优化过程,在重构或编辑的生图过程中,直接将 Negative Prompt 从空字符串替换成原图 prompt。具体做法: 

  1️⃣在重构时,CFG 中的条件 embedding 和无条件 embedding 相等,都是 \(\textcolor{blue}{\mathcal{C}}\)。从而就相当于没有 CFG 的无条件生成模型,DDIM Inversion 自然可以成立。

  2️⃣在编辑时,直接将 \(\textcolor{blue}{\mathcal{C}}\) 当做 Null Text Inversion 中优化得到的 \(\textcolor{blue}{∅_t}\),大大提高了编辑效率。

图5:我们的框架说明。(a) 利用 CFG 生成图像。从标准正态分布 \(N(0,I)\) 中采样随机噪声 \(z_T\),然后在从 \(T\)\(1\) 的扩散步骤中使用 CFG 对 \(z_t\) 去噪。\(CFG(C,∅)\)表示使用提示嵌入 \(C\) 进行条件预测,使用空文本嵌入 \(∅\) 进行无条件预测。(b) 利用负提示反转重建图像。我们用 CFG 中的提示嵌入 \(∅\) 替换空文本嵌入\(∅\)。 (c) 利用负提示反转进行图像编辑。我们使用编辑后的提示嵌入 Cedit 作为文本条件,并使用原始提示嵌入 C 代替 CFG 中的空文本\(∅\),同时使用提示到提示(P2P)等图像编辑方法。

图6:重建图像的评估。左侧 4 列显示了每种方法的重建结果,右侧一列显示了使用我们的方法和 prompt 到提示的图像编辑结果。编辑提示在编辑后的图像下方描述,这些图像是通过在原始提示中替换单词或添加新单词创建的。我们的方法不仅能重建输入图像,还能进行空文本反转,编辑后的图像还保留了输入图像的结构。

  表 1 显示了三种重建方法的 PSNR、LPIPS 和推理时间比较。就 PSNR(越高越好)和 LPIPS(越低越好)而言,Negative Prompt Inversion方法的重建质量略逊于Null Text Inversion方法,但远远优于 DDIM inversion。另一方面,推理速度是Null Text Inversion的 30 倍。由于该方法不需要空文本反演所需的迭代优化和反向传播处理,因此实现了这种加速。

图7:重建质量和速度与采样步数的关系 PSNR 越高越好(左图),LPIPS 越低越好(中图),执行时间越短越好(右图)。阴影表示 95% 的置信区间。

  该方法的不足之处在于平均重建质量达不到Null text inversion的质量。这种差异乍看之下一般难以察觉;然而,在某些情况下,Negative Prompt Inversion方法却明显失败。图 8 显示了一个该方法未能重建的图像实例。我们观察到,Negative Prompt Inversion方法在重建人物时往往会失败。作者把这种失败可归因于稳定扩散自动编码器的特性,它在重建人脸时非常吃力。在这种情况下,采用更有效的编码器-解码器对可能会有所改善。此外,通过增加采样步数,一些失败案例也得到了改善。

图8: 失败的例子。Negative Prompt Inversion方法未能在 50 个采样步骤中重建最左边的人

4、总结

  Inversion 技术的两个关键目标是重构性能和编辑性能,既要与原图布局结构大致保持一致,又要能够按照新的 prompt 合理地编辑修改图中的语义内容。

  DDIM 本身是一种确定性的采样过程,十分适合作 Inversion,也是扩散模型 Inversion 的常用 baseline。当引入 CFG 文本条件控制后,重构编辑过程要求有较高的条件引导系数,使得问题进一步复杂。Null Text Inversion 提出使用无 CFG 时的 DDIM Inversion 结果作为 pivot 来迭代优化 null text embedding 解决了这一问题。Negative Prompt Inversion 则通过合理假设,推导出只要将原 prompt 设置为 Negative Prompt 即可达到类似的效果。

CATALOG
  1. 1. 1.概况
  2. 2. 2.背景
    1. 2.1. 2.1 diffusion and denoising
    2. 2.2. 2.2 DDIM Inversion
    3. 2.3. 2.3 GAN Inversion
    4. 2.4. 2.4 Classifier-free guidance
  3. 3. 3. Inversion 相关技术
    1. 3.1. 3.1 Null Text Inversion
    2. 3.2. 3.2 Negative Prompt Inversion
  4. 4. 4、总结