浅谈stable diffusion (一)

潜在扩散模型结构
迄今为止,已经发现扩散模型在广泛的领域中是有用的,从生成建模任务(如图像生成、图像超分辨率、图像修复)到辨别任务(如,图像分割、分类和异常检测)
文生图”模块,也就是txt2img
部分。下图是一个基本的文生图展示,输入是“天堂(paradise)、广袤的(cosmic)、海滩(beach)、海盗船(Pirate ship)”,可以看到最右边的生成图片很好的符合了输入的要求,图中不仅有蓝天白云,广阔的海滩也一望无际

### 文生图测试1 -- “天堂(paradise)、广袤的(cosmic)、海滩(beach)”

稳定扩散的组成部分
Stable Diffusion其实是个比较杂合的系统,里面有着各种各样的模型模块。那首先映入眼帘的问题是,怎么把人类理解的文字转换为机器理解的数学语言
text understander
下图中蓝色的text understander将文字转换成某种计算机能理解的数学表示

蓝色的text understander(也就是一个文字的encoder编码器)把人类语言转换成计算机能理解的语义内容
text understander是个特别的Transformer语言模型(例如clip)
text understander的输入是人类语言,输出是一系列的向量,这些向量的语义对应着我们输入的文字
text understander将输出传递给图像生成器(Image Generator)

代表语义的向量(就比如上面的蓝色3*5方格)
Image Generator
粉色的图片生成器(Image Generator)可以分解成两个子模块
图片信息生成器
粉色的模块是Stable Diffusion的核心,也是Stable Diffusion和其他diffusion模型最大的区别,很多性能上的提升就来源于此。
首先,最需要明确的一点:图片信息生成器不直接生成图片,而是生成的较低维度的图片信息,也就是所谓的隐空间信息(information of latent space)。这个隐空间信息在下面的流程图中表现为那个粉色的4*3的方格,后续再将下图中这个隐空间信息输入到下图中黄色的解码器(Decoder)里,就可以成功生成图片了。Stable Diffusion主要引用的论文“latent diffusion”中的latent也是来源于隐变量中的“隐”(latent)。

一般的diffusion模型都是直接生成图片,并不会有先生成隐变量的过程,所以普通的diffusion在这一步上需要生成的信息更多,负荷也更大。因而之前的diffusion模型在速度上和资源利用上都比不过Stable Diffusion。
图像解码器
图片解码器也就是我们上面说的decoder,它从图片信息生成器(Image Information Creator)中接过图片信息的隐变量,将其升维放大(upscale),还原成一张完整的图片。

图片解码器只在最后的阶段起作用,也是我们真正能获得一张图片的最终过程。
有了以上的了解,我们可以看到构成稳定扩散的三个主要组件(每个都有自己的神经网络):

Text Encoder (蓝色模块)
功能:将人类语言转换成机器能理解的数学向量 输入:人类语言 输出:语义向量(77,768)
Image Information Creator (粉色模块)
功能:结合语义向量,从纯噪声开始逐步去除噪声,生成图片信息隐变量 输入:噪声隐变量(4,64,64)+语义向量(77,768) 输出:去噪的隐变量(4,64,64)
Image Decoder (黄色模块)
功能:将图片信息隐变量转换为一张真正的图片。 输入:去噪的隐变量(4,64,64) 输出:一张真正的图片(3,512,512)
什么是扩散
扩散模型(diffusion model)
扩散模型包括两个过程:前向过程(forward process)和反向过程(reverse process)如下图所示。无论是前向过程还是反向过程都是一个参数化的马尔可夫链(Markov chain)**。

简单地说,扩散模型的工作原理是通过连续添加高斯噪声来破坏训练数据,然后学习通过反转这种噪声过程来恢复数据。
扩散过程,从字面上理解就是,像分子运动一样,一点点改变(放到图像里就是,最开始噪声一般的图像,它的像素值一点点改变,或者说叫"运动",直到最后改变成了有意义的图像)。
输入随机生成了噪声图片如下

实际的噪声更加随机,看不出来什么模式
扩散模型通过对噪声做运动得到下面的图片

最终获得了较为清晰的图片
扩散模型由两部分构成:学习过程,推理过程,上面的去噪过程就是推理过程。
学习过程

首先我们拿到要学习的图片I
然后用固定的方法添加一个噪声 N ,并把这个噪声 N 保存下来
把噪声 N 扔给我们的神经网络,神经网络会返回一个同尺寸的噪声 PN
比较神经网络预测的噪声 PN 和 N 数学尺度上的"差距" ,这个差距我们记为 D
把这个差距 D 扔给一个迭代器,它会告诉神经网络应该怎么调整它里面众多的神经参数来缩小 N 和 PN的差距。
最后重复不断这个过程,直到 D 的值足够小
推理过程

首先我们随机生成一个噪声 RD
把 RD 喂给已经学习好的 神经网络
得到神经网络给出的噪声 PD
用原始的噪声 RD根据 PD做运动,得到预测的图片I。这里的运动可以简单理解为原始噪声RD的数值减去预测噪声PD。实际上是做了一些数学变化,而非简单的加减。
判断做完运动得到的预测I是否符合我们的预期,如果符合,那就完成预测啦!否则继续6
如果运动还不够,则刚刚得到的预测图片I成为新的噪声RD,进行下一轮运动,直到得到我们需要的图片。
请注意,我们到目前为止描述的扩散过程在不使用任何文本数据的情况下生成图像。因此,如果我们部署这个模型,它将生成漂亮的图像,但我们无法控制它是金字塔还是猫或其他任何东西的图像。
文生图测试2 -- 无输入

