Skip to content

23.3 图像生成:扩散模型完整理论

在上一节中,我们看到了文本如何驱动图像生成的整体流程。现在,是时候深入这台"造梦机器"的核心引擎了——扩散模型(Diffusion Model)。扩散模型是过去五年图像生成领域最重要的技术突破,从 2020 年 DDPM 的复兴到 Stable Diffusion 的工业级落地,再到 Sora 背后的 DiT 架构和 Flux 系列采用的 Flow Matching 方案,几乎所有前沿的视觉生成系统都建立在扩散模型的理论基础之上。

开源图像生成模型发展全景图(2022-2025),展示从 U-Net 黄金时代到 DiT 架构迁徙与流匹配范式的演进

图 23-9:开源图像生成模型发展全景图。从 2022 年 Stable Diffusion 1.5 的 U-Net 架构,到 2024 年 SD3/Flux 全面转向 DiT 与 Flow Matching,图像生成技术在短短三年内经历了范式级跃迁。

本节将从 DDPM 的正向加噪与逆向去噪出发,逐步揭示三种预测目标的数学等价性、得分匹配与 SDE 的"上帝视角"、采样加速的工程技巧、条件控制与 CFG 的引导机制、潜空间扩散的降维奇迹、骨干网络从 U-Net 到 DiT 的架构演进,最后展望流匹配与一致性模型等前沿方向。


23.3.1 DDPM 核心:从噪声中重建世界

为什么需要扩散模型?

所有的生成式 AI,本质上都在做一件事:从数据分布 pdata 中采样。可以把"世界上所有可能的猫的图片"想象成一个极高维空间中的地形图——山谷(高概率密度)对应清晰、符合现实逻辑的真实猫图,山顶(低概率密度)对应纯噪声和乱码。生成一张猫的图片,就等价于从这个分布的高密度区域中抽取一个样本。

在扩散模型之前,GAN(对抗生成网络)是图像生成的主流方案,但它面临训练不稳定和模式坍塌两大顽疾。2020 年,Ho et al. 发表的 DDPM(Denoising Diffusion Probabilistic Models)证明了一个优雅的替代思路:不试图一步到位地从噪声生成图像,而是将过程拆解为上千个极其微小的去噪步骤,每一步都只需解决一个简单的"去掉一点噪声"的问题。

DDPM 的有向图模型:从纯噪声  逐步去噪到干净图像

图 23-10:DDPM 的有向图模型(来源:Ho et al., 2020)。上方虚线箭头为正向加噪过程 q(xt|xt1),下方实线箭头为逆向去噪过程 pθ(xt1|xt)

正向过程:逐步加噪的马尔可夫链

正向过程是一个人为定义的、无需学习的马尔可夫链。给定一张干净的图片 x0,我们每一步都向其注入极其微量的高斯噪声:

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

即:

(23.2)xt=1βtxt1+βtϵ,ϵN(0,I)

其中 βt 是控制每步"撒噪量"的超参数,通常从 β1=104 线性增长到 βT=0.02t 越大加噪越猛。注意 1βtβt 的平方和严格等于 1,这确保了图像在不断叠加噪声时,整体数值尺度保持稳定,不会发生数值爆炸。

重参数化技巧:闭式跳跃 [必读]

如果要生成第 1000 步的噪声图 x1000,难道要循环执行 1000 次加噪吗?不需要。由于高斯分布叠加的优美性质,我们有一个闭式公式,可以从 x0 直接跳跃到任意时刻 t

(23.3)xt=α¯tx0+1α¯tϵ,ϵN(0,I)

其中 αt=1βtα¯t=i=1tαi 是前 tα 的累乘。这个公式将 xt 定义为**"原图残留信息"与"累计噪声"的加权和**。α¯tt 单调递减:t 很小时 α¯t1,图像几乎无损;t=Tα¯T0,图像几乎变成纯噪声。

这个公式的工程意义极大:训练时可以随机抽取任意时间步 t,一步到位生成带噪图像,无需串行计算。

推导提示 [选读]: 将式 (23.2) 递归展开,利用"两个独立正态之和仍为正态"的性质(N(0,σ12)+N(0,σ22)=N(0,σ12+σ22)),可以证明 xt|x0N(α¯tx0,(1α¯t)I),从而得到式 (23.3)。

逆向过程:学习去噪

逆向过程是模型真正需要学习的。因为正向每一步加的噪声极小,数学上可以证明,真实的逆向单步转移同样近似为高斯分布:

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

其中方差 σt2 通常被固定为关于 βt 的常数,模型只需用神经网络预测均值 μθ。但在实践中,我们不直接预测均值,而是让模型预测加入的真实噪声 ϵ,再通过公式反推均值:

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

DDPM 损失函数:从 ELBO 到 MSE [必读]

