{条件控制|Conditioning}
如果没有文本提示,{稳定扩散|Stable Diffusion}就不是一个文本到图像的模型。你将只会得到一张猫或狗的图片,没有任何控制它的方法。
这就是{条件控制|Conditioning}的作用。
条件控制
的目的是引导噪声预测器,使得在从图像中减去预测的噪声后,我们可以得到我们想要的结果。
文本调节(文本到图像)
下面是一个概述,说明了文本提示是如何被处理并输入到噪声预测器中的。
- 首先,分词器将提示中的每个单词转换为一个称为标记(
token
)的数字。 - 然后,每个标记被转换为一个包含768个值的
向量
,称为{嵌入|embedding}。这些嵌入向量接着被文本转换器处理,并准备好供噪声预测器使用。
Tokenizer
文本提示首先通过CLIP
分词器进行分词。CLIP
是OpenAI
开发的一个深度学习模型,用于生成任何图像的文本描述。{稳定扩散|Stable Diffusion}v1
使用了CLIP
的分词器。
分词是计算机理解单词的方式。我们人类可以读取单词,但计算机只能读取数字。这就是为什么文本提示中的单词首先被转换为数字。
分词器只能对其在训练期间见过的单词进行分词。例如,CLIP
模型中有“dream”
和“beach”
,但没有“dreambeach”
。分词器会将单词“dreambeach”
分割为两个标记“dream”
和“beach”
。因此,一个单词并不总是对应一个标记!
另一个需要注意的细节是空格字符也是标记的一部分。在上述情况中,短语“dream beach”
产生了两个标记“dream”
和“[space]beach
”。这些标记与“dreambeach”
产生的标记“dream”
和“beach”
(beach之前没有空格)不同。
{稳定扩散|Stable Diffusion}模型限制了文本提示中使用的标记数量为
75
个。
{嵌入|embedding}
{稳定扩散|Stable Diffusion}v1
使用了OpenAI
的ViT-L/14 CLIP
模型。{嵌入|embedding}是一个包含768
个值的向量
。每个标记都有其自己独特的{嵌入|embedding}向量。{嵌入|embedding}是由CLIP
模型固定的,在训练过程中学习得到。
为什么我们需要{嵌入|embedding}?这是因为某些单词彼此之间密切相关。我们希望利用这些信息。例如,man
(男人)、gentleman
(绅士)和guy
(家伙)的嵌入几乎相同,因为它们可以互换使用。
将嵌入投喂给噪声预测器
在输入嵌入向量到噪声预测器
之前,嵌入
需要经过文本变换器的进一步处理。这个变换器就像一个通用的适配器,用于条件控制。在这种情况下,它的输入是文本嵌入向量,但它也可以是其他东西,比如类别标签、图像和深度图。变换器不仅进一步处理数据,还提供了一种包含不同条件模态的机制。
{交叉注意|Cross-attention}
文本变换器的输出在整个U-Net
中被噪声预测器多次使用。U-Net
通过{交叉注意|Cross-attention} 机制来利用它。这就是prompt
与图像相遇的地方。
以提示“一个有蓝眼睛的男人”为例。{稳定扩散|Stable Diffusion}将“蓝”和“眼睛”这两个词进行配对(在提示内部进行自我注意),这样它就生成了一个有蓝眼睛的男人,而不是一个穿着蓝色衬衫的男人。然后,它利用这个信息来引导{逆向扩散|Reverse Diffusion}朝着包含蓝眼睛的图像方向进行。(prompt
和图像之间的交叉注意)
{稳定扩散|Stable Diffusion}优化处理
到目前为止,我们对{前向扩散|Forward Diffusion}中的训练过程以及如何根据文本输入在{逆向扩散|Reverse Diffusion}过程中生成图像有了更好的理解。但这只是个开始,更有趣的部分是我们如何根据我们的需求调整这个过程,以产生更高质量的图像。研究人员和爱好者提出了许多不同的技术来改善稳定扩散的结果。
这些方法中的大多数是在已经训练好的稳定扩散模型的基础上进行的。训练好的模型意味着它已经看到并学会了如何使用其模型权重(指导模型工作的数字)生成图像。
优化{文本编码器|Text Encoder}
其中一组技术是针对{稳定扩散|Stable Diffusion}的{文本编码器|Text Encoder}部分的,包括文本反演
和DreamArtist
。
- 文本反演通过为你想要生成的每个新概念或风格学习一个新的关键词嵌入来工作。你可以将文本反演视为告诉翻译器 “记住这个新对象叫做'猫狗',下次我说'猫狗'的时候,你应该告诉艺术家画这个对象”。
DreamArtist
通过学习正面和负面关键词来描述参考图像。这就像是告诉翻译器“这是一张图片,记住它的样子,并称呼它为你认为最能描述它的名字”。
优化U-Net
(噪声预测器部分)
另一组技术主要针对U-Net
,即图像生成组件
,包括DreamBooth
、LoRA
和Hypernetworks
。
DreamBooth
通过使用新图像数据集
对扩散模型进行微调,直到它能理解新概念。LoRA
通过在交叉注意模型
中添加一小组额外的权重,并仅训练这些额外的权重。Hypernetworks
使用一个辅助网络来预测新的权重,并利用{噪声预测器|Noise Predictor}中的交叉注意部分插入新的样式。
这些方法基本上是告诉艺术家学习一些新的绘画方式,要么是自己学习(DreamBooth
),要么是调整现有的样式(LoRA
),要么是通过外部帮助(Hypernetworks
)。DreamBooth
非常有效,但需要更多的存储空间,而LoRA
和Hypernetworks
的训练相对较快,因为它们不需要训练整个稳定扩散模型。
控制噪声来改善生成图像
另一个技术是通过控制噪声来改善生成图像的方法,包括DALL-E 2
和Diffusion Dallying
。
DALL-E 2
是对原始的DALL-E
模型的改进,通过对噪声进行控制来生成更具指导性的图像。Diffusion Dallying
则是在{逆向扩散|Reverse Diffusion}过程中加入额外的迭代步骤,使模型有更多的时间去学习并生成更高质量的图像。
这些方法通过更好地控制噪声的引入和图像生成的迭代过程来改善稳定扩散的结果。
除了上述方法外,还有其他一些技术可用于改进稳定扩散的结果,例如使用更大的模型,优化训练策略,调整超参数等。这些技术的目标是通过不断改进稳定扩散的各个组件和流程,以获得更高质量、更符合预期的图像生成结果。
总而言之,稳定扩散的结果可以通过改进
文本编码器
、U-Net
、噪声控制
以及其他技术来提升。这些技术可以根据具体需求选择和应用,以实现更好的图像生成效果。
{扩散模型|Diffusion model}的运作方式
刚才我们从上帝视角审视{扩散模型|Diffusion model}的内部机制,让我们来看一些具体的示例,了解其运作方式。
文本到图像
在文本到图像的过程中,你给{扩散模型|Diffusion model}一个文本提示,它会返回一张图像。
第一步:{稳定扩散|Stable Diffusion}在潜在空间中生成一个随机{张量|Tensor}。
你可以通过设置随机数生成器的种子来控制这个张量
。如果你将种子设置为特定的值,每次都会得到相同的随机张量。这个张量代表了潜在空间中的图像,但目前只是一片噪声。
第二步:{噪声预测器|Noise Predictor} 也就是 U-Net
接收潜在噪声图像
和文本提示
作为输入,并预测出潜在空间
中的噪声(一个4x64x64
的张量)。
第三步:从潜在图像
中减去潜在噪声
。这将成为你的新潜在图像。
第二步和第三步将重复进行一定次数的采样步骤,例如20次。
第四步:最后,VAE
的解码器将潜在图像转换回像素空间。这就是在运行{稳定扩散|Stable Diffusion}之后得到的图像。
以下是图像在每个采样步骤中的演变情况。
噪声调度
图像从嘈杂变为清晰。真正的原因是我们在每个采样步骤中尝试得到预期的噪声。这就是噪声调度。
下面是一个例子。
噪声调度是我们自己定义的。我们可以选择在每个步骤中减去相同数量的噪声。或者我们可以在开始时减去更多的噪声,就像上面的例子。采样器
在每个步骤中减去恰好足够的噪声,以达到下一个步骤中的预期噪声。这就是你在上面图像中看到的过程。
图生图
图生图是首次在SDEdit
方法中提出的一种方法。SDEdit
可以应用于任何扩散模型。因此,我们可以使用图生图方法来进行稳定扩散
。
图生图的输入包括输入图像和文本提示。生成的图像将同时受到输入图像和文本提示的约束。
例如,使用左侧的简单图片和{提示|Prompt}为“拍摄完美绿色苹果带茎、水滴和戏剧性灯光”的输入,图生图可以将其转换为专业绘画:
下面是详细的处理过程。
第一步:将输入图像{编码|Encoder}到潜在空间中。
第二步:向潜在图像中添加噪声。去噪强度控制添加了多少噪声。如果去噪强度为0,不会添加任何噪声。如果去噪强度为1,将添加最大量的噪声,使潜在图像变成完全随机的张量。
第三步:{噪声预测器|Noise Predictor} 也就是 U-Net
以潜在的噪声图像和文本提示作为输入,并预测潜在空间中的噪声(一个4x64x64
的张量)。
第四步:从潜在图像中减去潜在噪声。这成为你的新潜在图像。
第三步和第四步会重复执行一定数量的采样步骤,例如,重复20次。
第五步:最后,VAE
的解码器将潜在图像转换回像素空间。这就是在运行图像到图像的过程中得到的图像。
图生图的含义:它的主要作用是在初始潜在图像中添加一些噪声和一些输入图像。将去噪强度设置为1等同于文本到图像(
text-to-image
)的过程,因为初始潜在图像完全是随机噪声。
{修复|Inpainting}
{修复|Inpainting}实际上只是图生图的一个特殊情况。噪声被添加到需要修复的图像部分。噪声的量同样由去噪强度控制。
{深度到图像|Depth-to-image}
{深度到图像|Depth-to-image}是对图生图的增强,它利用深度图进行附加的条件约束生成新的图像。
步骤1:将输入图像编码为{潜在状态|latent state}。
第2步。MiDaS
(一种AI深度模型)从输入图像中估计深度图。
第3步。向潜在图像添加噪声。去噪强度控制添加的噪声量。如果去噪强度为0,则不添加噪声。如果去噪强度为1,则添加最大噪声,使潜在图像成为随机张量。
第4步。{噪声预测器|Noise Predictor}根据文本提示和深度图来估计潜在空间的噪声。
第5步。从潜在图像中减去潜在噪声,得到新的潜在图像。
第4步和第5步在采样步骤中重复进行。
第6步。VAE
的解码器将潜在图像解码。现在你从深度到图像得到了最终的图像。
CFG 值
CFG是{无需分类器辅助|Classifier-Free Guidance}的简称。为了理解CFG是什么,我们需要首先了解它的前身,分类器辅助
。
分类器辅助
分类器辅助
是在{扩散模型|Diffusion model}中将图像标签纳入考虑的一种方式。你可以使用标签来指导扩散过程。例如,标签“猫”将引导{逆向扩散|Reverse Diffusion} 过程生成猫的照片。
分类器辅助尺度是一个参数,用于控制扩散过程应该多大程度上遵循标签。
假设有3组带有标签“猫”、“狗”和“人类”的图像。如果扩散是未引导的,模型将从每个组的总体中抽取样本,但有时可能会生成适合两个标签的图像,例如一个男孩抚摸一只狗的图像。
在高分类器辅助下,{扩散模型|Diffusion model}生成的图像会偏向极端或明确的示例。如果你要求模型生成一只猫的图像,它将返回一张明确是猫而不是其他东西的图像。
分类器辅助尺度控制着辅助的紧密程度。在上面的图中,右侧的采样比中间的采样具有更高的分类器辅助尺度。在实践中,这个尺度值只是对朝着具有该标签数据的漂移项的乘法因子。
CFG value
无分类器辅助(CFG)尺度是一个值,用于控制文本提示对扩散过程的影响程度。当该值设为0时,图像生成是无条件的(即忽略了提示)。较高的值将扩散过程引导向提示的方向。
Stable Diffusion v1 vs v2
模型差异
Stable Diffusion v2
使用OpenClip
进行文本嵌入,而Stable Diffusion v1
使用Open AI
的CLIP ViT-L/14
进行文本嵌入。这个改变的原因如下:
OpenClip
的模型比CLIP
模型大五倍。更大的文本编码器模型可以提高图像质量。- 虽然
Open AI
的CLIP
模型是开源的,但这些模型是使用专有数据进行训练的。切换到OpenClip
模型使研究人员在研究和优化模型时拥有更多的透明度,有利于长期的发展。
训练数据的差异:
Stable Diffusion v1.4
在以下数据集上进行训练:
- 在
laion2B-en
数据集上进行了237,000个步骤,分辨率为256×256
。 - 在
laion-high-resolution
数据集上进行了194,000
个步骤,分辨率为512×512
。 - 在“laion-aesthetics v2 5+”数据集上进行了225,000个步骤,分辨率为512×512,并且取消了10%的文本条件。
Stable Diffusion v2
在以下数据集上进行训练:
- 在经过过滤的
LAION-5B
子集上进行了550,000个步骤,分辨率为256x256,使用LAION-NSFW
分类器进行筛选,设置punsafe=0.1
,美学评分>=4.5。 - 在相同数据集上进行了850,000个步骤,分辨率为512x512,并且限制了图像分辨率>=512x512。
- 使用
v-objective
在相同数据集上进行了150,000个步骤。 - 在
768x768
的图像上再进行了额外的140,000
个步骤。
Stable Diffusion v2.1
在v2.0的基础上进行了微调,包括:
- 在相同数据集上额外进行了55,000个步骤(
punsafe=0.1
)。 - 另外进行了155,000个额外步骤(
punsafe=0.98
),最后关闭了NSFW过滤器。
要点总结
在本文中,我试图用简单的术语解释稳定扩散的工作原理。以下是一些要点:
- 稳定扩散是一个主要从文本生成图像的模型(受文本约束),但也可以根据其他指令(如图像/表示)生成图像。
- 稳定扩散的训练过程包括逐渐向图像中添加噪声(前向扩散)并训练{噪声预测器|Noise Predictor}逐渐去除噪声以生成更清晰的图像(逆向扩散)。
- 生成过程(逆向扩散)从潜空间中的随机噪声图像(张量)开始,并逐渐扩散成一个清晰的图像,以提示为条件。
- 有许多技术可以改善稳定扩散的结果,包括在嵌入层上进行的
文本反演
和DreamArtist,以及在扩散模型上进行的LoRA
、DreamBooth
和Hypernetworks
。而这些技术列表还在不断增长。
后记
分享是一种态度。
参考资料:
全文完,既然看到这里了,如果觉得不错,随手点个赞和“在看”吧。