\[ \begin{align}\begin{aligned}\newcommand{\ba}{\boldsymbol{a}} \newcommand{\bb}{\boldsymbol{b}} \newcommand{\be}{\boldsymbol{e}} \newcommand{\bq}{\boldsymbol{q}} \newcommand{\bk}{\boldsymbol{k}} \newcommand{\bw}{\boldsymbol{w}} \newcommand{\bx}{\boldsymbol{x}} \newcommand{\by}{\boldsymbol{y}} \newcommand{\bz}{\boldsymbol{z}} \newcommand{\bd}{\boldsymbol{d}} \newcommand{\bv}{\boldsymbol{v}} \newcommand{\bs}{\boldsymbol{s}}\\\newcommand{\btheta}{\boldsymbol{\theta}} \newcommand{\bbeta}{\boldsymbol{\beta}} \newcommand{\bgamma}{\boldsymbol{\gamma}} \newcommand{\bsigma}{\boldsymbol{\sigma}} \newcommand{\md}{\mbox{d}} \newcommand{\bmu}{\boldsymbol{\mu}} \newcommand{\bone}{\boldsymbol{1}} \newcommand{\bzero}{\boldsymbol{0}} \newcommand{\bepsilon}{\boldsymbol{\epsilon}} \newcommand{\bphi}{\boldsymbol{\phi}} \newcommand{\bh}{\boldsymbol{h}} \newcommand{\bc}{\boldsymbol{c}} \newcommand{\br}{\boldsymbol{r}} \newcommand{\bQ}{\boldsymbol{Q}} \newcommand{\bK}{\boldsymbol{K}} \newcommand{\bV}{\boldsymbol{V}} \newcommand{\bSigma}{\boldsymbol{\Sigma}} \newcommand{\bg}{\boldsymbol{g}} \newcommand{\bxi}{\boldsymbol{\xi}} \newcommand{\bvarepsilon}{\boldsymbol{\varepsilon}} \newcommand{\bdelta}{\boldsymbol{\delta}} \newcommand{\bq}{\boldsymbol{q}} \newcommand{\bk}{\boldsymbol{k}} \newcommand{\bJ}{\boldsymbol{J}} \newcommand{\bp}{\boldsymbol{p}} \newcommand{\bi}{\boldsymbol{i}} \newcommand{\bo}{\boldsymbol{o}} \newcommand{\bE}{\boldsymbol{E}} \newcommand{\bH}{\boldsymbol{H}} \newcommand{\bL}{\boldsymbol{L}} \newcommand{\bu}{\boldsymbol{u}} \newcommand{\bLambda}{\boldsymbol{\Lambda}} \newcommand{\trans}{^{\rm\scriptsize T}} \newcommand{\var}{\mathrm{var}}\\\newcommand{\bA}{\boldsymbol{A}} \newcommand{\bB}{\boldsymbol{B}} \newcommand{\bC}{\boldsymbol{C}} \newcommand{\bD}{\boldsymbol{D}} \newcommand{\bG}{\boldsymbol{G}} \newcommand{\bI}{\boldsymbol{I}} \newcommand{\bM}{\boldsymbol{M}} \newcommand{\bP}{\boldsymbol{P}} \newcommand{\bS}{\boldsymbol{S}} \newcommand{\bU}{\boldsymbol{U}} \newcommand{\bW}{\boldsymbol{W}} \newcommand{\bX}{\boldsymbol{X}} \newcommand{\bY}{\boldsymbol{Y}} \newcommand{\bZ}{\boldsymbol{Z}} \newcommand{\cotp}{\textcolor[RGB]{48,209,88}{TP}} \newcommand{\cotn}{\textcolor[RGB]{100,210,255}{TN}} \newcommand{\cofp}{\textcolor[RGB]{94,92,230}{FP}} \newcommand{\cofn}{\textcolor[RGB]{191,90,242}{FN}}\\\newcommand{\numcotp}{\textcolor[RGB]{48,209,88}{50}} \newcommand{\numcotn}{\textcolor[RGB]{100,210,255}{30}} \newcommand{\numcofp}{\textcolor[RGB]{94,92,230}{10}} \newcommand{\numcofn}{\textcolor[RGB]{191,90,242}{10}} \DeclareMathOperator*{\argmin}{arg\,min}\end{aligned}\end{align} \]

常见扩散模型、快速采样与潜空间生成#

