DDPM 模型基础与数学推导
Denoising Diffusion Probabilistic Models(DDPM)由 Ho 等人在 2020 年提出,是扩散生成模型的开山之作,也是 score-based model、Latent Diffusion(Stable Diffusion)、flow matching 等一系列后续工作的基础。这篇文章从思想出发,把前向加噪过程和训练 Loss 的数学推导完整走一遍。
1. 核心思想
DDPM 把「生成一张图片」建模成 逐步去噪 的过程,由两个相反的过程组成:
- 前向过程(扩散 / 加噪):对真实数据 x0 逐步叠加高斯噪声,经过 T 步后变成几乎纯噪声 xT。这个过程是简单且封闭可解的——任意时刻的 xt 可以直接由 x0 一个公式算出,不需要逐步模拟。
- 逆向过程(去噪 / 生成):训练一个神经网络 pθ,学习把噪声逐步还原成数据。生成样本时,从纯噪声 xT∼N(0,I) 出发,迭代去噪 T 步得到 x0。
三个关键洞见支撑了这套设计:
- 加噪容易,去噪难但可学习:给数据加噪声只需要一个线性变换;而「给定带噪图片,猜它上一步长什么样」是一个神经网络擅长拟合的回归任务。
- 闭式可解性:前向过程任意时刻的边缘分布是高斯分布,且可以用重参数化技巧直接采样,这让训练变得极其高效。
- 训练即去噪:最终训练目标退化成一个简洁的「噪声预测」回归,稳定、好实现。
2. 前向加噪过程
2.1 单步加噪
设噪声表 β1,β2,…,βT 是预定义的(通常从 0.0001 线性增大到 0.02 )。前向过程每一步定义为:
q(xt∣xt−1)=N(xt;1−βtxt−1, βtI)
即每一步都从 xt−1 出发,保留一部分信息,叠加一点高斯噪声。利用重参数化技巧,采样 xt 等价于:
xt=1−βtxt−1+βtε,ε∼N(0,I)
为了记号简洁,记:
αt=1−βt,αˉt=s=1∏tαs
2.2 任意时刻的边缘分布(关键推导)
我们要推导:xt 可以直接写成 x0 加一个整体噪声的形式。从 xt 的表达式开始,把 xt−1 再展开一步:
xt=αtxt−1+1−αtεt−1=αt(αt−1xt−2+1−αt−1εt−2)+1−αtεt−1=αtαt−1xt−2+两个独立标准高斯的加权和αt(1−αt−1)εt−2+1−αtεt−1
这里用到一个基本性质:两个独立的 N(0,I) 的线性组合仍是高斯,且方差相加。上面括号里的两项合并后的方差为:
αt(1−αt−1)+(1−αt)=1−αtαt−1
因此存在一个新的标准高斯噪声 ε′∼N(0,I),使得:
xt=αtαt−1xt−2+1−αtαt−1ε′
不断递归(数学归纳法),最后得到闭式边缘分布:
xt=αˉtx0+1−αˉtε,ε∼N(0,I)
也就是:
q(xt∣x0)=N(xt;αˉtx0, (1−αˉt)I)
当 t→T 时 αˉt→0,xT 收敛到标准高斯 N(0,I),这正是「扩散到最后变成纯噪声」的数学表达。
这个式子的价值在于:训练时不需要逐 t 模拟加噪,任意采样一个 t 和一个噪声 ε,就能一步得到对应的 xt。
3. 逆向去噪过程
逆向过程用一个参数为 θ 的神经网络建模:
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t), Σθ(xt,t))
实践中通常把方差 Σθ 固定(令其为后面推导出的后验方差 β~tI ),核心只学均值 μθ 。生成时从 xT∼N(0,I) 出发,按 t=T,T−1,…,1 迭代采样 pθ(xt−1∣xt),最终得到 x0。
4. 训练目标:Loss 的构建(关键推导)
4.1 从变分下界出发
目标是最大化数据对数似然 logpθ(x0),但它是难解(intractable)的。仿照 VAE,利用变分下界(ELBO):
logpθ(x0)≥Eq(x1:T∣x0)[logq(x1:T∣x0)pθ(x0:T)]
将联合分布拆开并把期望内的对数展开,可以整理成三项之和(这里略去中间的代数,只写结论):
L=(1) 重建项−Eq[logpθ(x0∣x1)]+(2) 逐步去噪匹配项t=2∑TEq[DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))]+(3) 先验项DKL(q(xT∣x0)∥p(xT))
- (1) 重建项:从 x1 还原 x0,类似自编码器的重建误差。
- (2) 去噪匹配项:让学到的去噪分布 pθ(xt−1∣xt) 逼近「给定 x0 时的真实后验」q(xt−1∣xt,x0) 。
- (3) 先验项:衡量 xT 是否接近标准高斯先验,由于加噪收敛,该项通常趋于 0,可以忽略。
核心难点在第 ② 项,但它恰好是可解的:真实后验 q(xt−1∣xt,x0) 是高斯分布。
4.2 真实后验 q(xt−1∣xt,x0) 的推导
由贝叶斯公式:
q(xt−1∣xt,x0)∝q(xt∣xt−1)q(xt−1∣x0)
两边都是高斯(一个来自单步加噪定义,一个来自 2.2 节的边缘分布),高斯的乘积仍是高斯。配合重参数化整理,可得真实后验的均值与方差:
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
现在把 x0 用 2.2 节的闭式解反解出来:x0=αˉtxt−1−αˉtε ,代入 μ~t 并化简,可以得到一个只依赖于 xt 和注入噪声 ε 的漂亮形式:
μ~t(xt,x0)=αt1(xt−1−αˉtβtε)
这个形式说明:真实后验的均值,本质上就是「从 xt 中把预测的噪声去掉一步」。
4.3 KL 项化简:预测噪声
当 pθ 的方差固定为 β~tI 时,两个高斯之间的 KL 散度有闭式解:
DKL(N(μ~,σ2I)∥N(μθ,σ2I))=2σ21∥μ~−μθ∥2
于是第 ② 项的每一项正比于:
∥μ~t(xt,x0)−μθ(xt,t)∥2
如果我们也把网络均值 μθ 参数化成「预测噪声」的形式,即:
μθ(xt,t)=αt1(xt−1−αˉtβtεθ(xt,t))
代入后 xt 与 αt1 部分相消,Loss 就只剩下噪声之间的差:
Lt=Ex0,t,ε[ε−εθ(αˉtx0+1−αˉtε, t)2]
这就是 DDPM 论文采用的简化训练目标:网络输入「加噪到 t 步的样本 xt 」和时间步 t,输出预测的噪声 ε。Ho 等人发现,去掉完整 ELBO 里各项权重后的这个简化版本,训练更稳定、效果反而更好。
5. 训练与采样算法
训练(每次迭代):
- 采样真实样本 x0∼q(x0),时间步 t∼Uniform{1,…,T},噪声 ε∼N(0,I);
- 计算 xt=αˉtx0+1−αˉtε;
- 对 ∥ε−εθ(xt,t)∥2 做一步梯度下降。
采样(生成):
- 从纯噪声出发 xT∼N(0,I);
- 对 t=T,T−1,…,1:
xt−1=αt1(xt−1−αˉtβtεθ(xt,t))+β~tz,z∼N(0,I) (仅 t>1)
- 返回 x0。
6. 总结
- DDPM 把生成问题转化为迭代去噪,训练目标最终退化为简洁的「噪声预测」回归,稳定且易于实现。
- 数学上优雅之处在于:前向边缘分布闭式可解(重参数化 + 高斯线性组合),真实后验闭式可解(贝叶斯 + 高斯乘积),使得训练和推导都有明确解析形式。
- 后续的 DDIM(加速采样)、Latent Diffusion / Stable Diffusion(在潜空间扩散)、score-based models 与 flow matching 都是在这套框架上的改进与推广。
参考
- Ho, J., Jain, A., Abbeel, P. Denoising Diffusion Probabilistic Models. NeurIPS 2020.
- Luo, C. Understanding Diffusion Models: A Unified Perspective. arXiv:2208.11970, 2022.