扩散模型完全指南:从直觉到数学的深度解析

12 阅读9分钟

22-扩散模型完全指南:从直觉到数学的深度解析

引言

扩散模型(Diffusion Models)是当前最先进的生成模型之一,在图像生成领域取得了超越GAN的效果。从DALL-E 2到Stable Diffusion,从Midjourney到Imagen,这些震撼世界的AI艺术工具背后,都是扩散模型的身影。

本文目标:从零开始,用最详细的方式介绍扩散模型的完整原理——从最初的直觉理解,到严格的数学推导,再到实际的训练和采样过程。

适合人群:具备基础的概率论知识(高斯分布、条件概率)和深度学习基础的读者。


第一部分:直觉理解 - 扩散模型在做什么?

从一滴墨水说起

想象一个实验:在一杯清水中滴入一滴墨水。

观察到的现象

  • 0秒:墨水是一个清晰的黑点
  • 10秒:墨水开始扩散,边缘模糊
  • 30秒:墨水继续扩散,形状变得不规则
  • 5分钟:墨水充分扩散,整杯水变成均匀的淡灰色

这个过程就是扩散(Diffusion):有序的结构逐渐变成无序的均匀分布。

物理本质:墨水分子受到随机的布朗运动,从高浓度区域向低浓度区域移动,最终达到熵最大的状态——均匀分布。

逆转时间:从噪声到图像

扩散模型的核心想法:如果我们能逆转扩散过程,就能从噪声生成有序的结构

类比:

  • 正向扩散:清晰图像 → 加噪声 → 加噪声 → ... → 纯噪声
  • 反向扩散:纯噪声 → 去噪 → 去噪 → ... → 清晰图像

但问题是:物理上的扩散是不可逆的(熵增原理)。你不可能把那杯灰水变回一滴墨水。

扩散模型的突破:虽然物理上不可逆,但我们可以训练一个神经网络学习逆过程

为什么要这么做?

生成模型的目标:从随机噪声生成真实的数据(图像、音频、文本等)。

传统GAN的思路

  • 生成器:噪声 → 图像(一步到位)
  • 判别器:判断图像真假
  • 问题:训练不稳定,模式崩溃

扩散模型的思路

  • 不一步到位,而是逐步去噪
  • 每一步只需要预测"噪声的一小部分"
  • 分解了复杂问题,训练更稳定

类比

  • GAN:要求你一笔画出蒙娜丽莎(难!)
  • 扩散模型:给你一张模糊的蒙娜丽莎,让你一点点清晰化(容易得多!)

扩散模型的三个核心问题

理解扩散模型,需要回答三个问题:

问题1:如何定义"逐步加噪"的过程?

  • 答案:设计一个马尔可夫链,每步加一点高斯噪声

问题2:如何学习"逐步去噪"的过程?

  • 答案:训练神经网络预测每一步添加的噪声

问题3:如何从噪声生成图像?

  • 答案:从纯噪声开始,逐步运行去噪网络

接下来,我们将用严格的数学语言回答这三个问题。


第二部分:前向扩散过程 - 从图像到噪声的数学描述

马尔可夫链:离散的扩散过程

扩散模型将连续的扩散过程离散化成 TT 步(通常 T=1000T=1000)。

定义:给定原始数据 x0x_0(例如一张图像),前向过程定义为:

x0x1x2xTx_0 \to x_1 \to x_2 \to \cdots \to x_T

其中每一步都是一个马尔可夫过程xtx_t 只依赖于 xt1x_{t-1},与更早的状态无关。

单步转移:加一点高斯噪声

核心公式:从 xt1x_{t-1}xtx_t 的转移分布定义为:

q(xtxt1)=N(xt;1βtxt1,βtI)q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t I)

符号说明

  • N(μ,σ2)\mathcal{N}(\mu, \sigma^2):均值为 μ\mu,方差为 σ2\sigma^2 的高斯分布
  • βt(0,1)\beta_t \in (0, 1):第 tt 步的噪声强度(可学习或预定义)
  • II:单位矩阵(各维度独立加噪)

直观理解

  • xtx_t1βtxt1\sqrt{1-\beta_t} x_{t-1} 为中心(保留部分原始信号)
  • 同时加上方差为 βt\beta_t 的随机噪声

采样公式(重参数化):

xt=1βtxt1+βtεt1x_t = \sqrt{1-\beta_t} x_{t-1} + \sqrt{\beta_t} \varepsilon_{t-1}

其中 εt1N(0,I)\varepsilon_{t-1} \sim \mathcal{N}(0, I)

为什么要乘 1βt\sqrt{1-\beta_t}

这是为了保持方差稳定。如果 x0x_0 的方差为1,这个系数保证所有 xtx_t 的方差也为1,避免数值爆炸或消失。

噪声调度:βt\beta_t 的设计

βt\beta_t 控制每一步的噪声强度。常见的调度策略:

1. 线性调度(Linear Schedule)

βt=βmin+t1T1(βmaxβmin)\beta_t = \beta_{\min} + \frac{t-1}{T-1}(\beta_{\max} - \beta_{\min})

典型值:βmin=0.0001,βmax=0.02\beta_{\min} = 0.0001, \beta_{\max} = 0.02

特点

  • 早期(tt小):βt\beta_t 很小,加噪缓慢
  • 后期(tt大):βt\beta_t 接近 βmax\beta_{\max},加噪快速

2. 余弦调度(Cosine Schedule)

αˉt=f(t)f(0),f(t)=cos(t/T+s1+sπ2)2\bar{\alpha}_t = \frac{f(t)}{f(0)}, \quad f(t) = \cos\left(\frac{t/T + s}{1+s} \cdot \frac{\pi}{2}\right)^2

其中 s=0.008s=0.008 是偏移量。

优势:避免了线性调度在开始和结束时的突变,训练更稳定。

累积效应:从 x0x_0 直接跳到 xtx_t

逐步加噪可以合并成一步。定义累积参数:

αt=1βt,αˉt=i=1tαi=i=1t(1βi)\alpha_t = 1 - \beta_t, \quad \bar{\alpha}_t = \prod_{i=1}^{t} \alpha_i = \prod_{i=1}^{t}(1-\beta_i)

核心定理(可直接从 x0x_0 采样 xtx_t):

q(xtx0)=N(xt;αˉtx0,(1αˉt)I)q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1-\bar{\alpha}_t)I)

重参数化形式

xt=αˉtx0+1αˉtε,εN(0,I)x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \varepsilon, \quad \varepsilon \sim \mathcal{N}(0, I)

