DDPM
DDPM 原理详解 (Denoising Diffusion Probabilistic Models)
Pointer
DDPM (Ho et al., 2020) 是现代生成式 Diffusion Model 的基石。它证明了通过训练一个模型来预测噪声,可以从纯高斯噪声中恢复出高质量图像。 本质上,它可以被视为一个固定编码器的分层变分自编码器 (Hierarchical VAE with fixed encoder)。
1. 核心思想
DDPM 定义了两个马尔科夫过程:
- 前向过程 (Diffusion Process, $q$): 固定的加噪过程。将数据 $x_0$ 逐步加噪变成 $x_T \sim \mathcal{N}(0, I)$。
- 反向过程 (Reverse Process, $p$): 学习的去噪过程。从 $x_T$ 开始,逐步去除噪声恢复 $x_0$。
2. 数学原理 (Mathematical Formulation)
2.1 前向加噪 (Forward Process)
给定真实数据 $x_0 \sim q(x_0)$,定义时间步 $t \in [1, T]$。 每一步添加高斯噪声:
$$q(x_t | x_{t-1}) = \mathcal{N}(x_t; \underbrace{\sqrt{1 - \beta_t} x_{t-1}}_{\text{均值}}, \underbrace{\beta_t \mathbf{I}}_{\text{方差}})$$其中 $\beta_t \in (0, 1)$ 是 Variance Schedule(方差调度表)。
公式记忆:调色原理
- 衰减 ($\sqrt{1-\beta_t} x_{t-1}$): 就像倒掉一小部分原液。
- 注入 ($\beta_t \mathbf{I}$): 就像注入等量的白水(噪声)。
- VP (Variance Preserving): 系数平方和 $(\sqrt{1-\beta_t})^2 + (\sqrt{\beta_t})^2 = 1$,保证了混合后的总体积(方差)不变,防止数值爆炸。
概率分布写成 $q(\cdot)$ 的形式比较抽象,我们把它写成**采样方程(Reparameterization Trick)**的形式,也就是你在写 Python 代码时实际会写的算式:
$$x_t = \underbrace{\sqrt{1 - \beta_t} \cdot x_{t-1}}_{\text{保留一部分原来的信息}} + \underbrace{\sqrt{\beta_t} \cdot \boldsymbol{\epsilon}}_{\text{加入一部分新的噪声}}$$其中:
- $\boldsymbol{\epsilon} \sim \mathcal{N}(0, \mathbf{I})$ 是从标准正态分布采样的随机噪声。
- $\beta_t$ 是一个很小的数(比如 0.0001),代表这一步加噪的力度。
重参数化技巧 (Reparameterization Trick) 的推导: 令 $\alpha_t = 1 - \beta_t$, $\bar{\alpha}_t = \prod_{i=1}^t \alpha_i$。 我们可以直接从 $x_0$ 采样任意时刻 $t$ 的 $x_t$(重要性质):
$$q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) \mathbf{I})$$$$x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \boldsymbol{\epsilon}, \quad \boldsymbol{\epsilon} \sim \mathcal{N}(0, \mathbf{I})$$2.2 反向去噪 (Reverse Process)
反向过程的目标是采样 $q(x_{t-1}|x_t)$。当 $\beta_t$ 足够小时,这个分布近似于高斯分布。我们训练神经网络 $p_\theta$ 来拟合它:
$$p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1}; \boldsymbol{\mu}_\theta(x_t, t), \boldsymbol{\Sigma}_\theta(x_t, t))$$在 DDPM 原文中:
- 方差 $\boldsymbol{\Sigma}_\theta$: 设为常数 $\sigma_t^2 \mathbf{I}$ (通常取 $\beta_t$ 或 $\tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t$),不进行学习。
- 均值 $\boldsymbol{\mu}_\theta$: 这是网络需要学习的核心。
2.3 优化目标 (Training Objective)
我们如何优化 $\theta$?通过最大化对数似然的变分下界 (Evidence Lower Bound, ELBO)。 经过一系列数学推导,预测均值 $\boldsymbol{\mu}_\theta$ 的问题被简化为预测噪声 $\boldsymbol{\epsilon}$。
最终的 Simple Loss:
$$L_{\text{simple}}(\theta) = \mathbb{E}_{t, x_0, \epsilon} \left[ \| \boldsymbol{\epsilon} - \boldsymbol{\epsilon}_\theta(x_t, t) \|^2 \right]$$直观理解
网络输入一张充满噪声的图 $x_t$ 和时间步 $t$,它的任务是:“请告诉我,$x_t$ 里加的这一层噪声 $\epsilon$ 是什么?”。如果预测准了,我们就能把噪声减掉,还原出更清晰的图像。
3. 关键组件 (Key Components)
3.1 网络架构 (UNet + Attention)
DDPM 使用 U-Net 作为骨干网络 $\boldsymbol{\epsilon}_\theta(x_t, t)$。
- Time Embedding: 类似 Transformer 的 Positional Encoding,将时间 $t$ 映射为向量,注入到 UNet 的每个 Residual Block 中,告诉网络当前处理的是哪个噪声强度的阶段。
- Self-Attention: 在低分辨率层加入 Self-Attention 机制,以捕获全局上下文。
3.2 采样算法 (Sampling)
从纯噪声 $x_T$ 逐步生成 $x_0$ 的算法:
- 采样 $x_T \sim \mathcal{N}(0, I)$
- For $t = T, \dots, 1$ do:
- 采样 $z \sim \mathcal{N}(0, I)$ (若 $t=1$ 则 $z=0$)
- 计算去噪后的均值: $$\boldsymbol{\mu}_{\theta}(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta(x_t, t) \right)$$
- 加回一点随机性 (Langevin Dynamics 思想): $$x_{t-1} = \boldsymbol{\mu}_{\theta}(x_t, t) + \sigma_t z$$
- Return $x_0$
3.3 Variance Schedule ($\beta_t$ 的选择)
- Linear Schedule (DDPM原版): $\beta_t$ 从 $10^{-4}$ 线性增长到 $0.02$。缺点是在 $t$ 很大和很小时,信噪比变化不均匀。
- Cosine Schedule (Improved DDPM): 让 $\bar{\alpha}_t$ 按余弦函数下降。这种策略在 $t$ 接近 0 或 T 时变化更平滑,效果更好,是目前的默认选择。
4. 优缺点分析
| 优点 | 缺点 |
|---|---|
| 生成质量极高 (SOTA Image Quality) | 采样速度慢 (需迭代 1000 步) |
| 训练稳定 (不易发生 Mode Collapse) | 计算开销大 |
| 数学推导严谨 (基于 ELBO) |
注:后续的 DDIM, IDDPM, Rectified Flow 主要是为了解决采样速度慢的问题。