本文基本不设语言门槛,只讲大白话,力求让读者快速理解DDIM(Denoising Diffusion Implicit Model)模型。
本文适合谁来学
本文会讲解DDIM的实现思路,但是会基于DDPM的知识来讲。如果你还不了解DDPM,请先自行学习,或阅读博主此前的文章《大白话 | 从生成模型快速理解【扩散模型】Diffusion Model》。
本文适合哪些读者:
- 如果你已经了解DDPM的数学推理原理(马尔可夫链、前向加噪反向去噪过程),但是完全不了解DDIM模型,那本文很适合你。
- 如果你简单了解过DDIM模型,但是有包括但不限于以下几个问题:
- 为什么DDPM模型不可以跳步?
- DDIM的跳步在数学上是怎么推理得到的?
- 为什么说DDIM是确定性的?
- 既然说DDIM是确定性的,为什么跳10步生成和100步的结果清晰度不同?
本文不合适哪些读者:
- 希望学习到DDIM模型每一步详细的数学推理过程(本文有数学推理过程,但是部分会省略)。
- 希望结合代码来学习DDIM模型的模型结构。
- 完全不了解扩散模型或者DDPM,或者完全不具备深度学习、概率统计相关知识。
本文参考:
【串讲系列】讲人话-Stable Diffusion全解(原理+代码+公式)之 DDIM + SDXL Turbo
一文带你看懂DDPM和DDIM(含原理简易推导,pytorch代码)
文章目录
DDIM模型和DDPM模型的最大区别,在于前者可以跳步,后者不可以,导致后者的生成速度较慢。那为什么DDPM要采样很多步,并且还不能跳步呢?
DDPM采样很多步的原因
当设置总步数T为1000的时候,DDPM要老老实实的从纯高斯噪声 x T x_T xT,通过采样+降噪1000次得到我们想要的图片。那么为什么DDPM要采样1000步呢?(当然1001步、2000步、1w步也都可以,但是必须采样很多步)
原因其一:为了保证反向过程为高斯分布
这里首先需要知道一个结论:对于一个连续的扩散过程,它的前向扩散和后向扩散过程,在 β \beta β的变化速率比较小的时候,具有完全相同的函数形式。
这里的
β
\beta
β就是我们在加噪的时候,使用的那个
β
t
\beta_t
βt。在这个公式中出现的:
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−βt∗xt−1+βt∗εt−1
就是说,当
β
\beta
β变化速率比较小的时候,如果正向过程的分布
q
(
x
t
∣
x
t
−
1
)
q(x_t|x_{t-1})
q(xt∣xt−1)是一个高斯分布,那么反向过程的分布
q
(
x
t
−
1
∣
x
t
)
q(x_{t-1}|x_t)
q(xt−1∣xt)和正向过程的分布一样,也是一个高斯分布。
我们知道,DDPM中的 β t \beta_t βt会存在变化,在加噪过程中会有一个从0到1的变化。那么如果总步数设置的很少,比如T=10,那么相当于 β t \beta_t βt平均每一次都要变化0.1,那就不满足“当 β \beta β变化速率比较小”这个条件了,反向过程就无法满足高斯分布。所以需要T很大,比如T=1000,而且一次一步, β t \beta_t βt平均每一次都要变化0.001,才可以保证反向过程近似为高斯分布。
当然这其实是一个近似的过程。稍微展开来说就是,根据正向和反向过程的随机微分方程(SDE), β \beta β根据 t t t的导数足够小的时候,可以近似认为 β \beta β是一个常数,这样反向过程SDE中的有一项分数函数的系数 β d t \beta dt βdt可以近似认为是0,此时正向和反向的SDE方程就会具有完全相同的数学结构,那它们的值的分布肯定就是相同的了。
虽然说 β \beta β根据 t t t的导数越小就也可以近似为0,当然即使T=1000,那一项也不是完全为0的,也就是说其实反向过程并不是100%完全的高斯分布,但是这个近似已经足够我们使用了。所以,其实T=10的时候也勉强能近似为高斯分布,但是还不太够用。这一点其实能解答DDIM为什么步数越多越清晰的问题,我们后面会详细讲。
原因其二:DDPM的Loss简化
对于DDPM的Loss,我们在讲DDPM的时候提到过,Loss里的一些项其实是省略掉的,这其中有一项Loss是:
−
l
o
g
p
θ
(
x
0
∣
x
1
)
-log \ p_\theta(x_0|x_1)
−log pθ(x0∣x1)
那这一项Loss什么时候可以省略呢?我们知道Loss肯定是要最小的,也就是原式的相反数
l
o
g
p
θ
(
x
0
∣
x
1
)
log \ p_\theta(x_0|x_1)
log pθ(x0∣x1)要尽可能大,也就是
p
θ
(
x
0
∣
x
1
)
p_\theta(x_0|x_1)
pθ(x0∣x1)要尽可能的大,那么条件概率“当
x
1
x_1
x1发生的时候,
x
0
x_0
x0发生的概率”什么时候最大呢?那肯定是
x
1
x_1
x1等于
x
0
x_0
x0的时候最大,并且是
x
0
x_0
x0和
x
1
x_1
x1越接近,这个概率就越大。
于是,当T比较大的时候, x 0 x_0 x0和 x 1 x_1 x1比较接近,这一项Loss就可以省略掉。但是当T比较小的时候,这一项Loss就不能省略了,如果我们还用它省略的形式,去让 ε t \varepsilon_t εt和 ε p r e d \varepsilon_{pred} εpred尽可能接近,就已经不能让此时真正的Loss变小了。所以DDPM需要很多步降噪来省略掉这一项。
DDPM采样不能跳步的原因
DDPM不仅要采样很多步,而且还不能跳步,这是为什么呢?
直接原因:破坏了反向降噪公式
回顾DDPM,在反向降噪过程中,我们用贝叶斯公式,去展开了
q
(
x
t
−
1
∣
x
t
,
x
0
)
q (x_{t-1} | x_{t},x_0)
q(xt−1∣xt,x0),得到了这一项高斯分布的参数
μ
\mu
μ和
σ
\sigma
σ。那如果现在要跳s步,也就是
q
(
x
t
−
s
∣
x
t
,
x
0
)
q (x_{t-s} | x_{t},x_0)
q(xt−s∣xt,x0),我们看看怎么展开:
q
(
x
t
−
s
∣
x
t
,
x
0
)
=
q
(
x
t
∣
x
t
−
s
,
x
0
)
q
(
x
t
−
s
∣
x
0
)
q
(
x
t
∣
x
0
)
q (x_{t-s} | x_{t},x_0) = \frac{q(x_t|x_{t-s}, x_0)q(x_{t-s}|x_0)}{q(x_t|x_0)}
q(xt−s∣xt,x0)=q(xt∣x0)q(xt∣xt−s,x0)q(xt−s∣x0)
这里
q
(
x
t
−
s
∣
x
0
)
q(x_{t-s}|x_0)
q(xt−s∣x0)和
q
(
x
t
∣
x
0
)
q(x_t|x_0)
q(xt∣x0)我们在DDPM中都已经学会了怎么展开,但是
q
(
x
t
∣
x
t
−
s
,
x
0
)
q(x_t|x_{t-s}, x_0)
q(xt∣xt−s,x0)这一项要怎么做呢?对于
s
=
1
s=1
s=1的情况,
q
(
x
t
∣
x
t
−
1
,
x
0
)
q(x_t|x_{t-1}, x_0)
q(xt∣xt−1,x0),因为我们知道DDPM的扩散过程中,所以每一项都只和它的前一项有关(想一下那个递推公式
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−βt∗xt−1+βt∗εt−1),和其他项都是无关的,所以可以省略
x
0
x_0
x0,即:
q
(
x
t
∣
x
t
−
1
,
x
0
)
=
q
(
x
t
∣
x
t
−
1
)
q(x_t|x_{t-1}, x_0) = q(x_t|x_{t-1})
q(xt∣xt−1,x0)=q(xt∣xt−1)
那
q
(
x
t
∣
x
t
−
1
)
q(x_t|x_{t-1})
q(xt∣xt−1)根据重参数采样就可以写出来它符合的高斯分布的参数
μ
\mu
μ和
σ
\sigma
σ了。
但是对于 q ( x t ∣ x t − s , x 0 ) q(x_t|x_{t-s}, x_0) q(xt∣xt−s,x0),这一项还可以省略 x 0 x_0 x0吗?当然是不可以了。
根本原因:DDPM是基于马尔可夫链的建模
其实 q ( x t ∣ x t − s , x 0 ) q(x_t|x_{t-s}, x_0) q(xt∣xt−s,x0)无法展开的根本原因,就是在于DDPM是一个基于马尔可夫链的建模。什么是马尔可夫链?简单复习一下:
若随机过程满足 p ( x t ∣ x t − 1 , x t − 2 , . . . , x 0 ) = p ( x t ∣ x t − 1 ) p(x_t∣x_{t−1},x_{t−2},...,x_0)=p(x_t∣x_{t−1}) p(xt∣xt−1,xt−2,...,x0)=p(xt∣xt−1),则称其具有马尔可夫性,即未来状态仅依赖于当前状态。
也就是未来状态仅依赖当前状态,整个状态推导每一步都是连续的,不可以省略中间的步骤。那么其实就只能得到 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xt∣xt−1),至于 q ( x t ∣ x t − s ) q(x_t|x_{t-s}) q(xt∣xt−s)呢,需要从 q ( x t − s + 1 ∣ x t − s ) q(x_{t-s+1}|x_{t-s}) q(xt−s+1∣xt−s)、 q ( x t − s + 2 ∣ x t − s + 1 ) q(x_{t-s+2}|x_{t-s+1}) q(xt−s+2∣xt−s+1) ⋯ \cdots ⋯一步步推导,不会存在 q ( x t ∣ x t − s ) q(x_t|x_{t-s}) q(xt∣xt−s)的直接公式,也就无法跳步了。
那我们知道了对于DDPM,由于不知道 q ( x t ∣ x t − s , x 0 ) q(x_t|x_{t-s}, x_0) q(xt∣xt−s,x0),所以是无法求得 q ( x t − s ∣ x t , x 0 ) q(x_{t-s}|x_t, x_0) q(xt−s∣xt,x0)。那有没有一种方法,可以绕开马尔可夫链的设定,来给出符合 q ( x t − s ∣ x t , x 0 ) q(x_{t-s}|x_t, x_0) q(xt−s∣xt,x0)高斯分布的 μ \mu μ和 σ \sigma σ参数呢?
DDIM
下面我们正式进入DDIM的讲解。
有没有可能绕开马尔可夫链
因为马尔可夫链需要的是前一项和后一项的关系,那我们来观察DDPM中,是否存在并不是前一项和后一项的关系的式子呢?其实是存在的,也就是
q
(
x
t
∣
x
0
)
q(x_t|x_0)
q(xt∣x0):
q
(
x
t
∣
x
0
)
=
N
(
x
t
;
α
t
‾
⋅
x
0
,
(
1
−
α
t
‾
)
I
)
q(x_t|x_0)=N(x_t;\sqrt{\overline{\alpha _{t}}} \cdot x_0, (1-\overline{\alpha _{t}})I)
q(xt∣x0)=N(xt;αt⋅x0,(1−αt)I)
没错,我们在DDPM中,利用
x
t
x_t
xt和
x
t
−
1
x_{t-1}
xt−1的关系,逐步推导过直接得到
x
t
x_t
xt和
x
0
x_0
x0关系的式子。所以有没有一种可能,我们可以直接利用
q
(
x
t
∣
x
0
)
q(x_t|x_0)
q(xt∣x0),来推导反向降噪过程,而不使用递推式,从而绕过马尔可夫链呢?
有没有一种可能,利用马尔可夫链来推导 q ( x t − 1 ∣ x t , x 0 ) q (x_{t-1} | x_{t},x_0) q(xt−1∣xt,x0)的高斯分布的 μ \mu μ和 σ \sigma σ参数仅仅是当 s = 1 s=1 s=1时的特殊方法,而更宽泛的** q ( x t − s ∣ x t , x 0 ) q(x_{t-s}|x_t, x_0) q(xt−s∣xt,x0)还有其他可以通过 x 0 x_0 x0来表示的方式**呢?
有没有一种可能,马尔可夫链,其实可有可无?
重新定义反向降噪
现在的目标很明确了,想求
q
(
x
t
−
s
∣
x
t
,
x
0
)
q(x_{t-s}|x_t, x_0)
q(xt−s∣xt,x0)。已知的有
q
(
x
t
∣
x
0
)
q(x_t|x_0)
q(xt∣x0)和
q
(
x
t
−
s
∣
x
0
)
q(x_{t-s}|x_0)
q(xt−s∣x0):
q
(
x
t
∣
x
0
)
=
N
(
x
t
;
α
t
⋅
x
0
,
(
1
−
α
t
)
I
)
q
(
x
t
−
s
∣
x
0
)
=
N
(
x
t
−
s
;
α
t
−
s
⋅
x
0
,
(
1
−
α
t
−
s
)
I
)
q(x_t|x_0)=N(x_t;\sqrt{\alpha _{t}} \cdot x_0, (1-{\alpha _{t}})I)\\ q(x_{t-s}|x_0)=N(x_{t-s};\sqrt{\alpha _{t-s}} \cdot x_0, (1-{\alpha _{t-s}})I)
q(xt∣x0)=N(xt;αt⋅x0,(1−αt)I)q(xt−s∣x0)=N(xt−s;αt−s⋅x0,(1−αt−s)I)
这里把
α
\alpha
α上面的横线统一省略了,我们将
α
\alpha
α统一看成一个参数。然后我们把它们都写成重参数采样的形式,并且命名为
(
1
)
(1)
(1)式和
(
2
)
(2)
(2)式:
x
t
=
α
t
∗
x
0
+
(
1
−
α
t
)
∗
ε
⋯
⋯
(
1
)
x
t
−
s
=
α
t
−
s
∗
x
0
+
(
1
−
α
t
−
s
)
∗
ε
⋯
⋯
(
2
)
x_t = \sqrt{\alpha_t} * x_0 + \sqrt{(1-\alpha_t)} * \varepsilon \cdots \cdots (1) \\ x_{t-s} = \sqrt{\alpha_{t-s}} * x_0 + \sqrt{(1-\alpha_{t-s})} * \varepsilon\cdots\cdots (2)
xt=αt∗x0+(1−αt)∗ε⋯⋯(1)xt−s=αt−s∗x0+(1−αt−s)∗ε⋯⋯(2)
重参数采样: 假设 ε \varepsilon ε是标准高斯分布,即 ε ∼ N ( 0 , 1 ) \varepsilon \sim N(0,1) ε∼N(0,1),那么如果有 y = σ ∗ ε + μ y=\sigma * \varepsilon + \mu y=σ∗ε+μ,则 y ∼ N ( μ , σ 2 ) y \sim N(\mu,\sigma^2) y∼N(μ,σ2)。
我们先大胆假设
q
(
x
t
−
s
∣
x
t
,
x
0
)
q(x_{t-s}|x_t, x_0)
q(xt−s∣xt,x0)也是一个高斯分布,并且设出它的
μ
(
x
t
,
x
0
)
=
m
∗
x
t
+
k
∗
x
0
\mu(x_t,x_0) = m*x_t+k*x_0
μ(xt,x0)=m∗xt+k∗x0和
σ
t
\sigma_t
σt,其中
μ
(
x
t
,
x
0
)
\mu(x_t,x_0)
μ(xt,x0)是一个关于
x
t
x_t
xt和
x
0
x_0
x0的线性函数,
σ
t
\sigma_t
σt是一个和
x
x
x无关的参数,即:
q
(
x
t
−
s
∣
x
t
,
x
0
)
=
N
(
μ
(
x
t
,
x
0
)
,
σ
t
2
I
)
q(x_{t-s}|x_t, x_0)=N(\mu(x_t,x_0),\sigma_t^2I)
q(xt−s∣xt,x0)=N(μ(xt,x0),σt2I)
然后也写出它的重参数采样的形式,并且将
μ
(
x
t
,
x
0
)
=
m
∗
x
t
+
k
∗
x
0
\mu(x_t,x_0) = m*x_t+k*x_0
μ(xt,x0)=m∗xt+k∗x0带入,命名为
(
3
)
(3)
(3)式:
x
t
−
s
=
m
∗
x
t
+
k
∗
x
0
+
σ
t
∗
ε
⋯
⋯
(
3
)
x_{t-s}=m*x_t+k*x_0+\sigma_t * \varepsilon \cdots \cdots (3)
xt−s=m∗xt+k∗x0+σt∗ε⋯⋯(3)
我们现在的目标就是将式子
(
3
)
(3)
(3)凑成
(
1
)
(1)
(1)或者
(
2
)
(2)
(2)的形式,并且求得
k
k
k、
m
m
m两个参数,这样就可以验证我们的猜测,
q
(
x
t
−
s
∣
x
t
,
x
0
)
q(x_{t-s}|x_t, x_0)
q(xt−s∣xt,x0)是一个
μ
\mu
μ是关于
x
t
x_t
xt和
x
0
x_0
x0的线性函数的高斯分布了。
怎么凑呢?我们看到
(
3
)
(3)
(3)左侧的部分和
(
2
)
(2)
(2)一致都是
x
t
−
s
x_{t-s}
xt−s,于是我们让他们的右侧也尽量一致,我们看到
(
2
)
(2)
(2)的右侧没有
x
t
x_t
xt,于是我们将
(
1
)
(1)
(1)带入
(
3
)
(3)
(3)消去
x
t
x_t
xt:
x
t
−
s
=
m
∗
(
α
t
∗
x
0
+
(
1
−
α
t
)
∗
ε
)
+
k
∗
x
0
+
σ
t
∗
ε
x_{t-s}=m*(\sqrt{\alpha_t} * x_0 + \sqrt{(1-\alpha_t)} * \varepsilon)+k*x_0+\sigma_t * \varepsilon
xt−s=m∗(αt∗x0+(1−αt)∗ε)+k∗x0+σt∗ε
按照
(
2
)
(2)
(2)的形式,整理成
x
0
x_0
x0和
ε
\varepsilon
ε的形式:
x
t
−
s
=
(
m
∗
α
t
+
k
)
∗
x
0
+
m
∗
(
1
−
α
t
)
∗
ε
+
σ
t
∗
ε
x_{t-s} = (m*\sqrt{\alpha_t} + k)* x_0 + m*\sqrt{(1-\alpha_t)} * \varepsilon + \sigma_t * \varepsilon
xt−s=(m∗αt+k)∗x0+m∗(1−αt)∗ε+σt∗ε
注意后面这两个
ε
\varepsilon
ε项是不可以直接合并的,因为这两个
ε
\varepsilon
ε都是标准高斯的随机变量,它们是独立的。但是我们可以算出来它们合并之后的分布的均值和方差。我们假设他们合并之后的分布为
ε
′
\varepsilon'
ε′,那这个新的分布的均值应该是原来两个分布的均值之和,方差也是原来两个分布的方差之和,也就是:
x
t
−
s
=
(
m
∗
α
t
+
k
)
∗
x
0
+
ε
′
ε
′
∼
N
(
0
,
m
2
∗
(
1
−
α
t
)
+
σ
t
2
)
x_{t-s} = (m*\sqrt{\alpha_t} + k)* x_0 + \varepsilon' \\ \varepsilon' \sim N (0, m^2 * (1-\alpha_t) + \sigma_t^2)
xt−s=(m∗αt+k)∗x0+ε′ε′∼N(0,m2∗(1−αt)+σt2)
那我们把
(
2
)
(2)
(2)式也整理成这个形式:
x
t
−
s
=
α
t
−
s
∗
x
0
+
ε
′
′
ε
′
′
∼
N
(
0
,
1
−
α
t
−
s
)
x_{t-s} = \sqrt{\alpha_{t-s}} * x_0 + \varepsilon'' \\ \varepsilon'' \sim N (0, 1-\alpha_{t-s})
xt−s=αt−s∗x0+ε′′ε′′∼N(0,1−αt−s)
这样我们对比这两组式子,让二者
x
0
x_0
x0前面的系数相同,同时高斯分布的均值和方向也相同,就可以得到两个等式:
m
∗
α
t
+
k
=
α
t
−
s
m
2
∗
(
1
−
α
t
)
+
σ
t
2
=
1
−
α
t
−
s
m*\sqrt{\alpha_t} + k = \sqrt{\alpha_{t-s}} \\ m^2 * (1-\alpha_t) + \sigma_t^2 = {1-\alpha_{t-s}}
m∗αt+k=αt−sm2∗(1−αt)+σt2=1−αt−s
我们联立就可以解得:
m
=
1
−
α
t
−
s
−
σ
2
1
−
α
t
k
=
α
t
−
s
−
1
−
α
t
−
s
−
σ
2
1
−
α
t
α
t
m = \frac{\sqrt{1-\alpha_{t-s}-\sigma^2}}{\sqrt{1-\alpha_t}}\\ k = \sqrt{\alpha_{t-s}} - \frac{\sqrt{1-\alpha_{t-s}-\sigma^2}}{\sqrt{1-\alpha_t}} \sqrt{\alpha_{t}}
m=1−αt1−αt−s−σ2k=αt−s−1−αt1−αt−s−σ2αt
现在得到了
m
m
m和
k
k
k,我们的工作其实已经完成了,证明了
q
(
x
t
−
s
∣
x
t
,
x
0
)
q(x_{t-s}|x_t, x_0)
q(xt−s∣xt,x0)是一个
μ
\mu
μ是关于
x
t
x_t
xt和
x
0
x_0
x0的线性函数的高斯分布,并且还求得了这个分布的
μ
\mu
μ和
σ
\sigma
σ,下面只需要将它们带入,得到
x
t
−
s
x_{t-s}
xt−s的表达式就可以了。
将
m
m
m和
k
k
k带入
q
(
x
t
−
s
∣
x
t
,
x
0
)
=
N
(
μ
(
x
t
,
x
0
)
,
σ
t
2
I
)
q(x_{t-s}|x_t, x_0)=N(\mu(x_t,x_0),\sigma_t^2I)
q(xt−s∣xt,x0)=N(μ(xt,x0),σt2I)也就可以得到:
q
(
x
t
−
s
∣
x
t
,
x
0
)
∼
N
(
(
α
t
−
s
−
1
−
α
t
−
s
−
σ
2
1
−
α
t
α
t
)
∗
x
0
+
(
1
−
α
t
−
s
−
σ
2
1
−
α
t
)
∗
x
t
,
σ
t
2
I
)
q(x_{t-s}|x_t, x_0) \sim N((\sqrt{\alpha_{t-s}} - \frac{\sqrt{1-\alpha_{t-s}-\sigma^2}}{\sqrt{1-\alpha_t}} \sqrt{\alpha_{t}})*x_0 + (\frac{\sqrt{1-\alpha_{t-s}-\sigma^2}}{\sqrt{1-\alpha_t}})*x_t,\sigma_t^2I)
q(xt−s∣xt,x0)∼N((αt−s−1−αt1−αt−s−σ2αt)∗x0+(1−αt1−αt−s−σ2)∗xt,σt2I)
展开,整理一下得到:
q
(
x
t
−
s
∣
x
t
,
x
0
)
∼
N
(
α
t
−
s
∗
x
0
+
1
−
α
t
−
s
−
σ
t
2
x
t
−
α
t
x
0
1
−
α
t
,
σ
t
2
I
)
q(x_{t-s}|x_t, x_0) \sim N(\sqrt{\alpha_{t-s}} *x_0 + \sqrt{1-\alpha_{t-s}-\sigma_t^2} \frac{x_t-\sqrt{\alpha_t}x_0}{\sqrt{1-\alpha_t}},\sigma_t^2I)
q(xt−s∣xt,x0)∼N(αt−s∗x0+1−αt−s−σt21−αtxt−αtx0,σt2I)
这也就是最终求得的
q
(
x
t
−
s
∣
x
t
,
x
0
)
q(x_{t-s}|x_t, x_0)
q(xt−s∣xt,x0)在没有经过马尔可夫链的情况下,得到的关于
x
t
x_t
xt和
x
0
x_0
x0的表达式。
将它写成重参数采样的形式:
x
t
−
s
=
α
t
−
s
∗
x
0
+
1
−
α
t
−
s
−
σ
t
2
x
t
−
α
t
x
0
1
−
α
t
+
σ
t
ε
⋯
⋯
(
5
)
x_{t-s} = \sqrt{\alpha_{t-s}} *x_0 + \sqrt{1-\alpha_{t-s}-\sigma_t^2} \frac{x_t-\sqrt{\alpha_t}x_0}{\sqrt{1-\alpha_t}} + \sigma_t \varepsilon \cdots \cdots (5)
xt−s=αt−s∗x0+1−αt−s−σt21−αtxt−αtx0+σtε⋯⋯(5)
我们还可以继续,像DDPM一样,将由
(
1
)
(1)
(1)得到的关于
x
0
x_0
x0和
ε
t
\varepsilon_t
εt关系式:
x
0
=
x
t
−
1
−
α
t
ε
t
α
t
ε
t
=
x
t
−
α
t
x
0
1
−
α
t
x_0 = \frac{x_t - \sqrt{1-\alpha_t}\varepsilon_t}{\sqrt{\alpha_t}} \\ \varepsilon_t = \frac{x_t - \sqrt{\alpha_t}x_0}{\sqrt{1-\alpha_t}}
x0=αtxt−1−αtεtεt=1−αtxt−αtx0
代入
(
5
)
(5)
(5)式,得到:
x
t
−
s
=
α
t
−
s
∗
x
t
−
1
−
α
t
ε
t
α
t
+
1
−
α
t
−
s
−
σ
t
2
ε
t
+
σ
t
ε
x_{t-s} = \sqrt{\alpha_{t-s}} *\frac{x_t - \sqrt{1-\alpha_t}\varepsilon_t}{\sqrt{\alpha_t}} + \sqrt{1-\alpha_{t-s}-\sigma_t^2} \varepsilon_t + \sigma_t \varepsilon
xt−s=αt−s∗αtxt−1−αtεt+1−αt−s−σt2εt+σtε
大功告成!这样我们就可以得到一个只用
x
t
x_t
xt、
ε
t
\varepsilon_t
εt和
σ
t
\sigma_t
σt来表示的
x
t
−
s
x_{t-s}
xt−s。
和DDPM一样,在推理过程中,我们用训练好的noise preditor预测得到 ε t \varepsilon_t εt。至于noise preditor的训练过程我们可以完全沿用DDPM的流程,甚至直接复用DDPM训练好的noise preditor。 σ t \sigma_t σt是一个参数,我们可以随意设置。而 s s s可以取1到t的所有整数值,所以就可以从 x t x_t xt跳步求得 s s s步之前的结果了。
到此为止,DDIM的推理部分就已经讲完了,我们来对比一下DDPM和DDIM中
x
t
−
1
x_{t-1}
xt−1的公式:
D
D
P
M
:
x
t
−
1
=
1
α
t
(
x
t
−
(
1
−
α
t
)
(
1
−
α
ˉ
t
)
ε
t
)
+
β
t
∗
1
−
α
ˉ
t
−
1
1
−
α
ˉ
t
∗
ε
D
D
I
M
:
x
t
−
1
=
α
t
−
1
∗
x
t
−
1
−
α
t
ε
t
α
t
+
1
−
α
t
−
s
−
σ
t
2
ε
t
+
σ
t
ε
DDPM:x_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t- \frac{(1-\alpha_t)}{\sqrt{(1-\bar{\alpha}_t)}}\varepsilon_{t}) + \beta_t * \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t} * \varepsilon \\ DDIM:x_{t-1} = \sqrt{\alpha_{t-1}} *\frac{x_t - \sqrt{1-\alpha_t}\varepsilon_t}{\sqrt{\alpha_t}} + \sqrt{1-\alpha_{t-s}-\sigma_t^2} \varepsilon_t + \sigma_t \varepsilon
DDPM:xt−1=αt1(xt−(1−αˉt)(1−αt)εt)+βt∗1−αˉt1−αˉt−1∗εDDIM:xt−1=αt−1∗αtxt−1−αtεt+1−αt−s−σt2εt+σtε
我们发现这两个公式长得不能说完全不一样,但确实是没多少相似的地方,所以DDIM其实是找到了一条新的可以从
x
t
x_t
xt反推回
x
t
−
1
x_{t-1}
xt−1甚至是
x
t
−
s
x_{t-s}
xt−s的路径,找到了反向去噪过程一个新的解。
那这个新的解,会不会有一些DDPM没有的特点呢?
让随机性消失
回看两个公式的对比,我们可以看到一个特点,DDIM的
ε
\varepsilon
ε前面的系数明显更加简洁,而且它正好是我们之前说可以随机设置的参数
σ
t
\sigma_t
σt。可以随意设置,那我们不妨让
σ
t
=
0
\sigma_t=0
σt=0,于是见证奇迹的时刻:
x
t
−
1
=
α
t
−
1
∗
x
t
−
1
−
α
t
ε
t
α
t
+
1
−
α
t
−
s
ε
t
x_{t-1} = \sqrt{\alpha_{t-1}} *\frac{x_t - \sqrt{1-\alpha_t}\varepsilon_t}{\sqrt{\alpha_t}} + \sqrt{1-\alpha_{t-s}} \varepsilon_t
xt−1=αt−1∗αtxt−1−αtεt+1−αt−sεt
ε
\varepsilon
ε消失了!
于是有读者现在就说了:这有什么的?那 σ t \sigma_t σt是 ε \varepsilon ε前面的系数啊,你让它为0,那 ε \varepsilon ε自然会消失啊,这不是很正常嘛?
慢着,它的消失可能在你的意料之中,但是 ε \varepsilon ε的消失的意义可能在你的意料之外。 ε \varepsilon ε在DDPM中其实代表了每一次降噪过程,都需要在标准高斯分布中采集一个样本,DDPM采样1000次的那个”采样“二字,就是这么来的。这每一次采样,都给DDPM带来了随机性(因为你不知道采集的样本是什么样的),但是如果DDIM每一次反向降噪都不随机采样了呢?没错,那随机性就消失了。于是,神奇的事情发生了,DDIM的反向降噪成为了一个确定性的过程!
确定性采样:当描述DDIM的整体生成流程时,当设置 σ t = 0 \sigma_t=0 σt=0时虽然不具有随机性,但是仍可称为“采样”。因为“采样”一词已被广泛用于描述从噪声到数据的生成过程。对 σ t = 0 \sigma_t=0 σt=0时DDIM的采样过程,更严谨的表述是“确定性采样”,以区别于DDPM的随机性采样。
什么意思,就是只要给DDIM提供一个初始的标准高斯噪声 x t x_t xt,再提供一个预测出来的高斯噪声 ε t \varepsilon_t εt,它就一定对应一个确定的 x 0 x_0 x0。这是因为在整个生成过程中,没有加入任何其他随机量。但DDPM不是这样的,你提供的 x t x_t xt和 ε t \varepsilon_t εt一样,每一次降噪由于都加入了从标准高斯分布中采样的 ε \varepsilon ε,DDPM生成的结果都是随机的。
这就会出现两个情况,第一,DDIM无论进行多少次降噪,结果都是相同的,如下图:
可以看到,在采样10次和100次的情况下,DDIM都对应了同一个结果(但是清晰度会不同,这个我们下一节再聊)。那么我们就可以利用DDIM这一个特性,在生成的时候先使用低采样步数看看是不是我们想要的结果,相当于预览,如果是,再用更多的采样步数得到更精细的结果。
第二,我们可以对 x t x_t xt进行插值,得到两个 x t x_t xt不同比例下的融合结果,如下图:
可以看到,中间的图片的样子是左右两幅图片不同程度的叠加。这并不是直接进行的叠加,而是在生成之前,将左右两幅图此前对应的高斯噪声 x t x_t xt按照比例进行融合,由于生成过程是确定性的,相当于每个 x t x_t xt都对应了一个确定的 x 0 x_0 x0(因为训练好的网络对于每个 x t x_t xt所预测的 ε t \varepsilon_t εt也是一样的),所以生成的 x 0 x_0 x0也是融合的。
跳步的问题
那讲了这么多,DDIM的跳步就是十全十美的吗?DDIM的T=10就是比T=1000全方位多快好省么?那也不是的,采样步数也是一分钱一分货,越多越准确的。其实读者也已经发现了,在上一节展示的图片中,10次采样的结果是不如100次采样的结果的。这是为什么呢?
想一想,DDIM在整个推导过程中,有没有什么漏洞?其实是有的,就是首先假设了 q ( x t − s ∣ x t , x 0 ) q(x_{t-s}|x_t, x_0) q(xt−s∣xt,x0)符合高斯分布。在本文的第一章《DDPM为什么要采样很多次》中,就已经写到,当采样次数少,使得不满足“当 β \beta β变化速率比较小”这个条件时,反向过程就无法保证为高斯分布。所以当T=100的时候,DDIM的反向过程的概率分布还可以近似为高斯分布,但是让T=10的时候,反向过程与高斯分布实在是难以近似,所以生成的图像也就会模糊了。
结语
DDIM模型通过新的思路提供了反向生成过程的解,打破了DDPM中马尔可夫链的束缚。
它可以在跳步生成的同时保持生成质量,解决了DDPM模型多步生成速度较慢的问题,同时还带来了确定性采样这一个可以被利用的特点。
DDIM的提出标志着扩散模型从“理论验证阶段”迈入“高效实用阶段”,为后续研究(如Stable Diffusion等大规模生成模型)奠定了效率基础。其核心思想——通过重新设计生成路径实现加速——已成为扩散模型优化的重要范式。