意义:训练时可以一步生成任意时刻的 xtx_t,无需逐步迭代1000次。

终点:纯噪声

t=Tt = T 时(通常 T=1000T=1000),αˉT0\bar{\alpha}_T \approx 0,因此:

xTN(0,I)x_T \approx \mathcal{N}(0, I)

xTx_T 近似为标准高斯噪声,原始图像信息完全被破坏。


第三部分:反向扩散过程 - 从噪声到图像的逆转

反向过程的目标

我们想要逆转前向过程,即从 xTx_T 恢复 x0x_0

xTxT1xT2x0x_T \to x_{T-1} \to x_{T-2} \to \cdots \to x_0

关键问题:如何定义 q(xt1xt)q(x_{t-1}|x_t)(反向转移分布)?

贝叶斯公式的尝试

根据贝叶斯定理:

q(xt1xt)=q(xtxt1)q(xt1)q(xt)q(x_{t-1}|x_t) = \frac{q(x_t|x_{t-1})q(x_{t-1})}{q(x_t)}

困难

  • q(xtxt1)q(x_t|x_{t-1}) 已知(前向过程)
  • q(xt1)q(x_{t-1})q(xt)q(x_t) 是数据的边缘分布,未知且难以计算

结论:无法直接解析地计算 q(xt1xt)q(x_{t-1}|x_t)

条件反向分布:已知 x0x_0 的情况

如果我们知道原始数据 x0x_0,则可以计算:

q(xt1xt,x0)q(x_{t-1}|x_t, x_0)

根据贝叶斯定理:

q(xt1xt,x0)=q(xtxt1,x0)q(xt1x0)q(xtx0)q(x_{t-1}|x_t, x_0) = \frac{q(x_t|x_{t-1}, x_0)q(x_{t-1}|x_0)}{q(x_t|x_0)}

由于马尔可夫性,q(xtxt1,x0)=q(xtxt1)q(x_t|x_{t-1}, x_0) = q(x_t|x_{t-1})

q(xt1xt,x0)=q(xtxt1)q(xt1x0)q(xtx0)q(x_{t-1}|x_t, x_0) = \frac{q(x_t|x_{t-1})q(x_{t-1}|x_0)}{q(x_t|x_0)}

已知的分布

  • q(xtxt1)=N(xt;αtxt1,βtI)q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_t}x_{t-1}, \beta_t I)
  • q(xt1x0)=N(xt1;αˉt1x0,(1αˉt1)I)q(x_{t-1}|x_0) = \mathcal{N}(x_{t-1}; \sqrt{\bar{\alpha}_{t-1}}x_0, (1-\bar{\alpha}_{t-1})I)
  • q(xtx0)=N(xt;αˉtx0,(1αˉt)I)q(x_t|x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t}x_0, (1-\bar{\alpha}_t)I)

后验分布的推导

将三个高斯分布代入贝叶斯公式,利用高斯分布的乘积仍是高斯分布,可以推导出:

q(xt1xt,x0)=N(xt1;μ~t(xt,x0),β~tI)q(x_{t-1}|x_t, x_0) = \mathcal{N}(x_{t-1}; \tilde{\mu}_t(x_t, x_0), \tilde{\beta}_t I)

后验均值

μ~t(xt,x0)=αˉt1βt1αˉtx0+αt(1αˉt1)1αˉtxt\tilde{\mu}_t(x_t, x_0) = \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1-\bar{\alpha}_t}x_0 + \frac{\sqrt{\alpha_t}(1-\bar{\alpha}_{t-1})}{1-\bar{\alpha}_t}x_t

后验方差

β~t=1αˉt11αˉtβt\tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t

推导思路:将三个高斯分布的对数相加减,配方得到新的高斯分布的均值和方差(详细推导见DDPM论文附录)。

xtx_tε\varepsilon 重参数化

xt=αˉtx0+1αˉtεx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\varepsilon 可以解出:

x0=xt1αˉtεαˉtx_0 = \frac{x_t - \sqrt{1-\bar{\alpha}_t}\varepsilon}{\sqrt{\bar{\alpha}_t}}

代入 μ~t\tilde{\mu}_t 公式:

μ~t(xt,x0)=1αt(xtβt1αˉtε)\tilde{\mu}_t(x_t, x_0) = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\varepsilon\right)

关键洞察:如果我们能预测噪声 ε\varepsilon,就能计算后验均值 μ~t\tilde{\mu}_t,从而采样 xt1x_{t-1}


第四部分:训练目标 - 学习逆过程

定义神经网络逼近反向过程

由于无法直接计算 q(xt1xt)q(x_{t-1}|x_t),我们用神经网络 pθp_\theta 来逼近:

pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t))

其中 θ\theta 是网络参数。

简化假设(DDPM的选择):方差固定为后验方差

Σθ(xt,t)=β~tI\Sigma_\theta(x_t, t) = \tilde{\beta}_t I

因此只需学习均值 μθ(xt,t)\mu_\theta(x_t, t)

变分下界(ELBO)

训练目标是最大化对数似然 logpθ(x0)\log p_\theta(x_0)。通过变分推断推导出ELBO(Evidence Lower Bound):

LELBO=Eq[DKL(q(xTx0)p(xT))+t=2TDKL(q(xt1xt,x0)pθ(xt1xt))logpθ(x0x1)]\mathcal{L}_{\text{ELBO}} = \mathbb{E}_q\left[D_{KL}(q(x_T|x_0) \| p(x_T)) + \sum_{t=2}^{T}D_{KL}(q(x_{t-1}|x_t,x_0) \| p_\theta(x_{t-1}|x_t)) - \log p_\theta(x_0|x_1)\right]

核心项DKL(q(xt1xt,x0)pθ(xt1xt))D_{KL}(q(x_{t-1}|x_t,x_0) \| p_\theta(x_{t-1}|x_t)) —— 真实后验与模型后验的KL散度。

由于两者都是高斯分布且方差相同,KL散度简化为:

Lt1=Eq[12β~tμ~t(xt,x0)μθ(xt,t)2]L_{t-1} = \mathbb{E}_q\left[\frac{1}{2\tilde{\beta}_t}\|\tilde{\mu}_t(x_t, x_0) - \mu_\theta(x_t, t)\|^2\right]

目标:让网络预测的均值 μθ\mu_\theta 接近真实后验均值 μ~t\tilde{\mu}_t

从预测均值到预测噪声

回顾重参数化:

μ~t(xt,x0)=1αt(xtβt1αˉtε)\tilde{\mu}_t(x_t, x_0) = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\varepsilon\right)

