跳到主要内容

Stable Diffusion 的工作原理

潜空间(latent space)是什么?

Stable Diffusion 是一种在潜在空间扩散(latent diffusion)的模型。它不是在高维图像空间中操作,而是首先将图像压缩到潜空间(latent space)中。对比原像素空间,潜空间(latent space)小了 48 倍,因此它获得了处理更少数字的好处,这就是为什么它要快得多。

提示

图像空间是巨大的。想一想:具有三个颜色通道(红色、绿色和蓝色)的 512×512 图像是一个 786,432 维的空间!

像谷歌的 Imagen 和 Open AI 的 DALL-E 这样的扩散模型都在像素空间中。他们使用了一些技巧来使模型更快,但仍然不够。

像素空间可以参考 DeepFloyd IF,它就是用的像素空间。用像素空间的好处是可以比较精确控制生成的内容,例如显示文字。

变分自编码器(Variational Autoencoder)

Stable Diffusion使用一种称为变分自编码器(Variational Autoencoder)的技术来实现图像潜空间压缩。这正是我们在使用 Stable Diffusion 时设置的 VAE 文件的内容

变分自编码器(VAE:Variational Autoencoder)神经网络由两部分组成:

  1. 编码器:将图像压缩为潜在空间中的低维表示;
  2. 解码器:解码器从潜在空间恢复图像。

Stable Diffusion 模型的潜空间为 4x64x64,比图像像素空间小 48 倍。我们谈到的所有正向和反向扩散实际上是在潜在空间中完成的。

图像分辨率(Image resolution)

图像分辨率反映在潜在图像张量的大小上。潜在图像的大小仅为 4x64x64,仅适用于 512×512 图像。对于 4×96 的纵向图像,它是 64x768x512。这就是为什么生成更大的图像需要更多的VRAM的原因。

由于 Stable Diffusion v1 在 512×512 图像上进行了微调,因此生成大于 512×512 的图像可能会导致重复对象,例如臭名昭著的 两个头部

如果必须,请将至少一侧保持在 512 像素,并使用 AI 升频器(AI upscaler)以获得更高的分辨率。

潜空间中的反向扩散

以下是 Stable Diffusion 中潜在反向扩散的工作原理。

  1. 生成随机潜在空间矩阵。
  2. 噪声预测器估计潜在矩阵的噪声。
  3. 然后从原始潜空间矩阵中减去估计的噪声。
  4. 重复步骤 2 和 3 直至特定采样步骤。
  5. VAE 的解码器将潜空间矩阵转换为最终图像。

条件(Conditioning)

文本提示(text prompt)在哪里注入到图片?没有这部分内容,Stable Diffusion 就不是文本到图像(text-to-image)模型。你会随机得到一只猫或一只狗的图像,但你没法控制 Stable Diffusion 为你生成猫或者狗的图像。

这就是条件(conditioning)的用武之地。条件的目的是引导噪声预测器,以便预测的噪声在从图像中减去后会给出我们想要的东西。

文本条件(Text conditioning)

下面概述了如何处理文本提示(Text Prompt)并将其输入噪声预测器。

分词器(Tokenizer)首先将提示中的每个单词转换为称为标记(token)的数字。然后将每个标记转换为称为 Embedding 的 768 值向量。然后,Embedding 由文本转换器处理,并准备好供噪声预测器使用。

上面介绍了如何处理文本提示并将其馈送到噪声预测器中以引导图像生成。

分词器(tokenizer)

文本提示首先由 CLIP 标记器进行标记化。CLIP 是由 Open AI 开发的深度学习模型,用于生成任何图像的文本描述。Stable Diffusion v1 使用 CLIP 的分词器。

令牌化(Tokenization)是计算机理解单词的方式。我们人类可以阅读单词,但计算机只能读取数字。这就是为什么文本提示中的单词首先转换为数字的原因。

