跳转到内容

扩散模型第3章:实现、采样与排障

第 2 章已经完成前向与反向过程的推导。本章不再重复三条基础公式,而是处理实现时真正会改变结果的选择:预测目标与 loss、采样器和步数、训练与采样配置如何对应,以及出现异常时先检查哪一层。

随机抽一个 tt,用闭式加噪公式造 xtx_t。此时你知道刚才用的真实 ϵ\epsilon。网络以 xtx_t 和 tt 为输入预测 ϵ\epsilon;这个监督目标要求模型估计当前样本中的噪声成分。

DDPM 实践中最常用的简化目标:

L=Ex0,ϵ,t∥ϵ−ϵθ(xt,t)∥2\mathcal{L} =\mathbb{E}_{x_0,\epsilon,t} \Big\lVert \epsilon-\epsilon_\theta(x_t,t)\Big\rVert^2

完整变分推导里还有加权与方差项;工程实现常落到这种 MSE。网络输入是带噪样本与时刻(或噪声水平)嵌入,输出与 ϵ\epsilon 同形状。

等价视角:从闭式解出

x0=1αˉt(xt−1−αˉt ϵ)x_0=\frac{1}{\sqrt{\bar\alpha_t}}\big(x_t-\sqrt{1-\bar\alpha_t}\,\epsilon\big)

故预测 ϵ\epsilon 与预测 x0x_0 在信息上常可互推;选哪种是参数化选择,不是世界观对立。

  1. 优化友好 目标是监督回归,没有 GAN 式对抗博弈,损失曲面相对平滑,超参更宽容。

  2. 多任务耦合 不同 tt 对应不同难度:小 tt 接近重构细节,大 tt 接近从低信噪比输入中恢复结构。一个共享网络覆盖整条噪声课程(noise curriculum)。

  3. 与采样接口简单 许多采样公式直接吃 ϵθ\epsilon_\theta 或由它还原的 x0x_0。

1.3.1 为什么「随机抽 tt」在一个 batch 里也合理

Section titled “1.3.1 为什么「随机抽 ttt」在一个 batch 里也合理”

一个 mini-batch 里,样本 A 可能抽到 t=50t=50,样本 B 抽到 t=800t=800。这不是 bug:

  • 每个样本的监督信号只依赖自己的 (xt,ϵ,t)(x_t,\epsilon,t);
  • 网络用 tt 嵌入区分难度,相当于多任务共享骨干;
  • 长期训练后,各噪声水平都被反复考到。

对容量的要求是:骨干必须同时擅长「细修」与「从噪声里长结构」。U-Net 的多尺度跳跃连接、或 DiT 的全局注意力,都是在给这种多难度课程提供表示能力;换主干不改变训练目标,只改变「模型的函数逼近器」。

1.3.2 ε、x0x_0、vv:同一事实的三种写法

Section titled “1.3.2 ε、x0x_0x0​、vvv:同一事实的三种写法”

由闭式:

ϵ=xt−αˉt x01−αˉt,x0=xt−1−αˉt ϵαˉt\epsilon=\frac{x_t-\sqrt{\bar\alpha_t}\,x_0}{\sqrt{1-\bar\alpha_t}},\qquad x_0=\frac{x_t-\sqrt{1-\bar\alpha_t}\,\epsilon}{\sqrt{\bar\alpha_t}}

再引入速度型参数化(常见写法之一,系数随论文略有出入):

v=αˉt ϵ−1−αˉt x0v=\sqrt{\bar\alpha_t}\,\epsilon-\sqrt{1-\bar\alpha_t}\,x_0

三者描述同一几何关系的不同投影。工程含义:

参数化训练标签常见场景风险
ϵ\epsilon前向用的噪声DDPM 默认、大量图像权重与某些高分辨率设置配合一般
x0x_0干净样本部分实现/可视化直观高噪声区数值可能别扭
vv速度型组合蒸馏、部分现代管线必须配对应采样换算