我们参数化 μθ\mu_\theta 为:

μθ(xt,t)=1αt(xtβt1αˉtεθ(xt,t))\mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\varepsilon_\theta(x_t, t)\right)

其中 εθ\varepsilon_\theta 是神经网络,预测噪声。

代入损失函数:

Lt1=Ex0,ε[βt22β~tαt(1αˉt)εεθ(xt,t)2]L_{t-1} = \mathbb{E}_{x_0, \varepsilon}\left[\frac{\beta_t^2}{2\tilde{\beta}_t\alpha_t(1-\bar{\alpha}_t)}\|\varepsilon - \varepsilon_\theta(x_t, t)\|^2\right]

简化损失函数

DDPM论文发现,去掉权重系数后训练效果更好:

Lsimple=Et,x0,ε[εεθ(xt,t)2]L_{\text{simple}} = \mathbb{E}_{t, x_0, \varepsilon}\left[\|\varepsilon - \varepsilon_\theta(x_t, t)\|^2\right]

其中:

  • tUniform(1,T)t \sim \text{Uniform}(1, T)
  • x0q(x0)x_0 \sim q(x_0)(数据分布)
  • εN(0,I)\varepsilon \sim \mathcal{N}(0, I)
  • xt=αˉtx0+1αˉtεx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\varepsilon

最终训练目标让神经网络预测前向过程中添加的噪声

直观理解

  • 给网络一个加噪图像 xtx_t 和时间步 tt
  • 网络预测这张图像的噪声成分 εθ(xt,t)\varepsilon_\theta(x_t, t)
  • 与真实噪声 ε\varepsilon 对比,计算均方误差

第五部分:噪声预测网络的架构 - U-Net详解

前面我们知道了扩散模型需要一个神经网络 εθ(xt,t)\varepsilon_\theta(x_t, t) 来预测噪声。但这个网络到底长什么样?由哪些层组成?信息如何流动?

这部分详细拆解扩散模型最核心的网络架构:U-Net

U-Net的整体结构:编码器-解码器架构

U-Net是扩散模型(包括DDPM、Stable Diffusion等)的标准backbone。它的名字来源于其U形结构

整体架构

输入: 加噪图像 x_t (256×256×3) + 时间步 t

                    x_t
                     ↓
         ┌───────────────────────┐
         │   Initial Conv        │  → 256×256×128
         └───────────────────────┘
                     ↓
         ┌───────────────────────┐
    ┌───│  Encoder Block 1      │  → 128×128×256  ← 下采样
    │   └───────────────────────┘
    │                ↓
    │   ┌───────────────────────┐
    ├───│  Encoder Block 2      │  → 64×64×512    ← 下采样
    │   └───────────────────────┘
    │                ↓
    │   ┌───────────────────────┐
    ├───│  Encoder Block 3      │  → 32×32×1024   ← 下采样
    │   └───────────────────────┘
    │                ↓
    │   ┌───────────────────────┐
    │   │  Bottleneck (中间层)  │  → 32×32×1024
    │   └───────────────────────┘
    │                ↓
    │   ┌───────────────────────┐
    └──→│  Decoder Block 1      │  → 64×64×512    ← 上采样 + 跳跃连接
        └───────────────────────┘
                     ↓
        ┌───────────────────────┐
    ┌──→│  Decoder Block 2      │  → 128×128×256  ← 上采样 + 跳跃连接
    │   └───────────────────────┘
    │                ↓
    │   ┌───────────────────────┐
    └──→│  Decoder Block 3      │  → 256×256×128  ← 上采样 + 跳跃连接
        └───────────────────────┘
                     ↓
        ┌───────────────────────┐
        │   Output Conv         │  → 256×256×3
        └───────────────────────┘
                     ↓
            预测的噪声 ε̂

关键特征

  1. 对称结构:编码器逐步降低分辨率,解码器逐步恢复分辨率
  2. 跳跃连接(Skip Connections):编码器的特征直接连到对应的解码器层
  3. 时间嵌入:时间步 tt 通过嵌入向量注入到每一层

组件一:ResNet Block(残差块)

U-Net的基本构建单元是ResNet Block,每个Encoder/Decoder Block包含多个ResNet Block。

单个ResNet Block的结构

输入特征 h (H×W×C)
    ↓
┌─────────────────────────┐
│ GroupNorm + SiLU        │  ← 归一化 + 激活
└─────────────────────────┘
    ↓
┌─────────────────────────┐
│ Conv 3×3                │  ← 卷积
└─────────────────────────┘
    ↓
┌─────────────────────────┐
│ 时间嵌入注入:           │
│ h = h + Linear(t_emb)   │  ← 加入时间信息
└─────────────────────────┘
    ↓
┌─────────────────────────┐
│ GroupNorm + SiLU        │
└─────────────────────────┘
    ↓
┌─────────────────────────┐
│ Conv 3×3                │
└─────────────────────────┘
    ↓
    + ← 残差连接(与输入相加)
    ↓
输出特征 h'

数学表达

h1=Conv(SiLU(GN(h)))+Linear(temb)h_1 = \text{Conv}(\text{SiLU}(\text{GN}(h))) + \text{Linear}(t_{\text{emb}})
h2=Conv(SiLU(GN(h1)))h_2 = \text{Conv}(\text{SiLU}(\text{GN}(h_1)))
output=h+h2(残差连接)\text{output} = h + h_2 \quad \text{(残差连接)}

为什么用ResNet Block?

  • 梯度流畅:残差连接使得梯度可以直接反向传播,避免梯度消失
  • 深度网络:可以堆叠很多层(U-Net通常有20-30层)

组件二:时间嵌入(Time Embedding)

时间步 tt 是扩散模型的关键输入,网络需要知道"当前是第几步"才能预测对应的噪声。

时间嵌入的流程

时间步 t (标量, 如 t=500)
    ↓
┌─────────────────────────────┐
│ Sinusoidal Position Encoding│  ← 将t编码成高维向量
│ 类似Transformer的位置编码    │
└─────────────────────────────┘
    ↓
时间向量 t_vec (128维)
    ↓
┌─────────────────────────────┐
│ Linear (128512)          │  ← 两层MLP扩展维度
│ SiLU                        │
│ Linear (512512)          │
└─────────────────────────────┘
    ↓
时间嵌入 t_emb (512维)
    ↓
注入到每个ResNet Block

正弦位置编码的公式

PE(t,2i)=sin(t100002i/d)\text{PE}(t, 2i) = \sin\left(\frac{t}{10000^{2i/d}}\right)
PE(t,2i+1)=cos(t100002i/d)\text{PE}(t, 2i+1) = \cos\left(\frac{t}{10000^{2i/d}}\right)

