这一讲是整个 diffusion 系列里最关键、最优美的一讲——它把 Sohl-Dickstein 的”理论上正确但实际不好用”的框架,改造成了”现代 diffusion 的标准形式”。所有后续工作(Stable Diffusion、Imagen、SDXL、FLUX 等)都建立在 DDPM 之上。
我会按这个顺序展开:
- DDPM 的贡献概览
- 关键引理:$q(x_{t-1} \mid x_t, x_0)$ 是高斯,有闭式
- 用贝叶斯重写 ELBO,得到 KL 之和
- 化简 KL,从 $\mu$-预测到 $\epsilon$-预测
- $L_{\text{simple}}$ 的诞生
- 训练和采样算法
一、DDPM 的核心贡献
Ho et al. 2020 的论文(“Denoising Diffusion Probabilistic Models”)做了三件事:
- 数学改写:用贝叶斯把 ELBO 改成”两个高斯之间 KL”的求和——每一项都有闭式
- 重参数化:把网络的预测目标从均值 $\mu_\theta$ 换成噪声 $\epsilon_\theta$,损失变成简单的 MSE
- 工程突破:UNet 架构 + 时间嵌入,在 CIFAR-10 上首次达到 GAN 级别的质量
这一讲专注前两件事——它们是数学上的核心,理解了它们,后面的所有 diffusion 工作你都能秒懂。
二、关键引理:$q(x_{t-1} \mid x_t, x_0)$ 是闭式高斯
这是整个 DDPM 推导的基石。让我们看它说什么、为什么重要、怎么算。
2.1 它是什么?
注意条件:给定 $x_t$ 和 $x_0$,求 $x_{t-1}$ 的分布。
为什么要加 $x_0$?因为没有 $x_0$ 时,$q(x_{t-1} \mid x_t)$(真实的逆向条件分布)没有闭式——它要对所有可能的 $x_0$ 边际化,涉及对真实数据分布的积分。
但条件在 $x_0$ 上之后,问题变得 tractable——这是因为给定 $x_0$,前向过程是一条已知的高斯链。
2.2 直观
想象一个三角形:
1 | x_0 |
我们已经知道:
- $q(x_{t-1} \mid x_0)$:从 $x_0$ 一步跳到 $x_{t-1}$ 的高斯(用边际公式)
- $q(x_t \mid x_{t-1})$:前向一步的高斯
- $q(x_t \mid x_0)$:从 $x_0$ 跳到 $x_t$ 的高斯
三者都是高斯,且都已知。用贝叶斯把它们组合,就能得到 $q(x_{t-1} \mid x_t, x_0)$。
2.3 推导
贝叶斯公式(条件版本):
注意 $q(x_t \mid x_{t-1}, x_0) = q(x_t \mid x_{t-1})$(因为前向是马尔可夫,$x_t$ 只依赖 $x_{t-1}$)。所以:
三个都是高斯:
- $q(x_t \mid x_{t-1}) = \mathcal{N}(x_t;\, \sqrt{\alpha_t} x_{t-1},\, \beta_t I)$,其中 $\alpha_t = 1 - \beta_t$
- $q(x_{t-1} \mid x_0) = \mathcal{N}(x_{t-1};\, \sqrt{\bar\alpha_{t-1}} x_0,\, (1-\bar\alpha_{t-1}) I)$
- $q(x_t \mid x_0) = \mathcal{N}(x_t;\, \sqrt{\bar\alpha_t} x_0,\, (1-\bar\alpha_t) I)$
把高斯密度的表达式代入,展开 $\log$,合并 $x_{t-1}$ 的二次项和一次项——结果一定还是个关于 $x_{t-1}$ 的高斯(因为指数里是 $x_{t-1}$ 的二次型)。
2.4 闭式结果
整理后,$q(x_{t-1} \mid x_t, x_0) = \mathcal{N}(x_{t-1}; \tilde\mu_t(x_t, x_0), \tilde\beta_t I)$,其中:
关键观察:
- 均值 $\tilde\mu_t$ 是 $x_0$ 和 $x_t$ 的线性组合——非常干净
- 方差 $\tilde\beta_t$ 不依赖于 $x_0$ 或 $x_t$,只依赖于 $t$ 和预设的 $\beta_t$
- 所有项都用 schedule 中已知的 $\alpha, \bar\alpha, \beta$ 算出,没有任何待估计的量
这个公式是 DDPM 数学的核心引擎——后面的一切都建立在它上面。
(完整推导见附录1)
三、用贝叶斯重写 ELBO
回忆 Sohl-Dickstein 的 ELBO:
我们之前指出问题:每一项分子是前向 $q(x_t \mid x_{t-1})$,分母是逆向 $p_\theta(x_{t-1} \mid x_t)$,条件方向不一致,不是 KL 形式,无法用闭式。
DDPM 的修复:用贝叶斯把分子的方向翻过来。
3.1 贝叶斯翻转
由马尔可夫性,$q(x_t \mid x_{t-1}) = q(x_t \mid x_{t-1}, x_0)$(条件在 $x_0$ 上不影响)。再用贝叶斯:
代回 ELBO 的求和项(对 $t \geq 2$ 做这件事,$t=1$ 单独处理):
把 $\log$ 拆开:
3.2 第二个求和:望远镜求和(telescoping)
第二个求和是个望远镜结构:
(中间所有项依次抵消,这就是望远镜求和的威力)
3.3 处理 $t=1$ 项
把 $t=1$ 的项 $\log \frac{q(x_1 \mid x_0)}{p_\theta(x_0 \mid x_1)}$ 拿出来,和望远镜结果合并:
3.4 整合
把所有项放回 $-\mathcal{L}$:
把前两项合并成一个 KL:
它的期望是 $D_{\text{KL}}(q(x_T \mid x_0) | p(x_T))$。
中间求和的每一项 $\log \frac{q(x_{t-1} \mid x_t, x_0)}{p_\theta(x_{t-1} \mid x_t)}$ 在期望下也是 KL。所以最终:
这是 DDPM 论文里 Eq. (5) 的著名形式。
3.5 三项的物理意义
- $L_T$:最终噪声分布要接近先验 $p(x_T) = \mathcal{N}(0, I)$。不依赖 $\theta$(因为 $q$ 不学),训练时是常数,直接忽略
- $L_{t-1}$($t = 2, \ldots, T$):每一步的逆向匹配——这是训练的核心
- $L_0$:最后一步从 $x_1$ 重建 $x_0$,作为离散数据时的对数似然项
所以实际训练时,我们最关心的就是中间这一项 $L_{t-1}$。
四、化简 $L_{t-1}$:核心一步
现在魔法发生。$L_{t-1}$ 是两个高斯之间的 KL:
- $q(x_{t-1} \mid x_t, x_0) = \mathcal{N}(\tilde\mu_t(x_t, x_0), \tilde\beta_t I)$ ← 闭式,刚才推过
- $p_\theta(x_{t-1} \mid x_t) = \mathcal{N}(\mu_\theta(x_t, t), \Sigma_\theta(x_t, t))$ ← 网络输出
DDPM 做了一个简化:固定方差不学。设 $\Sigma_\theta = \sigma_t^2 I$,其中 $\sigma_t^2$ 是预设的(取 $\beta_t$ 或 $\tilde\beta_t$ 都行,论文实验两者效果相近,详细解释见附录2)。
(为什么可以固定方差?因为 $\tilde\beta_t$ 已经是闭式且不依赖 $x_0, x_t$,网络再去学一个方差既冗余又不稳。Improved DDPM 后来证明学方差能略微提升似然,但 DDPM 原版坚持固定。)
固定方差后,套用各向同性高斯 KL 闭式公式:
得到:
其中 $C$ 不依赖于 $\theta$。训练目标变成了一个 MSE:让网络输出的 $\mu_\theta$ 逼近真实后验均值 $\tilde\mu_t$。
这已经是巨大的进步——但 DDPM 还要再走一步。
五、从 $\mu$-预测到 $\epsilon$-预测
5.1 重写 $\tilde\mu_t$
$\tilde\mu_t$ 的原始公式包含 $x_0$,但训练时网络看到的是 $x_t$,看不到 $x_0$。我们用重参数化把 $x_0$ 表达成 $x_t$ 和 $\epsilon$ 的函数。
由 $x_t = \sqrt{\bar\alpha_t} x_0 + \sqrt{1-\bar\alpha_t}\, \epsilon$:
代入 $\tilde\mu_t$ 的公式(代入后大量代数化简,这一步比较繁琐但纯机械):
这个形式非常优美:$\tilde\mu_t$ 是 $x_t$ 减去”按比例缩放后的噪声”。
5.2 让 $\mu_\theta$ 取相同的参数化形式
既然真实后验均值长这样,我们让模型输出也长这样:
这里的 $\epsilon_\theta(x_t, t)$ 是一个新网络——给定 $x_t$ 和 $t$,预测一个噪声。这是个重参数化选择——我们把”输出 $\mu_\theta$”换成等价地”输出 $\epsilon_\theta$”。
5.3 损失变成噪声 MSE
代入 $L_{t-1}$:
代回 $L_{t-1}$ 的完整表达:
这是一个加权 MSE——权重依赖于 $t$,但损失函数本身就是”预测噪声”的 MSE。
六、$L_{\text{simple}}$ 的诞生
DDPM 论文做了最后一个决定性的简化:把权重扔掉,得到
其中 $t \sim \text{Uniform}(1, T)$,$x_0 \sim p_{\text{data}}$,$\epsilon \sim \mathcal{N}(0, I)$,$x_t = \sqrt{\bar\alpha_t} x_0 + \sqrt{1-\bar\alpha_t} \epsilon$。
这是整个 diffusion 训练的”圣杯”——一个干净的、无权重的 MSE。
6.1 为什么扔权重?
理论上原始权重 $\beta_t^2 / (2\sigma_t^2 \alpha_t (1-\bar\alpha_t))$ 是 ELBO 的一部分,扔了就不再是严格的最大似然。但 DDPM 实验发现:扔了之后效果反而更好。
直觉:原始权重对小 $t$(噪声小)的项加很大权,而那些项的”信号”实际上很弱——网络在小噪声时容易学,学到的细节对生成质量影响不大。扔掉权重相当于让网络在所有 $t$ 上均匀重视,实际上这强化了大噪声时的学习,而大噪声时的去噪决定了生成图像的整体结构,更重要。
后来研究者发现,$L_{\text{simple}}$ 等价于一种”去权重”的最大似然——不是严格的 ELBO,但仍然是个合理的 surrogate。
6.2 与 score matching 的对应
把 $\epsilon$-预测和 score 联系起来。从 $x_t = \sqrt{\bar\alpha_t} x_0 + \sqrt{1-\bar\alpha_t} \epsilon$,我们有
所以”预测 $\epsilon$”和”预测 score”只差一个标量 $-1/\sqrt{1-\bar\alpha_t}$:
两条线在这里完全对上了——DDPM 的 $\epsilon$-预测和 NCSN 的 score-预测在数学上是同一件事。这正是下一讲 Score SDE 要正式统一的内容。
七、训练算法
完整训练流程:
1 | for each iteration: |
仅仅 5 行——这就是 DDPM 训练的全部。回头看 Sohl-Dickstein 那种”整条链采样、逐项算对数比值”的复杂流程,简洁度天差地别。
八、采样算法
训练完后,从纯噪声生成图像:
1 | x_T ~ N(0, I) # 起点:纯噪声 |
每一步的核心:预测噪声 → 算后验均值 → 加一点新噪声,$T$ 次后得到一张图。
注意采样要走 $T = 1000$ 步(DDPM 默认)——这慢,是 DDPM 最大的工程问题。后面 DDIM、DPM-Solver 等专门解决这个问题(下一讲后展开)。
九、复盘:为什么这一切如此优雅?
让我们回头看,DDPM 究竟做了什么:
- 加了一个条件 $x_0$:$q(x_{t-1} \mid x_t)$ 不闭式 → $q(x_{t-1} \mid x_t, x_0)$ 闭式
- 用贝叶斯翻转方向:让 ELBO 的每一项变成两个高斯的 KL
- 套高斯 KL 闭式:KL → MSE
- 重参数化预测目标:$\mu_\theta \to \epsilon_\theta$
- 去掉权重:得到 $L_{\text{simple}}$
每一步都是把”复杂、不闭式、方向不对”的形式替换成”简单、闭式、可训练”的形式。最终结果:
- 训练 loss 一行 MSE
- 训练 5 行代码
- 完全消除蒙特卡洛的内层方差
- 数值稳定、效果惊艳
这就是 DDPM 比 Sohl-Dickstein 好的本质——不是改了模型,而是改了表达方式。同一个模型,换个写法,从难训变成易训,从凑合到 SOTA。
十、要点回顾
- DDPM 没有改 Sohl-Dickstein 的模型,只改了表达方式
- 关键引理:$q(x_{t-1} \mid x_t, x_0)$ 是闭式高斯,均值 $\tilde\mu_t$ 是 $x_0, x_t$ 的线性组合
- 贝叶斯重写:把 ELBO 改成”$L_T + \sum L_{t-1} + L_0$”的形式
- $L_T$ 是常数,$L_0$ 单独处理,核心训练是 $L_{t-1}$
- $L_{t-1}$ 是两个高斯 KL → 闭式 MSE on $\mu_\theta$
- 重参数化 $\mu_\theta \to \epsilon_\theta$,变成噪声预测
- $L_{\text{simple}}$ 去掉权重,纯 MSE
- $\epsilon$-预测和 score-预测只差一个标量,两条线在此对接
附录1:怎么用贝叶斯化简 $q(x_{t-1}|x_t,x_0)$
这个推导是”高斯运算”的经典练习——纯代数,但每一步都要清楚。我会用配方法(completing the square)系统推完。这是 diffusion 推导里最技术性的一段,但理解了它,后面所有”高斯之间的运算”你都会做。
一、起点:贝叶斯展开
我们要推:
三个高斯都已知:
(其中 $\alpha_t = 1-\beta_t$,$\bar\alpha_t = \prod_{s=1}^t \alpha_s$)
总策略:取对数,只看依赖 $x_{t-1}$ 的项,把它整理成”$x_{t-1}$ 的二次型 + 常数”,对照高斯标准形式读出均值和方差。
为什么这个策略行?因为:任何关于 $x_{t-1}$ 的表达,如果它的对数是 $x_{t-1}$ 的二次型,那它就是关于 $x_{t-1}$ 的高斯。高斯被均值和方差完全确定,所以读出二次型的系数就够了。
二、写出对数
取对数(乘除 → 加减):
第三项 $\log q(x_t \mid x_0)$ 不依赖 $x_{t-1}$,作为常数处理(吸收到归一化里)。
剩下两项,代入高斯密度公式 $\log \mathcal{N}(z; \mu, \sigma^2 I) = -\frac{1}{2\sigma^2}| z - \mu |^2 + \text{const}$(为了简洁我用了一维记号,多维各向同性同理):
第一项:
第二项:
合并:
三、展开 $x_{t-1}$ 的二次型
我们的目标是把方括号里的部分整理成关于 $x_{t-1}$ 的形式:
读出 $A$ 和 $B$ 后,均值方差就出来了。
第一块展开
只看依赖 $x_{t-1}$ 的项:
第二块展开
只看依赖 $x_{t-1}$ 的项:
合并两块
$x_{t-1}$ 的二次项系数 $A$:
$x_{t-1}$ 的一次项系数 $B$(指 $-2 B^\top x_{t-1}$ 的 $B$):
四、配方法读出均值和方差
回忆标准高斯的对数(忽略常数):
所以标准形式中的二次项系数和一次项 $B$ 满足:
- 二次项系数 = $\frac{1}{\tilde\sigma^2}$
- 一次项系数 $B$ = $\frac{\tilde\mu}{\tilde\sigma^2}$
(注意我们的合并公式整体外面有一个 $-\frac{1}{2}$,所以提取的就是这个对应关系)
对照得到:
所以:
五、化简 $\tilde\sigma^2$
通分:
化简分母。用 $\beta_t = 1 - \alpha_t$:
而 $\alpha_t \bar\alpha_{t-1} = \bar\alpha_t$(因为 $\bar\alpha_t = \prod_{s=1}^t \alpha_s = \alpha_t \prod_{s=1}^{t-1} \alpha_s = \alpha_t \bar\alpha_{t-1}$),所以分母是 $1 - \bar\alpha_t$。
得到:
完美——这就是 DDPM 公式里的方差。
六、化简 $\tilde\mu_t$
把 $\tilde\sigma^2$ 分配进去:
$x_t$ 的系数:
$x_0$ 的系数:
合起来:
完美——这就是 DDPM 公式里的均值。✓
七、检查一致性(sanity check)
数学推导要会自检,看这个结果合不合理。
检查 1:$x_0$ 和 $x_t$ 的系数加起来应该接近什么?
让我们看极端情况。当 $t = 1$ 时,$\bar\alpha_{t-1} = \bar\alpha_0 = 1$,$\bar\alpha_t = \alpha_1$:
- $x_0$ 系数:$\frac{\sqrt{1} \cdot \beta_1}{1-\alpha_1} = \frac{\beta_1}{\beta_1} = 1$
- $x_t$ 系数:$\frac{\sqrt{\alpha_1}(1-1)}{1-\alpha_1} = 0$
所以 $\tilde\mu_1 = x_0$ —— 当 $t = 1$ 时,逆向后验完全集中在 $x_0$,没有不确定性(方差也应该是 0,我们检查:$\tilde\beta_1 = \frac{1-1}{1-\alpha_1}\beta_1 = 0$ ✓)。
直觉解释:已知 $x_0$ 和 $x_1$,要问 $x_0$ 是什么——当然就是 $x_0$ 本身,完全确定。
检查 2:当 $t$ 很大、$\bar\alpha_t \to 0$ 时:
- $x_0$ 系数 $\approx \sqrt{\bar\alpha_{t-1}} \beta_t \to 0$
- $x_t$ 系数 $\approx \sqrt{\alpha_t}$
也就是 $\tilde\mu_t \approx \sqrt{\alpha_t}\, x_t$。当噪声非常大时,$x_0$ 信息被噪声完全淹没,逆向后验主要由 $x_t$ 决定——也合理。
检查 3:方差 $\tilde\beta_t < \beta_t$ 吗?
$\tilde\beta_t = \frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t} \beta_t$。因为 $\bar\alpha_{t-1} > \bar\alpha_t$,有 $1-\bar\alpha_{t-1} < 1-\bar\alpha_t$,所以 $\tilde\beta_t < \beta_t$ ✓。
直觉:已知 $x_0$ 和 $x_t$ 之后,我们对 $x_{t-1}$ 的不确定性,比单纯看前向加噪 $\beta_t$ 要小——多了 $x_0$ 这个信息,后验就更窄。合理。
八、技巧总结:配方法的精髓
整个推导的核心是配方法——给一个二次型,读出均值方差。让我把这个”模板”提炼出来,因为它在 diffusion / VAE / 高斯过程里反复出现。
模板:如果一个分布的对数密度(忽略常数)长这样
那这个分布就是高斯,均值 $\mu = B/A$,方差 $\sigma^2 = 1/A$。
实践三步:
- 把所有”高斯乘积/比值”取对数,变成一堆二次型相加
- 收集所有 $| z |^2$ 的系数得 $A$,所有 $z^\top$ 的系数得 $B$
- 读出 $\mu = B/A$,$\sigma^2 = 1/A$,完成
整个过程不需要任何创意,纯机械。学会这个,你以后看 diffusion 各种高斯运算都不会怕。
一个更几何的视角
更深一层:这个推导本质是”两个高斯的乘积还是高斯”——更准确地说,两个关于 $x_{t-1}$ 的高斯的乘积,得到一个新的关于 $x_{t-1}$ 的高斯,新的精度(precision = 方差的倒数)是两个精度之和。
具体到我们这里:
- $q(x_t \mid x_{t-1})$ 看作 $x_{t-1}$ 的函数,精度是 $\alpha_t / \beta_t$
- $q(x_{t-1} \mid x_0)$ 看作 $x_{t-1}$ 的函数,精度是 $1/(1-\bar\alpha_{t-1})$
- 乘积后的精度 = 两者之和 = $A$
这就是为什么贝叶斯推断里,精度具有”可加性”,而方差不具备——后验精度 = 先验精度 + 似然精度。这个原理在贝叶斯线性回归、卡尔曼滤波里都是同一回事。
九、要点回顾
- 推导工具:配方法——把对数密度整理成关于变量的二次型,读出均值方差
- 三个高斯(前向 1 步、前向 $t-1$ 步、前向 $t$ 步)通过贝叶斯组合
- 第三个($q(x_t \mid x_0)$)不依赖 $x_{t-1}$,扔进常数
- 二次项系数 $A$ 和一次项系数 $B$ 决定 $\tilde\mu = B/A$,$\tilde\sigma^2 = 1/A$
- 关键化简:$1 - \alpha_t \bar\alpha_{t-1} = 1 - \bar\alpha_t$
- 检查极端情况($t=1$、$t$ 很大)能验证公式合理
- 几何视角:贝叶斯组合 = 精度相加
附录2:怎么化简$L_{t-1}$散度的
一、先回顾我们在哪
DDPM 把负 ELBO 改写成:
其中核心训练项是
我们已经知道两个分布是什么:
- $q(x_{t-1} \mid x_t, x_0) = \mathcal{N}(\tilde\mu_t(x_t, x_0),\, \tilde\beta_t I)$ ← 闭式高斯,刚推过
- $p_\theta(x_{t-1} \mid x_t) = \mathcal{N}(\mu_\theta(x_t, t),\, \Sigma_\theta(x_t, t))$ ← 网络输出
问题:怎么计算两个高斯之间的 KL?
二、两个高斯的 KL 闭式公式
我们之前提过这个公式,但没真正用过。现在用最简化的版本:两个各向同性、方差相同的高斯。
设 $p = \mathcal{N}(\mu_1, \sigma^2 I)$,$q = \mathcal{N}(\mu_2, \sigma^2 I)$,都是 $d$ 维。则:
这是个奇迹般简洁的公式——两个相同方差的高斯之间的 KL,就是均值之差的平方,除以 $2\sigma^2$。
为什么这么简单?因为方差相同时,KL 公式里的 $\log(\sigma_2/\sigma_1)$ 项和 $\sigma_1^2/(2\sigma_2^2) - 1/2$ 项都消掉了,只剩均值差。
三、DDPM 的简化:固定方差
要套用这个简洁公式,两个高斯必须有相同的方差。但:
- $q(x_{t-1} \mid x_t, x_0)$ 的方差是 $\tilde\beta_t I$(已知,闭式)
- $p_\theta(x_{t-1} \mid x_t)$ 的方差是 $\Sigma_\theta(x_t, t)$(网络输出)
DDPM 做了一个简化设计:让 $p_\theta$ 的方差也固定,不学,直接设成
其中 $\sigma_t^2$ 是预设的常数(论文实验了 $\sigma_t^2 = \beta_t$ 和 $\sigma_t^2 = \tilde\beta_t$,效果差不多)。
为什么可以这样简化?
- $\tilde\beta_t$ 已经是个完全闭式且不依赖 $x_0, x_t$ 的量——它只依赖 $t$ 和 noise schedule
- 既然方差已经”事先知道”,网络再去学一个就是浪费
- 理论上稍微损失一点表达力,但实践中效果反而更好(更稳定)
简化之后,两个高斯方差都是 $\sigma_t^2 I$(假设取 $\sigma_t^2 = \tilde\beta_t$),套上面的简洁公式:
如果两边方差不完全相等(比如 $\sigma_t^2 = \beta_t$ 但 $q$ 的方差是 $\tilde\beta_t$),会多出一些常数项,但不依赖 $\theta$,可以塞进 const:
四、关键转折:KL 变成了 MSE
让我们停下来,欣赏这个时刻。
之前:训练 loss 是 $D_{\text{KL}}(q | p_\theta)$,听起来是个抽象的”分布之间的距离”。
现在:训练 loss 是 $| \tilde\mu_t - \mu_\theta |^2$,就是两个向量之间的均方误差——和回归问题完全一样!
具体说,网络要做的事变成了:给定 $x_t$ 和 $t$,输出一个向量 $\mu_\theta(x_t, t)$,让它逼近真实后验均值 $\tilde\mu_t(x_t, x_0)$。
这就是为什么我说这一步是”魔法”——一个看起来很复杂的概率论目标,化成了最朴素的 MSE 回归。
五、$\tilde\mu_t$ 是什么 vs $\mu_\theta$ 是什么
为了让这一步更具体,我们看清楚两边到底是什么:
| 表达式 | 来源 | |
|---|---|---|
| $\tilde\mu_t(x_t, x_0)$ | $\frac{\sqrt{\bar\alpha_{t-1}}\beta_t}{1-\bar\alpha_t} x_0 + \frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t} x_t$ | 闭式公式,用 $x_0, x_t$ 算出 |
| $\mu_\theta(x_t, t)$ | 由神经网络输出 | 给定 $(x_t, t)$,网络预测 |
目标:训练 $\mu_\theta$,让它在所有 $(x_0, x_t)$ 组合下都接近 $\tilde\mu_t(x_t, x_0)$。
注意一个关键事实:$\tilde\mu_t$ 依赖 $x_0$,而 $\mu_\theta$ 只能看到 $x_t$。所以 $\mu_\theta$ 必须从 $x_t$ 反推 $x_0$ 的信息——这就是去噪。
六、训练这个 MSE 怎么操作?
来一遍完整的训练步骤,落实到代码层面:
1 | # 一次训练迭代 |
这就是把 $L_{t-1}$ 落实到训练里的全部内容——一个标准的回归任务。
七、为什么 DDPM 还要再走一步?
到这里其实已经能训练了,而且原则上和最终的 DDPM 是等价的。但实践中”预测 $\mu$”比”预测 $\epsilon$”差,原因是:
原因 1:数值尺度问题
$\tilde\mu_t$ 是 $x_0$ 和 $x_t$ 的加权和,它的数值范围接近 $x_t$ 本身——也就是说,大部分输出就是”把 $x_t$ 输出回去”。网络要做的”修正”只是一个小偏移。
让网络输出”几乎是输入本身 + 小修正” 是低效的——网络的大部分容量被花在”复刻输入”上。
原因 2:$\epsilon$ 的尺度更”标准化”
对比一下,如果让网络预测 $\epsilon$:
——它的尺度永远是 0 均值、单位方差,不依赖 $t$。所有时刻 $t$ 的目标分布尺度统一,网络更好训练。
原因 3:残差结构
预测 $\epsilon$ 在数学上等价于”网络预测残差”——即”$x_t$ 里的噪声成分是什么”,然后从 $x_t$ 减掉。这是经典的残差学习思想,普遍比”直接学输入到输出的映射”更稳定。
所以 DDPM 做了重参数化:把网络的预测目标从 $\mu_\theta$ 换成 $\epsilon_\theta$,数学等价,但训练效果好得多。
八、所以这一步的本质是什么?
回到你问的:”$L_{t-1}$ 化简核心一步”到底在做什么?
它做了三件事:
- 认识到 $L_{t-1}$ 是两个高斯的 KL——两边都已经被设计成高斯了
- 简化模型:固定 $p_\theta$ 的方差为 $\sigma_t^2 I$,让两边方差相同
- 套用”相同方差高斯 KL = 均值差平方”的闭式公式——把 KL 变成 MSE
结果:训练 loss 从抽象的”两个分布的距离”变成了具体的”两个向量的 MSE”。
这是 DDPM 让训练变简单的最关键一步——但其实它的本质就是”利用我们之前讲过的’高斯 KL 有闭式’,把分布问题降维成回归问题”。
九、和我们之前讨论的串起来
回头看,这一切都是之前讨论的”闭式 vs 蒙特卡洛”故事的最终兑现:
| 阶段 | loss 的形式 | 怎么算 | ||
|---|---|---|---|---|
| Sohl-Dickstein | $\log \frac{q(x_t \mid x_{t-1})}{p_\theta(x_{t-1} \mid x_t)}$ | 蒙特卡洛(方向不一致,无法 KL) | ||
| DDPM 改写后 | $D_{\text{KL}}(q(x_{t-1} \mid x_t, x_0) \ | p_\theta(x_{t-1} \mid x_t))$ | 闭式 KL(都是高斯,方差还相同) | |
| DDPM 化简后 | $\ | \tilde\mu - \mu_\theta \ | ^2$ | MSE,直接回归 |
每一步都在降低 loss 的计算复杂度:从需要采样估计,到闭式 KL,到 MSE 回归。
十、要点回顾
- KL 变 MSE 的魔法:两个相同方差高斯的 KL 公式只剩均值差平方,$D_{\text{KL}} = | \mu_1 - \mu_2 |^2 / (2\sigma^2)$
- DDPM 简化:固定 $p_\theta$ 的方差为 $\sigma_t^2 I$,让两边方差相同(代价小,收益大)
- 简化后,$L_{t-1}$ 变成 $| \tilde\mu_t - \mu_\theta |^2$ 的 MSE
- 训练目标:网络从 $x_t$ 出发,预测真实后验均值 $\tilde\mu_t$
- 但这还不是最终形式——$\mu$-预测有数值尺度问题,后面用重参数化换成 $\epsilon$-预测会更好
附录3:采样公式的推导
这是个非常好的问题——采样这一步看起来”显然就该这样写”,但每一行背后其实都有具体的数学依据。我们一行一行拆解,你会看到它根本不是凭空设计的,而是每一步都从训练时的数学严格推出来的。
一、先把采样代码贴出来
1 | x_T ~ N(0, I) # 起点:纯噪声 |
四个值得问”为什么”的地方:
- 为什么从 $\mathcal{N}(0, I)$ 出发?
- 那个 $\mu$ 公式怎么来的?
- 为什么再加一个 $\sigma_t z$ 噪声?
- 为什么最后一步($t=1$)不加噪声?
我们逐个拆。
二、为什么从 $\mathcal{N}(0, I)$ 出发?
回忆训练目标 $L_T$:
当 $T$ 大、$\bar\alpha_T \to 0$ 时,$q(x_T \mid x_0) = \mathcal{N}(\sqrt{\bar\alpha_T} x_0, (1-\bar\alpha_T) I) \to \mathcal{N}(0, I)$。
我们定义先验 $p(x_T) = \mathcal{N}(0, I)$。这两者几乎相同,所以 $L_T \approx 0$,我们不训练它。
采样时:既然真实的 $x_T$ 分布(无论 $x_0$ 是什么)都接近 $\mathcal{N}(0, I)$,那我们从 $\mathcal{N}(0, I)$ 采样作为起点,就是从训练分布采样——不是任意选的”起点”,而是数学上对应的那个分布。
三、那个 $\mu$ 的公式怎么来的?
这是采样里最关键的一行。我们在训练时已经设计了:
所以采样时,从这个高斯采 $x_{t-1}$。问题是 $\mu_\theta$ 等于什么?
回忆我们在训练阶段做了重参数化——让 $\mu_\theta$ 取以下形式:
这个公式不是采样时凭空写出的——它是训练时网络的参数化定义本身。我们就是这样让网络的输出(通过 $\epsilon_\theta$ 间接)给出 $\mu_\theta$ 的。
所以采样代码里那行
1 | μ = (1/sqrt(α_t)) * (x_t - β_t/sqrt(1-α_bar_t) * eps_θ(x_t, t)) |
就是把训练时的参数化定义代入,给定网络预测的 $\epsilon_\theta$,算出 $\mu_\theta$。这一步纯粹是代数代入,没有新东西。
这个公式的直观
让我们看清楚它在做什么。回忆 $x_t = \sqrt{\bar\alpha_t} x_0 + \sqrt{1-\bar\alpha_t}\, \epsilon$。如果网络完美预测 $\epsilon_\theta = \epsilon$,那么:
第一步:从 $x_t$ 反推 $x_0$:
这是把”加噪公式”反过来用。
第二步:算逆向后验均值 $\tilde\mu_t(x_t, \hat x_0)$。直接套真实后验的公式:
两步合并(代入 $\hat x_0$,化简——这就是 $\tilde\mu_t \to \epsilon$ 那步代数化简的逆向使用),得到那个 $\mu$ 公式。
所以采样的 $\mu$ 步可以理解为:
“用网络预测噪声 → 反推一个 $\hat x_0$ 估计 → 用真实后验公式算 $x_{t-1}$ 的均值”
每次去噪一步,间接地是在估计 $x_0$ 然后向 $x_0$ 走一步。
四、为什么还要再加 $\sigma_t z$ 噪声?
这是最容易让初学者疑惑的一步——既然要去噪,为什么还要加噪声?
4.1 数学原因
我们的逆向模型是
——一个有方差的高斯,不是只输出均值。从这个分布采样就是”均值 + 标准差 × 标准高斯”,即:
代码里的 μ + σ_t * z 就是这个采样。所以这个噪声本来就是逆向高斯分布的一部分,没加就不是从 $p_\theta$ 采样了。
4.2 直觉原因
为什么模型设计成有方差?因为真实的逆向后验 $q(x_{t-1} \mid x_t, x_0)$ 也是有方差的高斯($\tilde\beta_t I$)——不是确定性映射。
直观看:已知 $x_t$ 和 $x_0$,$x_{t-1}$ 不是唯一确定的——它有一个分布的可能值。$\tilde\beta_t$ 衡量了这种不确定性。
更直观:前向加噪是随机过程,撤销它每一步也应该是随机的——给定 $x_t$,可能的”上一步” $x_{t-1}$ 有多种。如果逆向是确定的,我们就丢失了随机性,最终生成的 $x_0$ 永远只有一个(给定起点),失去多样性。
4.3 物理类比
想象前向是”墨水扩散到水里”。如果你能逆转每个分子的运动,逆向也是确定的——但实际上,信息在扩散过程中以热力学方式丢失,逆向就必须有随机性来”补偿”丢失的信息。
每一步采样加的 $\sigma_t z$,正是”补偿”前向那一步丢的信息。
4.4 一个常被问的细节:$\sigma_t$ 应该取什么?
DDPM 论文里实验了两种选择:
- $\sigma_t^2 = \beta_t$(前向方差)
- $\sigma_t^2 = \tilde\beta_t = \frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\beta_t$(真实后验方差)
两者效果相近。前者对应”假设 $x_0 \sim \mathcal{N}(0, I)$”的逆向后验,后者对应”假设 $x_0$ 是确定值”的逆向后验。实践中默认用前者(更简单)。
后来 DDIM(我们之后讲)发现:$\sigma_t$ 可以是任意值,甚至 $\sigma_t = 0$(完全确定性采样),仍然能生成正确分布的样本——这是个重要的发现,会让采样可以加速 10-50 倍。
五、为什么最后一步($t=1$)不加噪声?
代码里:
1 | z = N(0, I) if t > 1 else 0 |
也就是当 $t = 1$ 时,$z = 0$,我们只取 $\mu$,不加噪声。
5.1 数学原因
最后一步是从 $x_1$ 生成 $x_0$。$x_0$ 是最终输出,我们希望它是图像本身,而不是”图像 + 一点点噪声”。
更精确地,DDPM 里 $L_0 = -\log p_\theta(x_0 \mid x_1)$ 是单独处理的——它对应真实数据的对数似然。在最后一步,我们直接取最大似然估计,即 $\mu_\theta$ 本身,不再加噪声。
5.2 直观原因
如果最后一步加噪声 $\sigma_1 z$,你的图像就会带一个最后的小噪声。$\sigma_1$ 虽然小,但对生成图像的清晰度还是有影响。
把这一步噪声去掉,相当于”在最后做个 MAP(maximum a posteriori)估计”——取分布的众数(高斯的众数就是均值),作为最佳点估计。
5.3 这是个工程选择
严格说,完全按 $p_\theta$ 采样应该最后一步也加噪声。”$t=1$ 时不加”是个实践上的优化——理论上稍微偏离了概率模型,但生成质量更好。
后来 Improved DDPM、DDIM 等都采用了这个约定。
六、把整个采样过程串起来
让我把所有”为什么”放在一起,画出完整图景:
1 | 起点 x_T = N(0, I) ← 因为前向终点近似就是 N(0, I) |
每一步都不是”魔法”,而是训练阶段数学结构的直接对应:
- 起点 ↔ $L_T$ 的训练目标
- $\mu$ 公式 ↔ 训练时的参数化设计
- 加噪声 ↔ $p_\theta$ 是高斯分布
- 最后不加噪 ↔ $L_0$ 的处理约定
七、采样到底在干什么?(更高层理解)
最后一句话总结整个采样的”灵魂”:
采样是把训练时学到的”逆向条件分布 $p_\theta(x_{t-1} \mid x_t)$”按马尔可夫链反向运行,从 $\mathcal{N}(0, I)$ 一步步走到数据分布 $p_{\text{data}}$。
每一步本质上是:
“网络看着 $x_t$,猜里面的噪声 $\epsilon$,然后:
- 大致知道’清掉 $\epsilon$ 后应该长什么样’
- 但不完全清掉,只走一小步,留一点噪声给下一步处理
- 这就是 $x_{t-1}$”
走 $T$ 步,最终噪声彻底清完,得到 $x_0$。
八、几个值得知道的细节
8.1 为什么必须 $T$ 步?能不能跳步?
直接套这个采样过程,必须走完整的 $T$ 步——因为模型训练时假设了离散的 $t = 1, 2, \ldots, T$,逆向也按这个 schedule 走。
跳步不行,因为:
- 网络只在 $t \in {1, \ldots, T}$ 这些时刻”见过”
- 跳步意味着用错误的方差/均值组合
DDIM 后来重新设计了一个不依赖马尔可夫性的采样过程,可以跳步,10-50 步搞定。但那是另一个故事。
8.2 这个采样方法叫什么?
正式名字叫 Ancestral Sampling(祖先采样)——按马尔可夫链定义的方向逐步采样。它是按字面意义”从 $p_\theta$ 采样”——所以是数学上”原汁原味”的方法。
8.3 和 Langevin 动力学的对比
回忆第二讲里 NCSN 的 Langevin 采样:
DDPM 采样的形式:
把 $\epsilon_\theta = -\sqrt{1-\bar\alpha_t}\, s_\theta$ 代入,展开后……
两者形式上几乎一样! 都是”当前点 + 学到的方向 + 一点噪声”。这绝非巧合——下一讲 Score SDE 会证明它们其实是同一个 SDE 的不同离散化。
九、要点回顾
- 起点 $\mathcal{N}(0, I)$:对应训练时 $L_T$ 的目标分布
- $\mu$ 公式:训练时的参数化定义,等价于”反推 $\hat x_0$ 后算后验均值”
- 加噪声 $\sigma_t z$:$p_\theta$ 是有方差的高斯,采样必须加
- 最后一步不加噪:工程优化,取 MAP
- 整个采样 = 按马尔可夫链反向运行 $p_\theta$,从噪声走到数据
- 每步直觉:预测噪声 → 部分清除 → 留下少量给下一步
- 形式上和 Langevin 动力学几乎一样——这预示了下一讲的统一框架
附录4:为什么不直接一步预测$x_0$
这是个非常深刻的问题——你的直觉其实抓到了一个真实的”路径选择”。答案是:确实可以这么做,而且这就是 DDIM 的核心思想!但 DDPM 故意没这么做,原因值得仔细讲清楚。
一、先把你的想法精确化
你的直觉是:既然网络预测了 $\epsilon$,而且 $x_t = \sqrt{\bar\alpha_t} x_0 + \sqrt{1-\bar\alpha_t}\,\epsilon$,那直接反解就能拿到 $x_0$:
一步到 $x_0$,为什么还要走 $T$ 步?
这个想法完全对——而且实践中是可行的。但有微妙的问题。让我们看清楚。
二、第一种”直接”采样:一步式
2.1 直接公式
2.2 它能 work 吗?
理论上,如果 $\epsilon_\theta$ 完美预测了 $\epsilon$,这就是真实的 $x_0$。
实际上,几乎完全不能用。原因如下。
2.3 为什么不行?(这是关键)
回想训练时的损失:
这个损失训练出的 $\epsilon_\theta$ 是 $\epsilon$ 的条件均值估计,即:
(MSE 损失的最优解永远是条件均值——这是统计学的基本结论)
注意 $x_t$ 是多个不同 $x_0$ 都能到达的。给定一个 $x_t$,真实生成它的 $x_0$ 不唯一——可能有许多个 $x_0$ 都”恰好”通过某个 $\epsilon$ 到达这个 $x_t$。$\epsilon$ 在这些可能性上有一个分布。
网络只能学这个分布的均值——也就是”在所有可能的 $\epsilon$ 中取平均”。
当 $t$ 很大时,$x_t$ 和 $x_0$ 的关系几乎完全被噪声主导——给定一个 $x_T \sim \mathcal{N}(0, I)$,几乎任何 $x_0$ 都有可能生成它(只是概率不同)。所以 $\mathbb{E}[\epsilon \mid x_T]$ 几乎不带 $x_0$ 的信息。
结果:从 $x_T$ 直接反推的 $\hat x_0$ ≈ “所有数据的平均”——一张模糊的、所有图像取平均的灰图。
这是个具体的、可观察的现象,Tweedie 公式给出了精确解释。我们看一下。
三、Tweedie 公式视角
Tweedie 公式说:
把 score 和 $\epsilon$ 的关系 $\epsilon_\theta = -\sqrt{1-\bar\alpha_t}\, s_\theta$ 代入:
这正是你想”直接减”得到的 $\hat x_0$!
所以这个 $\hat x_0$ 不是真实的 $x_0$,而是 $x_0$ 在给定 $x_t$ 下的条件均值——即”所有可能的 $x_0$ 的加权平均”。
| $t$ 时刻 | 含义 |
|---|---|
| $t$ 小($x_t$ 接近 $x_0$) | $\mathbb{E}[x_0 \mid x_t] \approx x_0$,反推几乎精确 |
| $t$ 大($x_t$ 接近噪声) | $\mathbb{E}[x_0 \mid x_t] \approx \mathbb{E}[x_0]$,得到”平均图像”——一团模糊 |
所以从纯噪声 $x_T$ 一步反推不行,因为 $\mathbb{E}[x_0 \mid x_T]$ 没有信息,只能给你”训练集的平均长相”。
四、为什么走 $T$ 步就 work?
关键洞察:每一步只走一小步,$\epsilon_\theta$ 的预测就足够好用了。
具体看:从 $x_t$ 走到 $x_{t-1}$,而不是直接到 $x_0$。
$\mathbb{E}[\epsilon \mid x_t]$ 仍然是条件均值——但这一步的”目标”是从 $x_t$ 走到 $x_{t-1}$,只前进 $\beta_t$ 那么一点点。在这一小步内:
- 即使条件均值”模糊”,对应的”平均”也只是一小步范围内的平均
- 留下大量信息给后续步骤来精修
多步走的物理直觉:从 $x_T$ 想猜 $x_0$ 完全不可能,但猜”$x_T$ 上一步是什么样”是可行的——只要走得足够小。然后基于新的 $x_{T-1}$ 继续猜下一步,信息逐步注入。
每一步都是局部的、合理的预测,$T$ 步累积下来,把”完全没信息”的 $x_T$ 逐步变成”完全有信息”的 $x_0$。
五、一个更精确的图景
让我用一个比喻。设想你要画一只猫,但只能闭着眼”扫”一遍画布。
方法 1(一步式):闭眼一次,猜整张画的所有像素。结果:平均起来”像猫”的概率密度——一团灰雾。
方法 2(多步式):每次只扫一小块,基于已经画好的部分推下一块。每一步只决定一点点,但每一点都基于充分的局部信息。最终整张画连贯。
DDPM 是方法 2。每一步的”预测目标”很小,网络可以做出合理判断;$T$ 步累积出一张连贯的图像。
核心数学事实:从噪声分布到数据分布,直接的概率映射是高度非线性、多模态的——一个 $x_T$ 对应所有可能的 $x_0$,不是函数。但逐步的概率映射 $x_t \to x_{t-1}$ 几乎是线性的(高斯之间),网络容易学。
六、所以”直接减”完全不能用吗?
不是。让我们看几个部分采用了你的想法的方法。
6.1 DDIM(Denoising Diffusion Implicit Models, 2020)
DDIM 的核心思想就是:确实利用 $\hat x_0$,但不直接跳到 $x_0$。
DDIM 的更新规则:
含义:
- 用网络反推一个 $\hat x_0$ 估计
- 然后重新加噪到 $t-1$ 时刻——用同一个 $\epsilon_\theta$
- 得到 $x_{t-1}$
这看起来很奇怪——估出 $\hat x_0$ 后又加回噪声?但这有两个好处:
- 可以跳步:不依赖马尔可夫性,$x_t$ 和 $x_{t-k}$ 之间可以直接跳
- 确定性:没有随机噪声 $z$(对比 DDPM 的 $\sigma_t z$),完全可逆
DDIM 让采样从 1000 步降到 20-50 步,质量几乎不变。
6.2 一步生成:Consistency Models(2023)
Yang Song 等人的 Consistency Models 真的实现了”直接一步从 $x_T$ 跳到 $x_0$”——但代价是要重新训练一个网络,让它学会这个一步映射。
他们的训练目标是:让网络在所有 $t$ 上,直接预测一个固定的 $x_0$(而不是预测 $\epsilon$):
这绕开了”一步反推不准”的问题——网络从训练时就被强迫学这个一步映射,而不是从一个本来不擅长的目标(预测 $\epsilon$)拿来”硬反推”。
效果:CIFAR-10 上单步生成质量接近 DDPM 1000 步。
6.3 其他
- DPM-Solver(2022):用高阶 ODE 数值求解器,4-10 步生成
- Distillation 方法:把 DDPM 1000 步的”教师”知识蒸馏到 1-4 步的”学生”
所有这些方法的共同点:$\hat x_0$ 这个量是核心工具,只是用法不同。
七、回到你最初的疑问:DDPM 为什么”绕一圈”?
现在你应该看清楚了:
- 直接减一步反推确实是个自然想法——$\hat x_0$ 这个量是真实存在的,而且有 Tweedie 公式的精确意义
- 但它只是 $x_0$ 的”条件均值”,不是真正的 $x_0$——所以一步直接到 $x_0$ 得到的是模糊的均值图像
- DDPM 选择走 $T$ 步,每步只前进一点点,让”条件均值”足够准
- 每一步内部确实可以理解为”先反推 $\hat x_0$ 再算 $x_{t-1}$”——这就是 DDPM 公式的等价解读
- DDIM/Consistency 用更聪明的方式利用 $\hat x_0$,大幅减少步数
所以你的直觉抓到的事:$\hat x_0$ 是 diffusion 采样的核心量——只是 DDPM 选择”间接使用”它来获得稳定性,DDIM 等改进在使用方式上做了文章。
八、一个直观演示
让我们想象一个具体的实验。设 $T = 1000$,你训练好了一个 DDPM。
实验 1:对一张测试图像 $x_0$,做前向到 $x_{500}$。然后:
- 直接反推:$\hat x_0^{(500)} = \frac{x_{500} - \sqrt{1-\bar\alpha_{500}}\,\epsilon_\theta}{\sqrt{\bar\alpha_{500}}}$
- 结果:$\hat x_0^{(500)}$ 是个比较模糊但能看出大致内容的图像
实验 2:对 $x_{999}$(几乎纯噪声)做同样反推:
- 结果:$\hat x_0^{(999)}$ 是一团几乎看不出任何具体内容的雾
实验 3:从 $x_T \sim \mathcal{N}(0, I)$(任意噪声)直接反推:
- 结果:所有 $x_T$ 反推都给出几乎一样的雾——因为 $\mathbb{E}[x_0 \mid x_T] \approx \mathbb{E}[x_0]$ 不依赖 $x_T$
这就是为什么 DDPM 不能一步采样——但它的多步采样里,每一步都隐含地包含了这个反推。
九、要点回顾
- “直接减预测的噪声”得到的是 $\mathbb{E}[x_0 \mid x_t]$,不是 $x_0$(Tweedie 公式)
- 这个量在 $t$ 大时几乎没有 $x_t$ 的信息——是”训练集的平均图像”
- DDPM 的多步采样:每步只前进一点点,让条件均值足够准
- 每步内部确实在做”反推 $\hat x_0$” ——只是这个 $\hat x_0$ 是临时估计,不直接输出
- DDIM、Consistency Models 等改进:更聪明地利用 $\hat x_0$,大幅减少步数
- 你的直觉抓到了 diffusion 加速研究的核心入口
附录5:$\hat{x_0}$不准确也可以用
是的,而且这正是为什么 diffusion 能 work 的根本原因。让我把这个机制彻底讲清楚。
一、先精确表述你的洞察
你的问题翻译成数学:
即使 $\hat x_0(x_t) := \mathbb{E}[x_0 \mid x_t]$ 是个”模糊的、不准确的”估计,我们仍然把它代入 $\tilde\mu_t$ 的公式来算 $x_{t-1}$。这居然能 work?
答案:能,而且这不是巧合,是数学上必然的。
二、为什么”不准确的 $\hat x_0$”在概率意义下是对的
关键事实:我们不需要 $\hat x_0$ 等于真实的 $x_0$,我们只需要 $p_\theta(x_{t-1} \mid x_t)$ 等于真实的 $q(x_{t-1} \mid x_t)$。
这两件事是不同的!让我们分开看。
2.1 我们想要的是什么?
我们想让模型分布 $p_\theta(x_{0:T})$ 等于真实分布 $q(x_{0:T})$,这等价于让每个条件分布都对:
注意是 $q(x_{t-1} \mid x_t)$,不是 $q(x_{t-1} \mid x_t, x_0)$。前者是真实的逆向过程(没有 $x_0$ 信息),后者是我们推出闭式的那个。
2.2 真实的 $q(x_{t-1} \mid x_t)$ 是什么?
它是对所有 $x_0$ 边际化:
这是个混合高斯——以 $q(x_0 \mid x_t)$ 为权重,把所有 $q(x_{t-1} \mid x_t, x_0)$ 平均起来。
通常不是高斯——因为 $q(x_0 \mid x_t)$ 是一个复杂分布(后验数据分布)。
2.3 但 DDPM 用单个高斯逼近它!
这正是 Sohl-Dickstein 那个 Feller 定理保证的事:当 $\beta_t$ 足够小时,$q(x_{t-1} \mid x_t)$ 近似为高斯。
具体地,可以证明:
这是核心!真实的逆向后验,用 $\mathbb{E}[x_0 \mid x_t]$(即条件均值,即”模糊的 $\hat x_0$”)代入 $\tilde\mu_t$ 公式,得到的高斯就是它的最佳高斯逼近。
也就是说:
“模糊的 $\hat x_0$”代入 $\tilde\mu_t$ 公式,得到的 $\mu$ 不是某个具体 $x_0$ 对应的逆向均值——它是真实逆向分布的均值,本身就是混合高斯的均值。
三、关键洞察:训练目标实际上”自动追踪”这个最佳逼近
让我们看 DDPM 的训练目标究竟在做什么。
3.1 训练目标的等价形式
我们之前推过:
注意这是对 $x_0$ 求期望——不同的 $x_0$ 给出不同的 $\tilde\mu_t$ 目标,网络要学的是这些目标的”平均”。
MSE 损失的最优解永远是条件均值:
(给定 $x_t$,在所有可能的 $x_0$ 上,$\tilde\mu_t$ 的平均)
3.2 这个条件均值等于什么?
由于 $\tilde\mu_t$ 是 $x_0$ 的线性函数(回忆公式:$\tilde\mu_t = c_1 x_0 + c_2 x_t$,$c_1, c_2$ 不依赖 $x_0$),期望可以”穿过”:
所以最优网络输出:
——正是把”模糊的条件均值 $\hat x_0$”代入 $\tilde\mu_t$ 公式得到的结果。
3.3 这意味着什么?
我们从来没有显式让网络学条件均值。我们只是让 $\mu_\theta$ 去回归各种 $\tilde\mu_t(x_t, x_0)$ 目标。但因为 MSE 损失的性质,最优解自动等于”代入条件均值”的形式。
这是 diffusion 数学最优雅的事实之一——用 $\hat x_0 = \mathbb{E}[x_0 \mid x_t]$ 作为 $x_0$ 的”代理”不是近似,而是 ELBO 优化的精确闭式解。
四、为什么这能 work?用一个简化例子
让我用一个极端简化的例子说清楚。
4.1 设定
假设数据只有两个点:$x_0 = +1$ 或 $x_0 = -1$,各占一半。前向加噪到 $x_t$。
4.2 一个具体的 $x_t$
假设我们采到 $x_t = 0$(正中间)。这个 $x_t$ 既可能来自 $x_0 = +1$,也可能来自 $x_0 = -1$,几率各半。
4.3 真实的逆向后验 $q(x_{t-1} \mid x_t = 0)$
它是两个高斯的混合:
- 以概率 1/2 来自”$x_0 = +1$ 的链”,对应 $q(x_{t-1} \mid x_t=0, x_0=+1)$
- 以概率 1/2 来自”$x_0 = -1$ 的链”,对应 $q(x_{t-1} \mid x_t=0, x_0=-1)$
$q(x_{t-1} \mid x_t = 0)$ 是个双峰分布——不是单一高斯。
4.4 DDPM 的近似:用单个高斯
DDPM 用 $p_\theta(x_{t-1} \mid x_t = 0) = \mathcal{N}(\mu_\theta, \sigma^2)$ ——单个高斯。它当然不能完美匹配双峰分布。
但 MSE 训练让 $\mu_\theta$ 最优地落在两个峰的中点——也就是
(因为 $\mathbb{E}[x_0 \mid x_t=0] = 0$,正中间)
4.5 这够好吗?
对于单步:不够——$p_\theta$ 是单峰高斯,而真实 $q$ 是双峰。如果直接从这个 $p_\theta$ 一步采样,得到的样本是均值 0 附近的高斯——不是 $\pm 1$。
但走多步之后:
随着 $t$ 减小($x_t$ 离真实数据越来越近),$\hat x_0(x_t) = \mathbb{E}[x_0 \mid x_t]$ 会逐渐倾向于某一边——如果当前的 $x_t$ 偏向 +1,$\hat x_0$ 就接近 +1;偏向 -1 类似。
具体说,逆向链每走一步,$x_t$ 会因为随机噪声 $\sigma_t z$ 稍微偏移;偏移后 $\hat x_0$ 的”偏向”被放大;再下一步 $\hat x_0$ 更偏;以此类推。
多步累积下来,初始的随机性会逐步把 $x_t$ 推向其中一个真实的 $x_0$——形成”对称破缺”。
最终采样到的 $x_0$ 就在 $\pm 1$ 上,符合真实的双峰分布——尽管每一步都用单峰高斯逼近!
五、这就是 diffusion 多步采样的精髓
把上面这件事提炼成原则:
单峰高斯不能一步表达多峰分布,但多步逐渐”破缺”可以。
每一步:
- 用 $p_\theta = \mathcal{N}(\mu, \sigma^2)$ 单峰逼近真实的 $q(x_{t-1} \mid x_t)$
- $\mu$ 是在当前 $x_t$ 下”所有可能 $x_0$ 的平均”
- 每一步加的 $\sigma_t z$ 噪声把 $x_t$ 推向其中一个具体的 $x_0$ 的分支
- 下一步基于新 $x_t$ 重新算”平均”,这个平均逐步偏向某一支
$T$ 步累积下来,从一个对所有 $x_0$ 都”模糊兼容”的 $x_T$,逐步分化到具体的某个 $x_0$。
六、回到你的问题:为什么”不准确”也能用?
现在最直接地回答:
$\hat x_0$ 不准确,但它是无偏的最佳估计——具体地,它是所有可能 $x_0$ 的概率加权平均。
代入 $\tilde\mu_t$ 公式得到的 $\mu_\theta$,正是真实逆向后验的均值——这是混合分布的均值,而不是某个具体分支的均值。
每一步用这个均值 + 一点随机噪声采样,等价于”平均地”探索所有可能的逆向路径。
多步累积后,具体某条路径胜出(被随机性放大),最终生成的 $x_0$ 是真实分布中的具体一个样本。
关键不是 $\hat x_0$ 准不准,而是它在数学上是 ELBO 的最优解,这就够了。
七、用一个更深的视角:Score 视角
回忆 $\hat x_0$ 和 score 的关系(Tweedie):
也就是 $\hat x_0$ 本质上就是 score 的一个等价表达。
而 score $\nabla_{x_t} \log q(x_t)$ 的几何意义是”指向数据流形的方向”——它不是”指向某个具体的 $x_0$”,而是”指向密度增大的整体方向”。
所以:
- 在大噪声时($x_t$ 离数据远),score “指向整团数据”——具体到不了某一个 $x_0$
- 在小噪声时($x_t$ 接近数据),score “指向局部具体的高密度区域”——逐渐锁定某个 $x_0$
- 多步采样 = 沿着 score 指引的方向逐步走 + 噪声扰动来”选择分支”
这是 score-based 视角,Score SDE 会让这件事更精确。
八、和你之前问题的串联
我们一路问下来的几个问题,在这里全部串起来了:
| 之前的问题 | 现在的答案 |
|---|---|
| “为什么改写 ELBO?” | 改写后 loss 变成 MSE,MSE 最优解是条件均值——这正是我们想要的 |
| “为什么 KL 要闭式?” | 闭式让 MSE 形式干净,自动追踪条件均值 |
| “$\hat x_0$ 不是 $x_0$,为什么用它?” | $\hat x_0$ 在数学上就是 ELBO 最优 $\mu_\theta$ 的来源——它是”模糊”的,但模糊正确 |
| “为什么走 $T$ 步?” | 单步无法表达多峰分布,多步用随机性破缺,逐步从模糊到具体 |
| “采样为什么加 $\sigma_t z$?” | 这个噪声驱动”对称破缺”,让 $x_t$ 逐步偏向一个具体分支 |
所有这些选择都不是孤立的,它们共同构成一个自洽的概率框架——MSE 损失逼着网络学条件均值,条件均值给出最优单步逼近,多步采样用随机性把”模糊”分解成”具体”,最终得到真实数据分布的样本。
九、要点回顾
- $\hat x_0$ 是 $\mathbb{E}[x_0 \mid x_t]$,不是真实 $x_0$——是所有可能 $x_0$ 的概率加权平均
- 但代入 $\tilde\mu_t$ 公式后,得到的 $\mu_\theta^$ *正是真实逆向后验 $q(x_{t-1} \mid x_t)$ 的均值——这是 MSE 损失的最优解性质保证的
- 单步 $p_\theta$ 是单峰高斯,不能精确表达多峰真实后验——但 ELBO 让它成为最优的单峰逼近
- 多步采样用随机噪声 $\sigma_t z$ 驱动对称破缺——把”对所有 $x_0$ 模糊兼容”的状态逐步分化到具体某个 $x_0$
- $T$ 步累积后,采到的样本符合真实数据分布——尽管每一步都只是单峰高斯
- 这就是为什么 diffusion 能 work:每步不准确不重要,$T$ 步联合起来精确
附录6:为什么要求KL散度有闭式解?
一、问题的核心:有两个KL,你混淆了
让我先把问题挑明。在 diffusion 数学里出现的 KL 不是同一个——有两个层次,作用完全不同。一个不需要闭式,一个需要闭式。
KL 类型 A:外层 KL(在恒等式里)
这个 KL 出现在”似然 = ELBO + KL”这个恒等式里。它的角色是:
- 理论分析:解释 ELBO 是下界、解释下界的间隙是什么
- 不需要计算:训练时我们根本不算它,只算 ELBO
所以这个 KL 不需要闭式——它只是个理论概念,告诉我们 ELBO 优化的本质。我们无需关心它具体值多少。
KL 类型 B:内层 KL(ELBO 化简后出现)
DDPM 把 ELBO 重写成:
这个 KL 出现在 ELBO 的内部——是 ELBO 化简后的求和项。它的角色是:
- 每次训练都要算它(因为它是 loss 的一部分)
- 必须能高效计算
这个 KL 需要闭式——闭式才能算得快、梯度精确。
二、所以两者的关系是
让我用一张图表示清楚:
1 | log p(x_0) = ELBO + D_KL(q‖p) ← 外层 KL(类型 A,理论用,不算) |
关键区分:
| 外层 KL(类型 A) | 内层 KL(类型 B) | |
|---|---|---|
| 出现位置 | 恒等式 $\log p = \text{ELBO} + \text{KL}$ | ELBO 化简后的求和项 |
| 是 谁 vs 谁 的 KL | 完整变分分布 $q(x_{1:T}\mid x_0)$ vs 真实后验 $p_\theta(x_{1:T}\mid x_0)$ | 单步前向后验 $q(x_{t-1}\mid x_t,x_0)$ vs 单步逆向 $p_\theta(x_{t-1}\mid x_t)$ |
| 是否需要计算 | 不需要 | 每次训练都要 |
| 是否需要闭式 | 不需要 | 需要(否则训练慢/方差大) |
| 性质 | 高维($T$ 维联合分布之间) | 低维($d$ 维单步分布之间) |
三、为什么内层 KL 必须高效计算?
回到训练流程。每次训练一步:
- 采一个数据点 $x_0$
- 采一个时刻 $t$
- 采一个噪声 $\epsilon$,得到 $x_t$
- 计算 loss(就是某个 $t$ 的内层 KL 项)
- 反向传播
第 4 步每次迭代都要做几百万次(整个训练过程)。如果它不闭式:
- 要嵌套蒙特卡洛(里面再采样估计)→ 慢
- 估计有方差 → 训练不稳
- 梯度不精确 → 收敛慢
所以内层 KL 必须闭式——这是工程必需。
四、那”蒙特卡洛估计 ELBO”到底估的是什么?
回到你的疑问:既然要蒙特卡洛估 ELBO,为什么还要闭式?
答案是:蒙特卡洛和闭式估的是不同维度的随机性。我们两者都在用——把它们组合起来才得到最终的训练 loss。
ELBO 的完整结构
DDPM 改写后:
注意有两层结构:
- 外层:对 $q$ 的期望 $\mathbb{E}_q[\cdots]$ —— 这层用蒙特卡洛
- 内层:每个 KL —— 这层用闭式
训练时怎么算?
外层(蒙特卡洛):从 $q$ 采样 $x_t$、随机选 $t$,得到一个具体的 KL 项。这是单样本 MC 估计。
内层(闭式):对这个具体的 $(x_t, x_0, t)$,直接用高斯 KL 闭式公式算出 KL 的精确值——不需要再采样。
具体地,对一个 batch 里的样本 $(x_0, t, \epsilon)$:
整个 loss 对这一组 $(x_0, t, \epsilon)$ 而言是个确定性的、可微的、精确的值。多个样本平均就是对外层期望的 MC 估计。
五、对比 Sohl-Dickstein:为什么”内层闭式”是关键
现在你能精确看懂 Sohl-Dickstein 和 DDPM 的差异了:
Sohl-Dickstein 的形式
每一项 $\log \frac{p_\theta}{q}$ 依赖于 $x_{t-1}$ 和 $x_t$ 的具体值——它本身就是个随机变量。
没有”内层闭式”——每一项都是采样得到的随机数。
外层蒙特卡洛要估这个随机变量的期望,但它方差大,估计困难。
DDPM 的形式
每一项是个 KL,不依赖于具体的 $x_{t-1}$ 取值——它只依赖 $x_t, x_0$,且有闭式。
有”内层闭式”——每一项是确定性的精确值(给定 $x_t, x_0$)。
外层蒙特卡洛只对 $x_t$ 的随机性估,因为内层已经被解析积掉了——方差大幅降低。
六、用一个具体类比讲清楚
想象你要估这个嵌套期望:
方法 1:不用闭式,纯蒙特卡洛。采 $X_i$、再采 $Y_{i,j}$,平均所有 $f(X_i, Y_{i,j})$。两层采样,方差大。
方法 2:如果内层期望 $g(X) := \mathbb{E}_Y[f(X, Y) \mid X]$ 有闭式,直接采 $X_i$,平均 $g(X_i)$。一层采样,方差小。
这就是 Rao-Blackwell 化——能解析积的就解析积,不要乱采样。
回到 diffusion:外层期望(对 $x_0, x_t$ 的随机性)用蒙特卡洛——这没办法,只能采;内层期望(每个 KL 项中”对 $x_{t-1}$ 的随机性”)用闭式直接算——这是降方差的关键。
七、再用代码看一眼
1 | # 训练一步 |
看到了吗?
- 外层(
x_0, t, eps):蒙特卡洛 - 内层(
loss):闭式公式,不需要再采样估计
如果内层不闭式,这行 loss = ... 就要变成”再做一次蒙特卡洛估计”,训练会慢得多、噪声大得多。
八、总结:你的混淆是怎么解开的
回到你最初的问题:
“我们不是用蒙特卡洛估计去估计 ELBO 的吗?为什么要求 KL 有闭式解?”
答案:
- ELBO 里有两层结构:外层期望 + 内层每项
- 外层:用蒙特卡洛估(对 $x_0, t, x_t$ 的随机性)
- 内层每项:最好是闭式,这样不用再嵌套一层蒙特卡洛
- 闭式 + 蒙特卡洛是配合关系,不是二选一——把外层的”无法避免的随机性”留给 MC,把内层的”能算的部分”用闭式精确算掉
- “$\log p = \text{ELBO} + \text{KL}$”中的 KL(外层 KL)只是理论恒等式,不计算,不需要闭式
- ELBO 化简后出现的 KL(内层 KL)才是训练时真正算的,必须闭式
九、要点回顾
- diffusion 数学里有两个 KL,一定要分清:外层(理论用)和内层(训练算)
- 蒙特卡洛 ≠ 闭式的对立面,两者是配合关系
- Rao-Blackwell 化:能闭式就闭式,降方差靠这个
- DDPM 比 Sohl-Dickstein 强的本质:让内层有闭式,把”两层蒙特卡洛”减少到”一层蒙特卡洛”
- 训练 loss 对单个样本而言是确定性、精确、可微的——多样本平均才是 MC 估计
清楚了吗?这个区分非常微妙,但理解了它你就抓到了 diffusion 数学优雅性的真正命门。
继续推进的话,正好可以看一下 DDPM 的贝叶斯改写——你会亲眼看到“外层 KL”如何在等式中出现,”内层 KL”如何被造出来,以及高斯 KL 闭式如何把内层化简成 MSE。要不要现在就推这一段?