您现在的位置是:首页 >其他 >扩散模型之DDPM网站首页其他
扩散模型之DDPM
文章前置
最原文链接(英文):What are Diffusion Models?
原文链接:Diffusion扩散模型大白话讲解,看完还不懂?不可能
原文链接:DDPM解读(一)| 数学基础,扩散与逆扩散过程和训练推理方法
hugging face diffusers(扩散模型包):huggingface diffusers code
本文并非全部是个人理解,是觉得其他作者的博客和文章通过不同的角度将DDPM讲的更加通俗易懂,希望自己能通过写一些东西加深理解,并且能够将其他人的优质内容进行分享。
生成模型
生成模型的主流网络结构应该可以分成三类,GAN、VAE 和基于流的模型。他们在生成高质量样本方面取得了巨大成功,但每个都有自己的局限性。
- GAN:由生成器和判别器构成。先训练判别器,使其能够区分图片的真伪(二分类),再继续训练生成器生成图像,在通过判别器判别图像的真伪,使生成图像的分布逐渐逼近于真实分布。由于 GAN 模型具有对抗性训练的性质,因此以潜在的不稳定训练和较少的生成多样性而闻名。
- VAE:与GAN通过判别器判断生成图像的真假不同,VAE直接通过分布的变换来生成图像。将真实样本通过编码器网络变换成一个理想的数据分布,然后这个数据分布再传递给一个解码器网络,得到一堆生成样本,生成样本与真实样本足够接近的话,就训练出了一个自编码器模型。但VAE的方法输出模糊,常会失真。
- 基于流模型的方法,是建立训练数据和生成数据之间的概率关系,然后用可逆的神经网络来训练,这种关系是一一对应的。代价就是模型设计比较麻烦,因为要保证可逆而且逆函数可以算,还要有足够的灵活度。流模型必须使用专门的体系结构来构建可逆变换。
- 扩散模型的灵感来自非平衡热力学。他们定义了一个扩散步骤的马尔可夫链,以缓慢地将随机噪声添加到数据中,然后学习反转扩散过程以从噪声中构建所需的数据样本。与 VAE 或流模型不同,扩散模型是通过固定过程学习的,并且潜在变量具有高维性(与原始数据相同)。
总结
从图中我们可以看到,GAN、VAE和基于流的模型的共同点在于期望“一步跨十个台阶”,直接实现图像的生成,而扩散模型期望“一步跨一个台阶”,这可能是扩散模型生成的图像质量比较高的原因。
Design of DDPM
如下图所示。DDPM模型主要分为两个过程:forward加噪过程(从右往左)和reverse去噪过程(从左往右)。加噪过程意思是指向数据集的真实图片中逐步加入高斯噪声,而去噪过程是指对加了噪声的图片逐步去噪,从而还原出真实图片。加噪过程满足一定的数学规律,而去噪过程则采用神经网络来学习。这么一来,神经网络就可以从一堆杂乱无章的噪声图片中生成真实图片了。
正向加噪过程
给定一个从真实数据分布中采样的数据点
x
0
∼
q
(
x
)
m{x_0} sim q(
m{x})
x0∼q(x),定义一个
T
T
T step 的正向的加噪过程,逐步向样本中添加少量高斯噪声,以产生一连串的噪声样本
x
1
,
.
.
.
,
x
T
m{x_1},...,
m{x_T}
x1,...,xT。步长的大小是由
β
t
eta_t
βt控制
β
t
∈
(
0
,
1
)
t
=
1
T
{eta_t in(0,1)}^T_{t=1}
βt∈(0,1)t=1T。
这种公式看起来比较难理解比较抽象,其实就是
x
t
=
1
−
β
t
x
t
−
1
+
β
t
ϵ
t
−
1
m{x_t}=sqrt{1-eta_t}
m{x}_{t-1}+sqrt{eta_t}epsilon_{t-1}
xt=1−βtxt−1+βtϵt−1
其中
ϵ
t
∼
N
(
0
,
I
)
epsilon_t sim N(0,I)
ϵt∼N(0,I),这样就非常容易理解了,正向的加噪过程是通过公式推导的,不涉及网络参数的学习。随着
t
t
t不断增大,采样数据
x
0
m{x_0}
x0逐渐失去可辨别的特征,当
T
T
T比较大时,
x
T
m{x_T}
xT就等同于一个高斯分布了。我们可以看到,
x
T
m{x_T}
xT只由
β
T
eta_T
βT和
x
T
−
1
m{x_{T-1}}
xT−1来确定,是一个不通过学习就可以直接得到的过程。因此,只要我们有了
x
0
m{x_0}
x0,并且提前确定每一步的固定值
β
1
eta_1
β1,…,
β
T
eta_T
βT,我们就可以推出任意一步的加噪数据
x
1
m{x_1}
x1,…,
x
T
m{x_T}
xT。这里的前向加噪过程被称为是一个马尔科夫链过程。
反向去噪过程
反向的过程是复杂的,需要逐步反向计算,即计算
q
(
x
t
−
1
∣
x
t
,
x
0
)
q(
m{x_{t-1}}|
m{x_t},
m{x_0})
q(xt−1∣xt,x0)。这里为什么不是直接计算
q
(
x
t
−
1
∣
x
t
)
q(
m{x_{t-1}}|
m{x_t})
q(xt−1∣xt),这是因为在正向加噪的过程中,我们已知的只有各种条件概率
q
(
x
t
∣
x
t
−
1
)
q(
m{x_{t}}|
m{x_{t-1}})
q(xt∣xt−1),而像
q
(
x
t
)
q(
m{x_t})
q(xt)这样的先验概率不能得到,所以需要计算
q
(
x
t
−
1
∣
x
t
,
x
0
)
q(
m{x_{t-1}}|
m{x_t},
m{x_0})
q(xt−1∣xt,x0)。这里我们可以由贝叶斯公式得出(公式真的不想手打了,直接复制粘贴):
根据正向的加噪过程,我们很容易计算贝叶斯公式中的各个成分
在这里
α
t
=
1
−
β
t
alpha_t = 1-eta_t
αt=1−βt,
α
t
‾
=
α
t
α
t
−
1
.
.
.
α
1
overline{alpha_t} = alpha_t alpha_{t-1}...alpha_1
αt=αtαt−1...α1。标准正态分布可以表示为:
所以贝叶斯公式的表示可以转化为:
将平方展开并合并同类项我们可以得到:
因为KaTeX parse error: Undefined control sequence: x at position 1: ̲x̲_t和
x
0
x_0
x0都是已知的,所以最后一项可以作为一个常数项。对比标准的正态分布展开项为:
对比两个指数形式的分布,我们就可以分别计算
σ
sigma
σ和
μ
mu
μ,而且可以发现这里的
σ
sigma
σ是一个固定值,而
μ
mu
μ可以得到:
通过正向加噪的过程可以有
x
t
x_t
xt计算
x
0
x_0
x0,所以可以得到:
而在反向去噪的过程中,
ϵ
t
epsilon_t
ϵt并不知道是什么样的,所以就可以通过神经网络来拟合了,并且可以通过与正向加噪的过程中使用的噪声计算mse损失来训练这个网络。这就是一个标准的扩散模型DDPM的过程。