实现约束:checkpoint 写 epsilon / v_prediction / sample 时,训练标签与 scheduler 更新必须同一套。只改网络头或只改采样一侧,是最常见的「能够运行但输出失效」来源。

1.3.3 条件生成时训练目标多了什么

Section titled “1.3.3 条件生成时训练目标多了什么”

无条件时,网络看 (xt,t)(x_t,t)。条件生成时多一个 cc(类别、文本嵌入、结构图等):

ϵθ(xt,t,c)\epsilon_\theta(x_t,t,c)

训练若希望采样期使用 CFG,通常要以一定概率把 cc 丢掉(条件 dropout),让网络同时学有条件与无条件分数。CFG 的采样公式在第 6 章展开;本章只需记住:条件是训练目标输入的扩展,不是反向采样更新凭空变出来的。

1.4 组件拆解:参数化、嵌入、条件、加权

Section titled “1.4 组件拆解:参数化、嵌入、条件、加权”
小组件作用常见选择怎么调现象
预测目标网络输出语义ϵ\epsilon(DDPM 默认);x0x_0;vv跟社区权重与采样器文档;蒸馏/高分辨率常见 vv与采样公式不匹配 → 图像崩或需重推系数
时刻嵌入告诉网络「有多脏」正弦位置编码 + MLP连续 σ\sigma(EDM)时嵌噪声水平而非离散 tt噪声尺度编码不一致 → 只在中间 tt 好用
条件注入类别/文本/结构拼接、交叉注意力、AdaLN要做 CFG 需训练时条件 dropout条件弱则采样听不懂;过强则模式单一
损失加权各 tt 是否等权均匀 tt;SNR 加权等细节差时调整中高噪声段权重(依实现)影响纹理/结构平衡
主干谁算 ϵθ\epsilon_\thetaU-Net;DiT 等分辨率与扩展性驱动改变容量与归纳偏置,不改变训练与采样公式骨架

Progressive distillation 等工作常与 vv-prediction 等参数化一起出现;细节见文末相关条目。记住原则:参数化、训练目标、采样更新必须同一套约定。

1.4.1 时刻嵌入与「网络如何表示噪声水平」

Section titled “1.4.1 时刻嵌入与「网络如何表示噪声水平」”

若去掉 tt(或 σ\sigma)条件,网络会被迫用同一套权重处理「几乎干净」和「几乎纯噪」的输入,任务冲突极强。嵌入的作用是:

  • 把标量噪声水平映射到高维特征;
  • 通过加法、FiLM/AdaLN 或拼接注入 U-Net / Transformer 各层;
  • 让不同噪声水平走不同的内部计算路径。

排障时:若只有某一段 tt 生成正常,优先怀疑嵌入尺度、调度换算或训练时 tt 采样分布,而不是急着加层数。

健康训练常见现象:

  • 总损失先快速下降再缓慢平台;
  • 不同 tt 分桶的损失可能差一个数量级(高噪声更「容易」或更「难」取决于参数化);
  • 过拟合数据时,训练损失仍可能好看,但采样出现记忆化伪影。

不健康信号:

  • 损失 NaN:学习率、混合精度、数据未归一化、数值溢出;
  • 损失几乎不降:学习率过小、标签与参数化不一致、条件全丢/全不丢配置错误;
  • 损失降但采样结果仍接近噪声:反向采样更新配置错、VAE 解码错、或训练根本没学到有效 ϵθ\epsilon_\theta。

训练目标优化成功 不等于 反向采样更新展示成功——这是误区 7 的根源。

方向代表说明
Score matchingNCSN / Score SDE学 ∇xlog⁡pt(x)\nabla_x\log p_t(x),与 SDE 采样统一
流匹配Flow Matching / Rectified Flow回归速度场,路径更直,少步友好
离散目标D3PM / SEDD交叉熵或 score entropy,而非高斯 MSE
一致性蒸馏Consistency / LCM把多步轨迹压到少步/单步映射

