0 前言
DDPM
即我们所说的扩散模型,它的完整名称应该是扩散概率模型,其实在2015年就已经提出扩散模型了,只不过那时候效果比较拉,并没有受到什么关注,直到2020年Ho等人提出了DDPM
,该领域才得到的飞速的发展,后续又提出了众多的扩散模型,如DDIM
、Score-based
、Improved Diffusion
、Classifier Guidance
、Classifier Free Guidance
、Latent Diffusion
、Stable Diffusion
等。下面给出本次所讲述内容的论文的地址和代码仓库链接:
1 概览
扩散模型的训练可分为两部分
- 前向扩散过程:向图像添加噪声。
- 反向扩散过程:从图像中去除噪声。
2 前向处理过程
正向扩散通过逐步向输入图像
x
0
x_0
x0添加高斯噪声,总共有
T
T
T步。该过程将生成一系列噪声图像样本
x
1
,
…
x
T
x_1,…x_T
x1,…xT。在
T
T
T步时,结果图像将是完全含噪的,就像从各向同性高斯分布中采样一样。我们可以使用闭式公式在指定的时间步长
t
t
t直接对噪声图像进行采样,而不是创建一个算法来反复向图像中添加噪声。
2.1 闭式加噪公式
- 补充知识
重参数化技巧(后面推导 x t x_t xt的公式会用到):
如果: z ∼ N ( μ , σ 2 ) z \sim \mathcal{N}\left(\mu, \sigma^2\right) z∼N(μ,σ2) 可以参数化为(实际上就是从这个概率分布中采样一个值出来):
z = μ + σ ε , ε ∼ N ( 0 , 1 ) z=\mu+\sigma \varepsilon \quad , \quad \varepsilon \sim \mathcal{N}(0,1) z=μ+σε,ε∼N(0,1)
设当前时刻图像为
x
t
x_t
xt,噪声为
ε
t
\varepsilon_t
εt,则加噪的图像
x
t
x_t
xt表示如下:
x
t
=
1
−
β
t
x
t
−
1
+
β
t
ε
t
−
1
x_t=\sqrt{1-\beta_t} x_{t-1}+\sqrt{\beta_t} \varepsilon_{t-1}
xt=1−βtxt−1+βtεt−1
然后我们可以递归展开它得到封闭形式的公式:
所有的
ε
\varepsilon
ε都是
i
.
i
.
d
i.i.d
i.i.d(独立同分布)标准正态随机变量。使用不同的符号和下标来区分它们是非常重要的,因为它们是独立的,而且采样后它们的值可能会不同。上面的公式你看了可能会有疑惑,第四行使在呢么直接变成第五行的表示的,即下面这个式子:
下面我们来详细的解释下这个式子:
我们用
X
X
X和
Y
Y
Y表示这两项。它们可以被认为是来自两个不同正态分布的样本。即
X
∼
N
(
0
,
α
t
(
1
−
α
t
−
1
)
I
)
X \sim N(0,\alpha_t(1-\alpha_{t-1})I)
X∼N(0,αt(1−αt−1)I)和
Y
∼
N
(
0
,
(
1
−
α
t
)
I
)
Y \sim N(0,(1-\alpha_t)I)
Y∼N(0,(1−αt)I)。回想一下,两个正态分布(独立)的随机变量的和也是正态分布的。即如果
Z
=
X
+
Y
Z = X + Y
Z=X+Y,则
Z
∼
N
(
0
,
σ
x
2
+
σ
y
2
)
Z \sim N(0,\sigma_x^{2}+\sigma_y^{2})
Z∼N(0,σx2+σy2)。因此,我们可以合并它们,并以重新参数化的形式表示合并后的正态分布。这就是我们结合这两项的方式。重复这些步骤将得到以下公式,该公式仅取决于输入图像
x
0
x_0
x0:
x
t
=
α
t
ˉ
x
0
+
1
−
α
t
ˉ
ϵ
x_t = \sqrt{\bar{\alpha_t}}x_0+\sqrt{1-\bar{\alpha_t}}\epsilon
xt=αtˉx0+1−αtˉϵ
现在我们可以使用这个公式在任意时间步进直接采样
x
0
x_0
x0,这使得前向过程快得多。从上面的推导可以看出,第四行到第五行核心就是利用了标准正态分布的性质以及重参数化技术。
2.2 反向扩散过程(采样):
注意,注意,注意:这里为什么叫做采样(Sampling),一定要注意这一点,我们再反向推理的时候并不是去预测一个确定的
x
t
−
1
x_{t-1}
xt−1(这也是DDPM可以实现生成多样性的原因),而是通过给定的
x
t
x_t
xt去预测条件概率分布
p
(
x
t
−
1
∣
x
t
)
p(x_{t-1}|x_t)
p(xt−1∣xt),然后从这个预测的概率分布中采样一个
x
t
−
1
x_{t-1}
xt−1。
与正向过程不同,我们不能使用
q
(
x
t
−
1
∣
x
t
)
q(x_{t-1}|x_t)
q(xt−1∣xt)来去除噪声,因为它是难以处理的(不可计算的)。因此,我们需要训练一个神经网络
p
θ
(
x
t
−
1
∣
x
t
)
p_\theta(x_{t-1}|x_t)
pθ(xt−1∣xt)以近似
q
(
x
t
−
1
∣
x
t
)
q(x_{t-1}|x_{t})
q(xt−1∣xt)。近似
p
θ
(
x
t
−
1
∣
x
t
)
p_\theta(x_{t-1}|x_t)
pθ(xt−1∣xt)服从正态分布,其均值和方差设置如下:
{
μ
θ
(
x
t
,
t
)
:
=
μ
~
t
(
x
t
,
x
0
)
Σ
θ
(
x
t
,
t
)
:
=
β
~
t
I
\begin{cases}\mu_\theta\left(x_t, t\right) & :=\tilde{\mu}_t\left(x_t, x_0\right) \\ \Sigma_\theta\left(x_t, t\right) & :=\tilde{\beta}_t I\end{cases}
{μθ(xt,t)Σθ(xt,t):=μ~t(xt,x0):=β~tI
损失函数:我们可以将损失定义为负对数似然:
Loss
=
−
log
(
p
θ
(
x
0
)
)
Depends on
x
1
,
x
2
,
…
,
x
T
\text { Loss }=-\log \left(p_\theta\left(x_0\right)\right) \quad \text { Depends on } x_1, x_2, \ldots, x_T
Loss =−log(pθ(x0)) Depends on x1,x2,…,xT
这种设置与VAE中的设置非常相似。我们可以优化变分下界,而不是优化难以处理的损失函数本身。
通过优化一个可计算的下界,我们可以间接地优化棘手的损失函数。
通过扩展变分下界,我们发现它可以表示为以下三项: L T , L t − 1 , L 0 L_T,L_{t-1},L_0 LT,Lt−1,L0
-
L T L_T LT常数项
由于 q q q没有可学习的参数,而 p p p只是高斯噪声概率,因此该项在训练期间将是一个常数,因此可以忽略。 -
L t − 1 L_ {t-1} Lt−1逐步去噪项
这一项比较了目标去噪步长 q q q和近似去噪步长 p θ p_\theta pθ。
通过对 x 0 x_0 x0进行条件化,使 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t, x_0) q(xt−1∣xt,x0)变得可处理。
经过一系列推导, q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt−1∣xt,x0)的平均 μ ~ t \tilde{μ}_t μ~t如上图公式所示。
为了近似目标去噪步骤 q q q,我们只需要使用神经网络近似其均值。因此,我们将近似均值 μ θ μ_\theta μθ设置为与目标均值 μ ~ t \tilde{μ}_t μ~t相同的形式(通过可学习的神经网络 ε θ \varepsilon_\theta εθ):
使用均方误差(mean squared error, MSE)可以比较目标均值和近似均值:
实验结果表明,忽略加权项,简单地将目标噪声和预测噪声与MSE进行比较,可以取得较好的效果。因此,事实证明,为了近似所需的去噪步骤 q q q,我们只需要使用神经网络 ε θ \varepsilon_\theta εθ近似噪声 ε t \varepsilon_t εt。 -
L 0 L_0 L0 重建项
这是上一个去噪步骤的重建损失,在训练期间可以忽略它,原因如下:它可以使用 L t − 1 L_{t-1} Lt−1中的相同神经网络进行近似。忽略它可以使样本质量更好,并使其更容易实现。
2.3 简化的损失
所以最终的简化训练目标如下:
我们发现,在真实变分界上训练我们的模型比在简化目标上训练产生更好的码长,正如预期的那样,但后者产生最好的样本质量。
3 网络结构
3.1 数据集
在每个epoch中:
- 将为每个训练样本(图像)选择一个随机时间步长 t t t
- 对每个图像应用高斯噪声(对应于 t t t)
- 将时间步长转换为嵌入(向量)
3.2 训练
官方的训练算法如上所示,下图展示了训练步骤的工作原理:
3.3 采样过程
我们可以使用上述算法从噪声中生成图像。下面的图表是一个说明:
注意:在最后一步中,我们只是输出学习到的平均值
μ
θ
(
x
1
,
1
)
\mu_\theta(x_1,1)
μθ(x1,1),而不向其添加噪声。
- 总结
- 扩散模型分为正向扩散和反向扩散两部分
- 正向扩散可以用闭式公式来实现
- 反向扩散可以使用训练好的神经网络来完成
- 为了近似所需的去噪步骤 q q q,我们只需要使用神经网络 ε θ \varepsilon_\theta εθ近似噪声 ε t \varepsilon_t εt。
- 在简化的损失函数上进行训练,可以产生更好的样本质量。
以上就是对DDPM的分析介绍,欢迎各位大佬批评指正