潜在扩散模型是一种扩散模型的优化版本,它在文生图等多模态领域表现出色。然而,其背后的原理复杂难懂,涉及到复杂的数学公式。本文将从原理上剖析潜在扩散模型,主要解答以下几个问题:
- 潜在扩散模型做了什么?解决了什么问题?
- 潜在扩散模型的训练过程是什么,目标函数是什么?
- 为什么这样的目标函数可以优化生图的质量?
- 为什么潜在扩散模型的解码网络要使用U-Net?
参考资料:https://zhouyifan.net/2023/07/07/20230330-diffusion-model/
首先,抛出一张LDM的架构图:
要讲清楚潜在扩散模型,我们需要先理解扩散模型。
扩散模型
编码过程
我们知道(假定..),在VAE中,我们开始把一张图像映射到潜在空间中的正态分布,而不是一个潜在空间点,这样的话模型就可以学习到不同图像的相似特征信息,因为分布有交叉。那么既然如此,反正图像最终都要映射成一个正态分布,这一个步骤是VAE的编码器模型在做,那我干脆用固定的方法来把图像映射到正态分布,最简单的办法就是叠加多个正态分布。
参考:https://blog.csdn.net/xhhgffd/article/details/148935798?spm=1001.2014.3001.5501
于是扩散模型规定了t步用于扩散,每一步扩散就是对上一步的图像叠加正态分布的噪声。
x_t即t时刻的图像,x_t-1即t-1时刻的图像。x_t的均值为x_t-1均值的μ_t倍,该值为一个固定系数,除此之外,方差也是一个固定常数,I是单位矩阵。
这么一看其实这是一个马尔科夫过程,因为当前的状态只依赖上一时刻的状态。注意,马尔科夫状态很有可能会引入条件概率,也很有可能会因此引入贝叶斯公式。
然后扩散模型一般会把上面的采样分布改写成如下的形式:
乍一看和上面很大差别,实际上就是把那几个固定系数变成了互相关的常数而已。这么设置实际上是为了直观地控制信息源于噪声的比例,使得协方差矩阵为单位阵,等一下我们将会看到这一点。
那么论文是如何采样的呢?
采样公式如下:
从这个可以看到,若x_t-1的方差为单位阵,那么x_t也可以保持相同的方差。
其次,每次会以β_t来采样噪声,形成新的分布,随着时间步的递增,初始的样本会被高斯噪声填充。现在从公式的角度上说明这一点:
由于ε始终代表(0,1)分布的噪声因子,所以噪声的均值都是0,只有方差在变化,那么可以把方差写在一起,即:
如果再往前推:
这里我们就可以发现规律了,当我们一直写到x_0时,式子会变成:
那这里就能看到,由于β是一个大于0小于1的数,当时间步足够长,x_0这一项就会因为系数趋近于0而整体趋近于0,取而代之的是后面那个标准正态分布的噪声。
这样我们就能用固定的函数来把输入x转换为正态分布,从而降低模型训练的复杂度和困难度。
解码过程
那么解码过程实际上是一个去噪的过程,从时间步t到时间步1渐渐地找到噪声并去掉:
去噪的过程等价于添加噪声的逆噪声从而将噪声抵消,数学原理表明,当噪声的方差足够小时,添加逆噪声之后的结果也满足正态分布:
只不过我们目前并不知道它的均值和方差是多少,否则我们就可以直接采样一个作为时间步t-1解码的结果。
那么如何计算均值和方差呢?
这里由于并不知道x_t的概率,所以只有x_t和x_t-1没法用贝叶斯公式来计算。
于是,需要引入一个x_0变量:
这样左边是我们待求的,右边则是已知量:
q(xt | xt-1,x0)可以用马尔科夫转换为xt与xt-1之间的关系;
q(xt-1 | x0)和q(xt | x0)可以用之前的递推式;
于是化简之后得到:
这里可以观察到方差我们是知道的,因为α和β都是已知常数。
但是我们不知道均值,因为均值里面涉及到噪声因子ε,但均值里面的x_t我们是知道的,这个噪声因子我们没法确定。
于是模型的作用就出来了,解码器可以利用模型来拟合噪声,从而将预测的噪声用于计算均值,再通过已经计算好的均值和方差采样出去噪的图像。
这就是为什么损失函数要使用:
这就是输入x_t,t来让模型拟合噪声。
潜在扩散模型
潜在扩散模型做了什么呢?
我们发现,扩散模型虽然能够让模型拟合噪声,但总归来说,模型并没有学习到图像里面真正的内容是什么?也就是说,模型只能自发的生成很多与训练数据集很像的图像,但是没法按你的要求生成图像。
你有一张轮船的照片,有一张猫的照片,扩散模型能给你生成一张类似猫的照片,也能给你生成一张类似轮船的照片,但是它没法给你生成一张猫站在轮船的甲板上的照片,因为它不知道那是猫,也不知道那是轮船,在训练的过程中从始至终就没有给到模型语义的相关信息。
所以潜在扩散模型首先添加了文本的信息,从而让文本信息指导模型去噪。
其次,扩散模型的噪声和去噪都是直接针对图像像素空间做的,这在以前图像比较小的时候,分辨率比较低的时候可以,但现在随着图像的清晰度越来越高,在图像像素空间做加噪/去噪就不合适了,于是人们想到在潜在空间向量上做加噪和去噪,从而加速计算。
一般输入用VAE编码器转换为潜在空间向量,然后添加噪声,然后在去噪过程中,用语义向量指导去噪,一般来说语义向量是Clip这样的多模态预训练模型的文本编码器加上一个投影层对文本编码得到的,而输出的潜在向量会经过VAE的解码器再解码成图像。
而之所以在解码过程中使用U-Net是因为,往往训练数据是视频数据,本身的patch是基于时空采样得到的,包含多帧图像的信息,编码出来的潜在向量也是有多个通道的,所以U-Net这种结构的网络更利于模型感知潜在向量中包含的时空信息。