-
简介
Stable diffusion 是一种基于扩散技术的深度学习模型,于2022年发布,是Stability AI公司推出的首要产品,它主要用于生成以文本描述为条件的详细图像,同时也可以进行补绘、外绘、重绘等任务,但原理都和文生图原理相似。
Stable Diffusion是一种隐扩散模型(在扩散模型基础上进行了优化,后面会介绍)。
-
主要过程(以文生图为例)
Stable Diffusion属于深度学习模型里的一个类别,称为diffusion models(扩散模型)。这类模型属于生成式模型,也就是说它们用于生成新的数据,而生成的这部分新数据类似于它们训练时的数据。对于SD来说,这类新数据便是图片,为什么叫扩散模型?这是因为它的数学公式看起来非常像物理上的扩散现象。
假设我们训练了一个diffusion model,训练时只给了2类图片:猫与狗。如下图所示,左边便是送入训练的猫与狗的图片。
接下来要经过前向扩散和反向扩散两个过程,最终会生成一张我们想要的图片。
-
前向扩散(forward diffusion)
-
前向扩散的过程是给训练图片添加噪点的过程,并逐渐将图片转为一个反常的噪点图。也就是会将任何猫或狗的图片转为一张噪点图,并最终无法辨认噪点图对应的初始图片是猫还是狗(可以调节噪点添加的多少),这个过程就像是滴入了一滴墨水到一杯水里,墨水在水里扩散,在几分钟后,墨水会随机分散并融入水中。且无法判断它最初是从水杯的中心滴入,还是从边缘滴入,所以叫做扩散模型。
-
前向扩散最后生成的随机噪点图如下:
-
-
反向扩散(reverse diffusion)
-
在前向扩散之后是反向扩散过程,反向扩散过程最理想的效果是:
-
输入一张噪点图(毫无意义的图),反向扩散可以将这张噪点图恢复为一张猫或狗的图片。这就是反向扩散的主要目标。
-
-
从技术角度来说,每个扩散过程分为2部:
-
漂移或定向运动(例如,所举的例子来说,噪点图要么偏向狗的方向,要么偏向于猫的方向)
-
随机移动
反向扩散会朝着猫或狗的图片方向进行漂移,最后生成一张猫或狗的图片。
-
-
-
技术原理
具体过程已经了解了,那么怎么在技术层面实现这些过程,训练出这样一个模型呢?
-
模型训练过程
从反向扩散的角度来说,我们需要知道有多少“噪点”加入到了某张图片里,然后将这些噪点去除,便可以得到我们想要的图片。因此我们首先需要训练一个神经网络来预测添加的噪点有多少。这个模型在SD里称为噪点预测器(noise predicator)。
-
训练噪点预测模型流程:
-
Step1:选择一张训练图(例如一张猫的图片)
-
Step2:生成随机的噪点图
-
Step3:给这张图继续增加多轮噪点
-
Step4:训练noise predictor,预测加入了多少噪点。通过神经网络训练权重,并展示其正确答案
经过训练,便可得到一个noise predictor,它可以预测一张噪点图中,加入到图片的噪点信息。
-
现在已经有了noise predictor(噪点预测器),应该如何使用呢?
-
通过反向扩散过程生成图片
我们首先生成一张完全随机的图片,并让noise predictor告诉我们噪点是什么。然后从原图中移除噪点。并重复此过程多次,最终遍得到一张猫或狗的图片,反向扩散通过逐步从图像中减去预测出的噪声来生成最终的图片。
所以,通过前向扩散和反向扩散就可以生成一张猫和狗的图片,但现在距离我们所说的文生图还有一些差距,因为大家也注意到了,反向扩散去除噪点的过程是基于我们之前noise predictor 噪点预测器的训练数据的,所以只会生成猫或者狗的图片,那么如何生成符合我们输入文本的图像呢?这个篇幅比较多,后面会详细介绍,现在先介绍一下另一个重要的前置知识。
-
-
重要的名词解释
-
采样
-
反向扩散中去除噪声过程被称为采样,在每一步都会生成一个新的样本图像。采样所用的方法称为采样器或采样方法。
-
下面是一个正在进行的采样过程。采样器逐渐产生越来越清晰的图像(经过多轮采样,噪声逐渐减少)
-
-
-
通过前面的过程,我们可以看出,生成一张图片的过程包括前向扩散生成一张完全随机的噪点图,然后在反向扩散的过程中,预测噪声并去除,多轮采样(降噪)后生成最终的图片。。但实际上,生成一张随机的噪声图,然后通过反向扩散逐步预测并去除噪声图中的噪点,这个计算过程非常缓慢,基本上无法在单个GPU上处理,所以stable diffusion选择了先将图像降维,把图片压缩到一个“潜空间”(latent space)中,而不是在高维的图片空间里工作,因此,stable diffusion是一个潜扩散模型(latent diffusion model),潜空间比图片空间小了48倍,所以它可以节省大量计算,继而运行速度更快。
在此基础上,我们就可以把之前介绍的前向扩散和反向扩散过程用SD采用的潜扩散原理来更准确的描述了。
-
SD的潜扩散原理
-
将图片压缩到潜空间
-
使用的技术是variational autoencoder(变分自动编码器),即VAE。
-
VAE神经网络包含2部分:Encoder与Decoder,Encoder将一张图片压缩到“潜空间”里的一个低维空间表示。Decoder从“潜空间”里的表示恢复为一张图片。
-
前面提到的前向与反向扩散都是在潜空间里完成。
-
所以在训练时,不再是生成一张噪点图,而是在潜空间里生成一个随机张量(tensor)。并且在给图片每一步增加噪点时,也不再是给图片增加噪点,而是给图片在潜空间里的张量增加潜噪点,潜空间更小,执行速度更快。
所以就诞生了一个问题
-
-
为什么潜空间是合理的?
为什么VAE可以压缩一张图片到非常小的一个潜空间而不损失信息呢?
-
这是因为:自然图片并非是随机的,它们有很高的规律性。例如,一张脸上鼻子、脸颊和嘴巴之间有特定的空间关系;一只狗有4只腿并且有特定的形状。
-
换句话说,高维的图片是人为的。自然图像可以轻松地压缩到较小的潜空间中,而不会丢失任何信息。
-
-
结合上面的前置知识介绍,SD模型工作流程可以概括如下:
-
Step1:生成随机的潜空间矩阵
-
Step2:Noise predictor预测潜矩阵的噪点
-
Step3:将预测的噪点从潜矩阵中去除
-
Step4:重复步骤2与3,直到特定的采样步数
-
Step5:VAE的decoder将潜矩阵转为最终图片
-
-
添加文本控制
到目前为止,我们还没介绍文本是如何影响图片生成的。如果没有文本prompt的影响,SD模型也不会是一个text-to-image模型。我们可以得到一张猫或狗的图片,但是没有方式来控制它。
-
这部分就是“条件”(conditioning)要做的事情。“条件”的目的便是引导noise predictor,让其知道:在抽取预测的噪点后,我们需要的是什么。
-
下面展示的是:文本提示(text prompt)如何处理并输入到noise predictor的过程:
-
Step1:首先,Tokenizer(分词器)将每个输入的单词转为一个数,称为token。
-
Step2:每个token然后转为一个768维的向量,称为词嵌入(embedding)。
-
Step3:词嵌入然后由Text Transformer处理,并可以被Noise predictor进行消费。
-
Step4:Noise predictor便可以通过文本提示(text prompt)转化成的词嵌入来预测添加的噪声,然后将其去除。
-
Step5:通过多轮采样(去噪)便可以得到文本提示(text prompt)预期的图片。
-
-
-
示例
下面结合几个例子具体介绍一下SD工作的流程:
-
文生图
文生图:
-
即给SD模型输入一组文本提示词,它可以返回一张文本提示词对应的图片。
-
具体过程如下
-
Step 1. Stable Diffusion在潜空间里生成一个随机张量。我们通过设置随机种子seed来控制这个张量的生成。如果我们设置这个随机种子为一个特定的值,则会得到相同的随机张量。这就是我们在潜空间里的图片。但是当前还全是噪点。
-
Step 2. Noise predictor 将潜噪点图以及文本提示词作为输入,并预测噪点,此噪点同样也在潜空间内
-
Step 3. 从潜图片中抽取潜噪点,并生成了新的潜图片。
Step 2 与 Step 3 重复特定采样次数,例如20次。
-
Step 4. 最后,VAE的decoder将潜图片转回像素图片空间,这便是我们通过SD模型最终得到的图片。
-
现在再看这张图,就可以很容易理解了:
-
-
-
图生图
图生图:
-
即输入是一张输入图片以及一组文本提示词。生成的图片会由输入图片以及文本提示词两者共同调节。例如,使用下面的简笔画,以及提示词“带茎、水滴和戏剧性照明的完美绿色苹果照片”作为输入,图生图可以将其转换成专业绘画。
-
具体流程如下:
-
Step 1. 输入图片编码到潜空间
-
Step 2. 加入噪点到潜图片。Denoising strength控制加入多少噪点。如果为0,则不会加入噪点。如果为1,则会加入最多的噪点,这样潜图片则转为一张完全随机的张量。
-
Step 3. Noise predictor U-Net使用潜噪点图以及文本提示词作为输入,并预测潜空间内的噪点
-
Step 4. 从潜图片中剔除潜噪点,并生成新的潜图片
-
Step 3 与 4 重复多次,直到特定采样步数,例如20次。
-
Step 5. 最后,VAE的解码器将潜图片转回像素空间,便得到了最终生成的图片。
-
图生图的原理,简单来说就是设置一个初始的、带噪点的潜图片,作为输入图片,然后经过多轮采样(去除噪点),最终得到预期的图片,如果denoising strength设置为1,则等同于文本生成图了,因为初始的潜图片是完全随机的噪点。
-
-
-