扩散模型(Diffusion Model)
稳定扩散模型(Stable Diffusion)属于深度学习模型中的一个大类,即扩散模型。它们属于生成式模型,这意味着它们是被设计用于根据学习内容来生成相似的新的数据的。对于稳定扩散模型而言,新的数据即为图像数据。
假设我们只使用猫和狗这两类图像来训练这个稳定扩散模型。如下图所示,图中左侧曲线的两个峰值代表了猫与狗这两组图像。
扩散分类:
前向扩散(Forward diffusion )
所谓前向扩散(forward diffusion)过程就是向训练图像中不断地添加噪声,从而使其逐渐变为一张毫无意义的纯噪声图。在我们的例子中,前向扩散过程会将猫与狗的图片转变为噪声图。最终你将无法从得到的噪声图中分别出原来的图究竟是猫还是狗(这点很重要)
这就好比往一杯水中滴入一滴墨水。墨滴将在水中扩散,在几分钟之后,它将随机均匀的遍布于整杯水中,你将再也无法从这杯水中看出原来的墨滴究竟是从杯子的中心还是边缘滴入的了。
简单理解:向图片添加噪声,使其不能被辨别;
之所以这么做是因为要将噪声作为外扩容器;(相当于将其设置为一种新型变量)方便生成后面变动的新物种;
下图演示了一张图像经由前向扩散逐渐变为纯噪声图的过程
逆向扩散(Reverse diffusion)
现在来到神奇的部分了。如果我们能够逆转扩散的过程会怎样呢?就像影片倒带一样,在时间线上逆向移动,那我们最终将会看到墨滴最初是从哪里滴落的了。
本质:前向扩散的逆行为;主要就是消减噪声、使得被噪声篡改的噪声图变成其原来的样子;
从一张完全无意义的噪声图,逆向扩散过程使其还原为一张猫【或】狗的图像,这就是逆向扩散的核心理念。
从技术上来说,每个扩散过程都有两个分量:
(1)漂移或引导的方向;
(2)随机的方向。逆向扩散会将结果导向猫或者狗的图像,但并不会是二者之间的图像。这也是为什么我上面说,逆向扩散的结果将会是猫或者狗。
扩散原理的实现:
要实现扩散原理;
前向扩散(Forward diffusion ):核心是要控制住变量“噪声”;
为了将扩散过程逆转,我们需要知道到底有多少噪声被添加到了图像中。而这个问题的答案,将会由一个经过训练的神经网络模型来预测解答。在Stable Diffusion模型中,这个模块被称为噪声预测器(noise predictor)。训练的过程如下:
1、选择一张训练图片,比如一张狗或猫的图像
2、生成一个随机的噪声图
3、将这张噪声图像原始训练图片中添加特定次数,使图像变得嘈杂
4、以正确答案为基准,通过调试参数,训练噪声预测器最终能够识别出究竟有多少次噪声被添加到了这张图片中。
在训练完成后,我们将得到一个能够估计出有多少噪声被添加到了一张图像中的噪声预测器
逆向扩散(Reverse diffusion)
Stable Diffusion模型的工作机制:
首先:SD实现基础不是以扩散模型中的图片间“像素转化”为基础的
原因是:
1、计算量巨大、耗费资源惊人
以上所描述的扩散过程都是在图像(像素)空间(image space)进行的。它的计算量是非常非常巨大的,因而生成的速度会非常的慢。而且你不可能在任何一个单一的GPU中跑通这个过程,更别说那些笔记本电脑上的垃圾GPU了。
2、参数变量巨多、难以把控最终结果的准确性
图像的像素空间是非常巨大的。想象有一张512x512大小RBG三通道的彩色图片,这将是一个768,432(512x512x3)维度的空间。(意味着为了生成一张图,你需要确定768,432个值)
3、性能提升缓慢、新技术仍待发展;
扩散模型如谷歌的 Imagen 或者Open AI的 DALL-E 都是在像素空间上运行的,它们使用了一些技巧去使模型的计算速度得以提升,但总的来说提升的并不够