其中 ii 是维度索引,dd 是总维度(如128)。

为什么用正弦编码?

  • 连续性:相邻时间步的编码相近
  • 周期性:能表达时间的周期模式
  • 泛化性:没有可学习参数,避免过拟合

时间嵌入的注入方式

在每个ResNet Block中,时间嵌入通过加法注入到特征中:

h=h+Linear(temb)h = h + \text{Linear}(t_{\text{emb}})

这里的Linear层将512维的 tembt_{\text{emb}} 投影到当前特征的通道数 CC

组件三:下采样(Downsampling)

编码器通过下采样逐步减小空间分辨率,增加通道数。

两种下采样方式

方式1:步长为2的卷积

输入: 128×128×256
    ↓
┌────────────────────┐
│ Conv 3×3, stride=2 │  ← 卷积核大小3×3,步长2
└────────────────────┘
    ↓
输出: 64×64×512

方式2:平均池化

输入: 128×128×256
    ↓
┌────────────────────┐
│ AvgPool 2×2        │  ← 2×2平均池化
└────────────────────┘
    ↓
输出: 64×64×256
    ↓
┌────────────────────┐
│ Conv 1×1           │  ← 1×1卷积调整通道数
└────────────────────┘
    ↓
输出: 64×64×512

为什么下采样?

  • 增大感受野:低分辨率特征包含更全局的信息
  • 计算效率:低分辨率特征计算量小
  • 多尺度表示:不同分辨率捕获不同尺度的模式

组件四:上采样(Upsampling)

解码器通过上采样逐步恢复空间分辨率。

两种上采样方式

方式1:转置卷积(Transposed Convolution)

输入: 64×64×512
    ↓
┌────────────────────────┐
│ ConvTranspose2d        │  ← 反卷积
│ kernel=3, stride=2     │
└────────────────────────┘
    ↓
输出: 128×128×256

方式2:最近邻插值 + 卷积(更常用)

输入: 64×64×512
    ↓
┌────────────────────────┐
│ Upsample (x2)          │  ← 最近邻或双线性插值
│ 64×64 → 128×128        │
└────────────────────────┘
    ↓
┌────────────────────────┐
│ Conv 3×3               │  ← 卷积平滑插值产生的伪影
└────────────────────────┘
    ↓
输出: 128×128×256

为什么用插值+卷积?

  • 转置卷积容易产生棋盘伪影(checkerboard artifacts)
  • 插值+卷积效果更平滑

组件五:跳跃连接(Skip Connections)

这是U-Net的核心创新,也是"U"形名称的来源。

跳跃连接的作用

编码器的特征直接传递给解码器的对应层:

Encoder Block 1 (128×128×256) ─────┐
                                   │
                                   ├→ Concatenate
                                   │
Decoder Block 3 (128×128×256) ←────┘

具体操作

解码器在上采样后,将编码器的对应特征拼接到当前特征:

hdecoder=Concat(hupsampled,hencoder)h_{\text{decoder}} = \text{Concat}(h_{\text{upsampled}}, h_{\text{encoder}})

例如:

  • 上采样后:128×128×256128 \times 128 \times 256
  • 编码器特征:128×128×256128 \times 128 \times 256
  • 拼接后:128×128×512128 \times 128 \times 512(通道数翻倍)

为什么需要跳跃连接?

  1. 保留细节:编码器的高分辨率特征包含细粒度信息(边缘、纹理)
  2. 梯度流动:提供额外的梯度路径,缓解梯度消失
  3. 多尺度融合:结合低层次(细节)和高层次(语义)特征

组件六:注意力层(Attention Layer)

在较低分辨率的层(如32×32、16×16),U-Net会插入自注意力层

自注意力的位置

Encoder Block 3 (32×32×1024)
    ↓
┌────────────────────────┐
│ ResNet Block           │
└────────────────────────┘
    ↓
┌────────────────────────┐
│ Self-Attention         │  ← 注意力层
└────────────────────────┘
    ↓
┌────────────────────────┐
│ ResNet Block           │
└────────────────────────┘

Self-Attention的结构

输入特征 h (32×32×1024)
    ↓
展平成序列: (1024, 1024)  ← 1024个token,每个1024维
    ↓
┌────────────────────────┐
│ Linear投影: Q, K, V    │
│ Q = W_Q · h            │
│ K = W_K · h            │
│ V = W_V · h            │
└────────────────────────┘
    ↓
┌────────────────────────┐
│ Attention(Q, K, V)     │
│ = softmax(QK^T/√d)·V   │
└────────────────────────┘
    ↓
┌────────────────────────┐
│ 输出投影               │
└────────────────────────┘
    ↓
    + ← 残差连接
    ↓
输出特征 h'

数学表达

Attention(Q,K,V)=softmax(QKTd)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V

为什么要加注意力层?

  • 全局依赖:卷积只能捕获局部依赖(受感受野限制),注意力可以建模全局关系
  • 长距离交互:图像左上角的猫耳朵可以"看到"右下角的猫尾巴
  • 只在低分辨率使用:因为注意力复杂度是 O(N2)O(N^2),高分辨率计算量太大

条件注入:如何加入类别或文本?

扩散模型需要支持条件生成(如"生成一只猫")。条件信息有多种注入方式:

方式1:时间嵌入融合(类别条件)

类别标签 c (如 c=281 表示"猫")
    ↓
┌────────────────────────┐
│ Embedding Layer        │  ← 类别ID → 类别向量
└────────────────────────┘
    ↓
类别嵌入 c_emb (512维)
    ↓
┌────────────────────────┐
│ 与时间嵌入相加:        │
│ emb = t_emb + c_emb    │
└────────────────────────┘
    ↓
注入到ResNet Block

方式2:Cross-Attention(文本条件)

文本 "a photo of a cat"
    ↓
┌────────────────────────┐
│ CLIP Text Encoder      │  ← 预训练的文本编码器
└────────────────────────┘
    ↓
文本嵌入序列 c (77×768)  ← 77个token,每个768维
    ↓
在U-Net的每层插入Cross-Attention:

图像特征 h (32×32×1024)
    ↓
展平: (1024, 1024)
    ↓
┌────────────────────────┐
│ Q = W_Q · h            │  ← Query来自图像
│ K = W_K · c            │  ← Key来自文本
│ V = W_V · c            │  ← Value来自文本
└────────────────────────┘
    ↓
