← Home

Denoising Diffusion Probabilistic Models (DDPM)

Jonathan Ho、Ajay Jain、Pieter Abbeel · UC Berkeley · 2020-12-16 · arXiv:2006.11239

Denoising Diffusion Probabilistic Models(DDPM)

> UC Berkeley · Jonathan Ho / Ajay Jain / Pieter Abbeel · NeurIPS 2020 · arXiv:2006.11239

> 泛读卡片。目标读者:有 ML 基础、不熟悉生成模型方向的人。

一句话定位

这篇论文把扩散概率模型从 2015 年的理论框架变成能生成高质量图像的实用生成器:固定一条逐渐加噪的前向马尔可夫链,用 U-Net 学反向去噪链,并把训练目标改写成「预测噪声 ε」的无权重均方误差。在无条件 CIFAR10 上它拿到 IS 9.46、FID 3.17,超过当时多数生成模型;「噪声预测」从此成为扩散模型沿用至今的默认约定,也是 JiT 论文用 x-prediction 挑战的靶子。

问题:为什么扩散模型此前「理论干净、质量不达标」

扩散模型由 Sohl-Dickstein 2015 年提出:先定义一条逐级加噪的马尔可夫链,再学一条反向链把噪声还原成数据。这套框架训练目标明确、有变分下界保证,但在 2020 年之前没有人证明它能生成高质量样本,社区普遍把它当理论工具。

同一时期其它生成模型各有短板:GAN 训练不稳定、有模式坍缩;自回归模型按像素顺序逐点生成、计算贵且难并行;flow 模型要求可逆网络、容量受限;VAE 样本模糊。NCSN 一类 score matching 方法用多尺度噪声扰动加 Langevin 采样能生成可辨认图像(CIFAR10 FID 25.32),但采样系数靠手工设置,训练目标与采样器脱节。DDPM 的切入点是:把反向链当作 latent variable model 用变分推断直接训练,让训练目标与采样过程严格对齐,再用一个简单的参数化改动拿到质量跃升。

前向过程:把图一步步加噪

前向链是固定的,不含任何学习参数。给定数据 x_0,每一步按下面的转移加一点高斯噪声:

q(x_t|x_{t−1}) = N(x_t; √(1−β_t)·x_{t−1}, β_t·I)

这个式子的含义:x_t 以 √(1−β_t) 的比例缩放上一步的图,再叠加一个方差为 β_t·I 的高斯噪声。β_t 是每步的噪声强度,论文在 T=1000 步内让 β_t 从 10⁻⁴ 线性递增到 0.02,始终很小。小噪声的用意:相邻两步的分布长得几乎一样,反向恢复可以放心用高斯近似。

加噪链的高斯性质带来一个关键便利——任意时刻的加噪图可以直接闭式采样,无需一级一级加:

q(x_t|x_0) = N(x_t; √ᾱ_t·x_0, (1−ᾱ_t)·I)

其中 α_t = 1−β_t,ᾱ_t 是前 t 个 α 的连乘。上式用重参数化写就是 x_t = √ᾱ_t·x_0 + √(1−ᾱ_t)·ε,ε~N(0,I)。这意味着训练时对每个样本只采样一个随机时刻 t,就能拿到该时刻的加噪图,配合随机梯度下降高效优化。这是整篇论文训练效率的基石。

反向过程与 ELBO:训练目标从哪来

反向链是学习出来的。它从纯噪声 x_T~N(0,I) 出发,用高斯转移逐级还原:

p_θ(x_{t−1}|x_t) = N(x_{t−1}; μ_θ(x_t, t), σ_t²·I)

μ_θ 由神经网络给出,σ_t² 固定成未训练常数(取 β_t 或 β̃_t,两者结果相近)。目标是让反向链的联合分布 p_θ(x_{0:T}) 逼近数据分布,标准做法是最大化对数似然的下界(ELBO):

E[−log p_θ(x_0)] ≤ E_q[−log p(x_T) − Σ_{t≥1} log (p_θ(x_{t−1}|x_t) / q(x_t|x_{t−1}))] = L

直接优化这个 L 方差大。论文把它拆成三项:

L = L_T + Σ_{t>1} L_{t−1} + L_0

  • L_T 是最终噪声分布 q(x_T|x_0) 与标准高斯 p(x_T) 的 KL 散度。β 调度设计得让 x_T 几乎不含信号,这项在训练中是常数,可以忽略。
  • L_{t−1} 是前向后验 q(x_{t−1}|x_t, x_0) 与反向转移 p_θ(x_{t−1}|x_t) 的 KL。关键事实:给定 x_0 时,前向后验也是高斯,且有闭式解:
  • q(x_{t−1}|x_t, x_0) = N(x_{t−1}; μ̃_t(x_t, x_0), β̃_t·I)

    μ̃_t(x_t, x_0) = √ᾱ_{t−1}·β_t/(1−ᾱ_t)·x_0 + √α_t·(1−ᾱ_{t−1})/(1−ᾱ_t)·x_t,β̃_t = (1−ᾱ_{t−1})/(1−ᾱ_t)·β_t

    所以 L_{t−1} 是高斯对高斯的 KL,能写成闭式。它的含义很直接:网络要做的事,就是用 μ_θ(x_t, t) 去逼近这个「从 x_t 回到 x_{t−1} 的最佳均值」μ̃_t。

    • L_0 是最后一个离散解码器:数据缩放到 [−1,1] 后,用高斯分布在各像素 bin 上的积分计算离散像素的无损编码长度,保证整个下界是可比较的 bits/dim。

    核心约定:为什么让网络预测噪声

    最直接的参数化是让网络预测 μ̃_t 本身,但论文做了一次关键改写。把闭式采样公式 x_t = √ᾱ_t·x_0 + √(1−ᾱ_t)·ε 代入 μ̃_t 的表达式,经过化简可以得到:

    μ̃_t(x_t, x_0) = (1/√α_t)·(x_t − β_t/√(1−ᾱ_t)·ε)

    预期:这个式子把「后验均值」重写成「当前图 x_t 减去一项与噪声 ε 成比例的量」。既然 x_t 已经作为网络输入,网络就只需要预测 ε,再按上式换算回均值。于是网络改为预测 ε_θ(x_t, t),L_{t−1} 化简成:

    E[β_t²/(2σ_t²·α_t·(1−ᾱ_t))·‖ε − ε_θ(x_t, t)‖²]

    逐项看:β_t² 与 (1−ᾱ_t) 反映该时刻噪声占比,α_t 是缩放因子,σ_t² 是反向转移方差;整体是一个按 t 加权的去噪均方误差。这个目标形如多噪声尺度的 denoising score matching,采样算法(Algorithm 2)里 ε_θ 充当数据密度梯度的角色,等价于 annealed Langevin dynamics。论文把变分推断、score matching、Langevin 采样三条线索连成一条。

    随后论文再简化一步:去掉上面那个随 t 变化的权重,得到 L_simple:

    L_simple = E_{t,x_0,ε}‖ε − ε_θ(√ᾱ_t·x_0 + √(1−ᾱ_t)·ε, t)‖²,t 在 {1,…,T} 均匀采样

    去掉权重等效于压低小 t 项的贡献。小 t 对应几乎没噪声的去噪任务,简单且对样本质量贡献小;压低它们让网络把容量集中在噪声重、更难的大 t 任务上。这个改动让样本质量最好,虽然 codelength 略差。

    「预测噪声」约定是本文最重要的遗产:此后 DDIM、score-SDE、Stable Diffusion 等全部沿用 ε-prediction。JiT(2026)从流形角度指出,ε 铺满整个高维像素空间、远离数据流形,patch 维度一旦拉到 768/3072/12288,网络容量会随维度爆炸,主张直接预测 x_0;在 JiT 的对照中,同一网络换回 ε-prediction,ImageNet 256 的 FID 从 8.62 崩到 372。DDPM 建立约定,JiT 挑战约定——本期播客的核心对比就在这里。

    架构与设置

    • 数据线性缩放到 [−1,1];T=1000;β_t 从 10⁻⁴ 线性递增到 0.02。
  • 反向链用 U-Net(类 unmasked PixelCNN++ 结构)+ 分组归一化,跨层 skip 连接保留细节。
  • 时间步 t 用 Transformer 正弦位置嵌入,条件加到所有层;16×16 特征图分辨率处加 self-attention。
  • 所有层共享参数,靠 t 区分去噪强度;训练用 Adam,Cloud TPU。
  • 关键结果

    CIFAR10 无条件生成(Table 1):L_simple 模型 IS 9.46±0.11、FID 3.17(相对训练集)、NLL≤3.75 bits/dim。对照:NCSN FID 25.32、SNGAN 21.7、类条件 BigGAN FID 14.73(IS 9.22)、无条件 StyleGAN2+ADA FID 3.26。换测试集算 FID 是 5.24,仍好于文献里很多训练集 FID。这是全文招牌:无条件模型超过多数条件模型。

    预测目标消融(Table 2):同一 U-Net、同一 CIFAR10 设置,只改预测目标与损失。预测后验均值 μ̃ 配全变分界、固定方差:FID 13.22(IS 8.06);预测 ε 配全变分界、固定方差:13.51(IS 7.67);预测 ε 配 L_simple:3.17(IS 9.46)。μ̃-prediction 配无权重 MSE、以及学习对角方差的两格,训练不稳定、成绩空白。结论:ε-prediction 与简单 MSE 的组合是质量来源,参数化选择本身有决定性影响。

    LSUN 256×256(图 3/4):Church FID 7.89、Bedroom 大模型 4.90(小模型 6.36)、Cat 19.75;论文声明质量与 ProgressiveGAN 相当。CelebA-HQ 256 的样本见图 1。

    渐进生成与率失真:沿反向链用 x̂_0 = (x_t − √(1−ᾱ_t)·ε_θ)/√ᾱ_t 估计原图,大尺度结构先出现、细节最后出现(图 10 的 IS 随反向步数上升、FID 下降)。率失真分析:rate 1.78 bits/dim、distortion 1.97 bits/dim(RMSE 0.95,0–255 刻度),超过一半的无损编码长度花在不可感知细节上。中间 latent 已经编码高阶属性:t=750 处拆分采样链,性别、发色、表情等属性保持一致(图 7)。

    谱系定位

    vs Sohl-Dickstein 2015:同一概率框架,本文首次在标准基准上证明高质量生成,增量是噪声预测、固定线性调度、简化加权目标与 U-Net。vs NCSN:训练目标与采样器严格对齐(采样系数从 β_t 推导),结构上用 U-Net+attention、t 条件加到所有层。vs GAN/自回归:质量追平甚至超过多数 GAN,但似然落后自回归模型(Sparse Transformer 2.80 vs ≤3.75 bits/dim),且单图要 1000 次前向。这条线往后的继承者包括 DDIM、score-SDE、latent diffusion(Stable Diffusion)、flow matching,以及挑战 ε-prediction 的 JiT。

    局限

    1. 采样慢:一张图要 1000 次 U-Net 前向,GAN 只要一次;论文未探索加速推理。

    2. 似然不具竞争力:CIFAR10 NLL≤3.75 bits/dim,落后 Gated PixelCNN 3.03、Sparse Transformer 2.80。

    3. 质量与似然分离:训练全变分界 codelength 更好(≤3.70),训练 L_simple 样本更好(FID 3.17);超过一半编码长度花在不可感知细节上,模型偏有损压缩。

    4. 稳定性:学习对角方差在 CIFAR10 上训练不稳定(Table 2 空白);无条件生成下 LSUN Cat FID 19.75,质量明显弱于 Church/Bedroom。

    5. 我们读出:ε-prediction 只在 32×32 与 256×256 低维像素空间验证过;JiT 指出维度拉高后 ε 预测容量需求爆炸,DDPM 未回答「预测目标随维度如何变化」。

    6. 我们读出:β 调度只试了线性一种形状,架构沿用现成 U-Net,未系统消融;无条件生成与当时最强的无条件 GAN(StyleGAN2+ADA IS 9.74±0.05)相比仍有可测量差距(DDPM 9.46±0.11)。

    复现

    代码开源:https://github.com/hojonathanho/diffusion(TensorFlow,Cloud TPU 训练)。基准:CIFAR10 / LSUN / CelebA-HQ,报告 IS、FID、bits/dim。

    DDPM 把扩散概率模型从 2015 年的理论框架变成能生成高质量图像的实用生成器:固定一条逐渐加噪的前向马尔可夫链,用神经网络学反向去噪链,并把变分下界改写为『预测噪声 ε』的无权重均方误差。它在无条件 CIFAR10 上拿到 Inception Score 9.46、FID 3.17,超过当时多数生成模型;『噪声预测』从此成为扩散模型沿用至今的默认约定,也是后来 JiT 论文用 x-prediction 挑战的靶子。

    阅读提示

    精读深度:泛读

    清单提示:原文提示:快速复习前向/反向过程与 ELBO 推导即可,重点放在「噪声预测」这一约定上,为对比 JiT 的 x-prediction 服务。

    问题

    要解决什么:扩散概率模型(Sohl-Dickstein 2015 提出)训练目标明确、理论干净,但此前没有人证明它能生成高质量样本。本文要解决的是:如何设计扩散模型的具体实现——前向噪声方差、反向过程的网络结构、分布参数化、训练目标——让它在 CIFAR10、LSUN 等基准上追平甚至超过 GAN 与自回归模型的样本质量。

    为什么 prior work 不够:GAN 训练不稳定、模式坍缩;自回归模型按像素顺序逐点生成、计算昂贵且难以并行;flow 模型需要可逆网络、容量受限;VAE 的 ELBO 下界宽松、样本模糊。2015 年的原始扩散模型在 MNIST 上只有演示级质量,社区认为它只适合做理论分析。同时 NCSN 等 score matching 方法已经能用噪声扰动加 Langevin 采样生成可辨认图像(CIFAR10 FID 25.32),但它的采样系数靠手工设置、训练目标与采样器脱节。DDPM 从变分推断的角度把训练目标与采样链直接对齐,并靠一个简单的参数化改动拿到质量跃升。

    输入 / 输出

    输入

    名称类型说明
    x_t(加噪图像)像素,与数据同维度(CIFAR10 为 32×32×3,LSUN 为 256×256×3)训练时由 x_0 按 q(x_t|x_0)=N(√ᾱ_t·x_0, (1−ᾱ_t)I) 闭式采样;t 在 {1,…,1000} 上均匀抽样
    时间步 t标量 1–1000以 Transformer 正弦位置嵌入编码,所有网络层共享参数、靠 t 区分去噪强度

    输出

    名称类型说明
    ε_θ(x_t, t) 预测噪声与图像同维度的张量网络输出加噪时注入的高斯噪声 ε;采样时用 x_{t−1} = 1/√α_t·(x_t − (1−α_t)/√(1−ᾱ_t)·ε_θ) + σ_t z 还原上一步
    生成图像 x_0像素图从 x_T~N(0,I) 出发跑满 T=1000 步反向链;最后一步无噪声地显示 μ_θ(x_1,1)

    数据集

    数据规模备注
    CIFAR10(无条件)5 万张训练图 / 1 万张测试图,32×32×3主评测基准:IS、FID、负对数似然(bits/dim)
    LSUN Church / Bedroom / Cat(256×256)各约 12.6 万 / 3 百万 / 15 万张(原始 LSUN 规模)高分辨率质量评测,报告 FID
    CelebA-HQ 256×2563 万张人脸样本展示、latent 结构分析、插值实验

    架构(摘要)

    主干与结构

    backbone:U-Net(类 unmasked PixelCNN++ 结构)+ 分组归一化

    参数:未在正文给出精确参数量(作者开源实现约 35M 量级,训练在 Cloud TPU 上完成)

    类型:去噪自编码器 / 扩散概率模型

    关键组件

    为什么这样设计

    前向步噪声都很小(β_t 不超过 0.02),正反两个方向的条件分布都可以用高斯近似,网络只需回归均值;方差 σ_t²I 固定成未训练常数,避免学习方差带来的训练不稳定。U-Net 的 skip 连接让网络在保留全局结构的同时恢复高频细节,t 条件嵌入让同一套参数服务不同噪声强度。

    数值 sense

    分辨率CIFAR10 32×32×3;LSUN / CelebA-HQ 256×256×3
    timestepsT=1000;β_1=10⁻⁴,β_T=0.02,线性递增
    noise_scheduleβ_t 线性;α_t=1−β_t,ᾱ_t=∏_{s≤t}α_s
    sampling_cost生成一张图需 1000 次 U-Net 前向(与 GAN 的一次前向相比慢三个数量级)
    attention16×16 特征图分辨率处的 self-attention
    训练批量大小 128,Adam,学习率 2×10⁻⁴(附录),Cloud TPU;L_simple 目标下每步只采一个随机 t

    → 详见 Architecture tab。

    关键结果

    指标最强 baselinesetup
    CIFAR10 无条件 FID(L_simple)3.17(相对训练集);换测试集为 5.24NCSN 25.32、SNGAN 21.7、类条件 BigGAN 14.73、无条件 StyleGAN2+ADA 3.26CIFAR10 32×32,T=1000,U-Net,β_1=10⁻⁴→β_T=0.02 线性,数据缩放到 [−1,1]
    CIFAR10 无条件 Inception Score(L_simple)9.46 ± 0.11NCSN 8.87±0.12、EBM 8.30、类条件 BigGAN 9.22、无条件 StyleGAN2+ADA 9.74±0.05同上的无条件 CIFAR10 设置
    预测目标消融(Table 2,CIFAR10 FID)ε-prediction + L_simple:3.17μ̃-prediction + 全变分界固定方差 13.22;ε-prediction + 全变分界固定方差 13.51;μ̃-prediction + 无权重 MSE 与学习对角方差两格训练不稳定、成绩空白同一 U-Net、同一 CIFAR10 无条件设置,只改预测目标与损失
    LSUN 256×256 无条件 FIDChurch 7.89;Bedroom 大模型 4.90(小模型 6.36);Cat 19.75论文声明质量与 ProgressiveGAN 相当(ProgressiveGAN 是该基准的当时主流 GAN)256×256 LSUN,无条件生成,U-Net + self-attention,T=1000
    CIFAR10 负对数似然(bits/dim,训练集上)≤3.75(L_simple);全变分界版 ≤3.70Gated PixelCNN 3.03、Sparse Transformer 2.80(似然类模型更优);EBM / score matching 的 AIS 估计值更大(论文引用文献报告)CIFAR10 测试集评估;train/test 差距不超过 0.03 bits/dim
    率失真分解(CIFAR10 测试集)rate 1.78 bits/dim、distortion 1.97 bits/dim,对应 RMSE 0.95(0–255 刻度)论文自己的分析:超过一半的无损编码长度描述不可感知细节用 x̂_0=(x_t−√(1−ᾱ_t)ε_θ)/√ᾱ_t 沿反向链逐点估计,distortion 取均方根误差

    Insights

    vs 同类工作

    局限

    可复现性

    diffusion generative model noise prediction variational inference score matching U-Net NeurIPS 2020

    主干与结构

    backbone:U-Net(类 unmasked PixelCNN++ 结构)+ 分组归一化

    参数:未在正文给出精确参数量(作者开源实现约 35M 量级,训练在 Cloud TPU 上完成)

    类型:去噪自编码器 / 扩散概率模型

    关键组件

    • 前向过程:固定线性方差调度 β_1=10⁻⁴ 递增到 β_T=0.02,T=1000
    • 反向过程:p_θ(x_{t−1}|x_t)=N(μ_θ(x_t,t), σ_t²I),σ_t 取 β_t 或 β̃_t 之一(两者结果相近)
    • U-Net 编码器-解码器,卷积 + 下/上采样,跨层 skip 连接
    • 16×16 分辨率特征图上加 self-attention
    • 时间步 t 用 Transformer 正弦位置嵌入,条件加到所有层(不只在归一化层)
    • 数据线性缩放到 [−1,1];最后一个解码器用离散高斯积分计算 L_0(无损编码长度)

    为什么这样设计

    前向步噪声都很小(β_t 不超过 0.02),正反两个方向的条件分布都可以用高斯近似,网络只需回归均值;方差 σ_t²I 固定成未训练常数,避免学习方差带来的训练不稳定。U-Net 的 skip 连接让网络在保留全局结构的同时恢复高频细节,t 条件嵌入让同一套参数服务不同噪声强度。

    数值 sense

    分辨率CIFAR10 32×32×3;LSUN / CelebA-HQ 256×256×3
    timestepsT=1000;β_1=10⁻⁴,β_T=0.02,线性递增
    noise_scheduleβ_t 线性;α_t=1−β_t,ᾱ_t=∏_{s≤t}α_s
    sampling_cost生成一张图需 1000 次 U-Net 前向(与 GAN 的一次前向相比慢三个数量级)
    attention16×16 特征图分辨率处的 self-attention
    训练批量大小 128,Adam,学习率 2×10⁻⁴(附录),Cloud TPU;L_simple 目标下每步只采一个随机 t
    Figure 2 p.2 key

    前向加噪链与反向去噪链的计算图

    前向加噪链与反向去噪链的计算图

    原文 caption:The directed graphical model considered in this work.

    全篇的骨架图:上方从左到右是固定前向链 q(x_t|x_{t−1}),逐级给 x_0 加噪到纯噪声 x_T;下方从右到左是学习到的反向链 p_θ(x_{t−1}|x_t),从 x_T 逐级还原到 x_0。它对应论文的核心设定——训练目标就是让反向链的转移分布逼近前向过程的后验。理解这张图,前向/反向过程的定义和 ELBO 的三项分解就都锚定在同一个链条上。

    Table 1 & Table 2 p.5 key

    CIFAR10 结果表与预测目标消融

    CIFAR10 结果表与预测目标消融

    原文 caption:Table 1: CIFAR10 results. NLL measured in bits/dim. Table 2: Unconditional CIFAR10 reverse process parameterization and training objective ablation.

    两份表格并排在一页。Table 1 给出全文招牌数字:无条件 CIFAR10 上 DDPM(L_simple)IS 9.46±0.11、FID 3.17、NLL≤3.75 bits/dim,对比 NCSN FID 25.32、SNGAN 21.7、类条件 BigGAN FID 14.73。Table 2 是『噪声预测约定』的直接证据:同一网络、同一数据下,预测后验均值 μ̃ 配全变分界固定方差只有 FID 13.22,预测噪声 ε 配无权重 MSE(L_simple)达到 3.17;学习对角方差的两格训练不稳定、成绩空白。读这张表就能确认:参数化选择的收益来自 ε-prediction 与简单 MSE 的组合。

    Figure 1 p.1 supportive

    生成样本展示(CelebA-HQ 与 CIFAR10)

    生成样本展示(CelebA-HQ 与 CIFAR10)

    原文 caption:Generated samples on CelebA-HQ 256 × 256 (left) and unconditional CIFAR10 (right).

    论文第一眼的质量证据:左列 CelebA-HQ 256×256 人脸、右列无条件 CIFAR10 小图。它支撑『扩散模型能生成高质量样本』这句核心论断,也是后面 FID/IS 数字的直观对应——质量接近同一时期 GAN 的水平。图里全是未经挑选的整批样本(附录还给了更多)。

    🎧 音频版

    时长 23:07 · Edge TTS

    Denoising Diffusion Probabilistic Models(对话版·泛读)

    先说说这期为什么要讲一篇 2020 年的老论文

    小播:老播,今天这篇《Denoising Diffusion Probabilistic Models》,标题就是 DDPM,一篇 2020 年的论文。现在扩散模型遍地都是,为什么还要专门回头讲它?

    老播:因为今天你在网上看到的绝大多数 AI 生图、生视频,往前追根溯源,都绕不开这一篇。2020 年之前,扩散模型在学术圈里还只是个理论框架,没人能拿它生成像样的图;这篇论文把「预测噪声」这个约定定了下来,让扩散模型第一次在 CIFAR10 和 LSUN 上追平甚至超过了当时最强的 GAN,从此扩散模型才走上主流。所以这期我们把前向加噪、反向去噪、还有 ELBO 怎么拆,快速复习一遍,把重心放在「噪声预测」这个约定上——后面讲 JiT 那篇挑战它的论文时,要用这个当参照系。

    小播:那先把结论放出来,我们这期最后要记住什么?

    老播:记住一句话:同一个网络、同一份 CIFAR10 数据、同样 1000 步的加噪调度,只把网络的预测目标从「前向过程的后验均值」换成「噪声本身」,再配一个不带权重的均方误差,生成质量就从 FID 13.22 一路掉到 3.17——FID 越低越好,3.17 是当时无条件生成的最优水平之一。这个看似小改动,成了扩散模型往后所有工作的默认设置。本期我们还会说清楚一件事:为什么预测噪声这件事本身值得单独立一个约定,以及 JiT 后来从什么角度质疑它。

    小播:那这期我们具体能听懂什么?满篇概率符号,门槛会不会很高?

    老播:我们就从三个问题出发:前向过程怎么定义、反向过程学什么、训练目标怎么从变分下界里拆出来。听懂这三件事,再单独把「预测噪声」这一手拆开讲,你会发现它其实只是一次重参数化,难度没有想象中高。所有公式我们都先给预期,再逐项解释符号,真正要记住的式子其实只有两三条。

    先把背景铺开:2020 年之前,生成模型这条赛道什么局面

    小播:讲 DDPM 之前,我们得先知道它站在什么位置上。当时的生成模型都有哪些?

    老播:四大类。GAN 用生成器和判别器对抗训练,生成快、图也清楚,但训练不稳定、容易只生成少数几种图,也就是模式坍缩;自回归模型像 PixelCNN,把图像当像素序列一个点一个点地预测,质量高、速度慢,而且顺序是固定的,先算左上角才能算右下角;flow 模型要求网络可逆,容量受限;VAE 有清晰的变分下界,但生成图发糊。2020 年的主力是 GAN,CIFAR10 上最强的一批成绩都来自它。这里先交代两个后面常用的指标:FID 衡量生成图和真实图两个分布的差距,越低越好;Inception Score 衡量图是否清晰、是否多样,越高越好。后面所有数字都要带着比较对象和实验条件来读。

    小播:那扩散模型呢?它当时是什么状态?

    老播:扩散模型 2015 年就有人提出来了,论文原班人马的 Sohl-Dickstein 那篇。它把生成过程想成两段:第一段,前向过程,拿一张真实图,一步一步往上叠高斯噪声,叠到 1000 步,图彻底变成纯噪声;第二段,反向过程,学一个网络把噪声一步一步去掉,从纯噪声还原出图。这两段合起来是一条马尔可夫链——马尔可夫链的意思就是,每一步的状态只取决于上一步,跟更早的历史无关。想法很干净,但 2020 年之前只在 MNIST 这种玩具数据上做出过演示级的图,学界把它当理论工具。

    小播:那它和 VAE 都是潜在变量模型,区别在哪?

    老播:先把「潜在变量模型」定义一下:除了看到的 x,模型还引入一串看不到的变量,把数据分布写成对联合分布关于这些变量积分。VAE 的潜在变量是一个低维向量;扩散模型的潜在变量是 x_1 到 x_T 一整串,每一层都和图像同维度。差别在于扩散的前向过程固定、后验已知,训练不需要额外学编码器,这是它后面能闭式计算的基础。2015 年那篇的短板:调度、网络、目标全是朴素版本,样本质量上不来,所以一直没进主流。

    小播:那 NCSN 那篇呢?它好像也是加噪声去噪声的思路。

    老播:对,NCSN 是另一条线,叫 score matching。score 是数据分布的对数密度的梯度,指向数据密度增大的方向;NCSN 让网络在多尺度噪声下拟合这个梯度,再用 Langevin 采样沿着梯度方向走回去,一步一个噪声小步。它在 CIFAR10 上 FID 是 25.32,能看出图,但有个毛病:采样的步长、噪声系数靠手工调,训练目标和采样器是两套东西,没有严格对齐。DDPM 的切口就在这——它把反向链直接当潜在变量模型用变分推断训练,让训练目标本身就是采样链的质量,再用一个参数化改动拿到跃升。这条线很重要,因为后面你会发现,DDPM 的训练目标在数学上恰好等价于多尺度的 score matching。

    核心就三件事:前向加噪、反向去噪、把目标改成预测噪声

    小播:好,进入正题。前向过程怎么定义?

    老播:前向过程是一条固定链,不含任何要学的参数。给定一张真实图 x 零,每一步这样走:x_t 等于根号下 1 减 β_t,乘以 x_{t−1},再加上一个方差为 β_t 的高斯噪声。β_t 是这一步的噪声强度,论文把总步数 T 设为 1000,β_t 从 10 的负 4 次方线性递增到 0.02,全程都很小。第一个数字的意思是第一步几乎不加噪,最后一步的噪声方差也只有百分之二。小噪声的设计有讲究:相邻两步的分布长得几乎一样,反向恢复就可以放心用高斯近似,两边函数形式一致,网络只需要回归一个均值。加个数字抓手:如果到某一步 ᾱ_t 等于 0.25,原图信号的系数是它的平方根 0.5,噪声系数是根号下 0.75,约 0.87,信号已经被噪声盖过;β 调度越往后,这个信号占比越小,走到 1000 步时基本只剩噪声。这个「信号占比」的视角,后面解释采样公式和 JiT 的流形论证时都会用到。

    小播:为什么要一步一步加,直接一步加到位不行吗?

    老播:可以,而且论文就用了这个便利。因为高斯噪声叠加之后还是高斯,任意一步 t 的加噪图都能直接算出来:x_t 等于根号下 ᾱ_t 乘以 x_0,加根号下 1 减 ᾱ_t 乘以 ε。这里 ε 是标准高斯噪声,ᾱ_t 是前 t 个 1 减 β 的连乘,代表到第 t 步还剩多少信号。这个闭式公式意味着训练时每个样本只抽一个随机时刻 t,就能拿到这个时刻的加噪图,不需要真的跑 1000 步——这是整篇训练效率的根基,后面 JiT 的流形论证也要从这条公式出发。换个角度说,前向过程把「一张图」编码成了「一条从原图到纯噪声的中间状态序列」,反向过程的任务就是沿着这条序列倒着走回去。

    小播:反向过程呢?网络学的是什么?

    老播:反向过程从纯噪声 x_T 出发,学一个高斯转移,每一步从 x_t 还原到 x_{t−1}。网络输出这一步的均值 μ_θ,方差设成未训练的常数,论文试过两种取值,结果相近。两个候选值是 β_t 和 β̃_t:前者对纯噪声输入最优,后者对确定的单点数据最优,正好对应反向过程熵的两个极端,试下来结果相近,说明这个选择对质量影响不大,真正起作用的是均值怎么参数化。训练目标来自最大化似然的下界,也就是 ELBO——它的思路是:我们要一个分布 p_θ,让真实数据在它下面的概率尽量大,直接算这个概率要积分掉所有中间状态,算不动,就退而求其次优化它的下界。论文把这个下界拆成三项:L_T 管最后纯噪声那一步的分布对不对,因为 β 调度把信号消得干净,这项在训练里是常数,可以忽略;L_0 管最后一步把噪声还原成离散像素的编码,数据先缩放到负一到正一,再用高斯分布在每个像素区间上积分,保证整个目标能按 bits/dim 和别的模型比较;中间那一大串 L_{t−1} 是主角,每一项都是前向后验 q(x_{t−1}|x_t, x_0) 和网络反向转移之间的 KL 散度。

    小播:KL 散度又是什么?前向后验为什么能写出来?

    老播:KL 散度衡量两个分布的差距,越小越接近。关键点在于:给定 x_0 的条件下,前向后验也是高斯,而且均值有闭式解,叫 μ̃_t——它告诉我们,已知起点和当前点,最可能的中间站是哪。既然两边都是高斯,KL 就能直接积分算出来,训练方差很小,不用做高方差的蒙特卡洛估计。到这里逻辑就顺了:网络要做的事情,就是用 μ_θ(x_t, t) 去逼近这个前向后验均值 μ̃_t。这也是整篇推导里最干净的一步:ELBO 的三项分解,每一小项都有了能算、能理解的形式。拆成三项的收益是方差:每一项都只涉及单个时刻,用随机 t 就能无偏估计,整条链的计算变成每步一次前向,配合闭式高斯公式,整个目标是可微的,直接跑随机梯度下降就行。

    小播:那「预测噪声」这个约定是怎么从这一步冒出来的?

    老播:这就是全文最关键的改写。预期是:把前向后验均值重新整理一下,会发现它等于 1 除以根号 α_t,乘以括号里 x_t 减去 β_t 除以根号下 1 减 ᾱ_t 再乘以 ε。也就是说,后验均值可以写成「当前图减去一个与噪声成比例的量」。既然 x_t 已经作为输入喂给网络了,网络根本不需要绕一圈去预测均值,直接预测 ε 就行,再按这个公式换回均值。这个改动把每一项 L_{t−1} 变成了带权重的去噪均方误差,权重是 β_t 平方除以两倍 σ_t 平方乘 α_t 再乘 1 减 ᾱ_t,随 t 变化。

    小播:那这个权重后来怎么样了?

    老播:论文再进一步,把权重整个丢掉,得到最简目标 L_simple:抽一个随机 t,让网络预测注入的噪声 ε,预测值和真实噪声差的平方取期望。丢权重是有意的:小 t 对应几乎没噪声、容易的去噪任务,压低它们的权重,让网络把容量集中在大 t 的难任务上。实验证明这个最简目标样本质量最好,虽然按 bits/dim 算的编码长度略差一点点。这里有个容易混的点,我再说清楚:全变分界版本是「理论正确」的目标,最简版本是「样本质量最好」的目标,论文选了后者,并且用实验说明了为什么值得。

    小播:那采样的过程长什么样?

    老播:采样就是反向链的每一步:x_{t−1} 等于 1 除以根号 α_t,乘以 x_t 减 1 减 α_t 除以根号下 1 减 ᾱ_t 乘以 ε_θ,最后再加一步方差为 σ_t 平方的高斯噪声。每个符号的意思:第一项缩放当前图,中间那项用网络预测的噪声把污染分量抠掉,最后一步加回随机性。这个更新式的形状很像 Langevin 动力学,ε_θ 扮演了数据密度梯度的角色。所以论文把三件事连成了一条线:训练用变分推断,等价于多噪声尺度的 denoising score matching,采样等价于退火的 Langevin 动力学。用数字验证一下这个约定:Table 2 里,同一个 U-Net、同一份 CIFAR10、同样 1000 步,让网络预测后验均值、配全变分界,FID 是 13.22;让网络预测噪声、配最简目标,FID 是 3.17。差距来自预测目标的选择本身,后面实验部分还会再讲一遍这张表。

    小播:这里我要插一句,JiT 那篇后来主张直接预测干净图像 x,跟这个约定正好对着干?

    老播:对,这正是我们把重心放在噪声预测上的原因。DDPM 当年在 CIFAR10 这种 32 乘 32 的低分辨率数据上试过直接预测 x_0,效果差,所以 ε-prediction 成了主流,之后的 DDIM、Stable Diffusion、score-SDE 全部沿用。JiT 从流形角度提出:干净图像 x 落在低维数据流形上,噪声 ε 铺满整个高维像素空间;预测 ε 需要网络容量跟着观测维度涨,patch 一拉高就会崩。在 JiT 的对照里,同一个 B 模型在 ImageNet 256 上,预测 x 的 FID 是 8.62,换成预测 ε 直接到 372。这个对比我们第 5 段展开,现在先记住结论:DDPM 建立了 ε-prediction,JiT 后来挑战了它。

    实验结果挑三个点讲:招牌数字、消融表、渐进生成

    小播:好,来看实验结果。论文最出名的数字是什么?

    老播:无条件 CIFAR10,用最简目标训练的模型,Inception Score 9.46,正负 0.11,FID 3.17,负对数似然不超过 3.75 bits/dim。对照着看:NCSN 的 FID 是 25.32,SNGAN 是 21.7,EBM 是 37.9,连当时很强的类条件模型 BigGAN,FID 也只有 14.73、IS 9.22。也就是说这个无条件模型,质量上超过了绝大多数有类别标签帮助的模型。还有个细节:FID 3.17 是按训练集算的,换成测试集是 5.24,依然比文献里很多模型的训练集 FID 好。当时无条件生成的最强 GAN 是 StyleGAN2 加自适应增强,FID 3.26、IS 9.74,DDPM 的 3.17 已经到同一个量级。看图的建议放这里:图 2 就是前后向链的示意图,上方一条链从左到右加噪,下方一条链从右到左去噪,整篇的结构都锚在这一张图里;图 1 是生成样本墙,左边 CelebA-HQ 人脸、右边 CIFAR10。先看图再回来看数字,就明白 FID 3.17 对应的图长什么样。

    小播:第二点,就是刚才那张消融表?

    老播:对,Table 2 是全文方法论的核心证据。四组对比,全部同一网络、同一数据、同一调度:预测后验均值配全变分界,FID 13.22;预测噪声也配全变分界,FID 13.51,跟前者差不多;预测噪声配最简无权重目标,FID 3.17。另外两格——预测均值配无权重 MSE、以及学习方差的那两格——训练直接不稳定,表里是空白。结论重复一遍:质量提升来自「预测噪声」加「简单 MSE」这个组合,参数化选择本身是决定性的。这是本期要反复记住的核心结论。顺带看另一份基线:自回归的 Gated PixelCNN 在 CIFAR10 上 FID 是 65.93,虽然它的似然数字最好——这说明样本质量和似然是两件事,这个矛盾贯穿全文。

    小播:第三个点呢?渐进生成是什么意思?

    老播:扩散模型有个 GAN 没有的性质:生成过程可以中途停下来看进度。给网络一张中间时刻的加噪图,用公式 x 零的估计等于 x_t 减根号下 1 减 ᾱ_t 乘 ε_θ,再除以根号下 ᾱ_t,就能还原出当时的估计图。顺着反向链看这些估计图,会发现大尺度结构先出现,细节最后补上。图 10 就是横轴反向步数、纵轴 Inception Score 和 FID 两条曲线,随着反向过程推进,IS 往上升、FID 往下降,直观对应「先轮廓后细节」。论文还做了率失真分析:rate 1.78 bits/dim,distortion 1.97 bits/dim,对应均方根误差 0.95,刻度是 0 到 255——意思是超过一半的无损编码长度花在了人眼看不出差别的细节上,模型更像一个有损压缩器。还有个有趣的实验:在中间时刻 t 等于 750 处把采样链拆开,重新随机走完剩下的步骤,得到的多张图会共享性别、发色、表情这些高层属性——说明中间 latent 已经把语义信息编码进去了。LSUN 256 的结果顺带提一句:Church FID 7.89,Bedroom 大模型 4.90,Cat 19.75,论文声明质量与当时的 ProgressiveGAN 相当。

    一句话讲清它在谱系里的位置,尤其是和 JiT 的关系

    老播:谱系压缩成一段。往上,它继承 Sohl-Dickstein 2015 年的扩散框架,但第一次证明这个框架能出高质量样本,增量是噪声预测、固定线性调度、最简目标和 U-Net;横向,它和 NCSN 的 score matching 在数学上等价,但训练与采样严格对齐,采样系数全部从 β 调度推导出来,没有手工参数;往下,DDIM、score-SDE、latent diffusion、flow matching 全在这条线上,每一篇都默认了 ε-prediction 这个地基。JiT 的位置在这条线的另一端:它承认扩散框架本身,质疑的是「预测噪声」这个约定,理由是 x 在流形上、ε 在流形外,维度一高容量就爆炸。所以读 JiT 之前先读 DDPM,把 ε-prediction 是怎么来的、为什么当年赢了讲清楚,JiT 的挑战才有参照物。

    再说三条局限,论文自己承认的和我们读出来的

    小播:老规矩,讲讲局限。第一条应该是采样慢吧?

    老播:对,最直接的一条:生成一张图要跑满 1000 步反向链,每一步一次网络前向,GAN 只要一次前向,差了三个数量级。论文自己没做任何加速推理的探索,只提了一句扩散长度可以缩短,提速这件事留给后来的 DDIM 和蒸馏类工作。第二条是似然数字不好看:CIFAR10 上负对数似然不超过 3.75 bits/dim,Gated PixelCNN 是 3.03,Sparse Transformer 只有 2.80,似然类模型都压着它打。论文的解释是质量与似然分离——超过一半的编码长度花在不可感知的细节上,它更像有损压缩器。这个解释有率失真数据支撑,但也说明它偏离了精确密度估计的目标。

    小播:还有呢?第三条呢?

    老播:第三条是稳定性与覆盖度。论文自承学习反向过程方差在 CIFAR10 上训练不稳定,表 2 里那两格直接空白;LSUN 的 Cat 类 FID 19.75,明显差于 Church 和 Bedroom,说明不同数据域的稳定性差异很大。我们读出两条:第一,ε-prediction 的优越性只在 32 乘 32 和 256 乘 256 的低维像素空间验证过,论文没有回答「预测目标随维度怎么变」,这个问题后来被 JiT 用高维 patch 实验补上了;第二,β 调度只试了线性一种形状,架构沿用现成的 U-Net,没有系统消融,论文的功劳更多在证明可行性和定下约定,工程细节留给了后续工作。还有一层:论文全程只做无条件生成,类别标签没有进入模型,和 BigGAN 这类条件模型比处于先天劣势,即便如此 FID 仍占优;类别信息怎么融入反向链,是后续工作补上的。论文自己在影响讨论里还提到生成模型会被用来造假图、会放大训练数据的偏置,这些风险在扩散模型普及后确实成了现实问题。

    收尾:这期记住三件事

    小播:最后帮我总结一下,这期要带走哪三件事?

    老播:第一件,扩散模型的骨架:前向过程固定加噪,任意时刻能闭式采样;反向过程学高斯转移去噪;训练目标是 ELBO,拆成三项,中间每一项都是高斯对高斯的 KL,能闭式算。第二件,噪声预测约定:把后验均值重写之后,网络只需要预测注入的噪声 ε,配合无权重 MSE,同一个网络在 CIFAR10 上把 FID 从 13.22 压到 3.17,这个约定统治了扩散模型好几年,直到 JiT 从流形角度用 x-prediction 挑战它。第三件,它留下了两个悬而未决的问题:1000 步慢采样,以及似然与样本质量的分离。前者催生了 DDIM、蒸馏这些加速路线,后者催生了把扩散当有损压缩的解读,以及 flow matching 把预测目标换成速度场的思考。这篇论文的定位,就是给整个扩散生成时代定下地基,后面所有扩散系工作,不管是加速、改目标还是换架构,都在它划定的框架里做文章。

    小播:好,那这期就到这里。下一期我们接着讲 JiT,正好把今天埋的线收掉。

    老播:没错,那个对比我们到时候细说。