分词器只能对它在训练期间看到的单词进行分词。例如,CLIP 模型中有 “dream” 和 “beach”,但没有 “dreambeach”。Tokenizer 将 “dreambeach” 这个词分解为两个标记 “dream” 和 “beach”。所以一个词并不总是意味着一个令牌!

另一个细则是空格字符也是令牌(token)的一部分。在上述情况下,短语 “dream beach” 产生两个标记 “dream ” 和 “[空格]beach”。这些 token 与 “dreambeach” 产生的 token 不同,“dream beach” 是 “dream” 和 “beach”(beach 前没有空格)。

Stable Diffusion 模型仅限于在提示中使用 75 个令牌。(现在你知道它和75个字不一样了!)

嵌入/标签(Embedding)

Stable Diffusion v1 使用 Open AI 的 ViT-L/14 剪辑模型。嵌入是一个 768 个值的向量。每个令牌都有自己唯一的嵌入向量。嵌入由 CLIP 模型固定,该模型是在训练期间学习的。

为什么我们需要嵌入(Embedding)?这是因为有些词彼此密切相关。我们希望利用这些信息。例如,man、gentleman 和 guy 的嵌入几乎相同,因为它们可以互换使用。莫奈、马奈和德加都以印象派风格作画,但方式不同。这些名称具有接近但不相同的嵌入。

这与我们讨论的用于触发带有关键字的样式的嵌入相同。嵌入可以产生魔力。科学家们已经证明,找到合适的嵌入可以触发任意的对象和样式,这是一种称为文本反转的微调技术。

将嵌入(embeddings)馈送到噪声预测器(noise predictor)

在馈入噪声预测器之前,文本转换器需要进一步处理嵌入。变压器就像一个用于调节的通用适配器。在这种情况下,它的输入是文本嵌入向量,但它也可以是其他东西,如类标签、图像和深度图。转换器不仅进一步处理数据,而且还提供了一种包含不同调节模式的机制。

UNet 网络中如何使用文字 embedding

前面已经介绍了如何生成输入文字 embedding,那么UNet网络又是如何使用的?

实际上是在 UNet 的每个 ResNet 之间添加一个 Attention,而 Attention 一端的输入便是文字 embedding。如下图所示。

交叉注意力机制(Cross-attention)文本转换器的输出由整个 U-Net 中的噪声预测器多次使用。U-Net通过交叉注意力机制消耗它。这就是提示与图像相遇的地方。

以提示 “蓝眼睛的男人” 为例。Stable Diffusion将 “蓝色” 和 “眼睛” 这两个词配对在一起(提示中的自注意力机制),这样它就会生成一个蓝眼睛的男人,而不是一个蓝衬衫的男人。

然后,它使用这些信息将反向扩散引导到包含蓝眼睛的图像。(提示/prompt和图像/image之间的交叉注意力机制)

提示
  • Hypernetwork 是一种微调 Stable Diffusion 的技术,它通过干预交叉注意力网络来插入样式。
  • LoRA 模型修改交叉注意力模块的权重以更改样式。仅修改此模块就可以微调 Stabe Diffusion 模型这一事实说明了该模块的重要性。
  • ControlNet 通过检测到的轮廓、人体姿势等来调节噪声预测器,并实现对图像生成的出色控制。

Stable Diffusion Step-by-Step

文本到图像(Text-to-image)

在文本到图像中,只需向 Stable Diffusion 提供文本提示(prompt),它会返回一个图像。

第 1 步:Stable Diffusion 在潜空间中生成随机张量。可以通过设置随机数生成器的种子来控制此张量。如果将种子设置为某个值,将始终获得相同的随机张量。这是你在潜在空间中的图像。但现在都是噪音。

第 2 步:噪声预测器 U-Net 将潜在噪声图像和文本提示作为输入,并预测噪声,也在潜在空间(4x64x64 张量)中。

第 3 步:从潜在图像中减去潜在噪声,这将成为的新潜在图像。

步骤 2 和 3 重复一定数量的采样步骤,例如 20 次。