为什么训练扩散模型的损失函数如此简洁?让我们追溯其推导路径。

DDPM 的训练目标源自变分推断的 ELBO(Evidence Lower Bound)。我们希望最大化数据的对数似然 logpθ(x0),但直接计算涉及对所有隐变量 x1:T 求积分,这在高维空间中不可行。变分推断的标准策略是构造一个下界:

(23.6a)logpθ(x0)Eq[logpθ(x0:T)q(x1:T|x0)]=ELBO

经过仔细的条件分解,ELBO 可以拆成三部分:(a) 重建项 Eq[logpθ(x0|x1)](b) 先验匹配项 DKL(q(xT|x0)p(xT))(因为 q(xT|x0)N(0,I),此项接近零),以及 (c) 去噪匹配项,即各时间步的 KL 散度之和:

(23.6b)Lvlb=t=2TDKL(q(xt1|xt,x0)pθ(xt1|xt))

关键洞察: 在线性高斯马尔可夫链中,虽然 q(xt1|xt) 难以直接计算(它需要对 x0 做积分),但已知起点 x0 和终点 xt,后验条件分布 q(xt1|xt,x0) 有精确的闭式解——它是一个均值和方差都可以用 α¯tβt 表达的高斯分布。当两个高斯分布方差相同时(模型方差固定为常数 σt2),KL 散度严格退化为均值之间的 MSE。

经过层层化简(将均值用 ϵ 表达),最终的训练损失极其简洁:

(23.6)Lsimple=Et,x0,ϵ[ϵϵθ(xt,t)2]

训练流程可以概括为四步:(1) 从数据集中采样一张干净图片 x0(2) 均匀采样时间步 tUniform{1,,T}(3) 用式 (23.3) 一步到位生成 xt(4) 让网络预测噪声 ϵθ(xt,t),计算与真实噪声 ϵ 的 MSE。

下面是完整的训练与采样的伪代码实现:

python
import torch
import torch.nn as nn

class DDPMTrainer:
    def __init__(self, model, T=1000, beta_start=1e-4, beta_end=0.02):
        self.model = model  # 噪声预测网络 epsilon_theta
        self.T = T
        # 线性 beta 调度
        betas = torch.linspace(beta_start, beta_end, T)
        alphas = 1.0 - betas
        alpha_bar = torch.cumprod(alphas, dim=0)  # 累乘: bar{alpha}_t
        self.register_buffers(betas, alphas, alpha_bar)

    def train_step(self, x0):
        """DDPM 训练的单步:对应式 (23.3) 和 (23.6)"""
        B = x0.shape[0]
        # (1) 随机采样时间步
        t = torch.randint(0, self.T, (B,), device=x0.device)
        # (2) 采样随机噪声
        epsilon = torch.randn_like(x0)
        # (3) 一步到位加噪: x_t = sqrt(bar_alpha_t) * x0 + sqrt(1 - bar_alpha_t) * epsilon
        sqrt_alpha_bar = self.alpha_bar[t].sqrt().view(B, 1, 1, 1)
        sqrt_one_minus = (1 - self.alpha_bar[t]).sqrt().view(B, 1, 1, 1)
        x_t = sqrt_alpha_bar * x0 + sqrt_one_minus * epsilon
        # (4) 预测噪声并计算 MSE 损失
        epsilon_pred = self.model(x_t, t)
        loss = nn.functional.mse_loss(epsilon_pred, epsilon)
        return loss

    @torch.no_grad()
    def sample(self, shape):
        """DDPM 逆向采样:从纯噪声逐步去噪"""
        x = torch.randn(shape)  # x_T ~ N(0, I)
        for t in reversed(range(self.T)):
            t_batch = torch.full((shape[0],), t, dtype=torch.long)
            epsilon_pred = self.model(x, t_batch)
            # 式 (23.5): 计算均值
            alpha_t = self.alphas[t]
            beta_t = self.betas[t]
            alpha_bar_t = self.alpha_bar[t]
            mu = (1 / alpha_t.sqrt()) * (x - beta_t / (1 - alpha_bar_t).sqrt() * epsilon_pred)
            # 添加噪声(最后一步 t=0 不加)
            if t > 0:
                noise = torch.randn_like(x)
                sigma = beta_t.sqrt()
                x = mu + sigma * noise
            else:
                x = mu
        return x

23.3.2 三种预测目标的等价性

在闭式公式 xt=α¯tx0+1α¯tϵ 中,xtx0ϵ 被死死锁在同一个线性方程里:已知 xtt,解出任何一个,另外两个就确定了。因此,网络可以选择预测三者中的任何一个。

三种预测目标的几何关系:-pred 预测噪声方向,-pred 预测原图位置,-pred 预测切线速度

