DDPM 把生成问题写成两个方向相反的过程:前向过程用固定高斯转移逐步破坏数据,反向过程用神经网络近似未知的反向条件分布。训练的关键,是利用已知前向过程把变分目标转成不同噪声水平上的监督回归。
DDPM 数学需要连接六个对象:逐步前向转移 q(xt∣xt−1)、任意时刻的闭式边缘 q(xt∣x0)、可计算的后验 q(xt−1∣xt,x0)、需要学习的反向分布 pθ(xt−1∣xt)、噪声预测 loss,以及从 xT 到 x0 的 DDPM 采样算法。
这里采用离散时间、方差保持(variance preserving)DDPM 记号。连续噪声尺度、EDM preconditioning、score SDE 和 Flow Matching 分别使用不同公式边界。
前置知识
统一记号如下:
| 符号 |
含义 |
| x0 |
来自真实数据分布的干净样本 |
| xt |
第 t 个噪声水平的随机变量 |
| βt |
第 t 步加入的方差,满足 0<βt<1 |
| αt=1−βt |
单步保留的信号方差比例 |
| αˉt=∏s=1tαs |
从 0 到 t 的累计信号比例 |
| ϵ∼N(0,I) |
标准高斯噪声 |
| q |
固定的前向过程及其可计算分布 |
| pθ |
参数为 θ 的反向生成模型 |
核心机制
逐步前向高斯链
DDPM 规定一个马尔可夫前向过程:
q(xt∣xt−1)=N(xt;αtxt−1,βtI),αt=1−βt.
等价的采样式为:
xt=αtxt−1+βtϵt,ϵt∼N(0,I).
每一步缩小已有信号,再加入独立高斯噪声。若 βt 足够小并且累计步数足够多,xT 会接近标准高斯。这个过程没有可学习参数;noise schedule 完全由训练配置规定。

图源:Denoising Diffusion Probabilistic Models,Figure 2。左到右是固定前向链,右到左是需要学习的反向链。图能说明条件依赖关系,不能说明实际训练必须逐步生成所有中间状态。
任意时间步可以闭式采样
独立高斯噪声在线性组合下仍是高斯,因此可以把前 t 步合并:
q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I).
用重参数化形式采样:
xt=αˉtx0+1−αˉtϵ,ϵ∼N(0,I).
这条公式解释了训练为何可以随机抽一个 t,直接从 x0 构造 xt。模型仍覆盖整条路径,因为不同 batch 会采到不同时间步;单个训练样本不需要真的执行 t 次加噪。