学习目标与记号#

  1. 推导 DDIM 更新并解释随机性参数,区分扩散模型、参数化、采样器和网络骨干;

  2. 理解潜空间扩散的编码—扩散—解码流程及其效率与重构代价;

  3. 比较 DDPM、NCSN/Score-SDE、DDIM、LDM、U-Net 与 DiT,并建立可靠评价流程;

  本节沿用统一记号:普通小写字母表示标量,粗体小写字母表示向量,粗体大写字母表示矩阵或高阶张量;时间步写作下标 \(t\)⁠,网络层编号写作上标 \([l]\)⁠,转置写作 \(\trans\)⁠。用 \(m\) 表示一个批量中的图片数,用 \(d_C^{[l]}\)⁠、\(d_H^{[l]}\)\(d_W^{[l]}\) 分别表示第 \(l\) 层特征图的通道数、高和宽。\(\bx_0\) 表示干净数据,\(\bx_t\) 表示第 \(t\) 个噪声等级的随机变量。从 \(\bx_{t-1}\) 得到 \(\bx_t\) 时单独加入的噪声记作 \(\bepsilon_t\)⁠;解析式中直接由 \(\bx_0\) 构造 \(\bx_t\) 的累计噪声记作 \(\tilde{\bepsilon}_t\)⁠。后者是前 \(t\) 步单步噪声按相应系数合并并标准化后得到的等价标准高斯变量,并不是简单求和。正文与练习中的程序都应同时检查数值结果和数组维度。本节练习的参考答案见 常见扩散模型与实践答案⁠。

  本节比较建立在 DDPM 采样⁠、扩散 SDE条件引导 之上;不同方法分别改变采样路径、表示空间、网络骨干或条件机制。

  “扩散模型”一词在实践中常同时指前向过程、训练目标、网络架构和采样算法。为了正确比较方法,应先分清四个层次:DDPM、Score-SDE 等定义概率过程和训练目标;\(\tilde{\bepsilon}_t\)⁠、\(\bx_0\)⁠、\(\bv\) 是输出参数化所对应的目标;U-Net、DiT 是网络骨干;DDIM、数值 ODE/SDE 求解器和蒸馏方法负责采样效率。

DDIM:非马尔可夫采样视角#

  去噪扩散隐式模型(denoising diffusion implicit model,DDIM) 1Song、Meng 与 Ermon(2021)⁠,Denoising Diffusion Implicit Models⁠。 构造与 DDPM 具有相同训练边缘 \(q(\bx_t\mid\bx_0)\) 的非马尔可夫过程,因此通常可以直接使用训练好的 DDPM 噪声预测网络⁠。给定当前 \(\bx_t\)⁠,先计算

\[\widehat{\bx}_0 =\frac{\bx_t-\sqrt{1-\bar\alpha_t} \bepsilon_{\btheta}(\bx_t,t)} {\sqrt{\bar\alpha_t}}.\]

  式中的 \(\bepsilon_{\btheta}(\bx_t,t)\) 是网络对累计噪声 \(\tilde{\bepsilon}_t\) 的估计,不是单步噪声 \(\bepsilon_t\)⁠。

  若下一采样时刻为 \(s<t\)⁠,定义

\[\sigma_{t\to s}(\eta) =\eta \sqrt{\frac{1-\bar\alpha_s}{1-\bar\alpha_t}} \sqrt{1-\frac{\bar\alpha_t}{\bar\alpha_s}},\]

  则更新可写为

\[\bx_s =\sqrt{\bar\alpha_s}\widehat{\bx}_0 +\sqrt{1-\bar\alpha_s-\sigma_{t\to s}^2} \bepsilon_{\btheta}(\bx_t,t) +\sigma_{t\to s}\bz, \qquad \bz\sim\mathcal{N}(\bzero,\bI).\]

  标准实现通常取 \(\eta\in[0,1]\)⁠。当 \(\eta=0\) 时,给定当前状态的更新是确定性的:同一初始噪声和条件产生同一轨迹;取适当非零值可恢复随机性。DDIM 可以跳过训练时定义的许多时间步,但过少的步数会增加离散误差。所选时间子序列、参数化和预测修正必须相容。

