DDPM

Denoising Diffusion Probabilistic Model 去噪扩散概率模型

DDPM 通过模拟一个逐步加噪的前向扩散过程和一个逐步去噪的反向生成过程,使用神经网络学习噪声预测,从而生成高质量样本。 由 Jonathan Ho 等人于 2020 年提出,是扩散模型领域的奠基性工作。

核心思想:噪声与去噪的循环

DDPM 的核心思想可以概括为两个过程:

  1. 前向扩散过程 (Forward Diffusion Process):固定的马尔可夫链,在每个时间步 t 向数据 xt1 中添加少量高斯噪声,经过 T 步后原始数据 x0 完全变为纯高斯噪声 xT
  2. 反向去噪过程 (Reverse Denoising Process):训练一个神经网络预测并移除每个时间步添加的噪声,从纯高斯噪声 xT 逐步恢复出原始数据 x0
graph LR
    A["x₀ 原始数据"] -->|"q(xₜ|xₜ₋₁) 加噪"| B["x₁"]
    B -->|"..."| C["xₜ"]
    C -->|"..."| D["x_T ~ N(0,I)"]
    D -->|"pθ(xₜ₋₁|xₜ) 去噪"| E["x_{T-1}"]
    E -->|"..."| F["x̂₀ 生成数据"]

前向扩散过程

前向扩散是一个固定的马尔可夫链,在每个时间步 t 根据预设的方差调度 βt 添加噪声:

q(xt|xt1)=N(xt;1βtxt1,βtI)

其中 βt(0,1) 是噪声调度参数,通常随 t 线性或余弦递增。经过 T 步后(通常 T=1000),xT 近似于标准正态分布。

关键性质——任意步采样:利用 αt=1βtα¯t=s=1tαs,可以直接从 x0 采样得到任意时间步的 xt

q(xt|x0)=N(xt;α¯tx0,(1α¯t)I)

等价于重参数化形式:

xt=α¯tx0+1α¯tϵ,ϵN(0,I)
重参数化技巧

这个性质使得训练时无需逐步执行前向过程,可以直接对任意时间步 t 进行采样,大幅提高了训练效率。同样的技巧在 VAE 中也被使用。

反向去噪过程

反向过程也是一个马尔可夫链,其转移概率需要学习:

pθ(xt1|xt)=N(xt1;μθ(xt,t),σt2I)

DDPM 的关键洞察:当 βt 足够小时,反向过程的均值 μθ 可以通过预测噪声 ϵθ(xt,t) 来参数化:

μθ(xt,t)=1αt(xtβt1α¯tϵθ(xt,t))

训练目标

DDPM 的训练目标是最小化预测噪声与真实噪声之间的均方误差:

L(θ)=Ex0,t,ϵ[ϵϵθ(α¯tx0+1α¯tϵ,t)2]

其中 x0q(x0)tUniform(1,T)ϵN(0,I)

简洁的损失函数

这个目标函数从变分下界 (VLB) 推导而来,但形式极其简洁——本质上就是一个去噪自编码器的训练目标。正是这种简洁性使得 DDPM 的训练非常稳定。

采样算法

text
Algorithm: DDPM Sampling
Input: 训练好的噪声预测网络 ε_θ
Output: 生成样本 x_0

1. x_T ~ N(0, I)
2. for t = T, T-1, ..., 1:
     z ~ N(0, I) if t > 1, else z = 0
     x_{t-1} = (1/√α_t)(x_t - β_t/√(1-ᾱ_t) · ε_θ(x_t, t)) + σ_t · z
3. return x_0

数学形式:

xt1=1αt(xt1αt1α¯tϵθ(xt,t))+σtz

其中 σt=βt(或 σt=β~tβ~t=1α¯t11α¯tβt)。

U-Net 架构

DDPM 中的噪声预测网络 ϵθ 采用 U-Net 架构,包含以下关键组件:

组件 功能
编码器(下采样路径) 通过 CNN 卷积 + 下采样逐步提取多尺度特征
解码器(上采样路径) 通过转置卷积逐步恢复空间分辨率
跳跃连接 (Skip Connection) 将编码器特征直接传递给对应层级的解码器
时间步嵌入 将时间步 t 通过正弦位置编码 + MLP 注入网络各层
自注意力层 在低分辨率特征图上捕捉全局依赖关系

PyTorch 训练示例

python
import torch
import torch.nn as nn

def ddpm_train_step(model, x_0, T=1000, beta_min=1e-4, beta_max=0.02):
    """DDPM 单步训练"""
    betas = torch.linspace(beta_min, beta_max, T)
    alphas = 1.0 - betas
    alpha_bars = torch.cumprod(alphas, dim=0)

    # 随机采样时间步
    t = torch.randint(0, T, (x_0.shape[0],))
    alpha_bar_t = alpha_bars[t].view(-1, 1, 1, 1)

    # 前向加噪(重参数化)
    epsilon = torch.randn_like(x_0)
    x_t = torch.sqrt(alpha_bar_t) * x_0 + torch.sqrt(1 - alpha_bar_t) * epsilon

    # 预测噪声
    epsilon_pred = model(x_t, t)

    # 计算损失
    loss = nn.functional.mse_loss(epsilon_pred, epsilon)
    return loss

噪声调度策略

调度方式 公式 特点
线性 (Linear) βt104 线性增长到 0.02 DDPM 原始方案,简单直接
余弦 (Cosine) α¯t=f(t)f(0), f(t)=cos2(t/T+s1+sπ2) Improved DDPM 提出,信噪比更平滑

优缺点分析

优点 缺点
生成质量高,样本逼真 采样速度慢(需迭代 T 步,通常 1000 步)
训练稳定,损失函数简单 单次采样需数秒至数分钟
模式覆盖好,不易出现模式崩溃 计算资源需求大
理论基础扎实(变分推断) 隐空间缺乏可解释结构(对比 VAE

后续发展

模型 改进方向 关键贡献
Improved DDPM 方差学习 + 余弦调度 更少步数达到同等质量
DDIM 非马尔可夫采样 采样步数可降至 10-50 步
Score SDE 统一分数匹配与扩散模型 连续时间扩散框架
Latent Diffusion (LDM) 在潜空间而非像素空间扩散 大幅降低计算成本,Stable Diffusion 基础
Classifier-Free Guidance 无分类器引导 提升条件生成质量
DiT 用 Transformer 替代 U-Net 更好的可扩展性

扩散模型 | 深度学习 | GAN | VAE