如何控制扩散
人类绘画过程
要了解文生图怎么做到的,我们先看一下人类通常的作画流程,当人类开始进行艺术创作时,拿绘画举例,我们通常大致可以归类为以下几个步骤:
确立主题:这一阶段,我们会收集绘画想表达的内容,中心思想,或者说绘画本身的目的,再具体的说,这一阶段我们会去和绘画的需求方确认创作的这幅画的尺寸,主题,背景,需求方的目的,应用的场景等等。
细化需求:确立了主题,接下来就是细化需求,这一阶段我们可能需要收集内容的相关的素材,相关的文化知识,背景信息,画风等等来辅助我们创作。
绘制草稿:细化了需求,接下来可能会找一些参考图,进行一些草图,线稿,素描等创作。
完成绘图:最后,在草稿的基础上根据需求完成整体的构图,绘画,最终交付。

diffusion model在生成图片时需要指引,我们可以通过图片/文字进行实现
我们如何用语言来指引或控制最后生成的结果?
答案也很简单——注意力机制。在最开始我们讲到,我们用Text Encoder提取语义信息。
那这个语义信息怎么在生成图片的过程中使用呢?我们直接使用注意力机制在Unet内层层耦合。

图中每个黄色的小方块都代表一次注意力机制的使用,而每次使用注意力机制,就发生了一次图片信息和语义信息的耦合
文本编码器:A Transformer Language Model
自从2018年Bert发布以来,Transformer的语言模型就成了主流。Stable Diffusion起初的版本便是用的基于GPT的CLIP模型,而最近的2.x版本换成了更新更好的OpenCLIP,最近也有学者试图将Chatgpt模型与Stable Diffusion进行结合。语言模型的选择直接决定了语义信息的优良与否,而语义信息的好坏又会影响到最后图片的多样性和可控性。
Google在Imagen论文中做过实验,可以发现不同语言模型对生成结果的影响是相当大的。

更大/更好的语言模型对图像生成模型的质量有显著影响。
Clip是如何训练
那像CLIP这样的语言模型究竟是怎么训练出来的呢?它们是怎么样做到结合人类语言和计算机视觉的呢?
首先,要训练一个结合人类语言和计算机视觉的模型,我们就必须有一个结合人类语言和计算机视觉的数据集。CLIP就是在像下面这样的数据集上训练的,只不过图片数据达到了4亿张的量级。事实上,这些数据都是从网上爬取下来的,同时被爬取下来的还有它们的标签或者注释。

CLIP模型包含一个图片Encoder和一个文字Encoder。训练过程可以这么理解:我们先从训练集中随机取出一张图片和一段文字。注意,文字和图片未必是匹配的,CLIP模型的任务就是预测图文是否匹配,从而展开训练。

CLIP 包含一个图像编码器(Image Encoder)和一个文本编码器(Image Encoder)
我们分别用俩个编码器对图像和文本进行编码,输出结果是俩个embedding向量。
我们用余弦相似度来比较俩个embedding向量相似性,以判断我们随机抽取的文字和图片是否匹配。但最开始,由于两个编码器刚刚初始化,计算出来的相似度往往会接近于0。
这时候假设我们模型的预测是 Not similar 而标签为Similar ,那么我们的模型就会根据标签去反向更新俩个编码器。
不断地重复这个反向传播的过程,我们就能够训练好两个编码器,来识别图像和文本的匹配程度。
值得注意的是,就像经典的word2vec训练时一样,训练CLIP时不仅仅要选择匹配的图文来训练,还要适当选择完全不匹配的图文给机器识别,作为负样本来平衡正样本的数量。
粉色的Unet中每个Resnet不再和相邻的Resnet直接连接,而是在中间新增了Attention的模块。CLIP Encoder得到的语义embedding就用这个Attention模块来处理。

整个Unet是由一系列Resnet构成的。每一层的输入都是上一层的输出。
在图片信息生成器(Image Information Creator)中,有了初始的纯噪声【下图中左下透明4X4】+语义向量【下图左上蓝色3X5】后,Unet会结合语义向量不断的去除纯噪声隐变量中的噪声,重复50~100次左右就完全去除了噪声

得益于Clip的强大,我们可以不仅可以以类标签的文本生成图像,也能通过一些英语短句来生成图像
比如:”树下有一个女孩身边有一条狗(a girl with a dog under a tree)“

到这里我们就对stable diffusion 原理有了大概了解
下一章(如果有?),我们将会从各种stable diffusion模型的训练方法出发探寻其中的数学原理,结合数学推导揭示扩散模型的更深秘密。

参考
What are Diffusion Models? | Lil'Log (lilianweng.github.io)
The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time. (jalammar.github.io)
CompVis/latent-diffusion: High-Resolution Image Synthesis with Latent Diffusion Models (github.com)