潜空间扩散模型#

  像素空间扩散在高分辨率图像上计算昂贵。潜空间扩散模型(latent diffusion model,LDM) 2Rombach 等(2022)⁠,High-Resolution Image Synthesis with Latent Diffusion Models⁠。 先训练编码器 \(E\) 与解码器 \(D\)⁠,把图像压缩为较小的潜变量

\[\bz_0=E(\bx_0), \qquad \widehat{\bx}_0=D(\bz_0),\]

  然后在 \(\bz\) 空间执行扩散。若空间分辨率缩小 \(f\) 倍,潜变量位置数约缩小 \(f^2\) 倍,从而显著减少卷积或注意力成本。条件通常通过交叉注意力进入潜空间去噪网络。

  潜空间并不天然服从标准高斯,也不保证每个方向尺度相同。实现需要记录潜变量缩放因子,并确保训练扩散模型、采样和解码使用同一尺度。压缩提高效率,却引入重构上限:编码器丢失的细节无法由后续扩散可靠恢复,解码器也可能产生自己的伪影。

  下面的动画展示图像先由编码器压缩到潜空间、在潜变量中完成扩散与去噪,再由解码器还原到图像空间的完整过程。

U-Net、DiT 与常见改进#

  U-Net 利用多尺度卷积、残差块和跳跃连接,是图像 DDPM 与 LDM 的经典骨干。局部卷积有利于空间细节,多尺度路径扩大感受野,自注意力或交叉注意力负责全局和条件交互。

  Diffusion Transformer(DiT) 3Peebles 与 Xie(2023)⁠,Scalable Diffusion Models with Transformers⁠。 把图像或潜变量分块并表示为图像块词元,使用 Transformer 块建模,并通过自适应归一化等方式注入时间与条件。DiT 是网络骨干,不是一种新的前向扩散定律;它仍可配合 DDPM 类训练目标和多种采样器。

  改进型 DDPM 会调整各时间步的加噪强度、方差学习、损失权重和网络规模;EDM 等实践框架重新组织噪声参数化、预条件和采样器;一致性模型或蒸馏方法尝试把多步生成压缩为少步甚至一步。它们的训练成本、是否需要教师模型和最终质量不同,不能只用“采样步数更少”评价。

方法层次对照#

DDIM 少步采样、潜空间扩散和 U-Net 与 DiT 骨干的关系

图 45 DDIM 改变采样轨迹,LDM 改变扩散所在空间,U-Net 与 DiT 则是常见的噪声预测网络骨干#

表 8 经典与常见扩散方法#

名称

主要层次

核心思想

使用时应注意

DDPM

离散概率过程与训练

固定高斯前向链、学习随机反向链

原始采样步数多,需明确方差与参数化

NCSN / Score-SDE

分数学习与连续动力学

多噪声尺度分数、反向 SDE/ODE

分数尺度、时间方向和求解器必须一致

DDIM

采样过程

共享训练边缘,可确定性少步采样

时间子序列过稀会增加离散误差

LDM

表示空间

在压缩潜空间而非像素空间扩散

受自编码器重构质量与潜变量尺度限制

U-Net / DiT

网络骨干

多尺度卷积或图像块 Transformer

不能把骨干名称当作完整生成算法

采样器实现骨架#

  下面的 ddim_step 实现一次 DDIM 反向更新,可从当前时刻 \(t\) 跳到更接近干净样本的时刻 \(s\)⁠。主要输入是当前带噪样本 xt与它同形的累计噪声预测 eps_pred两个时刻的累积系数 alpha_bar_talpha_bar_s随机性系数 eta 以及 NumPy 随机数生成器 rng返回值与 xt 同形,表示时刻 \(s\) 的样本;反向时间顺序要求 \(0<\bar\alpha_t\leq\bar\alpha_s\leq1\)⁠。

import numpy as np