这张示意图把 xt 画成数据分量和噪声分量的系数组合,用来读取 αˉt 与 1−αˉt 的消长。它是参数化直觉,不是在断言真实图像向量与某次噪声样本在像素空间必然正交。
已知 x0 时,单步后验仍是高斯
训练推导中 x0 已知。利用高斯条件分布,可以得到:
q(xt−1∣xt,x0)=N(xt−1;μ~t(xt,x0),β~tI),
其中:
μ~t(xt,x0)=1−αˉtαˉt−1βtx0+1−αˉtαt(1−αˉt−1)xt,
β~t=1−αˉt1−αˉt−1βt.
这个后验说明:如果知道干净样本,反向一步的均值和方差都能直接计算。但生成时只有 xt,不知道对应的 x0,所以需要模型提供足够的信息来近似反向均值。
学习反向条件分布
DDPM 用参数化高斯分布近似真实反向条件:
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σt).
原始 DDPM 常固定反向方差,只学习均值。把均值改写成噪声预测形式:
μθ(xt,t)=αt1(xt−1−αˉtβtϵθ(xt,t)).
网络 ϵθ 读取带噪样本和时间步,预测构造 xt 时使用的标准高斯噪声。给定噪声预测,也能反推出干净样本估计:
x^0(xt,t)=αˉtxt−1−αˉtϵθ(xt,t).
因此 ε-prediction 和 x0-prediction 描述的是同一局部信息的不同坐标,但优化权重和数值稳定性并不自动相同。
从变分下界到噪声预测 MSE
反向生成模型的联合分布为:
pθ(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt).
最大化数据对数似然可以转成对前向路径取期望的变分下界。中间时间步对应真实后验 q(xt−1∣xt,x0) 与模型反向分布 pθ(xt−1∣xt) 的 KL 项。两者都是高斯,在固定方差和噪声参数化下,均值匹配可转成带时间权重的噪声预测误差。
DDPM 实践中常用简化目标:
Lsimple=Ex0,t,ϵ[∥ϵ−ϵθ(xt,t)∥22].
这里的监督目标 ϵ 是训练时真实采样的噪声。简化目标和完整 VLB 有明确联系,但不能把“无权重 MSE”说成与每个 VLB 项数值完全相同;不同方差参数化、时间权重和 learned variance 会改变目标。
时间步和网络架构的接口
同一个 xt 数值在不同 t 下代表不同信噪比,因此网络必须读取时间步或噪声嵌入。无条件模型接口为:
ϵθ(xt,t),
条件模型则为:
ϵθ(xt,t,c).
扩散目标不要求网络必须是 U-Net。U-Net、DiT 或其他主干只要能处理样本表示、时间信息和条件,就能承担 denoiser。组件细节见架构与 Stable Diffusion。
DDPM 训练算法
1 2 3 4 5 6 7 8 9
| repeat: x_0 ~ p_data t ~ Uniform({1, ..., T}) epsilon ~ Normal(0, I) x_t = sqrt(alpha_bar_t) * x_0 + sqrt(1 - alpha_bar_t) * epsilon epsilon_pred = epsilon_theta(x_t, t, condition) loss = mean_square_error(epsilon_pred, epsilon) update theta with gradient(loss)
|
训练只需网络一次前向和一次反向,不随 t 线性增加计算。若时间步采样不是均匀分布,loss weighting 必须与采样分布一起解释,否则某些噪声区间会被隐式放大或削弱。
DDPM 采样算法
先从简单先验采样:
xT∼N(0,I).
然后对 t=T,T−1,…,1 执行:
1 2 3 4 5 6 7 8 9
| epsilon_pred = epsilon_theta(x_t, t, condition) mean = 1 / sqrt(alpha_t) * ( x_t - beta_t / sqrt(1 - alpha_bar_t) * epsilon_pred ) if t > 1: z ~ Normal(0, I) x_{t-1} = mean + sqrt(posterior_variance_t) * z else: x_0 = mean
|
这里采用 β~t 作为 posterior variance 的教学版本。不同实现可能使用 βt、learned variance 或其他插值;比较 sampler 时必须同时记录方差约定和时间下标。

图源:DDPM,Figure 14。图展示反向链中的样本逐渐出现结构;它不能证明每个时间区间只负责一种固定语义或纹理。
常见误解与失效边界
**把 βt 当成噪声标准差。**在上述记号中 βt 是单步方差,采样噪声项使用 βt。代码里混淆两者会直接破坏 schedule。
**把 αt 和 αˉt 混用。**前者是单步系数,后者是累计乘积。闭式构造 xt 使用 αˉt,反向均值同时使用单步和累计量。
**在 t=0 继续加入随机噪声。**最终一步应返回均值估计;否则生成结果会被额外污染。不同代码使用 0-based 或 1-based 时间下标,必须先确认边界。
**认为训练 MSE 可以单独评价生成质量。**MSE 是局部预测指标;真实结果还受 VAE、条件、时间离散、solver、CFG 和误差累积影响。
**把 ε、score 和 v 当成完全独立模型。**在给定路径和系数时它们可以转换,但 loss weighting、preconditioning 和有限精度行为不同。转换公式见噪声日程与参数化。
检查理解
- 从 q(xt∣xt−1) 到 q(xt∣x0) 的闭式形式为什么依赖高斯噪声可合并性?
- 为什么 q(xt−1∣xt,x0) 在训练推导中可计算,而生成时不能直接使用?
- 噪声预测怎样进入反向均值 μθ?
- 简化 MSE 与完整变分下界是什么关系,为什么不能说二者逐项数值相等?
- 代码里将 αt 写成 αˉt 会影响哪几个步骤?
外部材料