论文: 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]$$
- 老师(前向过程)知道正确答案:第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}$”,我们就能算出上一时刻的图像。