图 23-11:三种预测目标的几何直觉(来源:Salimans & Ho, 2022)。带噪输入位于噪声空间与图像流形之间,ϵ-pred 指向纯噪声方向,x0-pred 指向图像流形,v-pred 则沿切线方向。

ϵ-pred(预测噪声)

这是 DDPM 的经典做法。网络输出 ϵ^=ϵθ(xt,t),损失为 ϵϵ^2。还原 x0 时:

(23.7)x^0=xt1α¯tϵ^α¯t

数值稳定性问题:在 t 很小时(图像几乎干净),1α¯t0,噪声信号极弱,模型需要在高清图中找出几乎不可见的噪点,梯度容易退化。

x0-pred(预测原图)

网络直接输出 x^0=x0,θ(xt,t),损失为 x0x^02。还原 ϵ 时:

(23.8)ϵ^=xtα¯tx^01α¯t

数值稳定性问题:在 t 很大时(几乎纯噪声),要求模型"透视"出原图,相当于无中生有,数值波动极大。

v-pred(预测速度)[选读]

Salimans & Ho (2022) 引入了一个巧妙的三角几何视角。注意到闭式公式中,α¯t1α¯t 的平方和为 1,可以设:

α¯t=cosθt,1α¯t=sinθt

扩散过程就像一根指针在单位圆上从 x0("纯图像"极)旋转到 ϵ("纯噪声"极)。速度向量 v 被定义为垂直于指针方向的切线:

(23.9)v=α¯tϵ1α¯tx0

核心优势:无论 t 在哪一端,v 的数值尺度永远均衡——它巧妙融合了原图和噪声的信息,在 t0tT 两端都不会出现信号消失的问题。这一设计极大地提升了训练的数值稳定性,成为 Stable Diffusion 2.0 及后续版本的核心升级。

关键洞察: 无论预测目标是 ϵx0 还是 v,骨干网络(U-Net 或 Transformer)的架构完全不需要改变。"语义不是写在网络结构里的,而是写在 Loss 里的。" 三种目标只是同一线性方程的不同"解读角度"。

下表总结了三种目标的特性:

预测目标损失函数t 小时(接近原图)t 大时(接近噪声)代表模型
ϵ-pred|ϵϵ^|2梯度退化稳定DDPM, SD 1.x
x0-pred|x0x^0|2稳定数值波动大DALL-E 2
v-pred|vv^|2稳定稳定SD 2.x, Imagen

23.3.3 得分匹配与 SDE 视角

前面的推导基于离散马尔可夫链和变分推断(ELBO)。本节将视角提升到连续时间,揭示扩散模型与得分匹配(Score Matching)、随机微分方程(SDE)之间的深刻联系。这一"上帝视角"由 Song et al. (2021) 的里程碑论文系统建立。

得分函数:只看坡度,不看海拔 [必读]

在能量模型 p(x)=1ZeE(x) 中,计算全局的归一化常数 Z=eE(x)dx 在高维空间中几乎不可能。但如果对概率取对数再求梯度:

(23.10)s(x)=xlogp(x)=xE(x)

常数 Z 奇迹般地消失了(xlogZ=0)!

得分(Score) 本质上是一个向量场:在数据空间的每个点上,它给出一个箭头,永远指向概率密度增加最快的方向。可以想象在地形图的每个位置放一个指南针,永远指向"下山"的方向。

核心联系:DDPM 中预测噪声 ϵ 完全等价于预测缩放后的得分函数:

(23.11)xtlogq(xt)=ϵ1α¯t

这意味着,训练一个 ϵ-prediction 网络,其实就是在训练一个得分估计器。这个联系之所以深刻,在于它将扩散模型从"变分推断"这一特定框架中解放出来——我们可以用任何能估计得分函数的方法来训练生成模型,不必受限于高斯前向过程和 ELBO 推导。

得分匹配的历史脉络 [选读]: 得分匹配最早由 Hyvarinen (2005) 提出,用于无需归一化常数的密度估计。Song & Ermon (2019) 将其与多尺度噪声扰动结合,提出了 NCSN(Noise Conditional Score Networks),即在不同噪声水平下联合训练得分估计器。DDPM 的 ϵ-prediction 可以被视为 NCSN 的一种特殊参数化形式。Song et al. (2021) 最终将 DDPM 和 NCSN 统一在 SDE 框架下,证明两者在数学上完全等价。

Langevin 动力学:从优化到采样 [选读]

如果单纯顺着得分(梯度)走,所有样本会被吸到局部最高概率的点上——这是"优化"而非"采样",会导致模式坍塌(Mode Collapse)。要实现真正的"生成/采样",必须引入精确的热噪声,即 Langevin 动力学

(23.12)xk+1=xk+ηs(xk)+2ηξk,ξkN(0,I)