这些替换不否定训练目标的地位:你仍然在学「某噪声水平下的局部去噪/搬运规则」,只是监督信号与路径定义变了。

ε 损失回答的是:「在给定脏度下,网络考试题是什么。」 它是 DDPM 能稳定训练的核心工程开关。


训练从未要求网络「一次生成整张图」。它只学会了:给定 xtx_t,估计噪声或干净样本。采样则是:从 xTx_T 出发,反复询问网络,按规则更新状态,直到 t=0t=0。

因此:换采样器常常不用重训——这是性价比最高的加速参数之一(第 6、9 章会反复用到)。

DDPM 构造条件高斯 pθ(xt−1∣xt)p_\theta(x_{t-1}\mid x_t):均值由 ϵθ\epsilon_\theta(或等价 x0x_0 估计)决定,方差可用固定调度或学习方差。每步采样:

xt−1=μθ(xt,t)+σtz,z∼N(0,I)x_{t-1}=\mu_\theta(x_t,t)+\sigma_t z,\quad z\sim\mathcal{N}(0,I)

(最后一步常不再加噪声。)步数多、轨迹带随机性,多样性好,但慢。

DDIM(Song, Meng, Ermon)构造非马尔可夫推断过程,允许:

  • 使用子序列时刻,步数远小于训练 TT;
  • η=0\eta=0 时走确定性轨迹,同种子可复现。

直觉:训练仍可按 DDPM 目标;采样换成另一族更新规则。这直接打脸「T=1000T=1000 就必须采 1000 步」的误解。

维度DDPM 祖先采样DDIM(典型 η=0\eta=0)
轨迹随机性每步可注入 zz可完全确定性
步数常接近训练 TT可用稀疏子序列,步数少很多
可复现性依赖每步随机数同种子更易对齐
多样性通常更高更依赖起点噪声 xTx_T
训练是否重做经典设定下不必通常不必(同 ϵθ\epsilon_\theta)

你可以这样选用:

  • 要对比实验、调参消融:优先确定性 DDIM 或文档推荐的确定性/半确定性 solver,固定种子。
  • 要样本多样性展示:祖先采样或带随机性的 solver,多抽几次 xTx_T。
  • 要延迟预算:先减 NFE,再换 DPM-Solver 族;仍不够再考虑蒸馏模型(换的是权重,不只是 solver)。

2.3.2 「跳步」在实现里长什么样

Section titled “2.3.2 「跳步」在实现里长什么样”

概念上,训练网格是 t=1,…,Tt=1,\ldots,T。采样可以只访问

τ1>τ2>⋯>τK\tau_1>\tau_2>\cdots>\tau_K

其中 K≪TK\ll T,例如 K=50K=50。每一步用网络在 τi\tau_i 上的预测,映射到 τi+1\tau_{i+1} 的状态。 Diffusers 里你设的 num_inference_steps=K,scheduler 负责生成这组 τ\tau 并执行更新;你没有改 TT 训练超参,只是换了推理离散化。

把反向过程看成积分 ODE/SDE 后,可用高阶数值方法:

方法族代表典型诉求
高阶 ODEDPM-Solver / DPM-Solver++约 10–20 NFE 级质量
设计空间EDM 的 Heun 等统一噪声尺度下的稳健采样
蒸馏/一致性Consistency、LCM2–8 步甚至更少

具体默认超参随库版本变化,以 Diffusers 文档为准;本章只建立「求解器是可替换组件」的接口思维。

小组件作用常见选择怎么调现象
求解器轨迹积分规则DDPM、DDIM、DPM-Solver++先加步数,不够再换族步太少 → 结构糊/伪影;够用后增益递减
NFE算力预算10–50;蒸馏后更少画质平台期就停延迟与质量主权衡
随机性多样性 vs 可复现祖先采样有噪;DDIM η=0\eta=0对比实验固定种子种子变 → 样本变;确定性便于 ablation
引导条件强度CFG 权重 ww图像文生图常从中等 ww 试;科学任务更保守ww 过大过饱和;过小不听条件

