@TOC
前言
本文一共分为三大部分,这是第一部分
Diffusion model(一): 公式推导详解
Diffusion model(二): 训练推导详解
Diffusion model(三): 公式结论
首先附上几个大佬的讲解
lilianweng-diffusion-models
zhihu_由浅入深了解Diffusion Model
b站_diffusion model 原理讲解
b站_基于 pytorch 动手实现 diffusion model
DDPM论文_NIPS_2020
这篇博客借鉴了上述博客、视频以及DDPM论文,同时加上个人的理解整合了一下,尽可能让整个推导详细,希望能使每个人都看懂
结合之前讲过的VAE和GAN模型,Diffusion Model和他们的区别就是latent code和原图是同尺寸大小的。如下图所示,给大家一个直观的认识:Diffusion Model分为前向过程和反向过程,前向过程将输入图片变为纯高斯噪声
(就是一个不断加噪的过程),反向过程就是将噪声
还原为图片
的过程(就是一个不断去噪的过程)
知道Diffusion Model在做什么之后,接下来对Diffusion的前向和反向过程做分析推导
Diffusion的前向过程
1. 前向过程从到
的公式
给定真实图片,前向过程中diffusion model对其添加了
次高斯噪声,分别得到图
(随着
的增加,
包含越来越多的噪声),这个过程如下表示
下图展示了前向加噪的过程中图片的变化,从左到右为
整个前向加噪过程是马尔科夫过程,即时刻的状态只与
时刻有关,在不断加噪的过程中,
不断接近纯噪声,
,
变为正态分布的高斯噪声(为什么下面会讲),在论文中
是从0.0001到0.02线性插值的,取
,也就是说
是不断增加的,
是不断减小的
回过头来再看上述分布,随着
增加,
的均值是
的
倍,因此最终
的均值不断变小,趋近于
,而标准正态分布的均值也为0
下面是和
随着
增加的变化曲线
![]() |
![]() |
2. 怎么从直接得到
的表达式?
前向过程的最多为1000次,如果每次都单独计算过于耗时,这里推导能够一步到位的方式
为了推导方便,原论文令,
,并用重参数化的方法来表示前向过程每一步的数据分布(重参数化方法在文末有介绍),这里我们由
得
公式解释部分,上述公式懂的话可以不看
其中公式的红色部分用到了高斯分布的独立可加性,即
由
可得
的最终结果为
,其中
在
次连乘之后接近于
,即
,即
的正态分布,这就是整个前向推导了
3. 关于到
的一个疑问
为什么的分布是
呢?因为这个公式是作者直接给出的,并没有一个推导,公式表明在加噪的过程中均值要乘上
,如果要保证均值最后为0的话,只需要每次乘的值小于1就可以了(虽然方差可能并不是
),通过上述推导我们可以发现
的最终等于
,即
,也就是说
这个分布能够保证
最终收敛为标准高斯分布,但是具体前向分布这个式子怎么得到的,我不是很懂
Diffusion的反向过程
1. 反向过程的理想目标:已知,预测
在前向加噪过程中,表达式为,反向过程就是将上述过程进行逆转,得到
的分布,通过不断的去噪从
中还原出原图
,文中证明了如果
满足高斯分布并且
足够小,
仍然是一个高斯分布。但是我们无法简单推断
,因此我们使用深度学习模型(参数为
,结构一般为U-net+attention结构)来预测他的真实分布
式是我们要通过神经网络预测diffusion model反向过程的式子:已知
以及加噪次数
的情况下,推导
,这个过程十分复杂,因为我们有无数的去噪可能性,即使最终得到了
,也无法确定
是否真的属于
这个分布中的数据,因此需要对去噪过程加以限制,即让其去噪后的图片收敛到
分布中
2. 额外已知的情况下的反向过程
对于反向过程的分布我们无法预测,但是从前向过程中我们知道
,所以通过贝叶斯公式得到
为
推导过程如下,首先利用贝叶斯公式将反向过程均变为前向过程,
以及
根据高斯分布的概率密度函数的指数部分以及前向推导公式
和
得
根据,对于大括号中的部分进行化简能够得到
的均值和方差,如下
化简得
由,得
并替换上面均值中的
得到
这样我们证明最初已知后的反向表达式了,即
观察发现,
,
,
都是已知的,要想由
得到
未知的只有
,这也是为什么在反向过程中我们要通过神经网络来预测噪声的原因,预测成功之后我们就可以得到
的分布了,然后利用重参数技巧来得到
3. 回到第一步的理想目标
通过上述推导发现要得到,反向过程的目的就是预测前向过程每一次t加入的噪声,因此这里的高斯分布
是深度学习模型所预测的噪声(即重参数化时从标准高斯分布中采样的噪声),可以看做
,由此得到均值为
网络的最终目的就是预测,或者说是均值
,至于方差
从推导来看他是一个固定值,论文中也提到当做固定值效果更好