一半是得分场的拉力(确定性),一半是高斯噪声的推力(随机性)。当步长 η 足够小且迭代次数足够多时,xk 的分布会收敛到目标分布 p(x)。噪声确保了样本能在高概率区域内持续游走而非被死死吸住,保证了分布的多样性

前向 SDE 与反向 SDE [选读]

扩散模型的前向与反向过程:前向 SDE 将图像变为噪声,反向 SDE(或概率流 ODE)通过得分函数将噪声还原为图像

图 23-12:扩散模型的 SDE 视角(来源:Song et al., 2021)。上方为前向 SDE,将图像空间 I 映射到噪声空间 E;下方为反向过程,通过得分函数 xtlogpt(xt) 将噪声还原为图像。

在连续时间极限下(T,步长 0),正向加噪过程是一个随机微分方程:

(23.13)dx=f(x,t)dt+g(t)dWt(前向 SDE)

其中 f(x,t) 是漂移系数,g(t) 是扩散系数,Wt 是标准布朗运动。Anderson (1982) 的经典定理告诉我们,反向时间的 SDE 同样存在且形式明确:

(23.14)dx=[f(x,t)g(t)2xlogpt(x)]dt+g(t)dW¯t(反向 SDE)

关键结论:只要我们学到了得分 xlogpt(x),就能完美求解反向 SDE,从噪声生成图像。

概率流 ODE:确定性的平滑轨迹 [必读]

更震撼的是,Song et al. (2021) 证明了,对于每一条反向 SDE,都存在一条去掉了随机扰动项的概率流 ODE(Probability Flow ODE),两者在边际分布上完全等价:

(23.15)dx=[f(x,t)12g(t)2xlogpt(x)]dt(概率流 ODE)

两种轨迹的对比:

  • SDE 轨迹:充满随机布朗运动,像在狂风中开车。容错率高,但必须步步为营,需要 1000 步才能走完(DDPM)。
  • ODE 轨迹:没有随机项,是一条完全确定的平滑曲线。给定相同初始噪声,输出完全可复现。这为后续所有的**"加速采样算法"**奠定了理论基石。

23.3.4 采样加速:从千步到十步

理解了 SDE/ODE 视角后,一个核心认知浮出水面:采样器(Sampler)本质上就是微分方程的数值求解器。 DDPM 需要 1000 步采样,是因为它使用了最朴素的求解策略。减少步数会导致画面崩坏,根源在于三类误差的累积:

  1. 离散化误差:用折线拟合曲线,步长越大偏离越严重。
  2. 模型误差:神经网络预测的 Score 存在轻微偏差,大步长会加速偏差累积。
  3. 随机性误差(仅 SDE):步长变大导致单次注入的噪声方差暴增,系统极不稳定。

DDIM:关闭随机性

Song et al. (2021b) 提出的 DDIM(Denoising Diffusion Implicit Models)是第一个重要的加速方案。其核心思路是直接转向 ODE 视角,关闭随机项:

(23.16)xt1=α¯t1xt1α¯tϵθ(xt,t)α¯t预测的 x^0+1α¯t1ϵθ(xt,t)

关闭随机项后,消除了"随机性误差",允许迈更大的步子。DDIM 将所需步数从 1000 步降至 50-100 步,实现 10-20 倍加速。更重要的是,给定相同初始噪声,DDIM 的轨迹是确定且可复现的——这为图像编辑和插值打开了大门。

DDIM 的语义插值 是确定性轨迹带来的一个附加能力:给定两张图像 x0(a)x0(b),先用 DDIM 前向过程编码为对应的噪声 xT(a)xT(b),然后在噪声空间中做球面线性插值(Slerp):xT(λ)=slerp(xT(a),xT(b),λ),最后用 DDIM 逆向采样解码 xT(λ),即可得到两张图像之间语义平滑的过渡。这与 VAE 的 latent 插值异曲同工,但在像素质量和语义连贯性上更胜一筹。

DPM-Solver:高阶求解器

Lu et al. (2022) 提出的 DPM-Solver 将数值分析中的高阶方法引入扩散模型。直觉上:

  • 一阶(Euler):只看脚下的斜率盲目前进,朴素但误差大——这就是 DDIM。
  • 二阶(Heun)/ 多步法:先用 Euler 往前看一步,再用前方的斜率与当前的斜率做平均进行校正,利用历史轨迹进行高阶多项式拟合,大幅压缩所需步数。

DPM-Solver 在概率流 ODE 的半线性结构上进行精确解析求解,仅需 10-20 步即可生成高质量图像,成为 Stable Diffusion 的默认采样器之一。

Karras 时间步调度

时间 t 本质上对应一个信噪比(Signal-to-Noise Ratio, SNR)。Karras et al. (2022) 发现,均匀切割时间步并不最优。直觉上,图像结构在中等信噪比阶段正在形成,此时模型最容易犯错。优秀的调度器应该把宝贵的计算步数密集分配给这个关键区域,而在高 SNR(接近原图)和低 SNR(接近纯噪声)区域使用更少的步数。

