近年来,扩散模型(Diffusion Models
)在图像生成任务中展现出了极高的性能,逐渐成为继 GANs 和 VAEs 之后的一类重要生成模型。特别是在高分辨率图像合成、图像编辑和音频生成等领域,扩散模型因其稳定性强、生成质量高而备受关注。去噪扩散模型(Denoising Diffusion Probabilistic Models
, DDPM)是扩散模型的代表性方法,其核心思想是将一个图像逐步添加噪声变成纯噪声,再通过一个反向过程一步步去噪还原原始图像。
扩散模型的关键在于两个过程:前向扩散过程 和 反向去噪过程,它们通过构建可学习的马尔可夫链,实现从随机噪声中生成高质量数据。
1 介绍
扩散模型是一种生成模型,其特点包括:
-
一个固定的前向过程 q q q,它使用马尔可夫链在 1.. T 1..T 1..T 个时间步中逐渐向输入图像添加噪声。当 T → ∞ T \to \infty T→∞ 时,图像最终变成纯噪声。
-
一个反向过程 p θ p_\theta pθ,它从一张纯高斯噪声图像开始,学习在每个时间步移除噪声的方式,逐步还原出原始输入图像。
第一步:前向过程(加噪声)
在每一个固定的前向过程步骤中,稍微加噪后的图像
x
t
x_t
xt 会基于前一步图像
x
t
−
1
x_{t-1}
xt−1 被计算出来。这个更嘈杂的新图像
x
t
x_t
xt 是从条件分布
q
(
x
t
∣
x
t
−
1
)
q(x_t|x_{t-1})
q(xt∣xt−1) 中采样得到的。假设我们有一张清晰的猫的照片
x
0
x_0
x0,然后每隔一小步,就往这张图里加一点点噪声:
x
1
∼
q
(
x
1
∣
x
0
)
,
x
2
∼
q
(
x
2
∣
x
1
)
,
…
,
x
T
∼
q
(
x
T
∣
x
T
−
1
)
x_1 \sim q(x_1|x_0),\quad x_2 \sim q(x_2|x_1),\quad \dots,\quad x_T \sim q(x_T|x_{T-1})
x1∼q(x1∣x0),x2∼q(x2∣x1),…,xT∼q(xT∣xT−1)
加到最后 x T x_T xT 就完全变成一张看不出图像内容的纯高斯噪声。
第二步:反向过程(去噪声)
在每一个学习到的反向过程步骤中,稍微去噪后的图像 x t − 1 x_{t-1} xt−1 会根据当前较嘈杂的图像 x t x_t xt 被计算出来。这个新的去噪图像 x t − 1 x_{t-1} xt−1 是从条件分布 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt−1∣xt) 中采样的。
现在我们从那张纯噪声图 x T x_T xT 开始,尝试一步一步“还原”出原图 x 0 x_0 x0,也就是:
x T − 1 ∼ p θ ( x T − 1 ∣ x T ) , x T − 2 ∼ p θ ( x T − 2 ∣ x T − 1 ) , … , x 0 ∼ p θ ( x 0 ∣ x 1 ) x_{T-1} \sim p_\theta(x_{T-1}|x_T),\quad x_{T-2} \sim p_\theta(x_{T-2}|x_{T-1}),\quad \dots,\quad x_0 \sim p_\theta(x_0|x_1) xT−1∼pθ(xT−1∣xT),xT−2∼pθ(xT−2∣xT−1),…,x0∼pθ(x0∣x1)
这个过程是用神经网络 p θ p_\theta pθ 来学的,目标就是一步步预测“如何去掉噪声”。
在每一步中添加和移除的噪声量都非常小,因此每一步的转移分布 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xt∣xt−1) 和 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt−1∣xt) 都可以被视为条件高斯分布,这使得使用神经网络进行训练变得更加容易。
- 高斯分布就是“变化集中在中间、偶尔偏一点”的一种随机方式,非常适合描述扩散模型中逐步加噪/去噪的过程,也让训练更简单、更稳定。
为什么每一步使用高斯分布?
因为每一步添加或移除的噪声量都非常小,我们可以假设当前图像只和前一步图像差一点点。这种“微小变化”可以很好地用高斯分布来建模:
- q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xt∣xt−1) 表示“添加一点噪声”;
- p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt−1∣xt) 表示“去掉一点噪声”。
这样一来,整个模型就可以被训练成一个“逐步去噪器”,最终从纯噪声恢复出真实图像。
2 前向扩散过程
2.1 数学原理
前向过程会在原始图像 x 0 x_0 x0 上逐步添加少量的高斯噪声,持续 t = 1 , . . . , T t = 1, ..., T t=1,...,T 个时间步。在给定 x t − 1 x_{t-1} xt−1 的前提下生成 x t x_t xt 的分布为:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I}) q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
其中每一步添加的噪声的方差 β t \beta_t βt 是由一个“方差调度表”确定的,其中 0 < β 1 < β 2 < ⋯ < β T < 1 0 < \beta_1 < \beta_2 < \dots < \beta_T < 1 0<β1<β2<⋯<βT<1 。
方差调度表是一组预定义的 β t \beta_t βt 值,决定了扩散过程中每一步添加多少噪声,是整个扩散模型的“噪声时间计划”。
- 稳定训练:如果一开始就加很多噪声,图像马上就毁了,训练没法进行;
- 平滑过渡:让整个模糊过程是逐渐的,便于神经网络去学习“逆过程”;
- 可控性强:我们可以尝试不同的 β t \beta_t βt 曲线,比如线性增加、余弦曲线、固定值等,调节生成质量和速度。
接下来我们从这个分布中采样一张图像 x t x_t xt,即从 x t − 1 x_{t-1} xt−1 得到下一张更嘈杂的图像。为此,我们使用重参数化技巧:
x t = 1 − β t x t − 1 + β t ϵ x_t = \sqrt{1 - \beta_t} x_{t-1} + \sqrt{\beta_t} \epsilon xt=1−βtxt−1+βtϵ
- x t x_t xt 的均值为 1 − β t x t − 1 \sqrt{1 - \beta_t} x_{t-1} 1−βtxt−1,这个缩放因子 1 − β t \sqrt{1 - \beta_t} 1−βt 会把前一张图像缩小,使得添加噪声后整体方差保持一致 。
- 添加的噪声的方差是 β t \beta_t βt,因此标准差是 β t \sqrt{\beta_t} βt。
- ϵ \epsilon ϵ 是从 N ( 0 , I ) \mathcal{N}(0, \mathbf{I}) N(0,I) 中采样得到的噪声。
- 第一项 1 − β t x t − 1 \sqrt{1 - \beta_t} x_{t-1} 1−βtxt−1 表示我们保留上一张图像的一部分内容;
- 第二项 β t ϵ \sqrt{\beta_t} \epsilon βtϵ 表示我们加了一点新的随机噪声;
- 每一步只变动一点点,这样才方便后面“反过来”去噪。
上图展示了一次前向步骤的计算过程,完整的前向过程 q ( x 1 : T ∣ x 0 ) q(x_{1:T}|x_0) q(x1:T∣x0) 定义如下:
q ( x 1 : T ∣ x 0 ) = q ( x T ∣ x T − 1 ) q ( x T − 1 ∣ x T − 2 ) … q ( x 2 ∣ x 1 ) q ( x 1 ∣ x 0 ) q(x_{1:T}|x_0) = q(x_T|x_{T-1})q(x_{T-1}|x_{T-2}) \dots q(x_2|x_1)q(x_1|x_0) q(x1:T∣x0)=q(xT∣xT−1)q(xT−1∣xT−2)…q(x2∣x1)q(x1∣x0)
也可以简写为:
q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(x_{1:T}|x_0) = \prod_{t=1}^T q(x_t|x_{t-1}) q(x1:T∣x0)=t=1∏Tq(xt∣xt−1)
2.2 方差调度
我们回顾一下每一步扩散的加噪公式是:
x
t
=
1
−
β
t
x
t
−
1
+
β
t
ϵ
x_t = \sqrt{1 - \beta_t} x_{t-1} + \sqrt{\beta_t} \epsilon
xt=1−βtxt−1+βtϵ
- β t \beta_t βt 越大,加进去的噪声越多;
- β t \beta_t βt 越小,保留的图像信息越多。
方差调度(Variance Schedule
)决定了在每个时间步添加的噪声的方差。这一方差在
t
=
1
,
.
.
.
,
T
t = 1,...,T
t=1,...,T 的整个扩散过程中并不是固定的,而是满足如下关系:
0
<
β
1
<
β
2
<
.
.
.
<
β
T
−
1
<
β
T
<
1
0 < \beta_1 < \beta_2 < ... < \beta_{T-1} < \beta_T < 1
0<β1<β2<...<βT−1<βT<1
常见的调度方式包括线性调度(linear
)、余弦调度(cosine
)、S型调度(sigmoid
)以及二次调度(quadratic
)等。
原始的 DDPM 论文中提出了线性调度,并在常数调度(constant
)、线性调度和二次调度中,选取其为性能最优者。作者设置了
β
1
=
1
0
−
4
\beta_1 = 10^{-4}
β1=10−4 和
β
T
=
0.02
\beta_T = 0.02
βT=0.02。
余弦调度相比线性调度更加“平缓”地添加噪声,使得生成图像中前期保留更多清晰信息,效果更自然。下面左图显示了 t = 1 t = 1 t=1 到 t = 1000 t = 1000 t=1000 的线性方差调度图;右图显示了相同范围内的余弦方差调度图。
线性调度:
β t \beta_t βt 从小到大线性增加,比如从 0.0001 0.0001 0.0001 到 0.02 0.02 0.02,图像会慢慢变模糊,但后期突然变得很糊。
- 优点:简单;
- 缺点:后期图像快速崩坏。
余弦调度:
β t \beta_t βt 的增加速度在前期很慢,后期才快(像余弦函数那样缓缓上升)。图像更长时间保持清晰,过渡更平滑。
- 优点:生成图像更自然;
- 缺点:计算上略复杂。
为什么调度方式会影响效果?
- 如果节奏突然加快(线性调度),图像会很快失真;
- 如果节奏平稳(余弦调度),图像逐渐模糊,神经网络更容易学会如何“反过来恢复”。
如下图所示,上排显示了使用线性调度进行前向扩散的各个阶段,下排则为余弦调度。可以观察到余弦调度下的图像逐渐加噪更平滑,而线性调度后期图像接近纯噪声。
下图展示了扩散过程中的前四个步骤。由于 β t \beta_t βt 随着 t t t 增大而增大,噪声所占比例也逐步增加:几乎全部是从采样的噪声中构建出来的图像。与此同时,前一步图像所占的比例(对比度)则逐渐减小。
2.3 实际的前向步骤
在实践中,前向过程并不需要逐步地计算 x 1 , x 2 , … , x t x_1, x_2, \dots, x_t x1,x2,…,xt。由于方差调度是固定的,我们只需要已知调度表和随机噪声 ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, \mathbf{I}) ϵ∼N(0,I),就可以直接计算任意时刻的 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} \epsilon_{t-1} xt=1−βtxt−1+βtϵt−1
其中 ϵ t ∼ N ( 0 , I ) \epsilon_t \sim \mathcal{N}(0, \mathbf{I}) ϵt∼N(0,I)。
令 α t = 1 − β t \alpha_t = 1 - \beta_t αt=1−βt,以及 α ˉ t = ∏ s = 1 t α s \bar{\alpha}_t = \prod_{s=1}^{t} \alpha_s αˉt=∏s=1tαs。
我们可以将 α t \alpha_t αt 代入上式,得到:
x t = α t x t − 1 + 1 − α t ϵ t − 1 x_t = \sqrt{\alpha_t} x_{t-1} + \sqrt{1 - \alpha_t} \epsilon_{t-1} xt=αtxt−1+1−αtϵt−1
我们也知道:
x t − 1 = α t − 1 x t − 2 + 1 − α t − 1 ϵ t − 2 \mathbf{x}_{t-1} = \sqrt{\alpha_{t-1}} \mathbf{x}_{t-2} + \sqrt{1 - \alpha_{t-1}} \epsilon_{t-2} xt−1=αt−1xt−2+1−αt−1ϵt−2
将 x t − 1 x_{t-1} xt−1 代入 x t x_t xt 的表达式中,得:
x
t
=
α
t
(
α
t
−
1
x
t
−
2
+
1
−
α
t
−
1
ϵ
t
−
2
)
+
1
−
α
t
ϵ
t
−
1
=
α
t
α
t
−
1
x
t
−
2
+
α
t
1
−
α
t
−
1
ϵ
t
−
2
+
1
−
α
t
ϵ
t
−
1
=
α
t
α
t
−
1
x
t
−
2
+
α
t
(
1
−
α
t
−
1
)
ϵ
t
−
2
+
1
−
α
t
ϵ
t
−
1
\begin{aligned} \mathbf{x}_t &= \sqrt{\alpha_t} \left( \sqrt{\alpha_{t-1}} \mathbf{x}_{t-2} + \sqrt{1 - \alpha_{t-1}} \epsilon_{t-2} \right) + \sqrt{1 - \alpha_t} \epsilon_{t-1} \\ &= \sqrt{\alpha_t} \sqrt{\alpha_{t-1}} \mathbf{x}_{t-2} + \sqrt{\alpha_t} \sqrt{1 - \alpha_{t-1}} \epsilon_{t-2} + \sqrt{1 - \alpha_t} \epsilon_{t-1} \\ &= \sqrt{\alpha_t \alpha_{t-1}} \mathbf{x}_{t-2} + \sqrt{\alpha_t (1 - \alpha_{t-1})} \epsilon_{t-2} + \sqrt{1 - \alpha_t} \epsilon_{t-1} \end{aligned}
xt=αt(αt−1xt−2+1−αt−1ϵt−2)+1−αtϵt−1=αtαt−1xt−2+αt1−αt−1ϵt−2+1−αtϵt−1=αtαt−1xt−2+αt(1−αt−1)ϵt−2+1−αtϵt−1
回顾一下两个高斯分布随机变量相加的公式:如果
X
∼
N
(
μ
X
,
σ
X
2
)
X \sim \mathcal{N}(\mu_X, \sigma_X^2)
X∼N(μX,σX2),
Y
∼
N
(
μ
Y
,
σ
Y
2
)
Y \sim \mathcal{N}(\mu_Y, \sigma_Y^2)
Y∼N(μY,σY2),那么
Z
=
X
+
Y
∼
N
(
μ
X
+
μ
Y
,
σ
X
2
+
σ
Y
2
)
Z = X + Y \sim \mathcal{N}(\mu_X + \mu_Y, \sigma_X^2 + \sigma_Y^2)
Z=X+Y∼N(μX+μY,σX2+σY2)。
我们将 α t ( 1 − α t − 1 ) ϵ t − 2 \sqrt{\alpha_t (1 - \alpha_{t-1})} \epsilon_{t-2} αt(1−αt−1)ϵt−2 与 1 − α t ϵ t − 1 \sqrt{1 - \alpha_t} \epsilon_{t-1} 1−αtϵt−1 合并得到一个新的高斯分布,其方差为:
α t ( 1 − α t − 1 ) + ( 1 − α t ) = 1 − α t α t − 1 \alpha_t(1 - \alpha_{t-1}) + (1 - \alpha_t) = 1 - \alpha_t \alpha_{t-1} αt(1−αt−1)+(1−αt)=1−αtαt−1
因此其标准差为 1 − α t α t − 1 \sqrt{1 - \alpha_t \alpha_{t-1}} 1−αtαt−1,合并得到的高斯项为:
1 − α t α t − 1 ϵ ′ \sqrt{1 - \alpha_t \alpha_{t-1}} \epsilon' 1−αtαt−1ϵ′
所以我们可以将 x t x_t xt 重写为:
x t = α t α t − 1 x t − 2 + 1 − α t α t − 1 ϵ ′ , ϵ ′ ∼ N ( 0 , I ) x_t = \sqrt{\alpha_t \alpha_{t-1}} x_{t-2} + \sqrt{1 - \alpha_t \alpha_{t-1}} \epsilon', \quad \epsilon' \sim \mathcal{N}(0, \mathbf{I}) xt=αtαt−1xt−2+1−αtαt−1ϵ′,ϵ′∼N(0,I)
我们可以继续将这个链式计算展开到 x t − 2 x_{t-2} xt−2, x t − 3 x_{t-3} xt−3,最终展开到 x 0 x_0 x0:
x t = α t α t − 1 … α 1 x 0 + 1 − α t α t − 1 … α 1 ϵ 0 ′ x t = α ˉ t x 0 + 1 − α ˉ t ϵ \mathbf{x}_t = \sqrt{\alpha_t \alpha_{t-1} \dots \alpha_1} \, \mathbf{x}_0 + \sqrt{1 - \alpha_t \alpha_{t-1} \dots \alpha_1} \, \epsilon_0' \\ \mathbf{x}_t = \sqrt{\bar{\alpha}_t} \, \mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_t} \, \epsilon xt=αtαt−1…α1x0+1−αtαt−1…α1ϵ0′xt=αˉtx0+1−αˉtϵ
因此,我们不需要从 x 0 → x 1 → x 2 … x_0 \to x_1 \to x_2 \dots x0→x1→x2… 一步步计算 x t x_t xt,而是直接从 x 0 x_0 x0 生成任意时间步的 x t x_t xt。
3 反向去噪过程
3.1 原理
在反向过程中,我们从纯高斯噪声图像开始,并在每个时间步逐步移除噪声,最终还原出原始图像。在每一个时间步 t t t,我们需要根据当前图像 x t \mathbf{x}_t xt 得到下一个更干净的图像 x t − 1 \mathbf{x}_{t-1} xt−1。
我们并不知道真实的分布 q ( x t − 1 ∣ x t ) q(\mathbf{x}_{t-1}|\mathbf{x}_t) q(xt−1∣xt),因为这就需要我们知道所有图像的真实分布。
就像我们有一个模糊图像 x t \mathbf{x}_t xt,但并不知道它是从哪一张清晰图像 x t − 1 \mathbf{x}_{t-1} xt−1 加噪得来的。如果我们能知道这个“反推路径”的分布,那就能一步步把噪声“反过来去掉”。但这个真实分布很难获取。
因此,我们希望用一个可学习的神经网络模型来近似这个真实分布,即:
p θ ( x t − 1 ∣ x t ) p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t) pθ(xt−1∣xt)
其中 θ \theta θ 表示模型参数。
反向过程的起点是纯噪声,因此我们规定:
q ( x T ) = p θ ( x T ) = N ( x T ; 0 , I ) q(\mathbf{x}_T) = p_\theta(\mathbf{x}_T) = \mathcal{N}(\mathbf{x}_T; \mathbf{0}, \mathbf{I}) q(xT)=pθ(xT)=N(xT;0,I)
也就是说:我们一开始给模型一个标准正态分布的随机图像 x T \mathbf{x}_T xT,然后一步步去噪出最终图像。
我们希望神经网络可以学习到每一步“去噪”的方式。由于每一步只添加/移除很少的噪声,我们可以将这个“去噪过程”视作高斯分布,其均值和方差由网络输出:
p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \mu_\theta(\mathbf{x}_t, t), \Sigma_\theta(\mathbf{x}_t, t)) pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))
其中, μ θ ( x t , t ) \mu_\theta(\mathbf{x}_t, t) μθ(xt,t) 和 Σ θ ( x t , t ) \Sigma_\theta(\mathbf{x}_t, t) Σθ(xt,t) 分别是神经网络预测的均值和协方差。
- 通常我们把协方差矩阵简化为对角矩阵,是为了让模型只预测每个像素自己的不确定性,不考虑像素之间的联系,从而更高效、更稳定地建模去噪过程。
整个反向过程是从 t = T t = T t=T 一步步推到 t = 0 t = 0 t=0,所以可以写成联合分布形式:
p θ ( x 0 : T ) : = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) p_\theta(\mathbf{x}_{0:T}) := p(\mathbf{x}_T) \prod_{t=1}^{T} p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t) pθ(x0:T):=p(xT)t=1∏Tpθ(xt−1∣xt)
反向过程是多个“单步去噪”的串联。每一步从 x t → x t − 1 \mathbf{x}_t \rightarrow \mathbf{x}_{t-1} xt→xt−1,由神经网络决定怎么移除噪声,最终从纯噪声一步步还原成清晰图像。
我们希望 p θ ( x t − 1 ∣ x t ) p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t) pθ(xt−1∣xt) 能尽量贴近真实的后验分布 q ( x t − 1 ∣ x t ) q(\mathbf{x}_{t-1}|\mathbf{x}_t) q(xt−1∣xt)。尽管这个真实分布本身不能直接获得,但在已知原始图像 x 0 \mathbf{x}_0 x0 时,我们可以准确计算这个条件分布:
q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ ( x t , x 0 ) , β ~ t I ) q(\mathbf{x}_{t-1}|\mathbf{x}_t, \mathbf{x}_0) = \mathcal{N}(\mathbf{x}_{t-1}; \tilde{\mu}(\mathbf{x}_t, \mathbf{x}_0), \tilde{\beta}_t \mathbf{I}) q(xt−1∣xt,x0)=N(xt−1;μ~(xt,x0),β~tI)
虽然 q ( x t − 1 ∣ x t ) q(\mathbf{x}_{t-1}|\mathbf{x}_t) q(xt−1∣xt) 是未知的,但我们知道如何根据 x 0 \mathbf{x}_0 x0 和 x t \mathbf{x}_t xt 推出 q ( x t − 1 ∣ x t , x 0 ) q(\mathbf{x}_{t-1}|\mathbf{x}_t, \mathbf{x}_0) q(xt−1∣xt,x0),这为我们提供了训练目标!
因此,接下来的目标就是求出 μ ~ ( x t , x 0 ) \tilde{\mu}(\mathbf{x}_t, \mathbf{x}_0) μ~(xt,x0) 和 β ~ t \tilde{\beta}_t β~t,从而构建出可监督学习的目标分布。
3.2 数学推导
首先回顾贝叶斯公式(Bayes’ Rule):
P ( A ∣ B ) = P ( A , B ) P ( B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) = \frac{P(A, B)}{P(B)} = \frac{P(B|A)P(A)}{P(B)} P(A∣B)=P(B)P(A,B)=P(B)P(B∣A)P(A)
以及条件贝叶斯公式:
P ( A ∣ B , C ) = P ( A , B , C ) P ( B , C ) = P ( B ∣ A , C ) P ( A ∣ C ) P ( C ) P ( B ∣ C ) P ( C ) = P ( B ∣ A , C ) P ( A ∣ C ) P ( B ∣ C ) P(A|B, C) = \frac{P(A, B, C)}{P(B, C)} = \frac{P(B|A, C)P(A|C)P(C)}{P(B|C)P(C)} = \frac{P(B|A, C)P(A|C)}{P(B|C)} P(A∣B,C)=P(B,C)P(A,B,C)=P(B∣C)P(C)P(B∣A,C)P(A∣C)P(C)=P(B∣C)P(B∣A,C)P(A∣C)
利用贝叶斯公式,我们可以得到:
q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) ⋅ q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) = \frac{q(\mathbf{x}_t | \mathbf{x}_{t-1}, \mathbf{x}_0) \cdot q(\mathbf{x}_{t-1} | \mathbf{x}_0)}{q(\mathbf{x}_t | \mathbf{x}_0)} q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1,x0)⋅q(xt−1∣x0)
也就是说,我们可以把 x t \mathbf{x}_t xt 给定的前一帧 x t − 1 \mathbf{x}_{t-1} xt−1 的真实分布(在已知 x 0 \mathbf{x}_0 x0 的条件下),拆解成三个前向过程相关的分布项来重新组合。
根据我们在前向过程中的推导,我们已经知道以下几个分布:
q ( x t ∣ x t − 1 , x 0 ) = q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q ( x t − 1 ∣ x 0 ) = N ( x t − 1 ; α ˉ t − 1 x 0 , ( 1 − α ˉ t − 1 ) I ) q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) \begin{aligned} q(\mathbf{x}_t | \mathbf{x}_{t-1}, \mathbf{x}_0) &= q(\mathbf{x}_t | \mathbf{x}_{t-1}) = \mathcal{N}(\mathbf{x}_t; \sqrt{1 - \beta_t} \, \mathbf{x}_{t-1}, \beta_t \mathbf{I}) \\\\ q(\mathbf{x}_{t-1} | \mathbf{x}_0) &= \mathcal{N}(\mathbf{x}_{t-1}; \sqrt{\bar{\alpha}_{t-1}} \, \mathbf{x}_0, (1 - \bar{\alpha}_{t-1}) \mathbf{I}) \\\\ q(\mathbf{x}_t | \mathbf{x}_0) &= \mathcal{N}(\mathbf{x}_t; \sqrt{\bar{\alpha}_t} \, \mathbf{x}_0, (1 - \bar{\alpha}_t) \mathbf{I}) \end{aligned} q(xt∣xt−1,x0)q(xt−1∣x0)q(xt∣x0)=q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)=N(xt−1;αˉt−1x0,(1−αˉt−1)I)=N(xt;αˉtx0,(1−αˉt)I)
这些分布都源于我们前面提到的“从 x 0 \mathbf{x}_0 x0 一步加噪到 x t \mathbf{x}_t xt”的闭式表达式。
接下来我们回顾标准高斯分布的概率密度函数:
f ( x ) = 1 σ 2 π exp ( − 1 2 ( x − μ σ ) 2 ) f(x) = \frac{1}{\sigma \sqrt{2\pi}} \exp\left( -\frac{1}{2} \left( \frac{x - \mu}{\sigma} \right)^2 \right) f(x)=σ2π1exp(−21(σx−μ)2)
💬 对于我们来说,最重要的是其中的指数项 exp ( − 1 2 ( ⋅ ) 2 ) \exp(-\frac{1}{2} (\cdot)^2) exp(−21(⋅)2),因为我们后面要比较的是多个高斯分布的指数形式。
所以我们可以将上述三个正态分布写为指数形式的比例:
q ( x t ∣ x t − 1 , x 0 ) ∝ exp ( − 1 2 ⋅ ( x t − α t x t − 1 ) 2 β t ) q ( x t − 1 ∣ x 0 ) ∝ exp ( − 1 2 ⋅ ( x t − 1 − α ˉ t − 1 x 0 ) 2 1 − α ˉ t − 1 ) q ( x t ∣ x 0 ) ∝ exp ( − 1 2 ⋅ ( x t − α ˉ t x 0 ) 2 1 − α ˉ t ) \begin{aligned} q(\mathbf{x}_t | \mathbf{x}_{t-1}, \mathbf{x}_0) &\propto \exp\left( -\frac{1}{2} \cdot \frac{ \left( \mathbf{x}_t - \sqrt{\alpha_t} \mathbf{x}_{t-1} \right)^2 }{ \beta_t } \right) \\\\ q(\mathbf{x}_{t-1} | \mathbf{x}_0) &\propto \exp\left( -\frac{1}{2} \cdot \frac{ \left( \mathbf{x}_{t-1} - \sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_0 \right)^2 }{ 1 - \bar{\alpha}_{t-1} } \right) \\\\ q(\mathbf{x}_t | \mathbf{x}_0) &\propto \exp\left( -\frac{1}{2} \cdot \frac{ \left( \mathbf{x}_t - \sqrt{\bar{\alpha}_t} \mathbf{x}_0 \right)^2 }{ 1 - \bar{\alpha}_t } \right) \end{aligned} q(xt∣xt−1,x0)q(xt−1∣x0)q(xt∣x0)∝exp(−21⋅βt(xt−αtxt−1)2)∝exp(−21⋅1−αˉt−1(xt−1−αˉt−1x0)2)∝exp(−21⋅1−αˉt(xt−αˉtx0)2)
这些形式让我们可以把贝叶斯公式的分子、分母都用相似的指数形式表示,然后组合后再整理成一个新的高斯分布。
我们接下来将利用这些表达式重写
q
(
x
t
−
1
∣
x
t
,
x
0
)
q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0)
q(xt−1∣xt,x0),从而推导出我们想要的均值
μ
~
(
x
t
,
x
0
)
\tilde{\mu}(\mathbf{x}_t, \mathbf{x}_0)
μ~(xt,x0) 和方差
β
~
t
\tilde{\beta}_t
β~t 的具体表达。
q
(
x
t
−
1
∣
x
t
,
x
0
)
∝
e
x
p
(
−
1
2
(
x
t
−
α
ˉ
t
x
0
)
2
1
−
α
ˉ
t
)
e
x
p
(
−
1
2
(
x
t
−
1
−
α
ˉ
t
−
1
x
0
)
2
1
−
α
ˉ
t
−
1
)
e
x
p
(
−
1
2
(
x
t
−
α
t
x
t
−
1
)
2
β
t
)
=
e
x
p
(
−
1
2
(
(
x
t
−
α
t
x
t
−
1
)
2
β
t
+
(
x
t
−
1
−
α
ˉ
t
−
1
x
0
)
2
1
−
α
ˉ
t
−
1
−
(
x
t
−
α
ˉ
t
x
0
)
2
1
−
α
ˉ
t
)
)
q(\mathbf{x}_{t-1}|\mathbf{x}_t, \mathbf{x}_0) \propto \frac{exp\left(-\frac{1}{2} \frac{(\mathbf{x}_t - \sqrt{\bar{\alpha}_t}\mathbf{x}_0)^2}{1 - \bar{\alpha}_t}\right) exp\left(-\frac{1}{2} \frac{(\mathbf{x}_{t-1} - \sqrt{\bar{\alpha}_{t-1}}\mathbf{x}_0)^2}{1 - \bar{\alpha}_{t-1}}\right)}{exp\left(-\frac{1}{2} \frac{(\mathbf{x}_t - \sqrt{\alpha_t}\mathbf{x}_{t-1})^2}{\beta_t}\right)} \\\\ = exp\left(-\frac{1}{2} \left( \frac{(\mathbf{x}_t - \sqrt{\alpha_t}\mathbf{x}_{t-1})^2}{\beta_t} + \frac{(\mathbf{x}_{t-1} - \sqrt{\bar{\alpha}_{t-1}}\mathbf{x}_0)^2}{1 - \bar{\alpha}_{t-1}} - \frac{(\mathbf{x}_t - \sqrt{\bar{\alpha}_t}\mathbf{x}_0)^2}{1 - \bar{\alpha}_t} \right) \right)
q(xt−1∣xt,x0)∝exp(−21βt(xt−αtxt−1)2)exp(−211−αˉt(xt−αˉtx0)2)exp(−211−αˉt−1(xt−1−αˉt−1x0)2)=exp(−21(βt(xt−αtxt−1)2+1−αˉt−1(xt−1−αˉt−1x0)2−1−αˉt(xt−αˉtx0)2))
因为 e a e b / e c = e a + b − c e^a e^b / e^c = e^{a + b - c} eaeb/ec=ea+b−c,所以我们继续展开:
= exp ( − 1 2 ( x t 2 − 2 x t α t x t − 1 + α t x t − 1 2 β t + x t − 1 2 − 2 x t − 1 α ˉ t − 1 x 0 + α ˉ t − 1 x 0 2 1 − α ˉ t − 1 − ( x t − α ˉ t x 0 ) 2 1 − α ˉ t ) ) \begin{aligned} &= \exp\left( -\frac{1}{2} \left( \frac{\mathbf{x}_t^2 - 2 \mathbf{x}_t \sqrt{\alpha_t} \mathbf{x}_{t-1} + \alpha_t \mathbf{x}_{t-1}^2}{\beta_t}+\frac{\mathbf{x}_{t-1}^2 - 2 \mathbf{x}_{t-1} \sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_0 + \bar{\alpha}_{t-1} \mathbf{x}_0^2}{1 - \bar{\alpha}_{t-1}}-\frac{(\mathbf{x}_t - \sqrt{\bar{\alpha}_t} \mathbf{x}_0)^2}{1 - \bar{\alpha}_t} \right) \right) \end{aligned} =exp(−21(βtxt2−2xtαtxt−1+αtxt−12+1−αˉt−1xt−12−2xt−1αˉt−1x0+αˉt−1x02−1−αˉt(xt−αˉtx0)2))
展开各个二次项,合并 x t − 1 2 \mathbf{x}_{t-1}^2 xt−12 和 x t − 1 \mathbf{x}_{t-1} xt−1 项:
= exp ( − 1 2 ( ( α t β t + 1 1 − α ˉ t − 1 ) x t − 1 2 − ( 2 α t x t β t + 2 α ˉ t − 1 x 0 1 − α ˉ t − 1 ) x t − 1 + ( x t − α ˉ t x 0 ) 2 1 − α ˉ t ) ) \begin{aligned} &= \exp\left( -\frac{1}{2} \left( \left( \frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}} \right) \mathbf{x}_{t-1}^2 -\left( \frac{2 \sqrt{\alpha_t} \mathbf{x}_t}{\beta_t} + \frac{2 \sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_0}{1 - \bar{\alpha}_{t-1}} \right) \mathbf{x}_{t-1}+\frac{(\mathbf{x}_t - \sqrt{\bar{\alpha}_t} \mathbf{x}_0)^2}{1 - \bar{\alpha}_t} \right) \right) \end{aligned} =exp(−21((βtαt+1−αˉt−11)xt−12−(βt2αtxt+1−αˉt−12αˉt−1x0)xt−1+1−αˉt(xt−αˉtx0)2))
将 x t − 1 \mathbf{x}_{t-1} xt−1 相关项整理成平方形式:
= e x p ( ( x t − 1 − α t β t x t + α ˉ t − 1 1 − α ˉ t − 1 x 0 α t β t + 1 1 − α ˉ t − 1 ( α t β t + 1 1 − α ˉ t − 1 ) − 1 ) 2 ) = exp\left(\left( \frac{\mathbf{x}_{t-1} - \frac{\frac{\sqrt{\alpha_t}}{\beta_t} \mathbf{x}_t + \frac{\sqrt{\bar{\alpha}_{t-1}}}{1 - \bar{\alpha}_{t-1}} \mathbf{x}_0}{\frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}}}}{\left( \sqrt{\frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}}} \right)^{-1}} \right)^2 \right) =exp (βtαt+1−αˉt−11)−1xt−1−βtαt+1−αˉt−11βtαtxt+1−αˉt−1αˉt−1x0 2
根据上述计算,我们最终可以写为:
q ( x t − 1 ∣ x t , x 0 ) ∝ exp ( ( x t − 1 − μ ~ t ( x t , x 0 ) ) 2 β ~ t ) q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) \propto \exp\left(\frac{(\mathbf{x}_{t-1} - \tilde{\mu}_t(\mathbf{x}_t, \mathbf{x}_0))^2}{\tilde{\beta}_t} \right) q(xt−1∣xt,x0)∝exp(β~t(xt−1−μ~t(xt,x0))2)
根据高斯分布的形式,我们可以得到:
β
~
t
=
(
α
t
β
t
+
1
1
−
α
ˉ
t
−
1
)
−
1
=
β
t
(
1
−
α
ˉ
t
−
1
)
α
t
−
α
ˉ
t
+
β
t
=
β
t
(
1
−
α
ˉ
t
−
1
)
1
−
α
ˉ
t
\tilde{\beta}_t = \left( \frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}} \right)^{-1} = \frac{\beta_t (1 - \bar{\alpha}_{t-1})}{\alpha_t - \bar{\alpha}_t + \beta_t} = \frac{\beta_t (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t}
β~t=(βtαt+1−αˉt−11)−1=αt−αˉt+βtβt(1−αˉt−1)=1−αˉtβt(1−αˉt−1)
我们可以使用
β
~
t
\tilde{\beta}_t
β~t 的值来计算
μ
~
t
\tilde{\mu}_t
μ~t:
μ ~ t ( x t , x 0 ) = ( α t β t x t + α ˉ t − 1 1 − α ˉ t − 1 x 0 ) / ( α t β t + 1 1 − α ˉ t − 1 ) \tilde{\mu}_t(\mathbf{x}_t, \mathbf{x}_0) = \left( \frac{\sqrt{\alpha_t}}{\beta_t} \mathbf{x}_t + \frac{\sqrt{\bar{\alpha}_{t-1}}}{1 - \bar{\alpha}_{t-1}} \mathbf{x}_0 \right) \Big/ \left( \frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}} \right) μ~t(xt,x0)=(βtαtxt+1−αˉt−1αˉt−1x0)/(βtαt+1−αˉt−11)
= ( α t β t x t + α ˉ t − 1 1 − α ˉ t − 1 x 0 ) ( β t ( 1 − α ˉ t − 1 ) 1 − α ˉ t ) = \left( \frac{\sqrt{\alpha_t}}{\beta_t} \mathbf{x}_t + \frac{\sqrt{\bar{\alpha}_{t-1}}}{1 - \bar{\alpha}_{t-1}} \mathbf{x}_0 \right) \left( \frac{\beta_t (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} \right) =(βtαtxt+1−αˉt−1αˉt−1x0)(1−αˉtβt(1−αˉt−1))
因为:
1
α
t
β
t
+
1
1
−
α
ˉ
t
−
1
=
β
t
(
1
−
α
ˉ
t
−
1
)
1
−
α
ˉ
t
\frac{1}{ \frac{\alpha_t}{\beta_t} + \frac{1}{1 - \bar{\alpha}_{t-1}} } = \frac{\beta_t (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t}
βtαt+1−αˉt−111=1−αˉtβt(1−αˉt−1)
最终化简为:
μ
~
t
(
x
t
,
x
0
)
=
α
t
(
1
−
α
ˉ
t
−
1
)
1
−
α
ˉ
t
x
t
+
β
t
α
ˉ
t
−
1
1
−
α
ˉ
t
x
0
\tilde{\mu}_t(\mathbf{x}_t, \mathbf{x}_0) = \frac{\sqrt{\alpha_t} (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} \mathbf{x}_t + \frac{\beta_t \sqrt{\bar{\alpha}_{t-1}}}{1 - \bar{\alpha}_t} \mathbf{x}_0
μ~t(xt,x0)=1−αˉtαt(1−αˉt−1)xt+1−αˉtβtαˉt−1x0
我们已知:
x t = α ˉ t x 0 + 1 − α ˉ t ϵ t \mathbf{x}_t = \sqrt{\bar{\alpha}_t} \, \mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_t} \, \epsilon_t xt=αˉtx0+1−αˉtϵt
我们可以将其变形为:
x
0
=
1
α
ˉ
t
(
x
t
−
1
−
α
ˉ
t
ϵ
t
)
\mathbf{x}_0 = \frac{1}{\sqrt{\bar{\alpha}_t}} \left( \mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \, \epsilon_t \right)
x0=αˉt1(xt−1−αˉtϵt)
我们可以将
x
0
\mathbf{x}_0
x0 表达式代入
μ
~
t
\tilde{\mu}_t
μ~t 的公式中:
μ ~ t ( x t , x 0 ) = α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t + β t α ˉ t − 1 1 − α ˉ t ( 1 α ˉ t ( x t − 1 − α ˉ t ϵ t ) ) = α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t + β t α ˉ t − 1 1 − α ˉ t ⋅ 1 α t α ˉ t − 1 ( x t − 1 − α ˉ t ϵ t ) \tilde{\mu}_t(\mathbf{x}_t, \mathbf{x}_0) = \frac{ \sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1}) }{1 - \bar{\alpha}_t} \mathbf{x}_t + \frac{ \beta_t \sqrt{ \bar{\alpha}_{t-1} } }{1 - \bar{\alpha}_t} \left( \frac{1}{\sqrt{\bar{\alpha}_t}} \left( \mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \, \epsilon_t \right) \right) \\\\ = \frac{ \sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1}) }{1 - \bar{\alpha}_t} \mathbf{x}_t + \frac{ \beta_t \sqrt{ \bar{\alpha}_{t-1} } }{1 - \bar{\alpha}_t} \cdot \frac{1}{\sqrt{{\alpha}_t\bar{\alpha}_{t-1}}} \left( \mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \, \epsilon_t \right) μ~t(xt,x0)=1−αˉtαt(1−αˉt−1)xt+1−αˉtβtαˉt−1(αˉt1(xt−1−αˉtϵt))=1−αˉtαt(1−αˉt−1)xt+1−αˉtβtαˉt−1⋅αtαˉt−11(xt−1−αˉtϵt)
将
α
ˉ
t
\sqrt{\bar{\alpha}_t}
αˉt 展开为
α
t
⋅
α
ˉ
t
−
1
\sqrt{\alpha_t} \cdot \sqrt{ \bar{\alpha}_{t-1} }
αt⋅αˉt−1:
=
α
t
(
1
−
α
ˉ
t
−
1
)
1
−
α
ˉ
t
x
t
+
(
1
−
α
t
)
(
1
−
α
ˉ
t
)
α
t
(
x
t
−
1
−
α
ˉ
t
ϵ
t
)
= \frac{ \sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1}) }{1 - \bar{\alpha}_t} \mathbf{x}_t + \frac{(1 - \alpha_t)}{(1 - \bar{\alpha}_t)\sqrt{\alpha_t}} \left( \mathbf{x}_t - \sqrt{1 - \bar{\alpha}_t} \, \epsilon_t \right)
=1−αˉtαt(1−αˉt−1)xt+(1−αˉt)αt(1−αt)(xt−1−αˉtϵt)
将
β
t
\beta_t
βt 替换为
1
−
α
t
1 - \alpha_t
1−αt,分子分母都使用
α
t
\sqrt{\alpha_t}
αt 统一:
=
α
t
(
1
−
α
ˉ
t
−
1
)
α
t
(
1
−
α
ˉ
t
)
x
t
+
(
1
−
α
t
)
(
1
−
α
ˉ
t
)
α
t
x
t
−
(
1
−
α
t
)
(
1
−
α
ˉ
t
)
α
t
1
−
α
ˉ
t
ϵ
t
= \frac{ \alpha_t (1 - \bar{\alpha}_{t-1}) }{ \sqrt{\alpha_t}(1 - \bar{\alpha}_t) } \mathbf{x}_t + \frac{ (1 - \alpha_t) }{ (1 - \bar{\alpha}_t)\sqrt{\alpha_t} } \mathbf{x}_t - \frac{ (1 - \alpha_t) }{ (1 - \bar{\alpha}_t)\sqrt{\alpha_t} } \sqrt{1 - \bar{\alpha}_t} \, \epsilon_t
=αt(1−αˉt)αt(1−αˉt−1)xt+(1−αˉt)αt(1−αt)xt−(1−αˉt)αt(1−αt)1−αˉtϵt
合并同类项(两个
x
t
\mathbf{x}_t
xt 项):
=
(
α
t
−
α
t
+
1
)
α
t
(
1
−
α
ˉ
t
)
x
t
−
(
1
−
α
t
)
(
1
−
α
ˉ
t
)
α
t
1
−
α
ˉ
t
ϵ
t
= \frac{ (\alpha_t - \alpha_t + 1) }{ \sqrt{\alpha_t}(1 - \bar{\alpha}_t) } \mathbf{x}_t - \frac{ (1 - \alpha_t) }{ (1 - \bar{\alpha}_t)\sqrt{\alpha_t} } \sqrt{1 - \bar{\alpha}_t} \, \epsilon_t
=αt(1−αˉt)(αt−αt+1)xt−(1−αˉt)αt(1−αt)1−αˉtϵt
化简得:
= 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ t ) = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_t \right) =αt1(xt−1−αˉt1−αtϵt)
从上式可以看出, μ ~ t \tilde{\mu}_t μ~t 不再依赖于 x 0 \mathbf{x}_0 x0,它只依赖于当前图像 x t \mathbf{x}_t xt 和噪声 ϵ t ∼ N ( 0 , I ) \epsilon_t \sim \mathcal{N}(0, \mathbf{I}) ϵt∼N(0,I)。
因此我们可以将 q ( x t − 1 ∣ x t , x 0 ) q(\mathbf{x}_{t-1}|\mathbf{x}_t, \mathbf{x}_0) q(xt−1∣xt,x0) 表达为如下形式:
q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ t ( x t , x 0 ) , β ~ t I ) q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) = \mathcal{N}(\mathbf{x}_{t-1}; \tilde{\mu}_t(\mathbf{x}_t, \mathbf{x}_0), \tilde{\beta}_t \mathbf{I}) q(xt−1∣xt,x0)=N(xt−1;μ~t(xt,x0),β~tI)
其中:
μ
~
t
=
1
α
t
(
x
t
−
1
−
α
t
1
−
α
ˉ
t
ϵ
t
)
β
~
t
=
β
t
(
1
−
α
ˉ
t
−
1
)
1
−
α
ˉ
t
\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_t \right) \\\\ \tilde{\beta}_t = \frac{ \beta_t (1 - \bar{\alpha}_{t-1}) }{1 - \bar{\alpha}_t}
μ~t=αt1(xt−1−αˉt1−αtϵt)β~t=1−αˉtβt(1−αˉt−1)
我们可以对学习得到的分布 p θ p_\theta pθ 使用类似的公式:
p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \mu_\theta(\mathbf{x}_t, t), \Sigma_\theta(\mathbf{x}_t, t)) pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))
其中:
μ θ = 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ θ ( x t , t ) ) \mu_\theta = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \, \epsilon_\theta(\mathbf{x}_t, t) \right) μθ=αt1(xt−1−αˉt1−αtϵθ(xt,t))
其中 ϵ θ \epsilon_\theta ϵθ 是模型预测出的噪声,用于从 x t − 1 \mathbf{x}_{t-1} xt−1 得到 x t \mathbf{x}_t xt。
对于方差部分, Σ θ = β t I \Sigma_\theta = \beta_t \mathbf{I} Σθ=βtI 和 Σ θ = β ~ t I \Sigma_\theta = \tilde{\beta}_t \mathbf{I} Σθ=β~tI 都可以使用。实际中,它们的效果差异不大。
为了从 x t \mathbf{x}_t xt 得到 x t − 1 \mathbf{x}_{t-1} xt−1,我们可以将该分布转换为如下形式的公式:
x t − 1 = 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ θ ) + β t ( 1 − α ˉ t − 1 ) 1 − α ˉ t z \mathbf{x}_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \, \epsilon_\theta \right) + \frac{\beta_t (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} \mathbf{z} xt−1=αt1(xt−1−αˉt1−αtϵθ)+1−αˉtβt(1−αˉt−1)z
其中 ϵ θ \epsilon_\theta ϵθ 是在时间步 t t t 模型预测的噪声, z ∼ N ( 0 , I ) \mathbf{z} \sim \mathcal{N}(0, \mathbf{I}) z∼N(0,I)。这个计算过程会用于采样阶段。
4 理解扩散模型
理解扩散模型最关键的一点是:我们不是在凭空创造图像,而是在构造一个可以正着加噪、反着去噪的数学过程,这个过程必须足够规则和可控,才能被神经网络有效学习。
前向扩散:一个高斯模糊的马尔可夫链
我们可以把前向过程想象成一个马尔可夫链加模糊滤镜的过程。一开始我们有原图 x 0 x_0 x0,每一步我们都往图像里加一点高斯噪声,像是给图像盖上一层模糊面纱:
- 每一步的操作是: x t = 1 − β t x t − 1 + β t ϵ x_t = \sqrt{1 - \beta_t} x_{t-1} + \sqrt{\beta_t} \epsilon xt=1−βtxt−1+βtϵ;
- ϵ \epsilon ϵ 是从标准正态分布中采样的纯随机噪声;
- 随着 t t t 增大,图像逐渐失真,直到变成几乎纯噪声的 x T x_T xT。
这个过程之所以选用高斯分布,是因为它具有非常好的封闭性:一连串高斯扰动的组合,仍然是高斯分布,这让我们能推导出从任意
x
0
x_0
x0 到
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 是模糊的,我们要推测它最有可能来自哪一张更清晰的图 x t − 1 x_{t-1} xt−1。
关键在于:由于我们知道加噪是高斯操作,我们可以精确推导出
q
(
x
t
−
1
∣
x
t
,
x
0
)
q(x_{t-1} | x_t, x_0)
q(xt−1∣xt,x0) 的真实形式 —— 它仍然是一个高斯分布,并且我们可以计算出它的均值和方差。这一点很重要,它让我们可以用一个神经网络来学习如何从
x
t
x_t
xt 预测出其中的噪声成分
ϵ
θ
(
x
t
,
t
)
\epsilon_\theta(x_t, t)
ϵθ(xt,t),从而近似得到
x
t
−
1
x_{t-1}
xt−1 的分布。最终我们使用下面这个公式从
x
t
x_t
xt 采样出
x
t
−
1
x_{t-1}
xt−1:
x
t
−
1
=
1
α
t
(
x
t
−
1
−
α
t
1
−
α
ˉ
t
ϵ
θ
(
x
t
,
t
)
)
+
σ
t
z
x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right) + \sigma_t z
xt−1=αt1(xt−1−αˉt1−αtϵθ(xt,t))+σtz
其中
z
z
z 是标准高斯噪声,
σ
t
\sigma_t
σt 控制采样过程的“模糊度”。这样,模型就能一步步把图像从“全是噪声”的
x
T
x_T
xT 还原成我们想要的
x
0
x_0
x0。
5 损失函数与变分下界
扩散模型的训练目标是最大化图像的生成概率
log
p
θ
(
x
0
)
\log p_\theta(\mathbf{x}_0)
logpθ(x0)。由于这个目标难以直接优化,DDPM 使用了一个更容易处理的替代目标:变分下界(Variational Lower Bound
, VLB)。我们通过最小化其上界,即负对数似然的变分下界来训练模型。
log p θ ( x 0 ) ≥ log p θ ( x 0 ) − D KL ( q ( x 1 : T ∣ x 0 ) ∥ p θ ( x 1 : T ∣ x 0 ) ) \log p_\theta(\mathbf{x}_0) \geq \log p_\theta(\mathbf{x}_0) - D_{\text{KL}}(q(\mathbf{x}_{1:T}|\mathbf{x}_0) \| p_\theta(\mathbf{x}_{1:T}|\mathbf{x}_0)) logpθ(x0)≥logpθ(x0)−DKL(q(x1:T∣x0)∥pθ(x1:T∣x0))
其中, q ( x 1 : T ∣ x 0 ) q(\mathbf{x}_{1:T}|\mathbf{x}_0) q(x1:T∣x0) 是前向加噪过程, p θ ( x 1 : T ∣ x 0 ) p_\theta(\mathbf{x}_{1:T}|\mathbf{x}_0) pθ(x1:T∣x0) 是模型学习到的反向去噪过程。我们希望模型能够逐步还原出接近真实图像的数据。
KL 散度(Kullback-Leibler divergence)是衡量两个概率分布差异的指标,它的值总是大于等于 0,因此右侧始终小于等于左侧。
基于这一目标,可以推导出以下损失函数(推导过程略):
E [ − log p θ ( x 0 ) ] ≤ E q [ D KL ( q ( x T ∣ x 0 ) ∥ q ( x T ) ) + ∑ t = 2 T D KL ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) − log p θ ( x 0 ∣ x 1 ) ] = L \mathbb{E}[-\log p_\theta(\mathbf{x}_0)] \leq \mathbb{E}_q \left[ D_{\text{KL}}(q(\mathbf{x}_T|\mathbf{x}_0) \| q(\mathbf{x}_T)) + \sum_{t=2}^{T} D_{\text{KL}}(q(\mathbf{x}_{t-1}|\mathbf{x}_t, \mathbf{x}_0) \| p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)) - \log p_\theta(\mathbf{x}_0|\mathbf{x}_1) \right] = L E[−logpθ(x0)]≤Eq[DKL(q(xT∣x0)∥q(xT))+t=2∑TDKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))−logpθ(x0∣x1)]=L
这个损失函数由三部分组成:
-
重建误差项(从最后一步还原图像):
L 0 = log p θ ( x 0 ∣ x 1 ) L_0 = \log p_\theta(\mathbf{x}_0|\mathbf{x}_1) L0=logpθ(x0∣x1) -
初始噪声项(衡量 x T x_T xT 是否接近标准高斯):
L T = D KL ( q ( x T ∣ x 0 ) ∥ q ( x T ) ) L_T = D_{\text{KL}}(q(\mathbf{x}_T|\mathbf{x}_0) \| q(\mathbf{x}_T)) LT=DKL(q(xT∣x0)∥q(xT)) -
去噪拟合项(每一步都需要尽可能复原干净):
L t − 1 = D KL ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) L_{t-1} = D_{\text{KL}}(q(\mathbf{x}_{t-1}|\mathbf{x}_t, \mathbf{x}_0) \| p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)) Lt−1=DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))
实际训练中,通常只保留中间每一步的去噪损失项,并将其简化为均方误差(MSE
)来计算,效率更高、收敛更稳定。
6 总结
扩散模型的魅力就在于它建立了一个结构清晰、数学上对称的生成框架:先用一条固定的马尔可夫链逐步将图像加噪到纯高斯噪声,然后训练一个神经网络去模拟这条链的反向过程,逐步预测和去除每一步的噪声成分。由于前向过程是高斯结构,我们不仅可以快速采样任意时间步的图像,还能解析地推导出真实的后验分布,使模型能够以“预测噪声”的形式高效学习。最终,这种从纯随机中逐步“清晰化”的方式,不仅稳定、可控,而且生成质量极高,成为当前最强大的生成建模方法之一。