def ddim_step(xt, eps_pred, alpha_bar_t, alpha_bar_s, eta, rng):
    xt = np.asarray(xt)
    eps_pred = np.asarray(eps_pred)
    if xt.shape != eps_pred.shape:
        raise ValueError("噪声预测必须与 xt 同形")
    if not (0 < alpha_bar_t < 1 and alpha_bar_t <= alpha_bar_s <= 1):
        raise ValueError("反向采样要求 0 < alpha_bar_t < 1 且 alpha_bar_t <= alpha_bar_s <= 1")
    if not np.isfinite(eta) or not (0 <= eta <= 1):
        raise ValueError("本实现要求 eta 位于 [0, 1]")
    x0_hat = (xt - np.sqrt(1 - alpha_bar_t) * eps_pred) / np.sqrt(alpha_bar_t)
    sigma = eta * np.sqrt((1 - alpha_bar_s) / (1 - alpha_bar_t))
    sigma *= np.sqrt(1 - alpha_bar_t / alpha_bar_s)
    direction_var = 1 - alpha_bar_s - sigma**2
    if direction_var < -1e-12:
        raise ValueError("确定性方向的方差为负,请检查时间顺序与 eta")
    direction_var = max(direction_var, 0.0)
    noise = 0.0 if eta == 0 else rng.normal(size=xt.shape)
    return (np.sqrt(alpha_bar_s) * x0_hat
            + np.sqrt(direction_var) * eps_pred
            + sigma * noise)

  程序首先由 xt 和累计噪声预测 eps_pred 估计干净样本 x0_hat再按 eta 计算本次跳步的随机噪声尺度 sigma返回值由估计的干净成分、指向当前预测累计噪声的确定性成分和可选随机成分组成。eta=0 时不采样新噪声,给定相同输入会得到相同输出;eta>0 时输出还取决于 rng 的状态。direction_var 按理论应非负,小幅负值按浮点误差截为 0,明显负值则通常意味着时间顺序或系数错误。

  这只是单步采样骨架,不包含噪声预测网络、完整时间表或连续迭代循环,也没有对 x0_hat 做裁剪或动态阈值处理。代码将 eta 限制在 [0, 1]因而是一个有意简化的教学实现。对 alpha_bar_t 的严格上界检查是必要的:若它等于 1,sigma 公式会除以 0;干净端点可作为 alpha_bar_s=1 的目标时刻。

评价、记忆与可复现性#

  FID 比较特征空间中的高斯近似统计,对样本量、特征提取器和预处理敏感;KID 是核距离估计;precision/recall 类指标尝试分别描述质量与覆盖。文本到图像还要评价条件一致性和人工偏好,但单一对齐分数可能奖励表面相关而忽略构图与真实性。

  可靠报告应给出样本数量、真实数据子集、特征网络版本、图像预处理、采样器、NFE、引导强度和随机种子。还应通过训练集近邻、重复率和成员推断等诊断检查记忆风险。展示图必须说明是否筛选;只展示最好样本不能替代分布级评价。

核心推导与实现核验#

核心关系

\[\bx_s=\sqrt{\bar\alpha_s}\widehat{\bx}_0+\sqrt{1-\bar\alpha_s-\sigma_{t\to s}^2}\bepsilon_{\btheta}+\sigma_{t\to s}\bz.\]

  推导路径。 先由 \(\bx_t\) 和噪声预测恢复 \(\widehat{\bx}_0\)⁠,再把时刻 \(s\) 的总方差拆成沿预测噪声方向的确定性部分与方差 \(\sigma_{t\to s}^2\) 的随机部分。\(\eta\) 控制随机项,所选 \(s\) 可以跨越多个训练时间步。

关键条件

  根号内非负需要合法的反向时间顺序和 \(\sigma_{t\to s}\) 范围。\(\eta=0\) 时给定 \(\bx_t\) 的更新确定;这不代表生成分布没有随机性,因为最初的 \(\bx_T\) 仍随机。LDM 的速度收益还依赖实际潜变量尺寸和骨干复杂度。

数据规模

  DDIM 中的 \(\bx_t\)⁠、预测的干净样本 \(\widehat{\bx}_0\)⁠、网络预测的噪声 \(\bepsilon_{\btheta}(\bx_t,t)\) 和新采样的随机量 \(\bz\) 必须一样大。潜空间扩散把 \(m\times d_C^{[l]}\times d_H^{[l]}\times d_W^{[l]}\) 的图像压缩为较小的 \(m\times d_{C_z}^{[l]}\times(d_H^{[l]}/f)\times(d_W^{[l]}/f)\)⁠,生成结束后再恢复原图大小;DiT 则把空间区域整理为 \(N\) 个图像块,输出时重新拼回图像。

常见误区

  不要把 DDIM 称为训练网络骨干,也不要把 DiT 当作独立的噪声过程。潜变量缩放、VAE 版本、时间子序列和采样器配置必须与模型匹配。