Karras 调度通过对 σ(噪声标准差)进行均匀的幂次插值来实现这一目标:

(23.17)σi=(σmax1/ρ+iN1(σmin1/ρσmax1/ρ))ρ,i=0,1,,N1

ρ=7(经验最优)时,步数自动集中在中间区域。这一调度方案与 DPM-Solver 等高阶求解器配合使用时效果更佳。


23.3.5 条件控制与 CFG

无条件的扩散模型只能随机生成图像。要让模型根据文本提示生成特定内容,需要将采样目标从 p(x) 变成条件分布 p(x|y),其中 y 是条件信号(如文本、类别标签、参考图像等)。

网络层面的条件注入

条件信息需要在网络架构中找到"入口"。现代扩散模型使用两种主要机制:

1. 特征调制(AdaGN):将条件信号(如时间步嵌入、类别嵌入)映射为一对向量 (γ,β),用于控制归一化层的缩放和平移。在 Group Normalization 之后执行:

(23.18)AdaGN(h,γ,β)=γGroupNorm(h)+β

这相当于一个**"全局风格旋钮"**:γ 控制特征的对比度,β 控制偏移。它能够全局性地调整图像的整体风格和色调。

2. 交叉注意力(Cross-Attention):将文本条件 Token 化后,图像特征作为 Query,文本 Token 序列作为 Key/Value

(23.19)Attention(Q,K,V)=softmax(QKd)V

其中 Q=WQz(图像特征),K=WKc(文本特征),V=WVc。每个图像空间位置可以独立"查询"文本的不同部分——比如画狗的区域关注"dog",画草地的区域关注"grass"——实现极细粒度的空间语义对齐

CFG:无分类器引导 [必读]

无分类器引导(Classifier-Free Guidance, CFG)是现代扩散模型最核心的控制机制(Ho & Salimans, 2022)。

训练时:以一定概率(通常 10%)随机丢弃条件 y(替换为空文本 ),逼迫模型同时学会"有条件预测"和"无条件预测":

模型既学 ϵθ(xt,t,y) 也学 ϵθ(xt,t,)

推理时:在每一步同时计算两者,并进行线性外推

(23.20)ϵ^cfg=ϵθ(xt,t,)+w(ϵθ(xt,t,y)ϵθ(xt,t,))

几何直觉:有条件预测与无条件预测之差 (ϵcondϵuncond) 是"为了满足条件所需的修正推力"。强度系数 w(guidance scale)相当于在能量地形图上,把符合提示词的"山谷"强行挖得更深。

  • w=1:不使用引导,等价于标准条件生成。
  • w=712:常用范围,图像质量与条件遵循度最佳。
  • w 过大(如 >20):条件推力过强,扭曲流形,导致色彩过饱和、纹理粘连("塑料感")、画面崩坏。

三角权衡w 越大,模型越"听话"(条件遵循度高),但多样性会断崖式下降(模式坍塌)。在实际应用中需要仔细调节。

CFG 的得分函数解释 [挑战]: 从得分匹配视角,式 (23.20) 等价于对条件得分函数做外推。利用贝叶斯公式 xlogp(x|y)=xlogp(x)+xlogp(y|x),可以证明 CFG 实际上是在以 w 倍的强度增强似然项 xlogp(y|x) 的贡献:s^cfg=xlogp(x)+wxlogp(y|x)。这与分类器引导(Classifier Guidance, Dhariwal & Nichol, 2021)在数学形式上完全等价,只是后者需要一个独立的分类器来提供 xlogp(y|x),而 CFG 通过条件/无条件预测的差分隐式地实现了相同的效果——因此被称为"无分类器"引导。

负面提示词(Negative Prompt)

只需将公式 (23.20) 中的无条件预测 ϵθ(xt,t,) 替换为对负面提示词 yneg 的条件预测:

(23.21)ϵ^=ϵθ(xt,t,yneg)+w(ϵθ(xt,t,y)ϵθ(xt,t,yneg))

修正向量就变成了"既靠近正面描述,又远离负面描述"。例如,正面提示词为"高清写实照片",负面提示词为"模糊、低质量、卡通",推力方向就会同时追求清晰度并回避卡通风格。


23.3.6 潜空间扩散(Latent Diffusion / Stable Diffusion)

直接在 1024×1024×3 的像素空间跑 50 步 U-Net 会击穿消费级显卡的显存。Rombach et al. (2022) 提出的 Latent Diffusion Model(LDM)引入了一个精妙的两阶段策略。

Latent Diffusion Model 的整体架构:VAE 将像素空间压缩到潜空间,扩散过程在潜空间中完成,通过交叉注意力注入文本条件