CFG(Ho & Salimans)本身是采样期(及训练期条件 dropout)组件,严格推导与调参表在第 6 章;这里只需知道:反向采样更新上还可以乘「条件引导」层。

2.5.1 采样质量的「平台期」如何判断

Section titled “2.5.1 采样质量的「平台期」如何判断”

固定提示、固定种子、固定模型:

  1. 画 K∈{10,20,30,50}K\in\{10,20,30,50\} 的结果;
  2. 若 30 与 50 几乎无差异,你的预算应停在平台起点附近;
  3. 若 10 明显结构崩、20 可接受,说明你处于「欠积分」区,应优先加步或换高阶 solver,而不是先加 CFG。

这条曲线比任何博客里的「推荐步数」都可靠,因为它绑定的是你的模型与提示。

在确定性 DDIM 下,多样性主要来自:

  • 不同的初始 xTx_T;
  • 不同的条件 cc / 提示;
  • 以及模型本身学到的条件分布宽度。

在随机祖先采样下,轨迹噪声 zz 额外注入多样性,但也让「同种子复现」变难。写论文或做工程回归测试时,优先确定性路径;做探索式生成时再打开随机性。

  • 少步蒸馏模型:换的是「网络所表示的轨迹映射」,不只是 solver。
  • 流匹配采样:沿更直路径积分。
  • 领域采样:3D 等变、离散状态的更新规则不同,但「网络局部预测 + 迭代更新」同构。

采样回答的是:「如何把局部去噪规则积成完整样本。」 它是推理算法,默认与训练目标配套,但可以在配套族内替换以换速度与多样性。

2.8 把反向采样更新写进实验日志的最小字段

Section titled “2.8 把反向采样更新写进实验日志的最小字段”

以后做任何生成实验,建议至少记录:

字段例对应训练与采样公式
模型 id / 修订runwayml/stable-diffusion-v1-5② 的权重
prediction_typeepsilon②
schedulerDDIMScheduler③
num_inference_steps30③ NFE 相关
guidance_scale7.0③+条件
seed0③ 可复现
提示 / 条件摘要…② 输入 cc
输出哈希或缩略图…结果

没有这些字段,你无法判断一次「变好」来自哪一层。第 6、9 章会沿用同一日志习惯。


3. 从公式到实现:Diffusers 与排障

Section titled “3. 从公式到实现:Diffusers 与排障”

3.4 与 Diffusers 的对应(工具映射)

Section titled “3.4 与 Diffusers 的对应(工具映射)”
概念Diffusers 中常见位置
网络 ϵθ\epsilon_\thetaUNet / Transformer 模型组件
调度与更新scheduler(可替换)
打包推理DiffusionPipeline
步数num_inference_steps
CFGguidance_scale(条件管线)

官方说明见 Hugging Face Diffusers 的 pipelines / schedulers 文档(文末 B 层引用)。会调 API ≠ 懂训练与采样公式;但懂训练与采样公式后,API 参数不再是魔法字符串。

遇到「能 load、出图很糟」时,按训练与采样公式逐项查,比盲目改学习率有效:

  1. 闭式加噪公式 / 调度是否一致? 训练用的 β\beta 或 σ\sigma 日程,与推理 scheduler 配置是否同一家族?数据是否仍在 [−1,1][-1,1] 等约定范围?

  2. 训练目标 / 参数化是否一致? 权重是 ϵ\epsilon 还是 vv?损失是否按同一标签算?条件 dropout 概率是否与 CFG 用法匹配?

  3. 反向采样更新 / 采样是否在合理区? NFE 是否过低?CFG 是否过大?是否该换 solver 而不是加噪声强度?

  4. 库层 torch_dtype、设备、VAE 缩放(隐空间模型)、安全 checker 是否误伤——这些不属于训练与采样公式,但常被误诊成「扩散坏了」。

