前言
现在大火的stable diffusion系列,Sora,stable video diffusion等视频生成模型都是基于了diffusion模型。而diffusion模型的基石就是DDPM算法(之后有一些diffusion的加速方法,但是原理上还是DDPM),所以需要我们对DDPM有一定的了解,了解了DDPM可以帮助我们更好的理解diffusion模型。
DDPM全称是Denoising Diffusion Probabilistic Models,最开始提出是用于去噪领域。原始论文中数学公式比较多,需要一定的数理基础。
https://arxiv.org/pdf/2006.11239.pdf
实际上,DDPM也没那么复杂,我们两个层面上理解下DDPM的过程,分别是基于vae和基于傅立叶变换。
下文中diffusion默认指代的是DDPM文中的diffusion model。
首先,我们可以简单对比下vae和diffusion的推理过程
vae 把图像可学习的方式压缩到一个latent space
diffusion 把图像通过n step 压缩成噪声,噪声再通过n step 去噪成图像
不同于vae encoder/decoder的叫法,
diffusion 的两个过程称为前向过程(加噪)和反向过程(去噪),这两个过程的中间态是一个和输入图像相同尺寸的高斯噪声。
而vae是通过数据驱动的方式压缩到一个一维隐空间,这个隐空间也是一个高斯分布,并且不需要n step,而是只需要 1 step。
那其实主观上,可能我们觉得vae多直接啊,而且非常优雅!为啥不用vae?确实,生成模型用了很长时间vae,最后gan变成主流,现在是diffusion。
生成模型越来越复杂了。
为什么越来越复杂大家还要用?最简单的解释就是,diffusion虽然很麻烦,但是效果好啊,架不住可以新发(水)几篇paper啊 ️。了解光流的同学一定听过RAFT等一个网络不够,我就cascade(级联)多个网络去学习的范式,diffusion也是类似的想法,但是这里并不是简单的把级联,
diffusion建模的是信号本身的restoration,意味着diffusion这套建模可以用到1维分布、2维分布、一直到N维分布都可以。
这非常重要,接下来我们从第二个点进一步了解。
第二,我们可以通过傅立叶变换的思路去理解diffuison。不了解傅立叶变化的我简单说下,就是用一系列不同频率的余弦函数我们可以逼近任意的时域分布。
我们看最右边蓝色时域分布是一个非常奇怪的分布,实际上可以在频域拆解成若干 不同频率的余弦去表达。
那么理论上,余弦可以表达任意分布!
我们学过中心极限定理:
无论原始数据的分布如何,只要样本量足够大,这些样本均值的分布将近似为正态分布。我们再回过头看看,为什么我们能从一个高斯分布,通过diffusion model 还原出clear image,甚至是segmentation mask,depth等等表达,都是因为我们的源头是一个包含了所有可能分布的总和啊!
DDPM
我会通过尽可能简单的语言,带大家一起理解
diffsuion 前向过程 和 反向过程的基本数学表达
基本符号
diffusion原文中用
表示clear image,
表示高斯噪声, T一般都很大, 比如1000。
表示中间的图像和噪声混合的中间态, t越大, 混杂的噪声越大。
表示
去噪过程
中给定
的分布。
表示
加噪过程
中给定
的分布。
前向过程(加噪)
加噪过程为前向过程
忽略化简过程,整个马尔可夫链可以表示为
首先需要理解的是
。
这里的
可以表示为
, 很明显, 这个正态分布的均值方差如下:
那么根据正态分布的性质,我们可以得到如下转换:
所以最后
, 看起来就非常清晰了。
就是
和一个高斯噪声加权
得到的。这里的权重
和噪声水平相关。当噪声比较大的时候, 信号的权重比较小, 相反, 当噪声比较小的时候, 图像权重比较大。一般来说
都比较小, 且小于1。
根据上面的式子, 我们可以直接递推出,
给定
的情况下,
的分布
。这对后面损失函数
的化简有帮助。不要惧怕新的符号, 这里的
并且
只是为了美观引入了新的变量, 让表达式更加简洁。也就是说在diffusion 加噪过程中, 只要知道了 clean image
和
, 就能推导出任意时刻的
。
所以我们也需要理解
文中称
为 variance schedule。我们需要保证
足够大的T的时候, 最后的分布是一个isotropic Gaussian (各向同性的高斯分布)。
值一般在正向过程
中增加(和时间
相关)比如
。
反向过程(去噪)
diffusion的目标是学习reverse process(或者叫 diffusion process),即训练一个
,从噪声还原回干净的图像。
我们可以写出最开始纯高斯分布的表达式
是已知的,我们还可以写出马尔可夫链单步的递推表达式:
安装上节的写法可以写成
注意,均值
就是DDPM要训练的单元,方差
在DDPM中是固定的,后续DDPM的优化工作也做成可训练的了。
目标函数
众所周知,
生成式网络都是为了让估计出来的分布更加接近真实的分布
。由于分布这个东西很抽象,一般都是使用一个dataset,然后都是要最大化网络估计出来的后验分布似然,也就是上图中右下角的公式。实践中,这个公式不能直接优化,需要转化,VAE中优化ELBO也是同理。这里省略推导。
对于扩散模型,
扩散模型是通过寻找使训练数据的可能性最大化反向马尔可夫转移来训练的
。在实践中,训练等同于最小化负对数似然的变分上界。
了解KL 散度的同学应该知道,这个问题就是要 优化 KL 散度,使得预测的分布更加接近真实分布。更直观的可以看下图,红色表示真实分布,蓝色表示预测分布。
DDPM 把负对数的上界叫vlb,其实就是 负的ELBO。最终要优化的目标是
其中
上式中,
target distribution
predicted distribution)表示KL 散度。接下来,我们分别解释下
中
. 没有可学习的参数, 所以在训练的时候
是一个常量, 可以直接忽略!
的取值范围是
, q (.) 没有可学习的参数, target 分布是
的原因是化简的过程中用到了贝叶斯公式。我们可以写出预测的分布
的表达式:
在DDPM中,假设
多元变量高斯分布是具有相同方差的独立高斯分布的乘积,这个方差值可以随时间t变化。
在前向过程中,
我们将这些方差设置为相同的大小。
t比较小的时候,方差比较小,t比较大的时候,方差比较大。最终方差值没有采用学习策略,而是经验设置了常数,如下:
所以预测的分布
变成了
注意!
中另外一项
和
都是通过配方法配的权重, 具体参数见论文下式
注意:上面的
在推理过程中是不知道的!!!所以需要利用网络进行预测!!!
这里是为了美观,设置了两个变量
并且
所以,有趣的来了,我们不难看出,
对于两个高斯分布求KL散度,变量还只有均值项,所以可以直接写成MSE的形式
,因为它们肯定是正相关的。
, 而作者实验发现在预测
的时候给定timestep t会取得更好的效果。
还记得前向过程中, 我们推导得到给定
的情况下,
的分布
吗? 我们可以简单的表达
。
作者为了清晰起见定义了一个
是噪声, 符合 0 均值, 1 方差的正态分布。
变成了