图 23-13:Latent Diffusion Model 架构(来源:Rombach et al., 2022)。左侧 VAE Encoder E 将像素图压缩到潜空间 z,中间扩散过程在潜空间完成(配合交叉注意力注入文本等条件),右侧 VAE Decoder D 将潜空间表示还原为像素图。

VAE 压缩:降维打击

Stable Diffusion VAE 的 Encoder 和 Decoder 结构:Encoder 通过多级下采样将像素空间压缩到潜空间,Decoder 通过上采样还原

图 23-13b:Stable Diffusion 中 VAE 的详细结构。上方为 Encoder(多级 DownBlock 压缩),下方为 Decoder(多级 UpBlock 还原),中间包含 MidBlock 进行全局特征融合。

第一阶段,训练一个独立的 VAE(变分自编码器)作为"感知友好的压缩器":

  • Encoder E:将 H×W×3 的像素图压缩到 Hf×Wf×C 的潜空间(SD 1.x 中 f=8C=4)。一张 512×512 的图被压缩为 64×64×4 的 latent。具体而言,Encoder 由多级 DownBlock(每级包含 ResNet 块和下采样卷积)组成,最终输出均值 μ 和标准差 σ,通过重参数化 z=μ+σϵ 采样得到 latent。
  • Decoder D:由对称的 UpBlock(ResNet 块 + 上采样插值 + 卷积)组成,将潜空间表示还原为像素图。

VAE 的训练结合了像素级重建损失(L1 或 L2)、感知损失(利用预训练 VGG 网络的中间特征计算)和对抗损失(引入 PatchGAN 判别器),以保证重建图像在高频细节上的真实感。

扩散模型只在这个低维潜空间里做加噪去噪,计算维度从 512×512×3=786,432 降到 64×64×4=16,384降低了约 48 倍

完整的 LDM 推理流程 可以概括为三步:(1) 从标准高斯分布采样 latent 噪声 zTN(0,I),维度为 64×64×4(2) 使用扩散采样器(如 DPM-Solver)在潜空间中逐步去噪得到 z0,每步注入文本条件通过交叉注意力;(3) 将去噪后的 z0 送入 VAE Decoder 还原为像素图。

三次损耗分析:VAE 是画质天花板

为什么 Stable Diffusion 画不好细小的文字?远景人脸容易崩坏?根源在于三重信息瓶颈

  1. 编码损耗:VAE Encoder 压缩时,高频细节(文字边缘、细纹理)被强行丢弃。8× 下采样意味着原图中 8×8 的像素块被压缩为一个标量。
  2. 扩散损耗:扩散模型在潜空间中带有平滑归纳偏置,进一步模糊高频信息。
  3. 解码损耗:VAE Decoder 解码时,发现信息缺失,会根据训练偏好进行"统计性脑补"——这就是为什么 SD 有时会产生"外星文"或"塑料感"面孔。

结论:VAE 决定了画质的绝对天花板。 这也是为什么 Stable Diffusion 每一代的重大更新都伴随着 VAE 的升级(SD 1.x 用 KL-VAE,SDXL 改进了 VAE 训练策略,SD3 进一步提升了 latent 通道数)。


23.3.7 骨干网络演进:U-Net → DiT → MMDiT

扩散模型的理论框架(加噪、去噪、损失函数)与骨干网络的选择是正交的——你可以用任何能够处理图像并接受时间步条件的网络来做噪声预测。但网络架构的选择对性能有决定性影响。

U-Net:频率分工的先验专家

Stable Diffusion U-Net 的详细架构图,展示下采样路径、中间块和上采样路径,以及交叉注意力和 ResNet 块的组合

图 23-14:Stable Diffusion 中 U-Net 的详细架构。左侧为下采样路径(捕获全局低频轮廓),右侧为上采样路径(恢复高频细节),中间通过跳跃连接传递多尺度特征。每个阶段包含 ResNet 块、交叉注意力块(注入文本条件)和时间步嵌入。

U-Net 最初为医学图像分割设计(Ronneberger et al., 2015),其 U 形编码器-解码器结构天然适合扩散模型:

  • 下采样路径:通过卷积和池化逐步缩小特征图,捕获全局低频轮廓。
  • 上采样路径:逐步放大特征图,恢复局部高频细节。
  • 跳跃连接(Skip Connection):将下采样各层的特征直接传递给对应的上采样层,实现多尺度特征融合

这种结构等效实现了完美的**"频率分工"**:低分辨率层负责全局构图,高分辨率层负责细节纹理。U-Net 自带极强的图像局部相关性先验,在中小规模数据和算力下表现出色。

DiT:剥离先验,拥抱 Scaling Laws

DiT(Diffusion Transformer)架构:将图像切成 Patch 展平为序列,输入 Transformer 处理