动手检查

  检查 \(\eta=0\) 时相同 \(\bx_T\) 严格可复现;DDIM 使用完整相邻时间表时与设定公式一致。对 LDM 先单独测量自编码器重构误差,再评价扩散采样,避免把两类误差混为一谈。

数值稳定性与规模

  少步采样对时间表和预测误差敏感;计算根号前应检查理论约束,而不是长期依赖 max 裁剪来隐藏错误。潜变量和条件嵌入应采用与训练阶段相同的精度与归一化方式。

本节小结#

  1. DDIM 复用扩散网络并改变反向轨迹,可在较少时间步下进行确定性或随机采样。

  2. LDM 在压缩潜空间执行扩散以降低成本,但样本质量受到自编码器重构和潜变量尺度限制。

  3. DDPM/Score-SDE 是过程,DDIM 是采样器,U-Net/DiT 是骨干;公平评价还要同时报告 NFE、条件一致性、多样性与记忆风险。

综合练习#

  前四题用于推导、证明和具体计算,第 5--7 题用于编程实现与核验,第 8--10 题要求在其他条件相同的情况下,只改变一个需要研究的因素进行比较,并根据实验结果分析该因素可能带来的影响。程序题应固定随机种子、写出维度断言并报告运行环境;比较题还应固定数据划分、随机种子集合和训练预算。全部参考答案见 常见扩散模型与实践答案⁠。

  1. DDIM 确定性。 从 DDIM 更新式说明当 \(\eta=0\)\(\sigma_{t\to s}=0\)⁠,从而给定 \(\bx_t\)⁠、时间表和网络预测后 \(\bx_s\) 唯一确定;解释为什么整个生成过程仍因初始 \(\bx_T\) 而具有随机性。

  2. DDIM 单步计算。 在一维情形取 \(\bar\alpha_t=0.25\)⁠、\(\bar\alpha_s=0.64\)⁠、\(x_t=1\)⁠、噪声预测 \(\epsilon_{\btheta}=0.2\)⁠、\(\eta=0\)⁠。计算 \(\widehat x_0\)\(x_s\)⁠。

  3. 潜空间压缩计算。 像素图像张量为 \(m\times3\times256\times256\)⁠,自编码器产生 \(m\times4\times32\times32\) 潜变量。计算单样本元素数及其比值,说明该比值如何影响扩散网络的激活内存与计算量,以及为什么不能把它直接当作端到端加速比。

  4. DiT 图像块计算。\(32\times32\) 潜变量特征图,图像块边长分别取 2 和 4。计算两种设置的词元数以及每个注意力头的注意力矩阵元素数,说明图像块增大如何改变二次注意力成本和空间细节。

  5. DDIM 采样器实现。 实现任意递减时间子序列的 DDIM 采样器,支持 \(\eta\in[0,1]\)⁠,检查所有根号内非负、记录每一步时间对和 NFE,并允许传入固定初始噪声。

  6. 确定性与极限核验。 验证 \(\eta=0\) 且初始噪声相同时重复生成逐元素一致;对相邻完整时间表核对每步公式;逐渐减少步数并记录误差。对潜空间模型另外核对编码—解码维度和自编码器重构误差。

  7. 测试设计。 至少测试:反向时间严格递减、\(\eta\) 越界报错、根号参数不合法时失败、网络输出与状态同形、NFE 等于时间跳数、相同初始噪声可复现、不同初始噪声产生不同样本,以及潜变量缩放在训练与生成阶段一致。

  8. DDPM 与 DDIM 比较。 使用同一个噪声预测检查点,比较完整 DDPM、相同步数 DDIM 和少步 DDIM。固定初始噪声集合、随机种子集合、数据预处理和评价样本数;报告生成质量与多样性、共享训练时间、固定样本数生成时间、NFE、参数量及生成峰值内存。

  9. 像素与潜空间扩散比较。 在同一数据上比较像素空间扩散与潜空间扩散,并单独报告自编码器重构上限。固定数据划分、随机种子集合、训练预算和采样 NFE;报告生成质量、重构误差、训练与生成时间、NFE、扩散网络及自编码器参数量和峰值内存。

  10. U-Net 与 DiT 比较。 在同一扩散过程与采样器下比较参数量尽量匹配的 U-Net 和 DiT 骨干。固定数据划分、随机种子集合、训练预算、输入空间和 NFE;报告生成质量与覆盖、训练时间、固定样本数生成时间、NFE、参数量、乘加量及峰值内存。