┌────────────────────────┐
│ CrossAttention(Q,K,V)  │  ← 图像"查询"文本信息
│ = softmax(QK^T/√d)·V   │
└────────────────────────┘
    ↓
输出特征(融合了文本信息)

Cross-Attention vs Self-Attention

类型Query来源Key/Value来源作用
Self-Attention图像特征图像特征图像内部不同位置交互
Cross-Attention图像特征文本嵌入图像根据文本调整特征

完整的U-Net前向传播流程

把所有组件串起来,完整走一遍:

输入

  • 加噪图像 xtx_t: 256×256×3256 \times 256 \times 3
  • 时间步 tt: 标量(如500)
  • 条件 cc: 类别或文本嵌入

第1步:时间嵌入

tSinusoidaltvecMLPtembR512t \xrightarrow{\text{Sinusoidal}} t_{\text{vec}} \xrightarrow{\text{MLP}} t_{\text{emb}} \in \mathbb{R}^{512}

第2步:Initial Conv

xtConv 3×3h0R256×256×128x_t \xrightarrow{\text{Conv 3×3}} h_0 \in \mathbb{R}^{256 \times 256 \times 128}

第3步:编码器(下采样路径)

h_0 (256×256×128)
  ↓ ResNet Block × 2 + Attention
h_1 (256×256×128) ─────────┐ (保存用于跳跃连接)
  ↓ Downsample              │
h_2 (128×128×256)           │
  ↓ ResNet Block × 2        │
h_3 (128×128×256) ─────────┼─┐
  ↓ Downsample              │ │
h_4 (64×64×512)             │ │
  ↓ ResNet Block × 2        │ │
h_5 (64×64×512) ───────────┼─┼─┐
  ↓ Downsample              │ │ │
h_6 (32×32×1024)            │ │ │

第4步:瓶颈层(Bottleneck)

h_6 (32×32×1024)
  ↓ ResNet Block × 2
  ↓ Self-Attention
h_7 (32×32×1024)

第5步:解码器(上采样路径)

h_7 (32×32×1024)
  ↓ Upsample
h_8 (64×64×1024)
  ↓ Concat(h_8, h_5) ← 跳跃连接
h_9 (64×64×1536)
  ↓ ResNet Block × 3
h_10 (64×64×512)
  ↓ Upsample
h_11 (128×128×512)
  ↓ Concat(h_11, h_3) ← 跳跃连接
h_12 (128×128×768)
  ↓ ResNet Block × 3
h_13 (128×128×256)
  ↓ Upsample
h_14 (256×256×256)
  ↓ Concat(h_14, h_1) ← 跳跃连接
h_15 (256×256×384)
  ↓ ResNet Block × 3
h_16 (256×256×128)

第6步:输出投影

h16GroupNormSiLUConv 3×3ε^R256×256×3h_{16} \xrightarrow{\text{GroupNorm}} \xrightarrow{\text{SiLU}} \xrightarrow{\text{Conv 3×3}} \hat{\varepsilon} \in \mathbb{R}^{256 \times 256 \times 3}

输出:预测的噪声 ε^\hat{\varepsilon},与输入 xtx_t 同样大小。

U-Net的参数量

一个典型的扩散U-Net(如Stable Diffusion的U-Net)参数量:

组件参数量
Initial Conv0.1M
Encoder Blocks300M
Bottleneck50M
Decoder Blocks300M
Attention Layers200M
总计~860M

相比之下:

  • ResNet-50: 25M参数
  • ViT-Base: 86M参数
  • GPT-2: 1.5B参数

U-Net的参数量介于CV和NLP模型之间。

为什么U-Net适合扩散模型?

1. 对称的编码-解码结构

  • 编码器提取多尺度特征
  • 解码器逐步恢复细节
  • 非常适合"去噪"任务(从噪声恢复细节)

2. 跳跃连接保留细节

  • 去噪需要精确恢复像素级细节
  • 跳跃连接直接传递高分辨率特征

3. 多尺度处理

  • 噪声在不同尺度上的表现不同
  • U-Net自然地在多个尺度上操作

4. 已有的成功经验

  • U-Net最初为医学图像分割设计
  • 分割任务(像素级预测)与去噪任务(像素级预测)很相似

小结:U-Net的组成板块

扩散模型的噪声预测网络(U-Net)由以下板块组成:

  1. ResNet Block:基本构建单元,带残差连接
  2. 时间嵌入:将时间步编码并注入每一层
  3. 下采样模块:降低分辨率,增加通道数
  4. 上采样模块:恢复分辨率,减少通道数
  5. 跳跃连接:编码器特征直接传递给解码器
  6. 注意力层:在低分辨率层建模全局依赖
  7. 条件注入:通过时间嵌入融合或Cross-Attention加入条件

整体数据流

输入:xt,t,c时间嵌入:ttemb编码器:xth1h2h6(逐步下采样)瓶颈层:h6h7(最低分辨率)解码器:h7h8h16(逐步上采样 + 跳跃连接)输出:h16ε^\begin{align} \text{输入} &: x_t, t, c \\ \text{时间嵌入} &: t \to t_{\text{emb}} \\ \text{编码器} &: x_t \to h_1 \to h_2 \to \cdots \to h_6 \quad \text{(逐步下采样)} \\ \text{瓶颈层} &: h_6 \to h_7 \quad \text{(最低分辨率)} \\ \text{解码器} &: h_7 \to h_8 \to \cdots \to h_{16} \quad \text{(逐步上采样 + 跳跃连接)} \\ \text{输出} &: h_{16} \to \hat{\varepsilon} \end{align}

现在你应该清楚扩散模型的网络"长什么样"了——它是一个U形的编码器-解码器结构,通过ResNet块、注意力层、跳跃连接和时间嵌入共同完成噪声预测任务。


第六部分:采样算法 - 从噪声生成图像

DDPM采样:严格的概率过程

训练完成后,我们有了噪声预测网络 εθ(xt,t)\varepsilon_\theta(x_t, t)。如何用它生成图像?

反向采样过程

xTN(0,I)x_T \sim \mathcal{N}(0, I) 开始,逐步采样:

xt1pθ(xt1xt)=N(xt1;μθ(xt,t),β~tI)x_{t-1} \sim p_\theta(x_{t-1}|x_t) = \mathcal{N}\left(x_{t-1}; \mu_\theta(x_t, t), \tilde{\beta}_t I\right)

采样公式

xt1=1αt(xtβt1αˉtεθ(xt,t))+β~tzx_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\varepsilon_\theta(x_t, t)\right) + \sqrt{\tilde{\beta}_t}z