把问题标到 ①②③ 哪一层,你就知道该读 paper 的哪一节、该改 Diffusers 的哪一个对象。

你改的东西主要冲击通常要不要重训
采样步数 NFE反向采样更新否
scheduler 类型反向采样更新(有时假设参数化)否(同参数化族内)
CFG ww反向采样更新 + 条件否(但训练需支持无条件分支)
β\beta 日程 / 噪声轴闭式加噪公式 + 训练目标标签语义要
ϵ↔v\epsilon\leftrightarrow v训练目标 + 反向采样更新换算要(或官方转换流程)
主干 U-Net→DiT训练目标容量要
像素→隐空间闭式加噪公式作用域要(LDM 路线)

对照下面三列,检查自己处在哪一层:

层级你会什么还缺什么
L0 名词听说过 DDPM、DDIM分不清训练与采样
L1 公式能写闭式与 ε 损失不会映射到代码字段
L2 组件知道调度/参数化/求解器可换不会做平台期与日志
L3 排障能把坏图标到 ①②③需要第 9 章真实验巩固

本章目标是把你从 L0/L1 推到 L2,并摸到 L3 的门槛。若你已经能独立完成 §9 练习 E 与 §10.1 代码对照,可以进入第 6 章系统参数,而不必在本章无限加长证明。


下列误区来自中文教程与工程讨论中的高频混淆;纠正以 A/B 层为准。

误区 1:训练必须逐步加噪 tt 次

Section titled “误区 1:训练必须逐步加噪 ttt 次”

错因:把前向定义过程当成训练实现。 纠正:高斯设定下用闭式 q(xt∣x0)q(x_t\mid x_0) 一次到位(DDPM)。逐步加噪仅在你实现非闭式前向或做可视化时需要。

误区 2:网络输出的「噪声」就是采样时加的随机数

Section titled “误区 2:网络输出的「噪声」就是采样时加的随机数”

错因:把 ϵθ\epsilon_\theta 的预测与采样公式里可选的随机项 zz 混为一谈。 纠正:ϵθ\epsilon_\theta 是对前向注入噪声的估计,用于构造均值更新;采样是否再注入 zz 由求解器随机性决定(DDPM 有、DDIM η=0\eta=0 无)。

误区 3:T=1000T=1000 ⇒ 采样 1000 步

Section titled “误区 3:T=1000T=1000T=1000 ⇒ 采样 1000 步”

错因:训练网格与积分步数绑定。 纠正:DDIM / DPM-Solver 等可少步;NFE 是推理预算。见 DDIM、DPM-Solver 原文。

误区 4:随便把 ε 预测改成 x0 预测,采样代码不动

Section titled “误区 4:随便把 ε 预测改成 x0 预测,采样代码不动”

错因:忽略参数化与更新式的耦合。 纠正:改预测目标必须同步改训练标签与采样换算;跟 Diffusers 的 prediction_type 等配置走。

错因:把引导强度当万能锐化。 纠正:CFG 过大易过饱和、伪细节;应同时改提示、步数、求解器。CFG 论文与工程博文见第 6 章资料;硬定义回 Ho & Salimans。

误区 6:两个「EDM」是同一个东西

Section titled “误区 6:两个「EDM」是同一个东西”

错因:缩写碰撞。 纠正:Karras 的 EDM 是图像扩散设计空间;Hoogeboom 的 E(n)-EDM 是等变分子生成。导航页与系列第 5、8 章会再强调。

误区 7:损失降了就等于生成变好

Section titled “误区 7:损失降了就等于生成变好”

错因:把训练 MSE 当成唯一质量指标。 纠正:ε 损失下降只说明网络更会拟合训练分布上的噪声残差;样本观感还取决于数据、采样器、CFG、分辨率。应用侧应配合下游指标(FID、任务成功率等),在第 6、9 章用实验说话。