图 23-15:DiT(Diffusion Transformer)架构(来源:Peebles & Xie, 2023)。左侧为整体流程:将噪声 latent 切成 patch 并展平为序列,输入标准 Transformer。右侧展示了不同的条件注入方案,其中 adaLN-Zero 效果最优。

Peebles & Xie (2023) 提出了 DiT(Diffusion Transformer),核心思路是:像 LLM 处理文本一样处理图像。

  1. Patchify:将 32×32×4 的噪声 latent 切成 2×2 的 patch,展平为长度为 256 的序列。
  2. 位置编码:加入可学习的或正弦位置编码。
  3. 标准 Transformer:使用多头自注意力和前馈网络处理序列。
  4. 条件注入:通过 adaLN-Zero(Adaptive Layer Normalization with Zero-initialization)注入时间步和类别条件——将条件信号映射为 (γ,β,α) 三组向量,分别控制 LayerNorm 的缩放、平移和残差门控。

DiT 的哲学是剥离 U-Net 的归纳偏置先验,用纯数据驱动的 Transformer 拥抱 Scaling Laws。实验表明,DiT-XL/2(约 6.75 亿参数)在 ImageNet 256×256 上以 FID=2.27 首次超越了所有 U-Net 基线。Sora 的视频生成引擎即基于 DiT 架构的扩展。

为什么 adaLN-Zero 是最优的条件注入方式? DiT 论文对比了四种条件注入策略:(1) In-Context(将条件 Token 拼入序列)、(2) Cross-Attention、(3) adaLN(自适应 LayerNorm)、(4) adaLN-Zero。最后一种在残差连接前引入了一个初始化为零的门控参数 α——这意味着训练初期,每个 DiT Block 等效于恒等映射(输入直接跳过),网络的初始行为类似于浅层网络,梯度流更加稳定。随着训练推进,α 逐渐学习打开,各层才开始发挥作用。这一"渐进激活"策略是 DiT 训练稳定性的关键。

MMDiT:双向语义对齐

Stable Diffusion 3(Esser et al., 2024)引入了 MMDiT(Multi-Modal DiT),对 DiT 做了关键升级:

  • 传统做法:图像特征通过交叉注意力单向查询文本特征——信息流是"图→文"的单行道。
  • MMDiT:将图像 Token 和文本 Token 拼接成一整条长序列,在同一个 Self-Attention 中做联合计算。信息在两个模态之间双向自由流动

这带来了更强大的图文对齐能力。直觉上,传统的交叉注意力像是"翻译"——图像先理解自己,再去查阅文本字典。MMDiT 更像是"讨论"——图像和文本坐在同一张桌子上实时交流,双方都能根据对方的信息调整自己的表达。

三种架构的对比总结:

特性U-NetDiTMMDiT
核心组件卷积 + 跳跃连接Self-Attention + FFNJoint Self-Attention
归纳偏置强(多尺度、局部性)弱(仅位置编码)
条件注入交叉注意力 + AdaGNadaLN-ZeroJoint Attention
Scaling Law有限(卷积瓶颈)
代表模型SD 1.x/2.x/XLSora, FLUXSD 3/3.5

23.3.8 前沿:流匹配、修正流与一致性模型

扩散模型的演进并没有停止。当我们站在"概率流演化"的上帝视角,新的大门就打开了。

流匹配(Flow Matching)[必读]

扩散模型用高斯噪声找路的轨迹是弯曲且随意的——前向过程的数学形式决定了 ODE 的速度场不会是直线。为什么不直接走直线?

Lipman et al. (2023) 提出的 Flow Matching 抛弃了繁琐的马尔可夫链和 SDE 框架,直接定义一条从噪声到图像的线性插值轨迹

(23.22)xt=(1t)xnoise+txdata,t[0,1]

此时的理想速度场是一个常数向量

(23.23)v=xdataxnoise

训练目标变得极其简单——让神经网络 vθ(xt,t) 直接回归这个恒定的速度:

(23.24)LFM=Et,xdata,xnoise[vθ(xt,t)(xdataxnoise)2]

与 DDPM 相比,Flow Matching 有三个显著优势:

  1. 数学简洁:无需 αtα¯tβt 等繁琐的噪声调度。
  2. 轨迹更直:接近直线的轨迹意味着低阶 ODE 求解器(如简单的 Euler 法)就能高效采样。
  3. 步数更少:4-8 步即可生成高质量图像,远少于 DDPM 的 1000 步或 DDIM 的 50 步。

Stable Diffusion 3 和 Flux 系列均采用 Flow Matching 方案训练。

下面是 Flow Matching 训练的核心代码,对比 DDPM 可以看到简洁程度的飞跃:

python
import torch
import torch.nn as nn

