最近做相关任务时,用到了stable diffusion,把这篇论文又拿出来看了一下,这里记录了一下笔记,文章顺序为:生成模型,VAE,层级VAE,扩散模型, stable diffusion。
生成模型的目标就是从一类图像中学习到它的分布,然后从得到的分布中进行采样就可以得到新的属于这一类的图像了,比如说你想要设计一个算法,让它可以生成猫的图像,那你就使用很多猫的图像进行学习,学习到猫这种图像的分布特性,然后从这个分布中进行采样,就可以得到新的猫的图像了。说起来简单,但是做起来却十分困难,因为猫的图像分布实在很复杂,再加上二维图像是高维的数据,我们很难对它使用参数进行直接建模,所以在生成模型里,经常会引入隐变量。
想像一下为什么会产生猫的图像,图像的产生可能跟猫的一些纹理和形状的特性是有关的,比如耳机尖尖,眼睛大大,有胡须之类的,总之背后有一些隐性的控制因素,我们将这些隐性的控制因素称为隐变量,这些隐性因素比我们观测到的结果简单,所以你可以用一个简单的分布去对它做假设。
(假设它是一个简单的分布,一般假设其服从标准正态分布), 想要训练一个函数(神经网络)得到,这样你从简单分布中进行采样,通过神经网络,可以得到相应的生成图像,但这个网络怎么训练呢?
,最大似然的优化目标是:
考虑到隐变量,这个式子变为:
这里积分是很难积出来的,我们换一种表达方式:
表示从观测数据映射到隐变量空间的过程,这里最后一步用到了Jensen's 不等式,凹函数的期望大于等到期望的凹函数。最后一项又称为evidence lower bound, ELBO。
,可以通过近似最大化ELBO来实现。
表示从隐变量空间映射回数据真实分布的过程,ELBO通过推导分为了两项,第一项第称为先验匹配损失,第二步为重建损失,所以我们就把的最大似然变为了最大化这两项,推成这样有什么意义呢?因为这两项跟我们下面介绍的这个VAE网络是有关系的,这里对应的是解码器,对应的是编码器。
VAE
VAE的总体结构如下:
,解码器对应部分,训练时,需要最小化前面提过的重建损失和最小先验匹配两部分。
先看第一项,最小重建损失:
经过编码器之后映射到隐空间的,然后能通过decoder恢复出来,使用一个损失函数的话,可以表达为:
但是这样训练的话,会有些问题,因为我们现在训练的是一个生成模型,如果我们使用这个损失,网络只会学习到一些离散点的生成。
映射到一个离散的隐变量点, 然后解码器再将这个点重映回来,这使得离散点之间缺乏连续语义相关性,在非训练点采样时,无法采样得到有意义的东西,比较好的做法是,将输入映射到某一个区间分布上,比如上图将满月的图片映射到某一个区间分布,将半月的图片映射到另一个区间分布,两个分布之间具有交叉,当采样点位于两个区间之间时,就知道我想采样的图片是一个既像半月又像满月的图片(可能是3/4月亮),这个技巧称为重参数化技巧,在VAE里面,区间分布我们用正态分布来表示。
经过编码器之后得到与,这里表示映射到的正态区间分布的均值,为方差,这里涉及到的隐变量的维度你可以自己来定。
重参数化之后,重建损失可表示为:
再看第二项,先验匹配损失:
,从公式上理解就是,希望接近于先验分布,先验分布通常使用标准正态分布,通过重参数化技巧,我们已经知道。
是高维的,但每个维度是独立的,推导方式一样,VAE的训练方式就是使用这两个损失函数对编码器与解码器进行训练, 训练好之后,进行采样时,就从隐变量空间中随机进行采样,就可以得到生成的图片上。
VAE的方法可以产生还不错的生成结果,但是生成的结果并不是非常好,之后有人提出了层级VAE,层级VAE是什么呢?VAE里面我们不是用了两个神经网络,一个编码器,一个解码器,编码器将原始输入映射到隐变量空间,解码器将数据从隐变量空间进行恢复吗,但是可能一步映射到位方式并不是很合理,有时候这个映射函数太复杂,我们无法一步就能准确的进行映射。
通过T步,一步一步映射到我们最终的隐变量,其中间过程为, 解码也是一点一点进行解码的,所以实际上在这个方法里,我们的观测变量是, 到都是隐变量。
我们将输入映射到最终隐变量空间的过程是一个马尔可夫链,因此这个方法又称为马尔可夫层级VAE, 马尔可夫链是什么呢,就是我们每一小步的映射都只跟前一次的结果有关,这个性质在计算联合分布时具有很好的特性,比如我想计算:
原始公式如上式所示,但如果它是马尔可夫过程,则这个公式可以简化为:
我们在VAE里计算ELBO的结果套在HVAE(层级VAE)里,结果如下:
具体的训练,这里不做介绍了,主要是用这个引出扩散模型。