第十五期 02 Diffusion扩散模型
一:马尔可夫链
(一)什么是马尔可夫链
又称离散时间马尔可夫链,那就是某一时刻状态转移的概率只依赖于它的前一个状态。
举个简单的例子,假如每天的天气是一个状态的话,那个今天是不是晴天只依赖于昨天的天气,而和前天的天气没有任何关系。
马尔科夫链在很多时间序列模型中得到广泛的应用,比如循环神经网络RNN,隐式马尔科夫模型HMM等
假设状态序列为
由马尔科夫链定义可知,时刻Xt+1 的状态只与Xt 有关,用数学公式来描述就是:
既然某一时刻状态转移的概率只依赖前一个状态,那么只要求出系统中任意两个状态之间的转移概率,这个马尔科夫链的模型就定了。
(二)案例,看马尔可夫收敛性
这个马尔科夫链是表示股市模型的,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。
每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵阵P某一位置P(i, j)的值为P(j|i),即从状态i变为状态j的概率。另外定义牛市、熊市、横盘的状态分别为0、1、2,这样我们得到了马尔科夫链模型的状态转移矩阵为:
当这个状态转移矩阵P确定以后,整个股市模型就已经确定!
整个马尔可夫链模型的核心是状态转移矩阵P。那这个矩阵P有一些什么有意思的地方呢?
- 以股市模型为例,假设初始状态为t0=[0.1,0.2,0.7] ,然后算之后的状态。
最终输出结果为
从第18次开始,状态就开始收敛至[0.624,0.312,0.0625] 。最终数字上略有不同,只是计算机浮点数运算造成的罢了。
- 如果我们换一个初始状态t0 ,比如[0.2,0.3.0.5] 继续运行上面的代码,只是将init_array变一下,最后结果为:
到第18次的时候,又收敛到了[0.624,0.312,0.0625]
这个转移矩阵就厉害了。不管我们的初始状态是什么样子的,只要状态转移矩阵不发生变化,当n→∞ 时,最终状态始终会收敛到一个固定值。
二:AE和VAE模型
(一)AE自编码AutoEncoder
自编码器Autoencoder通过编码器生成特征,然后解码器重构出原来的特征,让重构出来的特征和输入的特征尽可能相似即可。
(二)VAE变分自编码Variational AutoEncoders
变分自编码器生成的不再是简单的特征,而是一个分布。包括均值m, 𝜎 是方差,e是按照正态分布采样出来的。最后生成的特征 𝑜𝑢𝑡=𝑚+𝑒𝑥𝑝(𝜎)×𝑒 。
VAE生成的中间变量是一个分布,生成的特征是根据分布的均值,加上采样的数据乘以exp(方差)【这可以理解为在均值上加的偏移量,数据噪声,做exp的操作是因为方差是大于等于0的数,通过对生成的数据加上exp保证大于等于0】
VAE的做法是使用两个网络,一个学习把图像编码成向量,另一个学习把向量解码回图像,它们的目标是让复原图像和原图像尽可能相似。学习完毕后,解码器就是图像生成网络。
(三)AE和VAE的区别
VAE加入了噪声学习,给生成的数据更多的可能。
变分自编码器的方式(VAE)是将真实样本通过编码器网络变换成一个理想的数据分布,然后这个数据分布再传递给一个解码器网络,得到一堆生成样本,生成样本与真实样本足够接近的话,就训练出了一个自编码器模型。但VAE的方法输出模糊,常会失真。
VAE之所以效果不好,很可能是因为它的约束太少了。VAE的编码和解码都是用神经网络表示的。神经网络是一个黑盒,我们不好对神经网络的中间步骤施加约束,只好在编码器的输出(某个正态分布)和解码器的输出(重建图像)上施加约束。能不能让VAE的编码和解码过程更可控一点呢?
三:Diffusion扩散模型
DDPM的设计灵感来自热力学:一个分布可以通过一系列简单的变化(如添加高斯噪声)逐渐变成另一个分布。恰好,VAE的编码器不正是想让来自训练集的图像(训练集分布)变成标准正态分布吗?既然如此,就不要用一个可学习的神经网络来表示VAE的编码器了,干脆用一些预定义好的加噪声操作来表示解码过程。可以从数学上证明,经过了多次加噪声操作后,最后的图像分布会是一个标准正态分布。Diffusion只需要训练一个模型,优化更加容易一些。
扩散模型的灵感来自非平衡热力学。通过定义了一个扩散步骤的马尔可夫链,以缓慢地将随机噪声添加到数据中,然后学习反转扩散过程以从噪声中构建所需的数据样本。
每一个噪声都是在前一时刻增加噪声而来的(马尔科夫过程),从最开始的𝑥0时刻开始,最终得到𝑥𝑇时刻的纯噪声图像(原始论文中𝑁=2000)
问题来了,为什么要加噪声?
Diffusion的本质是去噪,为了推导出逆向的去噪方法,必须了解增加噪声的原理。同时,添加噪声的过程其实就是不断构建标签的过程如果在前一时刻可以预测出来后一时刻的噪声,很方便地可以实现还原操作。(加噪声的概率为后面去噪声做指导)
所以扩散模型整体分为两个部分:前向过程(扩散过程)和复原过程。
(一)模型架构
扩散模型是一种特殊的VAE,其灵感来自于热力学:一个分布可以通过不断地添加噪声变成另一个分布。
放到图像生成任务里,就是来自训练集的图像可以通过不断添加噪声变成符合标准正态分布的图像。
从这个角度出发,我们可以对VAE做以下修改:
编码器:
1)不再训练一个可学习的编码器,而是把编码过程固定成不断添加噪声的过程;
2)不再把图像压缩成更短的向量,而是自始至终都对一个等大的图像做操作。
解码器:
解码器依然是一个可学习的神经网络,它的目的也同样是实现编码的逆操作。不过,既然现在编码过程变成了加噪,那么解码器就应该负责去噪。
而对于神经网络来说,去噪任务学习起来会更加有效。
因此,扩散模型既不会涉及GAN中复杂的对抗训练,又比VAE更强大一点。
(二)正向/反向过程
具体来说,扩散模型由正向过程和反向过程这两部分组成,对应VAE中的编码和解码。
正向过程:
在正向过程中,输入𝑥0会不断混入高斯噪声。经过𝑇次加噪声操作后,图像𝑥𝑇会变成一幅符合标准正态分布的纯噪声图像。
反向过程:
而在反向过程中,我们希望训练出一个神经网络,该网络能够学会𝑇个去噪声操作,把𝑥𝑇还原回𝑥0。
网络的学习目标是让𝑇个去噪声操作正好能抵消掉对应的加噪声操作。图像生成任务需要监督,通过与原始图像对比减少损失,来训练解码器部分的参数。
DDPM的解码器也不再是一个不可解释的神经网络,而是一个能预测若干个去噪结果的神经网络。
(三)训练目标(主要是反向过程)
训练完毕后,只需要从标准正态分布里随机采样出一个噪声,再利用反向过程里的神经网络把该噪声恢复成一幅图像,就能够生成一幅图片了。
图像生成任务就是把随机生成的向量(噪声)映射成和训练图像类似的图像。为此,扩散模型把这个过程看成是对纯噪声图像的去噪过程。通过学习把图像逐步变成纯噪声的逆操作,扩散模型可以把任何一个纯噪声图像变成有意义的图像,也就是完成图像生成。
(四)对比VAE
相比只有两个约束条件的VAE(VAE要最小化重建误差,最大化编码器输出与标准正态分布的相似度),DDPM的约束条件就多得多了。在DDPM中,第t个去噪操作应该尽可能抵消掉第t个加噪操作(t个约束)
总结一下,DDPM对VAE做了如下改动:
- 编码器是一系列不可学习(固定)的加噪声操作
- 解码器是一系列可学习的去噪声操作
- 图像尺寸自始至终不变
(五)问题
- DDPM的生成效果确实很好。但是,由于DDPM始终会对同一个尺寸的数据进行操作,图像的尺寸极大地影响了DDPM的运行速度,用DDPM生成高分辨率图像需要耗费大量计算资源。
- DDPM生成图片取决于初始噪声图片,如果真的是一个纯噪声图片,去噪后生成结果随机,缺少指导
四:降噪U-net网络
U-net网络用于在每一步迭代中预测噪声
(一)基础U-net网络架构
- 左边输入图片,经过整个网络处理,右边输出同尺寸图片。(原 UNet 网络用于医学图像识别分割,所以图上右边标的输出是一张同尺寸分割图。SD 这里的输出是降噪图)
- 左边下采样(也可以称为编码器),右边上采样(也可以称为解码器),一张图片经过一层层下采样计算,尺寸逐渐减小(图中的网络是减小到32×32),再经过右边层层上采样,恢复到原尺寸。那这里下采样和上采样的作用是什么?
-
下采样,是使用某种计算方式让更小的数据表示整张图片,这更小的数据代表了对这张图片高纬度的描述,而不是像素级细致的描述。
- 越小的数据对图片的表示和描述越宏观,有利于捕捉图片的语义特征。
- 例如一张猫在屋子前玩耍的地图,原图能看清所有细节,但因为细节太多,模型想要知道图里有猫和屋子,得把每个像素组合运算才行,但下采样到最小,最宏观的猫和屋子就容易识别。
-
上采样,是让图片的宏观小尺寸表示恢复成原图片尺寸。
- 比如对于图片分割(把图片上的物体分割出来),我们在下采样后的小数据量的高维表示里识别了图片的主体、边缘,最后还是要转回在原尺寸图片上表示,不然识别了也没用。
- 那不断下采样过程中肯定把图片细节都丢失了,再上采样,怎么可能还原图片细节?那就要说到跳跃连接(skip connection)了。
-
跳跃连接,也就是并不是顺着网络的方向连接,而是跳过原网络方向,跳着连接传输信息。说得有点拗口,看图很容易理解,就是图上中间的几条灰色箭头。
- 原网络连接方向是图片输入→下采样各节点→上采样各节点→输出图片这个链路,就是图中U字型的路径。
- 在这个路径之外,左边的下采样的每一层,都额外连接到右边上采样对应的层上面,将两个网络进行拼接。
- 上采样每一层,都在拼接了左边下采样对应层的数据后,再一起作为下一层上采样的输入。
- 为什么这样做,很容易理解,左边的每一层网络都保留了图片不同程度的细节,右边的每一层因为是上采样过来的,只有宏观信息,没有图片细节,那把左边图片细节信息拼接过去,右边这个网络宏观特征和微观细节都具备了,每一层都有不同程度的对图片的宏观语义理解和微观细节,就能做各种事情了,包括图片分割、语义生成图片。
(二)Stable Diffusion UNet 结构
SD 里的 UNet,整体结构流程跟上述一致,改造大部分是在上采样和下采样的每一层的实现里,最大的改造是引入了 ResnetBlock(残差模块)和 Transformer 模块。ResnetBlock 提升网络表达能力(原 UNet 是简单卷积模块),而 Transformer 模块的交叉注意力机制,将文本提示(prompt)的嵌入与图像特征进行融合,实现基于文本条件的图像生成。