本文参考:深入浅出讲解Stable Diffusion原理,新手也能看明白 - 知乎
目录
1、Stable Diffusion能做什么?
2、扩散模型(Diffusion model)
(1)前向扩散(Forward Diffusion)
(2)反向扩散(Reverse Diffusion)
(3)如何训练
3、Stable Diffusion Model
(1)潜在扩散模型(Latent diffusion model)
(2)变分自编码器(Variational Autoencoder)
(3)为什么潜在空间是可能的?
(4)潜空间的反向扩散
(5)什么是VAE文件
(6)条件(Conditioning)
(6.1)文本条件
(6.2)分词器tokenizer
(6.3)将嵌入(embeddings)送到噪声预测器
(6.4)交叉注意力机制
4、Stable Diffusion 生成步骤
(1)文本到图像
(2)图像到图像
5、CFG值
(1)分类器引导(Classifier Guidance)
(2)无分类器指导(Classifier-free guidance)
6、Stable Diffusion总结
1、Stable Diffusion能做什么?
在最简单的形式中,Stable Diffusion是一种文本到图像模式,给它一个文本提示(text prompt),它将返回与文本匹配的图像。
2、扩散模型(Diffusion model)
Stable Diffusion是扩散模型(Diffusion model)下的一种模型。
它们是生成式模型,这意味着它们的目的是生成类似于它们训练数据的新数据。对于Stable Diffusion来说,数据就是图像。
为什么叫扩散模型?
分为前向扩散和反向扩散两个部分,分别对应上图中的加噪和降噪。
(1)前向扩散(Forward Diffusion)
该过程是将噪声添加到训练图像中,逐渐将其转换为没有特点的噪声图像。前向过程会将任何猫或狗的图像变成噪声图像。最终,将无法分辨它们最初是狗还是猫。
就像一滴墨水掉进了一杯水里,墨滴在水中扩散,几分钟后,它会随机分布在整个水中,你再也分不清楚它最初是落在中心还是边缘附近。
下面是一个进行前向扩散的图像示例,猫的图像变成随机噪音。
(2)反向扩散(Reverse Diffusion)
反向过程就像倒着播放视频一样,时光倒流,我们将看到墨滴最初添加的位置。反向过程就是恢复图像。
从嘈杂、无意义的图像开始,反向扩散恢复了猫或狗的图像。
每个反向扩散过程都有两部分:一是漂移或定向运动,反向扩散向猫或狗的图像漂移;二是随机运动。
(3)如何训练
为了反向扩散,我们需要知道图像中添加了多少噪声,答案是教神经网络模型来预测增加的噪声。它被称为Stable Diffusion中的噪声预测因子(noise predictor),这是一个U-Net模型。训练如下:
- 选择一个训练图像,例如猫的照片
- 生成随机噪声图像
- 通过将此噪声图像添加到一定数量的步骤中来损坏训练图像
- 训练噪声预测器告诉我们添加了多少噪声,这是通过调整其权重并向其显示正确答案来完成的。
噪声在每一步按顺序添加, 训练后,我们有一个噪声预测器,能够估计添加到图像中的噪声。
现在我们有了噪声预测器,要如何使用呢?
我们首先生成一个完全随机的图像,并要求噪声预测器告诉我们噪声。然后,我们从原始图像中减去整个估计的噪声。重复此过程几次,就会得到一个猫或一只狗的图像。
此时,我们无法控制生成猫或狗的图像。当我们后面谈论条件反射时将解决这个问题。目前图像生成是无条件的。
3、Stable Diffusion Model
第2部分讲到的是Diffusion model生成图像的原理,但是不是Stable Diffusion Model的原理。原因是上述扩散过程是在图像空间中,它的计算量非常巨大,无法在任何单个GPU上运行。
图像空间是巨大的,具有三个颜色通道(RGB)的3*512*512图像是一个786,432维的空间。
像google的Imagen和OpenAI的DALL-E这样的扩散模型都在像素空间中,他们使用了一些技巧来使模型更快,但仍然不够。
当然用像素空间也有好处,那就是可以比较精确地控制生成地内容,比如显示文字。
Stable Diffusion旨在解决速度问题。
(1)潜在扩散模型(Latent diffusion model)
Stable Diffusion是一种潜在空间扩散的模型。它不是在高维图像空间中操作,而是首先将图像压缩到潜空间(latent space)中(ps:类似于图像中的centerNet算法,也是在隐藏层512*512->128*128空间中进行训练和推理)。对比原像素空间,潜空间小了48倍,因此速度变得更快。
(2)变分自编码器(Variational Autoencoder)
Stable Diffusion使用变分自编码器实现图像潜空间压缩。变分自编码器神经网络由两部分组成:编码器和解码器,编码器将图像压缩为潜在空间中的低维表示,解码器从潜在空间恢复图像。
Stable Diffusion模型的潜空间为4*64*64,对比原图像像素空间3*512*512小了48倍。我们所谈到的所有正向和反向扩散实际上是在潜在空间中完成的。
因此,在训练过程中,它不会生成噪声图像,而是在潜在空间中生成随机张量(潜在噪声)。它不是用噪声破坏图像,而是用潜在噪声 破坏图像在潜空间中的表示。 这样做的原因是它的速度要快得多。
(3)为什么潜在空间是可能的?
为什么VAE可以将图像压缩到更小的潜在空间而不会丢失信息。原因是:自然图像不是随机的,它们具有很高的规律性:面部遵循眼睛、鼻子、脸颊和嘴巴之间的特定空间关系;狗有4条腿,是一种特殊的形状。
这可能和机器学习里的流形假设(Manifold hypothesis)有关。如果认为自然数据是由低维的流形所表示在空间里,那它本身就是一个假象,可以直接去低维空间中计算它而得到和高维度相似的结果。这种将高维图像压缩到低维去理解,好像恰恰是人类视觉神经的一个运作原理。也就是说,更有助于AI将注意力放在低频段的、总体性的形态上去,相当于让AI把更多的精力放在判断一张图像的整体构造上。
不过从输出结果来看,流形假设并不完全正确。因为Latent Diffusion在人脸、手这种在图像整体中占比小的,但细节又不可忽视的地方,表现还不如Dall-E这种像素级的Diffusion。所以这种低维的计算还是有损的,这也是为何Stable Diffusion的VAE解码中,加入了人脸修正等加强模块,更换更好的VAE似乎也是一种增强Stable Diffusion效能的方式。
(4)潜空间的反向扩散
- 生成随机潜在空间矩阵
- 噪声预测器估计潜在矩阵的噪声
- 然后从原始潜空间矩阵中减去估计的噪声
- 重复步骤2和3直至特定采样步骤
- VAE的解码器将潜空间矩阵转换为最终图像。
(5)什么是VAE文件
VAE文件在Stable Diffusion V1中使用,以改善眼睛和面部的绘画效果。他们是我们刚刚谈到的自编码器的解码器。通过进一步微调解码器,模型可以绘制更精细的细节。
(6)条件(Conditioning)
文本提示(text prompt)在哪里注入到图片?需要用到条件。
条件的目的是引导噪声预测器,以便预测的噪声在从图像中减去后会给出我们想要的东西。
(6.1)文本条件
分词器(Tokenizer)首先将提示中的每个单词转换为标记(token)的数字,然后将每个标记转换为称为Embedding的768值向量,其次Embedding由文本转换器处理,并准备好供噪声预测器使用。
(6.2)分词器tokenizer
文本提示首先由CLIP标记器进行标记化。CLIP是由Open AI开发的深度学习模型,用于生成任何图像的文本描述。Stable Diffusion v1使用CLIP的分词器。
分词器只能对它在训练期间看到的单词进行分词。例如,CLIP模型中有"dream"和"beach",但没有"dreambeach"。Tokenizer将"dreambeach"这个词分解为两个标记"dream"和"beach"。所以,一个词并不总是意味着一个token。
Stable Diffusion模型仅限于在提示中使用75个token。
(6.3)将嵌入(embeddings)送到噪声预测器
在送入噪声预测器之前,文本转换器需要进一步处理embedding。它的输入是文本嵌入向量,但它也可以是其他东西,如类标签、图像和深度图。转换器不仅进一步处理数据,而且还提供了一种包含不同调节模式的机制。
(6.4)交叉注意力机制
文本转换器的输出在整个U-Net中的噪声预测器多次使用,U-Net通过交叉注意力机制消耗它,这就是提示与图像相遇的地方。
以提示"蓝眼睛的男人"为例。Stable Diffusion通过提示中的自注意力机制将“蓝色”和“眼睛”这两个词配对在一起,这样它就会生成一个蓝眼睛的男人,而不是一个蓝衬衫的男人。然后,它使用这些信息,通过提示prompt和图像prompt之间的交叉注意力机制将反向扩散引导到包含蓝眼睛的图像。
Lora模型修改交叉注意力模块的权重以更改样式。仅修改此模块就可以微调Stable Diffusion模型这一事实说明了该模块的重要性。
4、Stable Diffusion 生成步骤
(1)文本到图像
第1步,Stable Diffusion在潜空间中生成随机张量。此时可以通过设置随机数生成器的种子来控制此张量。生成的是潜在空间中的图像,但现在都是噪声。
第2步,噪声预测器U-Net将潜在噪声图像和文本提示作为输入,并预测噪声,也在潜在空间4*64*64的张量中。
第3步,从潜在图像中减去潜在噪声,这将成为新的潜在图像。
步骤2和3重复一定数量的采样步骤,比如20次。
第4步,VAE的解码器将潜在图像转换回像素空间。这是运行Stable Diffusion后获得的图像。
(2)图像到图像
图像到图像是SDEdit方法中首次提出的一种方法,SDEdit可以应用于任何扩模型,所以有Stable Diffusion的图像到图像的功能。
输入图像和文本提示作为图像到图像的输入提供,生成的图像将由输入图像和文本提示调节。例如,使用这幅素人画和提示“photo of perfect green apple with stem, water droplets, dramatic lighting”作为输入,图像到图像可以将其变成专业绘图。
第1步,输入图像被编码为潜在空间
第2步,噪声被添加到潜在图像中。降噪强度控制添加的噪声量。如果为0,则不添加噪声;如果为1,则添加最大噪声量,以便潜在图像成为完整的随机张量。
第3步,噪声预测器U-Net将潜在噪声图像和文本提示作为输入,并预测潜在空间(4*64*64张量)中的噪声。
第4步,从潜在图像中减去潜在噪声,这将成为新的潜在图像。
步骤3和4重复一定数量的采样步骤,例如20次。
第5步,VAE解码器将潜在图像转换回像素空间,这是运行图像到图像后获得的图像。
总结,图像到图像所做的只是设置带有一点噪声和一点输入图像的初始潜在图像。将降噪强度设置为1等效于文本到图像,因为初始潜在图像完全是随机噪声。
5、CFG值
CFG:Classifier-Free Guidance无分类器引导,这是AI艺术家每天调来调去的值。
(1)分类器引导(Classifier Guidance)
分类器引导是一种在扩散模型中合并图像标签的方法,它可以使用标签来指导扩散过程。例如,标签“猫”引导反向扩散过程中生成猫的照片。
分类器指导强度(classifier guidance scale)是用于控制扩散过程应与标签保持多近的参数。
假设有3组带有标签“猫”、“狗”和“人类”的图像。如果扩散是无指导的,模型将从每个组的总数据中(有点“均匀”的意思)提取样本,但有时它可能会绘制适合两个标签的图像,例如男孩抚摸狗。
在高分类器指导下,扩散模型生成的图像将偏向极端或明确的例子。如果你向模型询问一只猫,它将返回一个明确的猫的图像,没有别的。
(2)无分类器指导(Classifier-free guidance)
尽管分类器指导实现了破记录的性能,但它需要一个额外的模型来提供该指导,这给训练带来了一些困难。
无分类器指导是一种实现“没有分类器的分类器指导”的方法,文本提示以文本到图像的形式提供此指导。
他们将分类器部分作为噪声预测器U-Nett的条件,在图像生成中实现所谓的“无分类器”(即没有单独的图像分类器)指导。
现在我们通过条件反射有一个无分类器的扩散过程,那么如何控制应该遵循多少指导?无分类器引导(CFG)刻度是一个值,用于控制文本提示对扩散过程的调节程度。当图像生成设置为0时,图像生成是无条件的(即忽略提示),较高的值将扩散引导向提示。
6、Stable Diffusion总结
1、它使用扩散模型,分为前向扩散和反向扩散两部分,对应加噪和降噪的过程
2、前向扩散:类似墨滴在水中扩散,变成随机噪声;反向扩散:恢复图像。
3、训练:教神经网络U-Net预测噪声
4、潜在空间的反向扩散:
(1)生成随机潜在空间矩阵
(2)噪声预测器估计潜在矩阵的噪声
(3)从原始潜在空间矩阵减去估计的噪声
(4)重复步骤(2)和(3)直至特定采样步骤
(5)VAE的解码器将潜在空间矩阵转换为最终图像
5、文生图的步骤
(1)在潜空间中生成随机张量
(2)噪声预测器将潜在噪声图像和文本提示作为输入,并预测噪声
(3)从潜在图像中减去潜在噪声得到新的潜在图像
(4)重复步骤(2)和(3)直至特定采样步骤
(5)VAE的解码器将潜在空间矩阵转换为最终图像
6、图生图的步骤
(1)输入图像被编码为潜在空间,噪声被添加到潜在图像中。
(2)噪声预测器将潜在噪声图像和文本提示作为输入,并预测噪声
(3)从潜在图像中减去潜在噪声得到新的潜在图像
(4)重复步骤(2)和(3)直至特定采样步骤
(5)VAE的解码器将潜在空间矩阵转换为最终图像
7、CFG:classifier-free guidance无分类器引导,指的是不需要单独分类模型而使用文本提示来进行引导,该值用于控制文本提示对扩散过程的调节程度