前向扩散过程是一个马尔可夫链,通过逐步添加高斯噪声将数据分布 q(x0) 转化为简单的高斯分布 q(xT)≈N(0,I)。其数学形式为:
q(x1:T∣x0)=t=1∏Tq(xt∣xt−1),q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
其中:
- βt 是噪声调度参数(0<βt<1)
- 通过重参数化技巧,可直接从 x0 计算 xt:
xt=αˉtx0+1−αˉtϵ,ϵ∼N(0,I)
αt=1−βt, αˉt=∏s=1tαs
关键性质:当 T→∞ 时,xT 收敛到各向同性高斯分布。
图4.2.1:数据逐步被噪声化的过程示例(从清晰图像到纯噪声)
逆向过程通过学习条件概率 pθ(xt−1∣xt) 逐步去噪。根据DDPM原文,其形式为:
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))
其中:
- 均值 μθ 通过预测噪声 ϵθ 得到:
μθ(xt,t)=αt1(xt−1−αˉtβtϵθ(xt,t))
- 方差 Σθ 通常固定为 β~t=1−αˉt1−αˉt−1βt
训练目标:最小化噪声预测误差(简化版ELBO):
Lsimple=Et,x0,ϵ[∥ϵ−ϵθ(xt,t)∥2]
def forward_diffusion(x0, t, betas):
"""计算第t步的加噪样本"""
sqrt_alpha_bar = np.prod([(1 - betas[:t])**0.5])
sqrt_one_minus_alpha_bar = (1 - sqrt_alpha_bar**2)**0.5
noise = torch.randn_like(x0)
xt = sqrt_alpha_bar * x0 + sqrt_one_minus_alpha_bar * noise
return xt, noise
def reverse_step(xt, t, model, alphas, betas):
"""执行单步去噪"""
alpha_t = alphas[t]
sqrt_one_minus_alpha_bar_t = (1 - np.prod([(1 - betas[:t])]))**0.5
eps_theta = model(xt, t)
mu = (xt - (betas[t]/sqrt_one_minus_alpha_bar_t)*eps_theta)/alpha_t**0.5
return mu + (betas[t]**0.5)*torch.randn_like(xt)
以CIFAR-10图像生成为例:
- 前向过程:清晰图像在20步内逐渐变为噪声(见图4.2.1)
- 逆向过程:噪声通过U-Net预测噪声,逐步重建图像:
- 早期阶段(t≈T)恢复全局结构
- 后期阶段(t≈0)细化局部细节
图4.2.2:逆向去噪的阶段性效果(右→左为时间方向)
逆向过程的推导基于以下关键观察:
- 当 βt→0 时,q(xt−1∣xt,x0) 也是高斯分布:
q(xt−1∣xt,x0)=N(xt−1;μ~(xt,x0),β~tI)
- 通过贝叶斯定理可证明:
μ~(xt,x0)=1−αˉtαˉt−1βtx0+1−αˉtαt(1−αˉt−1)xt
- 用 ϵθ 替换 x0 的估计(因 x0=αˉtxt−1−αˉtϵ)
- Ho et al. "Denoising Diffusion Probabilistic Models" (NeurIPS 2020)
- Feller. "On the Theory of Stochastic Processes" (1951)
注:实际书籍中需补充完整的图表代码和更详细的推导步骤,此处为简洁展示核心内容结构。