其中 zN(0,I)z \sim \mathcal{N}(0, I)t=1t=1z=0z=0)。

完整算法

输入: 噪声预测网络 ε_θ
输出: 生成的图像 x_0

1. 采样 x_T ~ N(0, I)
2. for t = T, T-1, ..., 1 do
3.     z ~ N(0, I) if t > 1 else z = 0
4.     ε̂ = ε_θ(x_t, t)
5.     x_{t-1} = 1/√α_t · (x_t - β_t/√(1-ᾱ_t) · ε̂) + √β̃_t · z
6. end for
7. return x_0

特点

  • :需要 T=1000T=1000 步,每步都要前向传播网络
  • 随机性:每次采样噪声 zz,生成结果不同
  • 质量高:严格遵循训练时的概率过程

方差的选择

后验方差 β~t\tilde{\beta}_t 有两个合理的选择:

选择1:后验方差

β~t=1αˉt11αˉtβt\tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t

选择2:前向方差

β~t=βt\tilde{\beta}_t = \beta_t

DDPM使用选择1,IDDPM(Improved DDPM)发现学习方差插值效果更好。

DDIM采样:确定性加速

DDPM的问题:1000步太慢,能否加速?

DDIM的核心思想:构造一个非马尔可夫的前向过程,使得反向过程可以跳步。

DDIM前向过程

qσ(xt1xt,x0)=N(xt1;αˉt1x0+1αˉt1σt2xtαˉtx01αˉt,σt2I)q_\sigma(x_{t-1}|x_t, x_0) = \mathcal{N}\left(x_{t-1}; \sqrt{\bar{\alpha}_{t-1}}x_0 + \sqrt{1-\bar{\alpha}_{t-1}-\sigma_t^2} \cdot \frac{x_t - \sqrt{\bar{\alpha}_t}x_0}{\sqrt{1-\bar{\alpha}_t}}, \sigma_t^2 I\right)

其中 σt\sigma_t 控制随机性:

  • σt=β~t\sigma_t = \sqrt{\tilde{\beta}_t}:退化为DDPM
  • σt=0\sigma_t = 0:完全确定性

DDIM采样公式

用神经网络预测 x0x_0

x^0=xt1αˉtεθ(xt,t)αˉt\hat{x}_0 = \frac{x_t - \sqrt{1-\bar{\alpha}_t}\varepsilon_\theta(x_t, t)}{\sqrt{\bar{\alpha}_t}}

采样 xt1x_{t-1}

xt1=αˉt1x^0+1αˉt1σt2εθ(xt,t)+σtzx_{t-1} = \sqrt{\bar{\alpha}_{t-1}}\hat{x}_0 + \sqrt{1-\bar{\alpha}_{t-1}-\sigma_t^2} \cdot \varepsilon_\theta(x_t, t) + \sigma_t z

确定性情况σt=0\sigma_t = 0):

xt1=αˉt1x^0+1αˉt1εθ(xt,t)x_{t-1} = \sqrt{\bar{\alpha}_{t-1}}\hat{x}_0 + \sqrt{1-\bar{\alpha}_{t-1}} \cdot \varepsilon_\theta(x_t, t)

跳步采样

由于确定性,可以只在子序列 {τ1,τ2,,τS}{1,2,,T}\{\tau_1, \tau_2, \ldots, \tau_S\} \subset \{1, 2, \ldots, T\} 上采样。

例如:T=1000,S=50T=1000, S=50,选择 τ=[20,40,60,,1000]\tau = [20, 40, 60, \ldots, 1000]

算法

输入: 噪声预测网络 ε_θ, 时间步序列 τ = [τ_1, ..., τ_S]
输出: 生成的图像 x_0

1. 采样 x_{τ_S} ~ N(0, I)
2. for i = S, S-1, ..., 1 do
3.     t = τ_i
4.     t_prev = τ_{i-1} if i > 1 else 0
5.     ε̂ = ε_θ(x_t, t)
6.     x̂_0 = (x_t - √(1-ᾱ_t)·ε̂) / √ᾱ_t
7.     x_{t_prev} = √ᾱ_{t_prev}·x̂_0 + √(1-ᾱ_{t_prev})·ε̂
8. end for
9. return x_0

特点

  • :50步即可,速度提升20倍
  • 确定性:相同初始噪声产生相同结果
  • 质量略降:FID略高于DDPM,但肉眼难以区分

为什么DDIM可以跳步?

直观理解

DDPM的随机性累积,跳步会导致误差放大。DDIM去除随机性,每步都是确定性的轨迹,因此可以只在关键点采样。

数学角度

DDIM的更新公式可以看作ODE(常微分方程)的离散化:

dxdt=f(x,t)\frac{dx}{dt} = f(x, t)

而ODE的解对初值连续依赖,因此可以用更大的步长(跳步)求解。

采样质量与速度的权衡

方法步数时间FID (ImageNet 256×256)特点
DDPM100060s2.50严格概率过程,质量最高
DDIM503s2.80确定性,速度快
DDIM100.6s4.50极速,质量下降

第六部分:条件生成与引导

类别条件生成

实际应用中,我们希望控制生成内容,例如"生成一只猫"。

类别条件扩散模型

εθ(xt,t,c)\varepsilon_\theta(x_t, t, c)

其中 cc 是类别标签(如ImageNet的1000类)。

训练:数据集包含 (x0,c)(x_0, c) 对,损失函数变为:

L=Et,x0,c,ε[εεθ(xt,t,c)2]L = \mathbb{E}_{t, x_0, c, \varepsilon}\left[\|\varepsilon - \varepsilon_\theta(x_t, t, c)\|^2\right]

Classifier Guidance

问题:标准条件生成的类别一致性不够强。

解决方案:利用分类器梯度引导采样。

假设有一个分类器 pϕ(cxt,t)p_\phi(c|x_t, t),在采样时调整均值:

μ~t=μθ(xt,t,c)+sΣθxtlogpϕ(cxt,t)\tilde{\mu}_t = \mu_\theta(x_t, t, c) + s \cdot \Sigma_\theta \nabla_{x_t}\log p_\phi(c|x_t, t)

其中 ss 是引导强度。

直观理解:沿着"更像类别 cc"的方向调整。

缺点:需要额外训练分类器,且需要在噪声数据上训练。

Classifier-Free Guidance(CFG)

核心思想:不用分类器,而是训练时同时学习条件和无条件模型。

训练:以概率 pp (通常10%) 将条件 cc 置为空:

c={概率 pc概率 1pc' = \begin{cases} \emptyset & \text{概率 } p \\ c & \text{概率 } 1-p \end{cases}

这样网络学会两种预测:

  • εθ(xt,t,c)\varepsilon_\theta(x_t, t, c):条件预测
  • εθ(xt,t,)\varepsilon_\theta(x_t, t, \emptyset):无条件预测

采样时的引导

ε~θ(xt,t,c)=εθ(xt,t,)+w(εθ(xt,t,c)εθ(xt,t,))\tilde{\varepsilon}_\theta(x_t, t, c) = \varepsilon_\theta(x_t, t, \emptyset) + w \cdot (\varepsilon_\theta(x_t, t, c) - \varepsilon_\theta(x_t, t, \emptyset))

其中 w1w \geq 1 是引导尺度(guidance scale)。

改写为

ε~θ=(1w)εθ(xt,t,)+wεθ(xt,t,c)\tilde{\varepsilon}_\theta = (1-w)\varepsilon_\theta(x_t, t, \emptyset) + w \cdot \varepsilon_\theta(x_t, t, c)

数学解释

定义"条件方向"为:

Δ=εθ(xt,t,c)εθ(xt,t,)\Delta = \varepsilon_\theta(x_t, t, c) - \varepsilon_\theta(x_t, t, \emptyset)

则:

ε~θ=εθ(xt,t,)+wΔ\tilde{\varepsilon}_\theta = \varepsilon_\theta(x_t, t, \emptyset) + w\Delta
  • w=0w = 0:无条件生成
  • w=1w = 1:标准条件生成
  • w>1w > 1:放大条件影响

效果

ww类别一致性多样性图像质量
1.0
3.0
7.5最好
15.0过高过低过饱和

代价:推理时需要两次前向传播(条件+无条件),速度减半。

文本条件生成

对于文本到图像(Text-to-Image),条件 cc 是文本嵌入。

CLIP嵌入:使用预训练的CLIP模型将文本编码为向量。

Cross-Attention注入:在U-Net的每层添加交叉注意力:

Attention(Q,K,V)=softmax(QKTd)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V

其中:

  • Q=WQhQ = W_Q \cdot h(图像特征)
  • K=WKcK = W_K \cdot c(文本嵌入)
  • V=WVcV = W_V \cdot c

这使得图像特征可以"查询"文本信息。


第七部分:扩散模型的理论基础

与score-based模型的联系

扩散模型与score-based生成模型本质相同。

Score函数:数据分布的对数梯度

s(x)=xlogp(x)s(x) = \nabla_x \log p(x)

Tweedie's Formula:给定噪声观测 xt=x0+σεx_t = x_0 + \sigma\varepsilon,则:

E[x0xt]=xt+σ2xtlogp(xt)\mathbb{E}[x_0|x_t] = x_t + \sigma^2 \nabla_{x_t}\log p(x_t)

扩散模型的score

xt=αˉtx0+1αˉtεx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\varepsilon 可知:

xtlogp(xt)=ε1αˉt\nabla_{x_t}\log p(x_t) = -\frac{\varepsilon}{\sqrt{1-\bar{\alpha}_t}}

因此预测噪声 ε\varepsilon 等价于预测score:

εθ(xt,t)=1αˉtsθ(xt,t)\varepsilon_\theta(x_t, t) = -\sqrt{1-\bar{\alpha}_t} \cdot s_\theta(x_t, t)

随机微分方程(SDE)视角

扩散过程可以表示为SDE:

dx=f(x,t)dt+g(t)dwdx = f(x, t)dt + g(t)dw

其中:

  • f(x,t)f(x, t):漂移系数
  • g(t)g(t):扩散系数
  • ww:布朗运动

前向SDE(方差保持,VP-SDE):

dx=12β(t)xdt+β(t)dwdx = -\frac{1}{2}\beta(t)x dt + \sqrt{\beta(t)}dw

反向SDE

dx=[f(x,t)g2(t)xlogpt(x)]dt+g(t)dwˉdx = \left[f(x, t) - g^2(t)\nabla_x\log p_t(x)\right]dt + g(t)d\bar{w}

其中 wˉ\bar{w} 是反向布朗运动。

数值求解

用神经网络 sθs_\theta 逼近 xlogpt(x)\nabla_x\log p_t(x),然后用欧拉-丸山方法求解反向SDE,即可生成样本。

优势

  • 统一框架(DDPM、DDIM、score-based都是特例)
  • 可以使用高阶ODE求解器加速(DPM-Solver)
  • 理论保证(SDE理论)

概率流ODE(Probability Flow ODE)

对于任意SDE,存在唯一的ODE,其边缘分布与SDE相同:

dx=[f(x,t)12g2(t)xlogpt(x)]dtdx = \left[f(x, t) - \frac{1}{2}g^2(t)\nabla_x\log p_t(x)\right]dt

意义

  • ODE是确定性的,无随机性
  • 可以精确计算似然(通过瞬时变化公式)
  • 可以进行隐空间插值

DDIM就是概率流ODE的离散化


第八部分:扩散模型的变体与改进

Latent Diffusion Models(LDM)

核心思想:在低维隐空间做扩散,而非原始像素空间。

架构

  1. 自编码器xEzDx^x \xrightarrow{E} z \xrightarrow{D} \hat{x}

    • 编码器 EE:图像 → 隐表示(如 256×256×332×32×4256 \times 256 \times 3 \to 32 \times 32 \times 4
    • 解码器 DD:隐表示 → 图像
  2. 扩散过程:在 zz 空间做扩散

zt=αˉtz0+1αˉtεz_t = \sqrt{\bar{\alpha}_t}z_0 + \sqrt{1-\bar{\alpha}_t}\varepsilon
  1. 噪声预测网络εθ(zt,t,c)\varepsilon_\theta(z_t, t, c)

优势

  • 效率:隐空间维度远小于像素空间(322×42562×332^2 \times 4 \ll 256^2 \times 3),计算量减少64倍
  • 语义:隐空间更具语义性,更易于条件控制
  • 质量:解码器补充高频细节

代表:Stable Diffusion、Imagen Video。

Cascaded Diffusion Models

思想:分阶段生成,从低分辨率到高分辨率。

流程

  1. 基础模型:生成 64×6464 \times 64 图像
  2. 超分辨率模型1:64×64256×25664 \times 64 \to 256 \times 256
  3. 超分辨率模型2:256×2561024×1024256 \times 256 \to 1024 \times 1024

每个阶段都是独立训练的扩散模型,条件包括低分辨率图像。

优势

  • 分解复杂度,每个模型专注于特定尺度
  • 高分辨率生成(DALL-E 2使用此方法)

Consistency Models

目标:一步生成,去除迭代采样。

核心思想:训练一个网络 fθ(xt,t)f_\theta(x_t, t) 满足自一致性

fθ(xt,t)=fθ(xt,t)=x0t,tf_\theta(x_t, t) = f_\theta(x_{t'}, t') = x_0 \quad \forall t, t'

即所有噪声状态映射到同一个干净图像。

训练方法

  • 蒸馏:从预训练的扩散模型蒸馏
  • 直接训练:设计自一致性损失

效果

  • 速度:一步生成(0.1秒/图)
  • 质量:FID约5(比DDIM 50步的2.8差,但可接受)

Diffusion Transformers(DiT)

改进:用Transformer替换U-Net作为噪声预测网络。

优势

  • Scaling law:模型越大效果越好
  • 统一架构:与NLP模型一致

第九部分:扩散模型的应用

图像生成

无条件生成:学习数据分布,生成多样化样本(CelebA-HQ、FFHQ)。

条件生成

  • 类别条件:ImageNet生成
  • 文本条件:DALL-E 2、Stable Diffusion、Midjourney
  • 布局条件:根据语义图生成(COCO-Stuff)

图像编辑

SDEdit:给定粗略编辑,添加噪声后去噪,保持语义同时提升质量。

Inpainting:修复图像缺失区域,条件为mask和已知区域。

Image-to-Image:根据引导图像生成新图像(风格迁移、超分辨率)。

视频生成

时序扩散模型:将视频视为4D张量 (T,H,W,C)(T, H, W, C),在时空维度做扩散。

代表:Imagen Video、Make-A-Video、Runway Gen-2。

3D生成

DreamFusion:用预训练的2D扩散模型指导3D模型优化(NeRF)。

方法:从多视角渲染3D模型,用扩散模型的score函数作为损失。

音频与语音

语音合成:条件为文本,生成语音波形(Grad-TTS、DiffWave)。

音乐生成:Riffusion(在频谱图上做扩散)。

分子设计与科学

蛋白质结构预测:RFDiffusion(David Baker组)。

分子生成:生成具有特定性质的药物分子。


第十部分:扩散模型的优缺点与未来

优势

1. 生成质量高

  • FID优于GAN
  • 多样性好,无模式崩溃

2. 训练稳定

  • 简单的MSE损失
  • 无对抗训练的不稳定性

3. 似然可计算

  • ELBO提供似然下界
  • 概率流ODE可精确计算

4. 灵活的条件控制

  • 支持多种条件(文本、类别、图像)
  • CFG提供可调的条件强度

劣势

1. 采样速度慢

  • DDPM需要1000步
  • 即使DDIM也需50步
  • 实时应用困难

2. 训练成本高

  • 大规模数据集(数百万图像)
  • 长时间训练(数周到数月)
  • 高计算资源(数百GPU)

3. 理论不完善

  • 损失函数的权重设计缺乏理论指导
  • 采样步数与质量的关系不清晰

未来方向

1. 采样加速

  • 更好的ODE求解器(DPM-Solver++)
  • 蒸馏方法(Consistency Models、Progressive Distillation)
  • 一步生成(Adversarial Diffusion Distillation)

2. 架构改进

  • Transformer替代U-Net(DiT、U-ViT)
  • 更高效的注意力机制(Flash Attention)

3. 条件控制

  • 更细粒度的控制(ControlNet、T2I-Adapter)
  • 多模态条件(文本+图像+布局)

4. 应用拓展

  • 视频生成(时序一致性)
  • 3D生成(多视角一致性)
  • 科学领域(药物设计、材料科学)

5. 理论深化

  • 更好的score估计方法
  • 采样轨迹的优化
  • 与其他生成模型的统一

总结

扩散模型是深度生成模型的重大突破,其核心思想简洁而优雅:

前向过程:逐步加噪,将数据转化为纯噪声

x0x1xTN(0,I)x_0 \to x_1 \to \cdots \to x_T \approx \mathcal{N}(0, I)

反向过程:训练神经网络逐步去噪,从噪声恢复数据

xTxT1x0x_T \to x_{T-1} \to \cdots \to x_0

训练目标:预测每一步添加的噪声

L=Et,x0,ε[εεθ(xt,t)2]\mathcal{L} = \mathbb{E}_{t, x_0, \varepsilon}\left[\|\varepsilon - \varepsilon_\theta(x_t, t)\|^2\right]

采样过程:从纯噪声开始,迭代去噪生成样本

xt1=1αt(xtβt1αˉtεθ(xt,t))+σtzx_{t-1} = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\varepsilon_\theta(x_t, t)\right) + \sigma_t z

从物理的扩散现象,到严格的概率推导,再到实用的采样算法,扩散模型展现了理论与实践的完美结合。

虽然采样速度仍是瓶颈,但随着算法和硬件的进步,扩散模型正在重塑AI生成内容的格局,从艺术创作到科学研究,从娱乐产业到工业设计,扩散模型的应用前景无限广阔。

扩散模型告诉我们:有时候,通往目标的最佳路径,不是直线冲刺,而是小步迭代——从噪声到秩序,从混沌到结构,一步一步,终将抵达。


参考文献

  1. Sohl-Dickstein, J., et al. (2015). Deep Unsupervised Learning using Nonequilibrium Thermodynamics. ICML 2015.
  2. Ho, J., Jain, A., & Abbeel, P. (2020). Denoising Diffusion Probabilistic Models. NeurIPS 2020.
  3. Song, J., Meng, C., & Ermon, S. (2020). Denoising Diffusion Implicit Models. ICLR 2021.
  4. Nichol, A., & Dhariwal, P. (2021). Improved Denoising Diffusion Probabilistic Models. ICML 2021.
  5. Dhariwal, P., & Nichol, A. (2021). Diffusion Models Beat GANs on Image Synthesis. NeurIPS 2021.
  6. Ho, J., & Salimans, T. (2022). Classifier-Free Diffusion Guidance. NeurIPS Workshop 2021.
  7. Song, Y., et al. (2021). Score-Based Generative Modeling through Stochastic Differential Equations. ICLR 2021.
  8. Rombach, R., et al. (2022). High-Resolution Image Synthesis with Latent Diffusion Models. CVPR 2022.
  9. Ramesh, A., et al. (2022). Hierarchical Text-Conditional Image Generation with CLIP Latents. arXiv:2204.06125.
  10. Song, Y., et al. (2023). Consistency Models. ICML 2023.