什么是扩散模型
扩散模型(Diffusion Model)是一类十分先进的基于扩散思想的深度学习生成模型。生成模型除了扩散模型之外,还有出现较早的VAE(Varitational Auto-Encoder,变分自编码器)和GAN(Generative Adversarial Net, 生成对抗网络)等,他运用物理热力学中的扩散思想,主要包括前向扩散和反向扩散两个过程。
热力学扩散:一滴蓝墨水滴入一杯纯净水中,墨水不会立马让整杯水变色,而是有一个逐渐扩散的过程,直到整杯水全部变蓝,这个过程就可以叫做热力学扩散过程,而添加的那滴墨水,就可以被理解为向原始数据(纯净水)中添加的噪声,而扩散模型的反向传播过程就可以理解为将墨水的扩散过程给逆向过来,让一杯被蓝墨水染色的顺净水逐步变回无色透明的状态。
因为扩散模型的工作在于去噪,不断添加噪声是为了明白,噪声是怎么被加进去的,这样方便明白怎么去噪。
扩散概率模型-DDPM(Denoising Diffusion Probalistic Models)
DDPM作为一个生成类模型,它的目标是学习数据的分布,并能够从中生成新的数据样本。在DDPM中,这个过程分为两个阶段:前向扩散过程和反向扩散过程。
那为什么要不断地向一个图片中添加噪声然后再去噪呢?
当你向进行一个文字生成图片的模型训练的时候,需要给他一定的文字描述,然后再给他一个作画的素材(一张噪声图),模型会在自己训练的基础上,借由这张噪声图进行不断地denoise(去噪),来生成和文字描述相符的图片,如下图所示,一张噪声图经过不断地降噪过程,最终生成所期待风格的图片。
但这个过程的前提就在于需要一个非常强大的图像生成模型,这个过程是怎么去实现不断地对图片的降噪处理呢,需要了解到Denois模组是怎么对数据进行处理的,如下图所示,denoise模组内存在一个Noise Predicter组件,当一个数据被输入到Denoise模组内时,与其一起传入的还包括当前的降噪处理步骤数(如图中的999),让Denoise模组内的Noise Predicter一起接收这一数据然后生成一个与该步骤对应的纯噪声图,输入的数据减去这一噪声数据,就会得到处理后的数据,这就是Denoise的结果。
在这个过程的前提就是,Noise Predicter必须要被训练的足够成熟,能够拥有根据输入的噪声数据和步骤数据,能够输出一个噪声预测值。这意味着模型需要学会从输入的噪声图像中区分出原始数据和噪声,在前向扩散和后向扩散的训练过程中,模型在处理经过正向扩散生成的噪声图的过程中,逐步学习如何在每一步反向扩散过程中从带噪声的图片中恢复出更少噪声的图片。这个过程是通过最小化每一步的去噪误差来实现的。一旦模型的训练完成,就可以从一个完全随机的噪声图像开始,通过多个去噪步骤,生成一张逼真的图像。这意味着模型学会了训练数据的分布,并能够从纯噪声中生成符合该分布的真实图片,比如我在前向训练的过程中,所进行噪声添加的过程用的全是人脸的风格图片,那么当这个模型的训练成功以后,这个模型就学会了人脸的分布特征,在之后利用该模型进行一个随机噪声图向图片的转化过程中,就会不断向人脸特征进行靠拢。。
如图所示,要达成图上方的Denoise的效果关键在于Noise Predicter能够预测生成与输入的噪声图片以及处理步骤相对应的纯噪声图,这个生成的纯噪声图要与真实添加的噪声(Ground truth)之间的误差尽可能小。Ground truth是前向扩散过程中添加到原始图像 中的真实噪声图像。在训练Noise Predictor时,ground truth用于指导模型学习如何准确地预测噪声。
要怎么让模型能够去学习训练数据的分布,然后产出与训练数据的分布相似的输出呢?
这就是前向扩散和反向扩散的意义,首先向模型提供一个干净没有噪声的数据(图片),然后在每一步(timestep)的都向这个数据中添加噪声,之后再一步步让模型找到加噪声前的图片样子,在这个过程中,模型就学会了去噪。如此这样训练完毕,模型就拥有了能够从纯噪声中生成图片的能力。
Diffusion Process (又被称为Forward Process)、前向扩散
在这个前向传播过程中,向给定的输入(在图中是图片)中不断添加噪声,而且每一时刻添加噪声都在前一时刻的基础上再进行噪声添加(可以理解为一个不断熵增的过程),这个过程可以理解为一步一步地破坏图像,使其从一张清晰的图片变成一张完全随机的噪声图片。
在前向传播的过程中,我们记录以下变量:
•
T
T
T:指的是从初始数据到完全加噪完成所需要的步数。
•
x
0
,
x
1
,
…
,
x
T
x_0, x_1, \ldots, x_T
x0,x1,…,xT:每一步产生的图片,其中
x
0
x_0
x0为原始数据,
x
T
x_T
xT为加噪结束后初始数据被转化为纯高斯噪声。
•
ϵ
∼
N
(
0
,
I
)
\epsilon \sim \mathcal{N}(0, I)
ϵ∼N(0,I):代表从正态分布(又叫高斯分布)中抽样得到的噪声,每一步都会添加这个高斯噪声。
•
q
(
x
t
∣
x
t
−
1
)
q(x_t | x_{t-1})
q(xt∣xt−1):
x
t
x_t
xt在条件
x
=
x
t
−
1
x = x_{t-1}
x=xt−1下的概率分布。如果你觉得抽象,可以理解成已知
x
t
−
1
x_{t-1}
xt−1,求
x
t
x_t
xt。
所以在前向扩散的过程中:可以看做
x
t
=
x
t
−
1
+
ϵ
=
x
0
+
ϵ
0
+
ϵ
1
+
⋯
+
ϵ
x_t = x_{t-1} + \epsilon = x_0 + \epsilon_0 + \epsilon_1 + \cdots + \epsilon
xt=xt−1+ϵ=x0+ϵ0+ϵ1+⋯+ϵ
但在这个相加的过程中,为了得到
x
T
x_T
xT,每经过一个timestep都会添加一次噪声,为了能够简化计算,可以将这个公式进行简化,在逐步的加噪过程中,随着步骤数的增加,图片中原始信息的占比会越来越小,噪声越来越多,我们可以分别给原始图片和噪声一个权重来计算
x
t
x_t
xt:
α ˉ 1 , α ˉ 2 , … , α ˉ T [ :一系列常数,类似于超参数,随着 T 的增加越来越小。 ] \bar{\alpha}_1, \bar{\alpha}_2, \ldots, \bar{\alpha}_T \quad [:一系列常数,类似于超参数,随着 T 的增加越来越小。] αˉ1,αˉ2,…,αˉT[:一系列常数,类似于超参数,随着T的增加越来越小。]
则此时 x t x_t xt 的计算可以设计成:
x t = α ˉ t x 0 + 1 − α ˉ t ϵ x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon xt=αˉtx0+1−αˉtϵ
这个公式的表示意义在于,能够直接表示出某一步的 x t x_t xt ,利用一个逐渐缩小的系数 α ˉ t \bar{\alpha}_t αˉt来确定 x 0 x_0 x0在其中的占比,当需要知道某一步特定的 x 0 x_0 x0 时,我们只需要 sample 一次噪声,就可以直接从 x 0 x_0 x0 得到 x t x_t xt 了。但 α ˉ 1 , α ˉ 2 , … , α ˉ T \bar{\alpha}_1, \bar{\alpha}_2, \ldots, \bar{\alpha}_T αˉ1,αˉ2,…,αˉT 并不是我们直接设定的超参数,它是根据其它超参数推导而来,这个其它超参数就是:
β 1 , β 2 , … , β T \beta_1, \beta_2, \ldots, \beta_T \quad β1,β2,…,βT他们是一系列常数,是我们直接设定的超参数,随着 T 的增加越来越大
则 α \alpha α 和 β \beta β 的关系为:
α t = 1 − β t \alpha_t = 1 - \beta_t αt=1−βt
α ˉ t = α 1 α 2 ⋯ α t \bar{\alpha}_t = \alpha_1 \alpha_2 \cdots \alpha_t αˉt=α1α2⋯αt
这样从原始加噪数据到
β
t
\beta_t
βt ,再到
α
t
\alpha_t
αt 加噪,使得
q
(
x
t
∣
x
t
−
1
)
q(x_t | x_{t-1})
q(xt∣xt−1) 转换成
q
(
x
t
∣
x
0
)
q(x_t | x_0)
q(xt∣x0) 的过程,就被称为重参数化(Reparameterization)。
从公式
x
t
=
x
t
−
1
+
ϵ
=
x
0
+
ϵ
0
+
ϵ
1
+
⋯
+
ϵ
x_t = x_{t-1} + \epsilon = x_0 + \epsilon_0 + \epsilon_1 + \cdots + \epsilon
xt=xt−1+ϵ=x0+ϵ0+ϵ1+⋯+ϵ简化改进到公式
x
t
=
α
ˉ
t
x
0
+
1
−
α
ˉ
t
ϵ
x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon
xt=αˉtx0+1−αˉtϵ
数学关系推导
若不考虑占比不断消失的问题,如何由数学关系推导
x
0
x_0
x0得到
x
t
x_t
xt时刻的分布(前向扩散)
α
t
=
1
−
β
t
\alpha_t = 1 - \beta_t
αt=1−βt(
β
1
,
β
2
,
…
,
β
T
\beta_1, \beta_2, \ldots, \beta_T \quad
β1,β2,…,βT他们是一系列常数,是直接设定的超参数,随着 T 的增加越来越大)
β
t
\beta_t
βt越来越大,从而使
α
\alpha
α也就是要越来越小。
x
t
x_t
xt和
x
t
−
1
x_{t-1}
xt−1的关系为
x
t
=
α
t
x
t
−
1
+
1
−
α
t
ϵ
1
x_t = \sqrt{\alpha_t} x_{t-1} + \sqrt{1 - \alpha_t} \epsilon_1
xt=αtxt−1+1−αtϵ1
但是现在只能由后一时刻分布推导前一时刻分布得到的,但是由数学关系推导
x
0
x_0
x0得到
x
t
x_t
xt时刻的分布怎么实现?
x
t
−
1
x_{t-1}
xt−1和
x
t
−
2
x_{t-2}
xt−2的关系为
x
t
−
1
=
α
t
−
1
x
t
−
2
+
1
−
α
t
−
1
ϵ
2
x_{t-1} = \sqrt{\alpha_{t-1}} x_{t-2} + \sqrt{1 - \alpha_{t-1}} \epsilon_2
xt−1=αt−1xt−2+1−αt−1ϵ2
将上式带入
x
t
x_t
xt和
x
t
−
1
x_{t-1}
xt−1的关系式可以得到下式:
x t = α t ( α t − 1 x t − 2 + 1 − α t − 1 ϵ 2 ) + 1 − α t ϵ 1 x_t = \sqrt{\alpha_t} \left( \sqrt{\alpha_{t-1}} x_{t-2} + \sqrt{1 - \alpha_{t-1}}\epsilon_2 \right) + \sqrt{1 - \alpha_t} \epsilon_1 xt=αt(αt−1xt−2+1−αt−1ϵ2)+1−αtϵ1
x t = α t α t − 1 x t − 2 + α t ( 1 − α t − 1 ) ϵ 2 + 1 − α t ϵ 1 x_t = \sqrt{\alpha_t \alpha_{t-1}} x_{t-2} + \sqrt{\alpha_t (1 - \alpha_{t-1})} \epsilon_2 + \sqrt{1 - \alpha_t} \epsilon_1 xt=αtαt−1xt−2+αt(1−αt−1)ϵ2+1−αtϵ1
每次加入的噪声都服从高斯分布
ϵ
1
ϵ
2
,
…
∼
N
(
0
,
I
)
\epsilon_1 \epsilon_2, \ldots \sim \mathcal{N}(0, I)
ϵ1ϵ2,…∼N(0,I)
其中
1
−
α
t
ϵ
1
\sqrt{1 - \alpha_t} \epsilon_1
1−αtϵ1和
α
t
(
1
−
α
t
−
1
)
ϵ
2
\sqrt{\alpha_t (1 - \alpha_{t-1})} \epsilon_2
αt(1−αt−1)ϵ2
都服从高斯分布,分别为:
N ( 0 , 1 − α t ) \mathcal{N}(0, 1 - \alpha_t) N(0,1−αt)
N ( 0 , α t ( 1 − α t − 1 ) ) \mathcal{N}(0, \alpha_t (1 - \alpha_{t-1})) N(0,αt(1−αt−1))
他们相加后仍服从高斯分布:
N ( 0 , 1 − α t ) \mathcal{N}(0, 1 - \alpha_t) N(0,1−αt)+ N ( 0 , α t ( 1 − α t − 1 ) ) \mathcal{N}(0, \alpha_t (1 - \alpha_{t-1})) N(0,αt(1−αt−1)) ∼ N ( 0 , ( 1 − α t + α t ( 1 − α t − 1 ) ) \sim \mathcal{N}(0, (1 - \alpha_t+\alpha_t (1 - \alpha_{t-1})) ∼N(0,(1−αt+αt(1−αt−1))= N ( 0 , 1 − α t − 1 ) \mathcal{N}(0, 1 - \alpha_{t-1}) N(0,1−αt−1)
展开:
x t = α t α t − 1 x t − 2 + ( α t ( 1 − α t − 1 ) ϵ 2 + 1 − α t ϵ 1 ) x_t = \sqrt{\alpha_t \alpha_{t-1}} x_{t-2} + \left( \sqrt{\alpha_t (1 - \alpha_{t-1})} \epsilon_2 + \sqrt{1 - \alpha_t} \epsilon_1 \right) xt=αtαt−1xt−2+(αt(1−αt−1)ϵ2+1−αtϵ1)
= α t α t − 1 x t − 2 + 1 − α t α t − 1 ϵ = \sqrt{\alpha_t \alpha_{t-1}} x_{t-2} + \sqrt{1 - \alpha_t \alpha_{t-1}} \epsilon =αtαt−1xt−2+1−αtαt−1ϵ
经过递推累乘可得
x
t
=
α
t
α
t
−
1
.
.
.
α
1
x
0
+
1
−
α
t
α
t
−
1
.
.
.
α
1
ϵ
x_t= \sqrt{\alpha_t \alpha_{t-1}...\alpha_1} x_0 + \sqrt{1 - \alpha_t \alpha_{t-1}...\alpha_1} \epsilon
xt=αtαt−1...α1x0+1−αtαt−1...α1ϵ
又因为
α
ˉ
t
=
α
1
α
2
⋯
α
t
\bar{\alpha}_t = \alpha_1 \alpha_2 \cdots \alpha_t
αˉt=α1α2⋯αt可得
x
t
=
α
ˉ
t
x
0
+
1
−
α
ˉ
t
ϵ
x_t= \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon
xt=αˉtx0+1−αˉtϵ
可以直观的展现出,在前向扩散的过程中,并不是理论上的图片依次进行加噪操作最后逐步生成最后的噪声图片,而是通过公式进行计算,直接展示出某一步的图片处理结果,具体如下图所示。
前向扩散的模型训练过程(Algorithm 1 Training)为
1.repeat
2.
x
0
∼
q
(
x
0
)
x_0 \sim q(x_0)
x0∼q(x0)
3.
t
∼
Uniform
(
{
1
,
…
,
T
}
)
t \sim \text{Uniform}(\{1, \ldots, T\})
t∼Uniform({1,…,T})
4.
ϵ
∼
N
(
0
,
I
)
\epsilon \sim \mathcal{N}(0, I)
ϵ∼N(0,I)
5. Take gradient descent step on
∇
θ
∥
ϵ
−
ϵ
θ
(
α
‾
t
x
0
+
1
−
α
‾
t
ϵ
,
t
)
∥
2
\nabla_{\theta} \left\| \epsilon - \epsilon_{\theta} \left( \sqrt{\overline{\alpha}_t} x_0 + \sqrt{1 - \overline{\alpha}_t} \epsilon, t \right) \right\|^2
∇θ
ϵ−ϵθ(αtx0+1−αtϵ,t)
2
6. until converged
步骤解释
1.repeat,这是训练循环的开始,意味着以下步骤将重复执行,直到模型收敛。模型在训练过程中会不断优化参数。
2. x 0 ∼ q ( x 0 ) x_0 \sim q(x_0) x0∼q(x0),从数据分布 q ( x 0 ) \ q(x_0) q(x0)中采样获取一个初始数据 x 0 x_0 x0,例如在图像任务中,这个步骤表示 x 0 x_0 x0是数据集中获取的一张初始图片。
3. t ∼ Uniform ( { 1 , … , T } ) t \sim \text{Uniform}(\{1, \ldots, T\}) t∼Uniform({1,…,T}),从均匀分布 Uniform ( { 1 , … , T } ) \text{Uniform}(\{1, \ldots, T\}) Uniform({1,…,T})中采样一个时间步 𝑡,这个步骤随机选择扩散过程中的某个时间步 𝑡,以确保模型在整个扩散过程中的所有时间步都能得到训练。
4. ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, I) ϵ∼N(0,I),从标准正态分布 N ( 0 , I ) \mathcal{N}(0, I) N(0,I) 中采样一个噪声向量 ϵ \epsilon ϵ这个噪声在加噪的时候用于将数据 x 0 x_0 x0转化为噪声数据,以模拟扩散过程。
5.Take gradient descent step on(在以下方面采取梯度下降步骤)
∇
θ
∥
ϵ
−
ϵ
θ
(
α
‾
t
x
0
+
1
−
α
‾
t
ϵ
,
t
)
∥
2
\nabla_{\theta} \left\| \epsilon - \epsilon_{\theta} \left( \sqrt{\overline{\alpha}_t} x_0 + \sqrt{1 - \overline{\alpha}_t} \epsilon, t \right) \right\|^2
∇θ
ϵ−ϵθ(αtx0+1−αtϵ,t)
2
1)其中
α
ˉ
t
\bar{\alpha}_t
αˉt是上文提到的超参数经过
α
t
{\alpha}_t
αt以及
α
t
{\alpha}_t
αt之前的数据累乘得到的,由权值
α
ˉ
t
\sqrt{\bar{\alpha}_t}
αˉt和
1
−
α
ˉ
t
\sqrt{1 - \bar{\alpha}_t}
1−αˉt来决定
x
0
x_0
x0和
ϵ
\epsilon
ϵ在生成与噪声数据相结合的数据时,初始数据和噪声数据所占比重。经过这样计算会得到一张相比于初始图片添加了噪声数据的杂讯图。
2)之后将得到的
α
ˉ
t
x
0
+
1
−
α
ˉ
t
ϵ
\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon
αˉtx0+1−αˉtϵ
进行
ϵ
θ
(
α
‾
t
x
0
+
1
−
α
‾
t
ϵ
,
t
)
\epsilon_{\theta} \left( \sqrt{\overline{\alpha}_t} x_0 + \sqrt{1 - \overline{\alpha}_t} \epsilon, t \right)
ϵθ(αtx0+1−αtϵ,t)计算,
ϵ
θ
(
α
‾
t
x
0
+
1
−
α
‾
t
ϵ
,
t
)
\epsilon_{\theta} \left( \sqrt{\overline{\alpha}_t} x_0 + \sqrt{1 - \overline{\alpha}_t} \epsilon, t \right)
ϵθ(αtx0+1−αtϵ,t)的意义在于之前提到的Noise Predicter,它的作用就是接收一个加噪处理过的数据
α
ˉ
t
x
0
+
1
−
α
ˉ
t
ϵ
\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon
αˉtx0+1−αˉtϵ和相应的步骤
t
t
t,然后对其进行处理,得到预测的噪声值
3)最后用
∇
θ
∥
ϵ
−
ϵ
θ
(
α
‾
t
x
0
+
1
−
α
‾
t
ϵ
,
t
)
∥
2
\nabla_{\theta} \left\| \epsilon - \epsilon_{\theta} \left( \sqrt{\overline{\alpha}_t} x_0 + \sqrt{1 - \overline{\alpha}_t} \epsilon, t \right) \right\|^2
∇θ
ϵ−ϵθ(αtx0+1−αtϵ,t)
2
采取梯度下降策略,计算真实值和预测值之间的损失,并优化模型。
不断训练优化模型的目的是什么?
DDPM模型训练的目的,就是给定time_step和输入图片,结合这两者去预测图片中的噪声。在重参数的表达下,第t个时刻的输入图片可以表示为:
x t = α ˉ t x 0 + 1 − α ˉ t ϵ x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon xt=αˉtx0+1−αˉtϵ
也就是说,第t个时刻sample出的噪声 ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, I) ϵ∼N(0,I) ,就是我们的噪声真值。而我们预测出来的噪声为:
ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) \epsilon_\theta(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t) ϵθ(αˉtx0+1−αˉtϵ,t)
其中 θ \theta θ 为模型参数,表示预测出的噪声和模型相关。
那么易得loss为:
l o s s = ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) loss = \epsilon - \epsilon_\theta(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t) loss=ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)
在训练过程中需要尽可能最小化该loss。
6.until converged,重复上述步骤,直到损失函数不再显著下降,或达到预设的训练轮数。此时,模型被认为已经收敛,即其参数已优化至可以较好地恢复原始数据。
所以前向扩散的过程可以被总结为:
-
初始化数据 x 0 x_0 x0:
x 0 x_0 x0是原始数据样本,例如图像数据。这一步是扩散过程的起点。 -
定义噪声分布:
使用标准正态分布 N ( 0 , I ) \mathcal{N}(0, I) N(0,I)生成噪声 ϵ \epsilon ϵ,其中 I I I是单位矩阵。噪声是高斯噪声,其均值为0,方差为1。 -
计算中间变量 α t \alpha_t αt和 α ‾ t \overline{\alpha}_t αt:
设定时间步 t t t从1到 T T T(通常是1000个时间步)。
定义一系列衰减因子 β 1 , β 2 , … , β T \beta_1, \beta_2, \ldots, \beta_T β1,β2,…,βT通常在0和1之间。
计算 α t = 1 − β t \alpha_t = 1 - \beta_t αt=1−βt。
计算累积乘积 α ‾ t = ∏ i = 1 t α i \overline{\alpha}_t = \prod_{i=1}^t \alpha_i αt=∏i=1tαi。 -
逐步添加噪声:
在每个时间步 t t t,根据以下公式逐步添加噪声:
x t = α ‾ t x 0 + 1 − α ‾ t ϵ x_t = \sqrt{\overline{\alpha}_t} x_0 + \sqrt{1 - \overline{\alpha}_t} \epsilon xt=αtx0+1−αtϵ
其中:
- x t x_t xt是在时间步 t t t的带噪声数据。
- x 0 x_0 x0是初始数据(原始图像)。
- ϵ \epsilon ϵ是从标准正态分布中采样的噪声。
前向扩散的数学解释
在前向扩散过程中,我们从原始数据 x 0 x_0 x0出发,逐步添加噪声,直至时间步 T T T,数据几乎完全被噪声覆盖。这一过程可以看作是一个马尔可夫链过程,每一步的数据仅依赖于前一步的数据和噪声。
每个时间步的具体计算步骤如下:
-
初始时刻 t = 0 t=0 t=0: x 0 = 原始数据 x_0=\text{原始数据} x0=原始数据
-
时间步 t t t:
x t = α ‾ t x 0 + 1 − α ‾ t ϵ x_t = \sqrt{\overline{\alpha}_t} x_0 + \sqrt{1 - \overline{\alpha}_t} \epsilon xt=αtx0+1−αtϵ- α ‾ t \sqrt{\overline{\alpha}_t} αt和 1 − α ‾ t \sqrt{1 - \overline{\alpha}_t} 1−αt分别是原始数据和噪声的权重。
- ϵ \epsilon ϵ是从标准正态分布 N ( 0 , I ) \mathcal{N}(0, I) N(0,I)中采样的噪声。 -
时间步 T T T(最终步):
x T ≈ N ( 0 , I ) x_T \approx \mathcal{N}(0, I) xT≈N(0,I)- 经过 T T T个时间步后,数据几乎完全变成噪声。
前向扩散的主要作用是:
- 训练数据的生成:通过逐步添加噪声生成不同程度带噪声的数据,用于训练去噪模型(Noise Predictor)。
- 模型学习目标:在训练过程中,模型需要学会从带有不同程度噪声的图像中恢复原始数据,这一过程通过对比预测噪声和真实噪声(ground truth)实现。
- 反向扩散的基础:前向扩散过程定义了模型在训练过程中需要学习的噪声添加过程,为反向扩散过程(即从噪声生成数据的过程)提供了基础。
Denoise Process(又被称为Reverse Process)、反向扩散
反向扩散过程则是将噪声逐渐去除,恢复成原始图像。DDPM的关键在于学习如何一步一步地去噪,使得最终的输出图片看起来像是来自训练数据分布的真实图片。
在反向扩散的这个过程中,当需要处理的噪声图和其对应的时间步骤被传入Noise Predicter,Noise Predicter接收这些数据并进行预测,生成与该噪声图对应的时间步骤的纯噪声图,然后输入的噪声数据减去纯噪声图,就可以得到处理后的结果。
反向扩散的过程就是使用已经训练好的模型,从高斯噪声集中提取一个高斯噪声图,利用Noise Predicter生成对应的预测值,该预测值在乘一个常数进行线性变换,然后高斯噪声减去变换后的值,之后再加一个加权噪声量,就可以得到处理后的结果。
反向传播过程如图所示
Algorithm 2: Sampling
1.
x
T
∼
N
(
0
,
I
)
x_T \sim \mathcal{N}(0, I)
xT∼N(0,I)
2.
f
o
r
for
for
t
=
T
,
…
,
1
t = T, \ldots, 1
t=T,…,1
d
o
do
do
3.
z
∼
N
(
0
,
I
)
\mathbf{z} \sim \mathcal{N}(0, I)
z∼N(0,I)
i
f
if
if
t
>
1
t > 1
t>1,
e
l
s
e
else
else
z
=
0
\mathbf{z} = 0
z=0
4.
x
t
−
1
=
1
α
t
(
x
t
−
1
−
α
t
1
−
α
‾
t
ϵ
θ
(
x
t
,
t
)
)
+
σ
t
z
\mathbf{x}_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \frac{1 - \alpha_t}{\sqrt{1 - \overline{\alpha}_t}} \epsilon_\theta(\mathbf{x}_t, t) \right) + \sigma_t \mathbf{z}
xt−1=αt1(xt−1−αt1−αtϵθ(xt,t))+σtz
5.
e
n
d
end
end
f
o
r
for
for
6.
r
e
t
u
r
n
return
return
x
0
\mathbf{x}_0
x0
Sampling过程
- 初始化
- 步骤 1: 从标准正态分布中采样
x
T
∼
N
(
0
,
I
)
x_T \sim \mathcal{N}(0, I)
xT∼N(0,I)。
- 这意味着 x T x_T xT是一个维度为 T T T的向量,其每个元素都从均值为0、方差为1的正态分布中采样。
- 步骤 1: 从标准正态分布中采样
x
T
∼
N
(
0
,
I
)
x_T \sim \mathcal{N}(0, I)
xT∼N(0,I)。
- 迭代过程
- 步骤 2: 从
t
=
T
t=T
t=T到
t
=
1
t=1
t=1进行循环。
- 这是一个从高时间步到低时间步的迭代过程,每次迭代都会更新 x t \mathbf{x}_t xt以减少噪声。
- 步骤 3: 如果
t
>
1
t > 1
t>1,从标准正态分布中采样噪声
z
∼
N
(
0
,
I
)
\mathbf{z} \sim \mathcal{N}(0, I)
z∼N(0,I);否则
z
=
0
\mathbf{z} = 0
z=0。
- 当 t = 1 t = 1 t=1时,不再引入额外噪声。
- 步骤 4: 更新
x
t
−
1
\mathbf{x}_{t-1}
xt−1:
x t − 1 = 1 α t ( x t − 1 − α t 1 − α ‾ t ϵ θ ( x t , t ) ) + σ t z \mathbf{x}_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \frac{1 - \alpha_t}{\sqrt{1 - \overline{\alpha}_t}} \epsilon_\theta(\mathbf{x}_t, t) \right) + \sigma_t \mathbf{z} xt−1=αt1(xt−1−αt1−αtϵθ(xt,t))+σtz
* α t \alpha_t αt和 α ‾ t \overline{\alpha}_t αt是预定义的时间步参数。
* ϵ θ ( x t , t ) \epsilon_\theta(\mathbf{x}_t, t) ϵθ(xt,t)是模型(Noise Predicter)在时间步 t t t上预测出的噪声。
* σ t \sigma_t σt是时间步 t t t对应的噪声系数。
- 步骤 2: 从
t
=
T
t=T
t=T到
t
=
1
t=1
t=1进行循环。
- 返回结果
- 步骤 6: 最终返回 x 0 \mathbf{x}_0 x0,这是去噪后的最终样本。
当DDPM训练好之后,我们要怎么用它,怎么评估它的效果呢?
对于训练好的模型,我们从最后一个时刻(T)开始,传入一个纯噪声(或者是一张加了噪声的图片),逐步去噪。根据
x
t
=
α
ˉ
t
x
0
+
1
−
α
ˉ
t
ϵ
x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon
xt=αˉtx0+1−αˉtϵ
我们可以进一步推导出
x
t
x_t
xt和
x
t
−
1
x_{t-1}
xt−1的关系。而
σ
t
z
\sigma_t z
σtz一项,则不是直接推导而来的,是我们为了增加推理中的随机性,而额外添加的一项。这样操作可以增加预测的多样性,不是选择概率最大的那个token,而是在top N中用方法进行随机选择。
当模型训练好以后,是怎么从一个噪声图生成一个图片的
这张图片清晰展示了扩散概率模型(Diffusion Probabilistic Models,DDPM)是如何将一个高噪声图像逐步去噪,最终形成一个清晰图像的过程。
以下是他的数学原理推导
P
θ
(
x
)
P_{\theta}(x)
Pθ(x):模型所产生的图片的(概率)分布。其中
θ
\theta
θ表示模型参数,以
θ
\theta
θ作为下标的目的是表示这个分布是由模型决定的,
P
d
a
t
a
(
x
)
P_{data}(x)
Pdata(x):训练数据(也可理解为真实世界)图片的(概率)分布。下标data表示这是一个自然世界客观存在的分布,与模型无关。
DDPM的目标在于让预测生成的数据尽可能符合真实数据的分布,要比较这两个分布之间的差距到底有多大,就需要用到KL散度进行计算。
KL散度的定义为:
假设有分布p和分布q,则这两个分布之间的KL散度为。
D
K
L
(
p
∥
q
)
=
∑
i
=
1
m
p
(
x
i
)
log
p
(
x
i
)
q
(
x
i
)
(
原始定义
)
D_{KL}(p \| q) = \sum_{i=1}^{m} p(x_i) \log \frac{p(x_i)}{q(x_i)} \quad (\text{原始定义})
DKL(p∥q)=∑i=1mp(xi)logq(xi)p(xi)(原始定义)
= − ∑ i = 1 m p ( x i ) log q ( x i ) p ( x i ) ( 稀作变式 ) = -\sum_{i=1}^{m} p(x_i) \log \frac{q(x_i)}{p(x_i)} \quad (\text{稀作变式}) =−∑i=1mp(xi)logp(xi)q(xi)(稀作变式)
= − ∫ x p ( x ) log q ( x ) p ( x ) d x ( m → ∞ ) = -\int_x p(x) \log \frac{q(x)}{p(x)} \, dx \quad (m \to \infty) =−∫xp(x)logp(x)q(x)dx(m→∞)