误区 8:扩散「没有似然」所以不能做密度相关任务

Section titled “误区 8:扩散「没有似然」所以不能做密度相关任务”

错因:把 DDPM 简化训练目标理解成模型没有概率含义。 纠正:扩散模型仍有概率模型故事(变分/分数/SDE);只是工程上常用简化回归目标。是否便于精确似然评估,取决于具体参数化与实现,不能一概而论。需要似然时去读 iDDPM、Score SDE 等讨论,而不是停在「只有 MSE」。

误区 9:中文博客推的「最佳 CFG=7」放之四海皆准

Section titled “误区 9:中文博客推的「最佳 CFG=7」放之四海皆准”

错因:把某一 SD 版本的社区习惯写成物理常数。 纠正:CFG 合适区间依赖模型、分辨率、提示风格甚至是否用了其他引导。正确流程是:固定种子与步数 → 扫描 ww → 看过饱和与贴合度 → 记在你的实验日志。硬定义回 CFG 论文;社区数字只当搜索起点。


  • 公式采用 DDPM 常用记号;不同论文对 αt\alpha_t、σt\sigma_t 定义可能差一个变换,读实现时以该仓库为准。
  • 具体最优超参随数据、分辨率、库版本变化;本文给的是机制与调试方向,不是固定「最佳数字」。
  • 社群经验(如某 CFG 区间)仅作起点,须用 A/B 层定义与你自己的验证覆盖。
  • 不提供医疗或实验操作建议。
  • review_status 在发布前须人工终审。
本章做本章不做
DDPM 训练与采样公式组件级精讲完整 SDE 证明与测度论
误区纠正与练习30+ 模型清单(导航页)
为工程实现建立坐标系端到端可运行的迷你实验(第 9 章)
参数化/调度/求解器接口思维生物模态专论(第 8 章)

若你读完仍觉得「公式会背但手里没感觉」,按 §4.4.2 做前向可视化,再按 §6.5.1 对一个公开 pipeline 扫步数——这两步通常比再读一篇综述更有效。

  1. Denoising Diffusion Probabilistic Models(DDPM) — Ho, Jain, Abbeel · 2026-06-02 · NeurIPS 2020
  2. Improved Denoising Diffusion Probabilistic Models(iDDPM) — Nichol, Dhariwal · 2026-06-02 · ICML 2021
  3. Score-Based Generative Modeling through SDEs(统一框架) — Song 等 · 2026-06-02 · ICLR 2021
  4. Denoising Diffusion Implicit Models(DDIM) — Song, Meng, Ermon · 2026-06-02 · ICLR 2021
  5. DPM-Solver: 高阶 ODE 求解器 — Lu 等 · 2026-06-02 · NeurIPS 2022
  6. Elucidating the Design Space of Diffusion-Based Generative Models(Karras EDM) — Karras 等 · 2026-06-02 · NeurIPS 2022
  7. Consistency Models(少步/单步生成) — Song, Dhariwal, Chen, Sutskever · 2026-06-02 · ICML 2023
  8. Latent Consistency Models(LCM) — Luo 等 · 2026-06-02 · 2023
  9. Diffusers: Schedulers — Hugging Face · 2026-07-15 · Docs
  10. Understanding pipelines, models and schedulers — Hugging Face · 2026-07-15 · Docs
  11. What are Diffusion Models? (Lil’Log) — Lilian Weng · 2026-07-15 · Blog
  12. 生成扩散模型漫谈:DDPM = 贝叶斯+去噪 — 苏剑林 · 2026-07-15 · Blog
  13. DDIM 简明讲解与实现 — 周弈帆 · 2026-07-15 · Blog
  14. An Introduction to Flow Matching and Diffusion Models (MIT notes PDF) — MIT diffusion course · 2026-07-15 · Lecture notes
本页导航

目录