第 4 步。最后,VAE 的解码器将潜在图像转换回像素空间。这是运行 Stable Diffusion 后获得的图像。

展示出来的效果如下图所示:

图像到图像(Image-to-image)

输入图像和文本提示作为图像到图像的输入提供。生成的图像将由输入图像和文本提示调节。例如,使用这幅素人画和提示 “photo of perfect green apple with stem, water droplets, dramatic lighting” 作为输入,图像到图像可以将其变成专业绘图:

第 1 步:输入图像被编码为潜在空间。

第 2 步:噪点被添加到潜在图像中,降噪强度控制添加的噪声量。如果为 0,则不添加噪声。如果为 1,则添加最大噪声量,以便潜在图像成为完整的随机张量。

第 3 步:噪声预测器 U-Net 将潜在噪声图像和文本提示作为输入,并预测潜在空间(4x64x64 张量)中的噪声。

第 4 步:从潜在图像中减去潜在噪声。这将成为新潜在图像。

步骤 3 和 4 重复一定数量的采样步骤,例如 20 次。

第5步:最后,VAE的解码器将潜在图像转换回像素空间。这是运行映像到映像后获得的图像。

所以现在你知道什么是图像到图像:它所做的只是设置带有一点噪声和一点输入图像的初始潜在图像。将去噪强度设置为 1 等效于文本到图像,因为初始潜在图像完全是随机噪声。

什么是 CFG 值?

如果不解释无分类器引导(Classifier-Free Guidance,CFG),这篇文章将是不完整的,这是AI艺术家每天调来调去的值。要了解它是什么,我们需要首先触及它的前身,分类器引导(Classifier Guidance)。

分类器引导(Classifier Guidance)

分类器引导是一种技术,用于将图像生成器的输出与分类器的输出进行比较。例如,如果你想生成一张猫的图像,你可以使用分类器引导来确保生成的图像看起来像猫。

这是通过将分类器的输出与猫的标签进行比较来完成的。如果分类器输出的标签与猫的标签匹配,则生成的图像看起来像猫。

分类器指导强度(classifier guidance scale)是用于控制扩散过程应与标签保持多近的参数。如果将分类器指导强度设置为 0,则分类器不会对生成的图像进行任何指导。如果将分类器指导强度设置为 1,则分类器将完全控制生成的图像。

假设有 3 组带有标签“猫”、“狗”和“人类”的图像。如果扩散是无指导的,模型将从每个组的总数据中平均的提取样本(比较随机)。如果扩散是完全指导的,则生成的图像将是猫、狗或人类的图像,没有别的内容。如果扩散是部分指导的,则生成的图像将是猫、狗或人类的图像的混合。

分类器指南。左:无指导。中:小引导尺度。右:大引导比例尺。

分类器指导强度(classifier guidance scale)控制遵循指导(guidance)的紧密程度。在上图中,右侧的采样具有比中间的分类器指导量表更高的分类器指导量表。实际上,此刻度值只是具有该标签的数据的漂移项的乘数。

无分类器指导(Classifier-free guidance)

尽管分类器指导实现了破纪录的性能,但它需要一个额外的模型来提供该指导。这给培训带来了一些困难。

用作者的话来说,无分类器指导是一种实现 “没有分类器的分类器指导” 的方法。他们没有使用类标签和单独的模型作为指导,而是建议使用图像标题并训练一个条件扩散模型,就像我们在文本到图像中讨论的那样。

他们将分类器部分作为噪声预测器 U-Net 的条件,在图像生成中实现所谓的“无分类器”(即没有单独的图像分类器)指导。

现在我们通过条件反射有一个无分类器的扩散过程,我们如何控制应该遵循多少指导?

无分类器引导 (CFG) 刻度是一个值,用于控制文本提示对扩散过程的调节程度。当图像生成设置为 0 时,图像生成是无条件的(即忽略提示)。较高的值将扩散引导向提示。

插件的生命周期

References