扩散模型 DDPM:从去噪过程到图像生成
引言:为什么扩散模型被称为“图像生成的新范式”
扩散模型(Diffusion Probabilistic Models)是近年来生成模型领域最引人注目的突破之一,它不仅能够生成高质量的图像,还为音频、视频、分子结构等领域的生成任务提供了统一的框架。其中,DDPM(Denoising Diffusion Probabilistic Models) 作为奠基之作,以优雅的数学形式和稳定的训练过程,颠覆了人们对生成模型的固有认知。
在本文中,我们将用初学者的视角,从最核心的去噪过程出发,一步一步揭开 DDPM 是如何从完全混乱的噪声中“雕刻”出清晰图像的。你不需要预先具备概率模型的知识,只需跟随我们的解释,就能理解这个改变游戏规则的技术。
直观理解:扩散模型像什么?
想象一下,你有一张清晰的照片。如果你不断地往这张照片上滴入极小的、不可察觉的噪声,经过足够多次后,照片会逐渐变得模糊,最终完全变成一团随机噪声。这个过程就是“前向扩散过程”。
现在,如果我们能够学会反向过程——即从这团噪声中,一步一步地将噪声“剔除”出去,直到恢复出一张完全正确的照片,那么我们不就拥有了一台能够从纯噪声中“创造”图像的机器吗?
这正是 DDPM 的核心思想:学习一个反向去噪过程,从而将噪声转化为数据样本。
数学模型:前向过程与马尔可夫链
DDPM 将前向过程定义为一个马尔可夫链。给定一张真实图像 $x_0$(假设像素值已归一化到 $[-1, 1]$ 或 $[0, 1]$),我们通过 $T$ 个时间步逐步加入高斯噪声,生成一系列从 $x_1$ 到 $x_T$ 的含噪样本。
前向过程的每一步由下面的条件概率分布描述:
$$ q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I}) $$
其中,$\beta_t \in (0, 1)$ 是预先定义好的方差调度参数(例如线性递增)。$T$ 通常设置为 $1000$ 这样的大数。这个公式意味着:每一步我们从 $x_{t-1}$ 出发,先缩小它的系数($\sqrt{1-\beta_t}$ 倍),再添加一份方差为 $\beta_t$ 的高斯噪声。
重参数化技巧让一步到位成为可能
上述过程有一个绝妙的性质:我们不需要一步一步迭代,就能直接从 $x_0$ 计算出任意时刻 $t$ 的 $x_t$。
定义 $\alpha_t = 1 - \beta_t$,以及 $\bar{\alpha}t = \prod{i=1}^t \alpha_i$,那么:
$$ q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t}, x_0, (1 - \bar{\alpha}_t) \mathbf{I}) $$
这意味着,给定一张初始图像 $x_0$,我们只需采样一个高斯噪声 $\epsilon \sim \mathcal{N}(0, \mathbf{I})$,就可以得到:
$$ x_t = \sqrt{\bar{\alpha}_t}, x_0 + \sqrt{1 - \bar{\alpha}_t}, \epsilon $$
这为训练创造了极大的便利:我们可以随机采样时间步 $t$,生成对应的含噪样本 $x_t$,然后要求模型去预测其中的噪声成分。
反向过程:学习如何“去噪”
反向过程 $p_\theta(x_{t-1} | x_t)$ 是我们需要学习的去噪模型。同样地,它也被建模为一个马尔可夫链,其中的每一步都是可学习的高斯转换:
$$ p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)) $$
这里的 $\mu_\theta$ 和 $\Sigma_\theta$ 通常由一个神经网络(比如 U-Net)来参数化,它以当前含噪图像 $x_t$ 和时间步 $t$ 作为输入。
简化预测目标:只需预测噪声
DDPM 的论文提出了一个极其实用的简化:固定方差 $\Sigma_\theta$ 为一个不学习的常数 $\sigma_t^2 \mathbf{I}$(通常 $\sigma_t^2 = \beta_t$ 或 $\tilde{\beta}t$),然后让模型去预测**均值 $\mu\theta$**。进一步地,通过对损失函数的推导,我们发现训练目标可以转化为:
训练一个网络 $\epsilon_\theta(x_t, t)$,让它去预测添加到 $x_0$ 上的噪声 $\epsilon$。
最终,损失函数极其简单:
$$ \mathcal{L}{\text{simple}} = \mathbb{E}{t, x_0, \epsilon} \left[ | \epsilon - \epsilon_\theta(x_t, t) |^2 \right] $$
其中 $x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon$,$\epsilon \sim \mathcal{N}(0, I)$,$t$ 从 ${1, \dots, T}$ 中均匀采样。
这个损失就是让模型学会根据当前的噪声图像和时间步,准确地指出“原来的噪声长什么样”。一旦模型能够预测噪声,我们就得到了去噪的均值:
$$ \mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}t}} \epsilon\theta(x_t, t) \right) $$
采样(生成):从噪声中一步一步创造图像
训练好噪声预测网络 $\epsilon_\theta$ 后,我们就能从纯随机噪声 $x_T \sim \mathcal{N}(0, \mathbf{I})$ 出发,通过 $T$ 步反向迭代,最终得到一张高质量的图像 $x_0$。
采样算法如下(简化版):
- 初始化 $x_T \sim \mathcal{N}(0, \mathbf{I})$
- 对于 $t = T, T-1, \dots, 1$:
- 如果 $t > 1$,采样 $z \sim \mathcal{N}(0, \mathbf{I})$,否则 $z = 0$
- 计算: $$ x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}t}} \epsilon\theta(x_t, t) \right) + \sigma_t z $$
- 返回 $x_0$(通常需要缩放到图像像素范围)
注意,最后一步中我们也会添加额外噪声(除了 $t=1$),这有助于提升生成样本的多样性。
网络架构:U-Net 的回归舞台
DDPM 选用 U-Net 作为骨干网络,因为它在像素级预测任务中表现出色,且能够很好地保留图像的空间结构。为了让网络感知当前的时间步 $t$,U-Net 中大量使用时间嵌入(time embedding):将 $t$ 编码成正弦位置编码,然后通过全连接层和特征图相加或融合,让网络的每一层都知道“我们现在正在处理扩散的哪一阶段”。
此外,DDPM 还引入了 自注意力层(self-attention) 来捕捉图像的全局依赖,这对于生成具有复杂内容的图像至关重要。
关键设计选择与技巧
1. 方差调度 $\beta_t$
$\beta$ 序列决定了噪声添加的速度。常见选择是线性递增(如从 $10^{-4}$ 到 $0.02$),保证在 $T$ 步时 $\bar{\alpha}_T$ 趋近于 0,使得 $x_T$ 接近标准高斯分布。
2. 时间步数 $T$
$T$ 越大,反向过程越接近连续扩散过程,生成质量通常更好,但推理速度越慢。DDPM 默认 $T=1000$,足以生成高质量的 $256\times256$ 图像。
3. 共享网络还是不共享?
DDPM 训练一个网络处理所有时间步,这迫使网络学习在不同噪声程度下的去噪能力,极大地提升了参数效率。
4. 损失加权
$\mathcal{L}_{\text{simple}}$ 对所有时间步使用相同权重。然而研究指出,不同时间步的损失尺度差异很大。实践中,这个简单损失已经能产生非常好的结果。后续工作(如改进的 DDPM)会通过调整权重进一步提升样本质量。
从理论到实践:简单的训练循环
以下是伪代码,帮助你理解 DDPM 训练的最核心流程:
for batch in dataloader:
x0 = batch # 真实图像
t = uniform_sample(1, T) # 采样一个时间步
epsilon = normal(0, I) # 随机噪声
xt = sqrt(alpha_bar[t]) * x0 + sqrt(1 - alpha_bar[t]) * epsilon
predicted_noise = model(xt, t)
loss = mse(epsilon, predicted_noise)
optimizer.zero_grad()
loss.backward()
optimizer.step()
这个过程极为稳定,不需要对抗训练,也不需要精巧的平衡技巧——这也是扩散模型被广泛采用的重要原因。
总结与延伸
DDPM 的精髓可以用三句话概括:
- 前向过程:不断加噪声,直到图像变纯噪声。
- 反向过程:训练一个网络,从纯噪声开始,逐步去噪重建图像。
- 训练秘诀:让网络预测每一步添加的噪声,回归损失简单而有效。
掌握了 DDPM,你就揭开了当今大部分扩散生成模型的神秘面纱。在此基础上的改进如 DDIM(加速采样)、条件扩散模型(文本驱动图像生成,如 Stable Diffusion)、潜在扩散模型(在压缩空间中扩散)等,都是围绕这个核心框架展开的优化和扩展。
如果你希望自己动手实现一个 DDPM,不妨从经典的 MNIST 或 CIFAR-10 数据集开始,你将亲眼见证一团随机噪声如何奇迹般地演变为数字或照片。这正是扩散模型的魅力所在。