去噪扩散概率模型 DDPM
相关:变分下界ELBO笔记(ELBO 的一般推导) | 变分自编码器VAE笔记(单步潜变量模型与重参数化)
参考:DDPM 专栏
1. DDPM 在做什么
DDPM(Denoising Diffusion Probabilistic Model,去噪扩散概率模型)把生成过程拆成 T 个很小的步骤:
- 正向过程:从真实样本 x0 出发,逐步加入高斯噪声,最后得到近似标准正态的 xT;
- 反向过程:从纯噪声 xT 出发,逐步去除噪声,最终得到生成样本 x0。
它的核心不是直接学习复杂的 p(x0),而是学习一串简单的高斯转移分布。和 变分自编码器VAE笔记 类似,DDPM 也是一个带潜变量的生成模型;区别是它使用 x1,…,xT 这一长串潜变量,而不是一个低维 z。
2. 正向加噪过程
2.1 一步转移
给定真实数据 x0,定义固定的马尔可夫链 q:
q(xt∣xt−1)=N(xt;αtxt−1,βtI),
其中
βt∈(0,1),αt=1−βt.
βt 是第 t 步加入的噪声强度,通常由一个预先设定的 schedule 给出;q 没有可学习参数。
用重参数化写成采样形式:
xt=αtxt−1+1−αtϵt−1,ϵt−1∼N(0,I).
这和 VAE 中的
z=μϕ(x)+σϕ(x)ϵ
形式相同,都是把随机采样改写成“确定性变换加标准高斯噪声”,但 DDPM 的正向过程本身不需要反向传播来学习。
2.2 多步转移
由于正向过程是马尔可夫链:
q(x1:T∣x0)=t=1∏Tq(xt∣xt−1).
定义累计乘积
αˉt=s=1∏tαs,αˉ0=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.
最后两项是相互独立的零均值高斯噪声,因此它们之和仍是零均值高斯噪声,方差为
αt(1−αt−1)+(1−αt)=1−αtαt−1.
继续递推到 x0,并记
αˉt=αtαˉt−1,αˉ0=1,
就得到信号系数为 αˉt,噪声方差为
1−αˉt=αt(1−αˉt−1)+(1−αt).
q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I).
因此可以不必真的执行 t 次加噪,直接采样:
xt=αˉtx0+1−αˉtϵ,ϵ∼N(0,I).
这里使用了独立高斯变量相加时均值相加、方差相加的性质:
N(0,σ12I)+N(0,σ22I)=N(0,(σ12+σ22)I).
当 t 增大时,αˉt 逐渐趋近于 0,于是
xT≈N(0,I).
也就是说,正向过程把数据分布逐渐抹平成简单的标准高斯分布。
3. 反向生成过程
3.1 反向过程的建模
如果知道真实数据分布,反向条件分布为 q(xt−1∣xt);但它通常无法直接计算,所以用神经网络参数化:
pθ(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt),
其中
p(xT)=N(xT;0,I),
并令每一步反向转移为高斯分布:
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t)).
神经网络接收带噪样本 xt 和时间步 t,输出反向高斯分布的参数。训练完成后,从 xT∼N(0,I) 开始,按照 T,T−1,…,1 的顺序逐步采样。
3.2 为什么需要 x0
单独的 q(xt−1∣xt) 一般难以解析得到,但带上已知的初始样本后,后验
q(xt−1∣xt,x0)
可以由贝叶斯公式写成
q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0).
由于正向过程的马尔可夫性质,q(xt∣xt−1,x0)=q(xt∣xt−1),而前面已经求出了 q(xt−1∣x0) 与 q(xt∣x0),所以该后验仍然是高斯分布。
3.3 反向后验的闭式形式
令 y=xt−1,将三个高斯分布代入上式,有
q(y∣xt,x0)∝q(xt∣y)q(y∣x0)∝exp[−21(βt∥xt−αty∥2+1−αˉt−1∥y−αˉt−1x0∥2)].
其中分母中的常数来自
q(xt∣y)=N(xt;αty,βtI),q(y∣x0)=N(y;αˉt−1x0,(1−αˉt−1)I).
把指数中的二次型关于 y 展开:
βt∥xt−αty∥2+1−αˉt−1∥y−αˉt−1x0∥2=(βtαt+1−αˉt−11)∥y∥2−2(βtαtxt+1−αˉt−1αˉt−1x0)⊤y+C(xt,x0).
二次项系数为
βtαt+1−αˉt−11=βt(1−αˉt−1)αt(1−αˉt−1)+βt=βt(1−αˉt−1)1−αˉt.
因此对二次型配方后,后验仍然是高斯分布:
q(xt−1∣xt,x0)=N(xt−1;μ~t(xt,x0),β~tI),
其中后验方差为
β~t=1−αˉt1−αˉt−1βt,
后验均值由“方差乘以一次项系数”得到:
μ~t(xt,x0)=β~t(βtαtxt+1−αˉt−1αˉt−1x0)=1−αˉtαˉt−1βtx0+1−αˉtαt(1−αˉt−1)xt.
即
μ~t(xt,x0)=1−αˉtαˉt−1βtx0+1−αˉtαt(1−αˉt−1)xt.
所以只要给定 x0,反向一步的真实均值和方差都可以解析计算。
但生成时只有 xt,没有 x0,因此需要神经网络根据 xt 预测出与 x0 或噪声等价的信息。
4. 从 ELBO 推导 DDPM 损失
4.1 把 DDPM 看成潜变量模型
在 DDPM 中,观测变量是 x0,潜变量是 x1:T。真实的正向过程 q(x1:T∣x0) 充当变分分布,反向模型 pθ(x0:T) 是要学习的生成模型。
这与 KL 散度分解 完全同一条思路:对边缘似然插入一个容易采样的分布 q。
logpθ(x0)=log∫pθ(x0:T)dx1:T=log∫q(x1:T∣x0)q(x1:T∣x0)pθ(x0:T)dx1:T≥Eq(x1:T∣x0)[logq(x1:T∣x0)pθ(x0:T)].
最后一步是 Jensen 不等式。定义 DDPM 的负 ELBO 损失:
LDDPM=−Eq(x1:T∣x0)[logq(x1:T∣x0)pθ(x0:T)].
因此,DDPM 并不是脱离 ELBO 的另一套目标,而是把 ELBO 应用到了一个有 T 个潜变量的层次模型上。
4.2 ELBO 的详细推导
负 ELBO 就是正向链与反向链两个联合分布的对数之比(见 4.1 把 DDPM 看成潜变量模型):
L=Eq(x1:T∣x0)[logpθ(x0:T)q(x1:T∣x0)].
把分子分母按各自的马尔可夫链展开成乘积:
L=Eq(x1:T∣x0)[logp(xT)∏t=1Tpθ(xt−1∣xt)∏t=1Tq(xt∣xt−1)]=Eq(x1:T∣x0)[−logp(xT)+t=1∑Tlogpθ(xt−1∣xt)q(xt∣xt−1)].
把求和中的 t=1 项单独分离出来,因为它是唯一出现 pθ(x0∣x1) 的项:
L=Eq(x1:T∣x0)[−logp(xT)+t=2∑Tlogpθ(xt−1∣xt)q(xt∣xt−1)+logpθ(x0∣x1)q(x1∣x0)].
正向过程是马尔可夫链,所以对 t≥2 有 q(xt∣xt−1)=q(xt∣xt−1,x0)。把它代入求和中的分子,为下一步用贝叶斯公式做准备:
L=Eq(x1:T∣x0)[−logp(xT)+t=2∑Tlogpθ(xt−1∣xt)q(xt∣xt−1,x0)+logpθ(x0∣x1)q(x1∣x0)].
对 t≥2 使用贝叶斯公式(并再次利用马尔可夫性质 q(xt∣xt−1,x0)=q(xt∣xt−1)):
q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1,x0)q(xt−1∣x0)
两边取对数:
logq(xt∣xt−1,x0)=logq(xt−1∣xt,x0)+logq(xt∣x0)−logq(xt−1∣x0).
代入求和后,∑t=2T[logq(xt∣x0)−logq(xt−1∣x0)] 是望远镜和,只剩首尾 logq(xT∣x0)−logq(x1∣x0),恰好与单独的 t=1 项中的 logq(x1∣x0) 相消:
L=Eq(x1:T∣x0)[logp(xT)q(xT∣x0)+t=2∑Tlogpθ(xt−1∣xt)q(xt−1∣xt,x0)−logpθ(x0∣x1)]=LTEq(xT∣x0)[logp(xT)q(xT∣x0)]+t=2∑TLt−1Eq(xt∣x0)[Eq(xt−1∣xt,x0)[logpθ(xt−1∣xt)q(xt−1∣xt,x0)]]−L0Eq(x1∣x0)[logpθ(x0∣x1)].
最后一步把期望按各自依赖的变量拆分(不依赖的变量先边缘化掉)。中间项的内层期望正是 KL 散度——对固定的 xt,按后验 q(xt−1∣xt,x0) 平均对数之比:
Lt−1=Eq(xt∣x0)[DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))].
三部分分别是终点先验 KL、中间反向转移 KL 和最终数据项。
4.3 三项的含义与可忽略项
- LT:终点先验 KL,正向过程最后的 q(xT∣x0) 要接近标准正态先验,通常接近常数;
- Lt−1:学习的反向一步 pθ(xt−1∣xt) 要逼近真实后验 q(xt−1∣xt,x0);
- L0:最后一步负责把 x1 还原成数据 x0,是数据重构(似然)项。
L0 可以忽略:图像像素被量化到 [0,255] 后,x1 与 x0 只相差一步很小的噪声(β1 很小),此时 −logpθ(x0∣x1) 几乎不随参数变化,对总损失的贡献很小;DDPM 原论文据此把它与不含可学习参数的 LT 一并当作常数处理,后续推导(5.2 KL 项化为均方误差)只保留中间的 Lt−1 项。
其中终点项可以直接算出闭式形式。对
q(xT∣x0)=N(αˉTx0,(1−αˉT)I),p(xT)=N(0,I),
使用高斯 KL 公式,得到
LT=21[d((1−αˉT)−1−log(1−αˉT))+αˉT∥x0∥2].
因为 αˉT 和 x0 都不依赖 θ,所以 LT 在训练反向网络时是常数;当 αˉT 很小时,q(xT∣x0) 已经非常接近 N(0,I)。
这和 VAE 的
−ELBO=重构损失+DKL(qϕ(z∣x)∥p(z))
结构相同,只是 DDPM 的中间潜变量很多,KL 项沿着整条反向链逐步展开。
5. 从预测均值到预测噪声
5.1 用噪声表示真实后验均值
忽略常数项 LT 和重建项 L0(见 4.3 三项的含义与可忽略项)后,训练目标只剩中间的反向 KL 项 Lt−1,下面把它化为关于噪声的均方误差。
由正向闭式采样公式
xt=αˉtx0+1−αˉtϵ
可以反解出
x0=αˉt1(xt−1−αˉtϵ).
将 x0 代入后验均值,并把 xt 与 ϵ 的系数分别整理:
μ~t(xt,x0)=1−αˉtαˉt−1βtαˉtxt−1−αˉtϵ+1−αˉtαt(1−αˉt−1)xt.
由于 αˉt=αtαˉt−1,xt 的系数为
αt(1−αˉt)βt+1−αˉtαt(1−αˉt−1)=αt(1−αˉt)βt+αt(1−αˉt−1)=αt1,
而 ϵ 的系数为
−αt1−αˉtβt.
因此得到只依赖 xt 和真实噪声 ϵ 的形式:
μ~t(xt,x0)=αt1(xt−1−αˉtβtϵ).
因此让网络预测噪声
ϵθ(xt,t)≈ϵ
即可定义反向均值:
μθ(xt,t)=αt1(xt−1−αˉtβtϵθ(xt,t)).
网络不需要直接输出 x0 或复杂的后验均值,只需判断当前 xt 中混入了哪些噪声。
5.2 KL 项化为均方误差
若把反向方差固定为 σt2I,可以从高斯 KL 的一般公式出发:
DKL(N(m1,S1)∥N(m2,S2))=21(log∣S1∣∣S2∣−d+tr(S2−1S1)+(m2−m1)⊤S2−1(m2−m1)).
取
m1=μ~t,S1=β~tI,m2=μθ,S2=σt2I,
得到
DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))=21[dlogβ~tσt2−d+dσt2β~t+σt2∥μ~t−μθ∥2].
其中前三项与网络参数无关,可以并入常数 C,于是依赖参数的部分是均值差的平方:
Lt−1=E[2σt21∥μ~t(xt,x0)−μθ(xt,t)∥2]+C.
由两个均值的噪声表达式,均值差为
μ~t−μθ=αt1−αˉtβt(ϵθ(xt,t)−ϵ).
代入均值差的平方,可得
Lt−1=E[2σt2αt(1−αˉt)βt2∥ϵ−ϵθ(xt,t)∥2]+C.
所以训练网络的核心就是噪声回归。DDPM 实际中常用去掉时间权重的简化目标:
Lsimple=Et,x0,ϵ[ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)2].
它的训练含义很直接:随机选一个时间步,把干净样本加噪,再让网络从带噪样本中预测所加入的噪声。
6. 训练算法
对每个训练样本 x0,训练步骤为:
- 随机采样时间步 t∼Uniform{1,…,T};
- 采样标准高斯噪声 ϵ∼N(0,I);
- 用闭式公式构造带噪样本
xt=αˉtx0+1−αˉtϵ;
- 计算噪声预测误差
L=∥ϵ−ϵθ(xt,t)∥2;
- 反向传播,更新 θ。
时间步 t 通常通过 sinusoidal positional embedding 编码后输入 U-Net,使同一个网络能够处理不同噪声强度。
7. 采样算法
训练完成后,先采样
xT∼N(0,I).
对 t=T,T−1,…,1:
- 预测噪声 ϵθ(xt,t);
- 计算反向均值
μθ(xt,t)=αt1(xt−1−αˉtβtϵθ(xt,t));
- 采样
xt−1=μθ(xt,t)+σtz,z∼N(0,I),
当 t=1 时通常令 z=0,避免在最终样本中再次加入噪声。
最后得到 x0。因此 DDPM 的生成速度较慢:一次生成需要执行 T 次网络推理,这正是后续快速采样方法要解决的问题。
8. DDPM 与 VAE、ELBO 的联动
8.1 统一视角
| 概念 | VAE | DDPM |
|---|
| 观测变量 | x | x0 |
| 潜变量 | 一个低维 z | 多个中间状态 x1:T |
| 变分分布 | qϕ(z∣x),由编码器学习 | q(x1:T∣x0),正向加噪过程固定 |
| 生成模型 | pθ(x∣z)p(z) | p(xT)∏tpθ(xt−1∣xt) |
| ELBO 中的逼近 | qϕ(z∣x)≈pθ(z∣x) | pθ(xt−1∣xt)≈q(xt−1∣xt,x0) |
| 训练目标 | 重构损失加 KL 正则 | 多个高斯 KL,化为噪声 MSE |
| 生成方式 | 一次从 z 解码 | 从 xT 逐步反向去噪 |
VAE 的编码器一次性把 x 压缩成 z,DDPM 的正向过程则把 x0 分散到一长串噪声状态中;DDPM 以更长的链换取了更容易学习的局部高斯反向过程。
8.2 与 ELBO 笔记的公式对应
KL 散度分解 中的基本恒等式是
logp(x)=Lq+DKL(q∥p(潜变量∣x)).
DDPM 只是在“潜变量”位置换成整个序列 x1:T:
logpθ(x0)=−LDDPM+DKL(q(x1:T∣x0)∥pθ(x1:T∣x0)).
最大化 ELBO 就是让反向链逼近真实的正向后验;当每个时间步的局部反向分布都学好时,整条链就能从高斯噪声逐步回到数据分布。
8.3 与 VAE 重参数化的对应
VAE 中重参数化解决的是“如何让随机隐变量采样对网络参数可导”;DDPM 中正向采样也可重参数化为
xt=αˉtx0+1−αˉtϵ.
但训练时 q 的均值和方差都由 schedule 固定,网络只需要对噪声预测误差求梯度。因此 DDPM 不需要 VAE 那样的可学习编码器,却仍然保留了“噪声与确定性变换分离”的思想。
9. 一句话总结
DDPM 先用固定的正向马尔可夫链把数据变成高斯噪声,再用神经网络学习反向链;其理论目标是多步潜变量模型的 ELBO,其常用训练形式则是预测正向过程中加入的噪声:
Lsimple=Et,x0,ϵ[∥ϵ−ϵθ(xt,t)∥2]
所以,VAE、ELBO 与 DDPM 的主线可以概括为:引入潜变量降低建模难度,用变分下界替代难算的边缘似然,再通过神经网络学习潜变量对应的生成过程。
评论