WhiteDLG

扩散模型 (Diffusion Models)

2026-02-05 Generative AI DDPM Theory

论文: https://arxiv.org/abs/2006.11239

官方代码: hojonathanho/diffusion

HuggingFace实现: huggingface/diffusers

扩散模型理论基石

扩散模型(DDPM)的理论基石,可分为逆向过程(生成)、前向过程(加噪)、优化目标以及任意时刻采样性质四个部分来理解。

1. 逆向过程 (Reverse Process)

公式:

$$p_\theta(\mathbf{x}_{0:T}) := p(\mathbf{x}_T) \prod_{t=1}^T p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)$$

其实就是最后一次出现 $p(\mathbf{x})$ 的概率乘上之前每一步的概率。

$$p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t) := \mathcal{N}(\mathbf{x}_{t-1}; \boldsymbol{\mu}_\theta(\mathbf{x}_t, t), \boldsymbol{\Sigma}_\theta(\mathbf{x}_t, t))$$

参数含义:

  • $\mathbf{x}_0$: 真实数据样本(例如一张清晰的图片)。
  • $\mathbf{x}_T$: 纯高斯噪声。
  • $\theta$: 神经网络的可学习参数。
  • $\boldsymbol{\mu}_\theta(\mathbf{x}_t, t)$: 神经网络预测的均值。这是扩散模型的核心,模型需要输入当前的噪点图 $\mathbf{x}_t$ 和时间步 $t$,输出去噪后的图像均值。
这一部分在学习修复(去噪):
假设现在的任务是倒放录像:给AI看那张完全被沙子覆盖的图,问它:“你能猜出上一秒(沙子稍微少一点的时候)这张图长什么样吗?”
- AI并不需要一步从“雪花屏”变回“高清图”。AI只需要学会每次只清理一点点沙子(从 $t$ 时刻推导 $t-1$ 时刻)。
- 物理意义: 如果我们把生成过程看作雕刻,这就像是从一块完全随机的石头($\mathbf{x}_T$)开始,每一步根据神经网络的指导,切掉一点点多余的部分,最终得到艺术品。

2. 前向过程 (Forward Process)

这是数据加噪的过程,不含神经网络参数,是固定的数学过程。

$$q(\mathbf{x}_{1:T}|\mathbf{x}_0) := \prod_{t=1}^T q(\mathbf{x}_t|\mathbf{x}_{t-1})$$ $$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})$$

物理意义:
这就像往一杯清水($\mathbf{x}_0$)里滴墨水。每过一秒($t-1$ 到 $t$),水就变得更浑浊一点,直到最后完全变成一团漆黑的墨水($\mathbf{x}_T$)。
$\beta_t$ 是控制“破坏速度”的油门。它决定每一步加多少噪,进而决定了 AI 在逆向过程中每一步需要去除多少噪。

3. 优化目标 (Loss Function)

利用变分推断(Variational Inference)告诉我们如何训练:

$$L = \mathbb{E}_q \left[ -\log p(\mathbf{x}_T) - \sum_{t \geq 1} \log \frac{p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)}{q(\mathbf{x}_t|\mathbf{x}_{t-1})} \right]$$

怎么判断AI学得好不好呢?
- 老师(前向过程)知道正确答案:第50步加的沙子具体是哪几粒。
- 学生(AI)预测说:“我觉得这几粒是沙子,应该拿掉。”
- 找茬(Loss): 比较“老师实际加的沙子”和“AI预测也是沙子的部分”。如果两者很像(KL散度小),老师就给高分。

4. 任意时刻采样性质

可以直接算出任意时刻 $t$ 的噪声图像分布:

$$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})$$

物理意义:
这个公式允许我们在训练时直接“跳跃”。我们不需要模拟撒500次沙子,可以直接通过公式算出混合比例,瞬间合成出第500步的样子给AI看。这极大地加快了训练速度。

隐变量与马尔可夫链

什么是隐变量 (Latent Variables)?

扩散模型是一类形式为 $p_\theta(\mathbf{x}_0) := \int p_\theta(\mathbf{x}_{0:T}) \, d\mathbf{x}_{1:T}$ 的隐变量模型。在现实世界中,我们观察到的数据(如人脸)往往由看不见的因素(如性别、表情)决定。

  • $\mathbf{x}_0$ 是观察到的数据(图片)。
  • $\mathbf{x}_1, \dots, \mathbf{x}_T$ 都是隐变量。

使用隐变量可以实现降维、特征提取,并赋予模型强大的生成能力——只要掌握了 $z$ 的规律,就能生成世界上不存在的数据。

从马尔可夫链看损失函数

Loss 的本质是对齐两个视角:

  • 视角 A (老师 $q$): 全知视角。手里有原图 $\mathbf{x}_0$,能精准算出 $\mathbf{x}_{t-1}$ 应该长什么样。
  • 视角 B (学生 $p_\theta$): 蒙眼视角。手里没原图,只能看着噪声硬猜。

训练就是把巨大的难题拆成1000个小测验。只要你模拟卷分高(优化变分下界 ELBO),考上清华(生成高质量图片)的概率就大。

扩散模型和去噪自动编码器

1. 关于方差 $\Sigma_\theta$ 的处理

作者决定不训练方差,直接设为常数 $\sigma_t^2$(如 $\beta_t$)。这极大地简化了模型,网络只需要专心预测均值 $\boldsymbol{\mu}_\theta$。

2. 从 KL 散度到 MSE

对于方差相同的两个高斯分布,KL 散度简化为均值之间的欧氏距离:$KL \propto \|\mu_1 - \mu_2\|^2$。公式(8)告诉我们,训练就像是在做简单的均方误差回归。

3. 伟大的代数替换

通过代数运算,公式(10)揭示了一个奇迹:

$$\tilde{\boldsymbol{\mu}}_t = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}}\boldsymbol{\epsilon} \right)$$

核心结论:
让神经网络预测整张图太难了。通过公式变形我们发现,只要让神经网络预测“这一步加了什么噪声 $\boldsymbol{\epsilon}$”,我们就能算出上一时刻的图像。
  Tags: Diffusion Models, DDPM, Generative AI, Latent Variables