class FlowMatchingTrainer:
    def __init__(self, model):
        self.model = model  # 速度预测网络 v_theta

    def train_step(self, x_data):
        """Flow Matching 训练的单步:对应式 (23.22)-(23.24)"""
        B = x_data.shape[0]
        # (1) 采样噪声和时间
        x_noise = torch.randn_like(x_data)
        t = torch.rand(B, 1, 1, 1, device=x_data.device)  # t ~ U(0, 1)
        # (2) 线性插值构造 x_t
        x_t = (1 - t) * x_noise + t * x_data
        # (3) 目标速度就是常数: x_data - x_noise
        target_v = x_data - x_noise
        # (4) 预测速度并计算 MSE 损失
        v_pred = self.model(x_t, t.squeeze())
        loss = nn.functional.mse_loss(v_pred, target_v)
        return loss

    @torch.no_grad()
    def sample(self, shape, steps=8):
        """Flow Matching 采样:Euler 法求解 ODE"""
        x = torch.randn(shape)
        dt = 1.0 / steps
        for i in range(steps):
            t = torch.full((shape[0],), i * dt)
            v = self.model(x, t)
            x = x + v * dt  # Euler 步进
        return x

注意 Flow Matching 的训练代码不需要 αtα¯tβt 等任何噪声调度参数,也不需要离散的时间步索引——整个过程在连续时间 t[0,1] 上操作。

修正流(Rectified Flow)[选读]

虽然 Flow Matching 在微观上规定了直线轨迹,但因为 xnoisexdata 是随机配对的("拉郎配"),宏观的概率流仍然会像乱麻一样交叉弯曲。

Liu et al. (2023) 提出了 Rectified Flow(修正流),通过一个"拉直"(Reflow)过程来解决这个问题:

  1. 第一轮训练:用随机配对的数据训练一个 Flow Matching 模型。
  2. 生成因果配对:用训练好的模型从一批噪声 x0 出发,ODE 积分得到对应的图像 x1。现在 (x0,x1) 之间有了明确的因果关系。
  3. Reflow 重训:用这些因果配对数据重新训练模型。由于配对有了一一对应的确定性关系,宏观流形被强行拉直

轨迹越直,ODE 求解器就可以用越大的步长。经过 Reflow 后,模型在 1-4 步即可生成高质量图像。

一致性模型(Consistency Models)[选读]

Song et al. (2023) 提出了比"拉直路线"更极端的方案——直接跳过积分过程

一致性模型的核心约束是自一致性:同一条 ODE 轨迹上的任意两个点 xtxt,经过模型映射后都必须得到相同的终点 x0

(23.25)fθ(xt,t)=fθ(xt,t),t,t[0,T]

训练时,通过惩罚同一轨迹上相邻时间点输出的不一致性来优化这个约束。一旦训练完成,无论输入哪个时间步的带噪图像,模型都能一步到位直接输出干净的 x0,实现真正的单步生成

下表总结了从 DDPM 到一致性模型的采样效率演进:

方法典型步数核心思路轨迹类型
DDPM1000反向 SDE(朴素 Euler)随机(含布朗运动)
DDIM50-100概率流 ODE(一阶 Euler)确定性
DPM-Solver10-20高阶 ODE 求解器确定性
Flow Matching4-8直线轨迹 + Euler确定性
Rectified Flow1-4Reflow 拉直宏观流确定性
Consistency Model1跳过积分,直接映射终点单步映射

23.3.9 本节总结

本节系统地梳理了扩散模型的完整理论体系。我们从 DDPM 的正向加噪与逆向去噪出发,理解了重参数化技巧为何能让训练"一步到位";通过三种预测目标(ϵ-pred / x0-pred / v-pred)的等价性分析,看到了同一线性方程的不同解读如何影响数值稳定性;在得分匹配与 SDE 视角下,认识到训练噪声预测器本质上就是在学习数据分布的得分函数;而概率流 ODE 的发现为 DDIM、DPM-Solver 等采样加速方案奠定了理论基础。

在工程层面,CFG 通过条件与无条件预测的线性外推实现了精确的文本控制;潜空间扩散(LDM / Stable Diffusion)通过 VAE 压缩将计算量降低了近两个数量级;骨干网络从 U-Net 的归纳偏置先验演进到 DiT / MMDiT 的纯 Scaling Law 驱动。在前沿方向,Flow Matching 用直线轨迹取代弯曲的扩散路径,Rectified Flow 通过 Reflow 进一步拉直宏观流形,一致性模型则直接跳过积分实现单步生成。

理解这些理论,不仅是使用扩散模型的基础,更是理解 Sora、Flux、SD3 等下一代视觉生成系统的必备知识。在下一节中,我们将看到如何将扩散模型的生成能力扩展到视频领域,以及多模态统一模型如何在单一架构中兼顾理解与生成。