扩散模型第3章:实现、采样与排障
第 2 章已经完成前向与反向过程的推导。本章不再重复三条基础公式,而是处理实现时真正会改变结果的选择:预测目标与 loss、采样器和步数、训练与采样配置如何对应,以及出现异常时先检查哪一层。
1. 预测目标与损失设计
Section titled “1. 预测目标与损失设计”1.1 直觉
Section titled “1.1 直觉”随机抽一个 ,用闭式加噪公式造 。此时你知道刚才用的真实 。网络以 和 为输入预测 ;这个监督目标要求模型估计当前样本中的噪声成分。
1.2 公式(ε-prediction)
Section titled “1.2 公式(ε-prediction)”DDPM 实践中最常用的简化目标:
完整变分推导里还有加权与方差项;工程实现常落到这种 MSE。网络输入是带噪样本与时刻(或噪声水平)嵌入,输出与 同形状。
等价视角:从闭式解出
故预测 与预测 在信息上常可互推;选哪种是参数化选择,不是世界观对立。
1.3 为什么回归噪声有效
Section titled “1.3 为什么回归噪声有效”-
优化友好 目标是监督回归,没有 GAN 式对抗博弈,损失曲面相对平滑,超参更宽容。
-
多任务耦合 不同 对应不同难度:小 接近重构细节,大 接近从低信噪比输入中恢复结构。一个共享网络覆盖整条噪声课程(noise curriculum)。
-
与采样接口简单 许多采样公式直接吃 或由它还原的 。
1.3.1 为什么「随机抽 」在一个 batch 里也合理
Section titled “1.3.1 为什么「随机抽 ttt」在一个 batch 里也合理”一个 mini-batch 里,样本 A 可能抽到 ,样本 B 抽到 。这不是 bug:
- 每个样本的监督信号只依赖自己的 ;
- 网络用 嵌入区分难度,相当于多任务共享骨干;
- 长期训练后,各噪声水平都被反复考到。
对容量的要求是:骨干必须同时擅长「细修」与「从噪声里长结构」。U-Net 的多尺度跳跃连接、或 DiT 的全局注意力,都是在给这种多难度课程提供表示能力;换主干不改变训练目标,只改变「模型的函数逼近器」。
1.3.2 ε、、:同一事实的三种写法
Section titled “1.3.2 ε、x0x_0x0、vvv:同一事实的三种写法”由闭式:
再引入速度型参数化(常见写法之一,系数随论文略有出入):
三者描述同一几何关系的不同投影。工程含义:
| 参数化 | 训练标签 | 常见场景 | 风险 |
|---|---|---|---|
| 前向用的噪声 | DDPM 默认、大量图像权重 | 与某些高分辨率设置配合一般 | |
| 干净样本 | 部分实现/可视化直观 | 高噪声区数值可能别扭 | |
| 速度型组合 | 蒸馏、部分现代管线 | 必须配对应采样换算 |
实现约束:checkpoint 写 epsilon / v_prediction / sample 时,训练标签与 scheduler 更新必须同一套。只改网络头或只改采样一侧,是最常见的「能够运行但输出失效」来源。
1.3.3 条件生成时训练目标多了什么
Section titled “1.3.3 条件生成时训练目标多了什么”无条件时,网络看 。条件生成时多一个 (类别、文本嵌入、结构图等):
训练若希望采样期使用 CFG,通常要以一定概率把 丢掉(条件 dropout),让网络同时学有条件与无条件分数。CFG 的采样公式在第 6 章展开;本章只需记住:条件是训练目标输入的扩展,不是反向采样更新凭空变出来的。
1.4 组件拆解:参数化、嵌入、条件、加权
Section titled “1.4 组件拆解:参数化、嵌入、条件、加权”| 小组件 | 作用 | 常见选择 | 怎么调 | 现象 |
|---|---|---|---|---|
| 预测目标 | 网络输出语义 | (DDPM 默认);; | 跟社区权重与采样器文档;蒸馏/高分辨率常见 | 与采样公式不匹配 → 图像崩或需重推系数 |
| 时刻嵌入 | 告诉网络「有多脏」 | 正弦位置编码 + MLP | 连续 (EDM)时嵌噪声水平而非离散 | 噪声尺度编码不一致 → 只在中间 好用 |
| 条件注入 | 类别/文本/结构 | 拼接、交叉注意力、AdaLN | 要做 CFG 需训练时条件 dropout | 条件弱则采样听不懂;过强则模式单一 |
| 损失加权 | 各 是否等权 | 均匀 ;SNR 加权等 | 细节差时调整中高噪声段权重(依实现) | 影响纹理/结构平衡 |
| 主干 | 谁算 | U-Net;DiT 等 | 分辨率与扩展性驱动 | 改变容量与归纳偏置,不改变训练与采样公式骨架 |
Progressive distillation 等工作常与 -prediction 等参数化一起出现;细节见文末相关条目。记住原则:参数化、训练目标、采样更新必须同一套约定。
1.4.1 时刻嵌入与「网络如何表示噪声水平」
Section titled “1.4.1 时刻嵌入与「网络如何表示噪声水平」”若去掉 (或 )条件,网络会被迫用同一套权重处理「几乎干净」和「几乎纯噪」的输入,任务冲突极强。嵌入的作用是:
- 把标量噪声水平映射到高维特征;
- 通过加法、FiLM/AdaLN 或拼接注入 U-Net / Transformer 各层;
- 让不同噪声水平走不同的内部计算路径。
排障时:若只有某一段 生成正常,优先怀疑嵌入尺度、调度换算或训练时 采样分布,而不是急着加层数。
1.4.2 损失曲线该怎么读
Section titled “1.4.2 损失曲线该怎么读”健康训练常见现象:
- 总损失先快速下降再缓慢平台;
- 不同 分桶的损失可能差一个数量级(高噪声更「容易」或更「难」取决于参数化);
- 过拟合数据时,训练损失仍可能好看,但采样出现记忆化伪影。
不健康信号:
- 损失 NaN:学习率、混合精度、数据未归一化、数值溢出;
- 损失几乎不降:学习率过小、标签与参数化不一致、条件全丢/全不丢配置错误;
- 损失降但采样结果仍接近噪声:反向采样更新配置错、VAE 解码错、或训练根本没学到有效 。
训练目标优化成功 不等于 反向采样更新展示成功——这是误区 7 的根源。
1.5 可替换成什么
Section titled “1.5 可替换成什么”| 方向 | 代表 | 说明 |
|---|---|---|
| Score matching | NCSN / Score SDE | 学 ,与 SDE 采样统一 |
| 流匹配 | Flow Matching / Rectified Flow | 回归速度场,路径更直,少步友好 |
| 离散目标 | D3PM / SEDD | 交叉熵或 score entropy,而非高斯 MSE |
| 一致性蒸馏 | Consistency / LCM | 把多步轨迹压到少步/单步映射 |
这些替换不否定训练目标的地位:你仍然在学「某噪声水平下的局部去噪/搬运规则」,只是监督信号与路径定义变了。
1.6 小结(训练目标)
Section titled “1.6 小结(训练目标)”ε 损失回答的是:「在给定脏度下,网络考试题是什么。」 它是 DDPM 能稳定训练的核心工程开关。
2. 采样器、步数与随机性
Section titled “2. 采样器、步数与随机性”2.1 直觉
Section titled “2.1 直觉”训练从未要求网络「一次生成整张图」。它只学会了:给定 ,估计噪声或干净样本。采样则是:从 出发,反复询问网络,按规则更新状态,直到 。
因此:换采样器常常不用重训——这是性价比最高的加速参数之一(第 6、9 章会反复用到)。
2.2 DDPM 祖先采样(思想)
Section titled “2.2 DDPM 祖先采样(思想)”DDPM 构造条件高斯 :均值由 (或等价 估计)决定,方差可用固定调度或学习方差。每步采样:
(最后一步常不再加噪声。)步数多、轨迹带随机性,多样性好,但慢。
2.3 DDIM:确定性与跳步
Section titled “2.3 DDIM:确定性与跳步”DDIM(Song, Meng, Ermon)构造非马尔可夫推断过程,允许:
- 使用子序列时刻,步数远小于训练 ;
- 时走确定性轨迹,同种子可复现。
直觉:训练仍可按 DDPM 目标;采样换成另一族更新规则。这直接打脸「 就必须采 1000 步」的误解。
2.3.1 DDPM 与 DDIM:对照表
Section titled “2.3.1 DDPM 与 DDIM:对照表”| 维度 | DDPM 祖先采样 | DDIM(典型 ) |
|---|---|---|
| 轨迹随机性 | 每步可注入 | 可完全确定性 |
| 步数 | 常接近训练 | 可用稀疏子序列,步数少很多 |
| 可复现性 | 依赖每步随机数 | 同种子更易对齐 |
| 多样性 | 通常更高 | 更依赖起点噪声 |
| 训练是否重做 | 经典设定下不必 | 通常不必(同 ) |
你可以这样选用:
- 要对比实验、调参消融:优先确定性 DDIM 或文档推荐的确定性/半确定性 solver,固定种子。
- 要样本多样性展示:祖先采样或带随机性的 solver,多抽几次 。
- 要延迟预算:先减 NFE,再换 DPM-Solver 族;仍不够再考虑蒸馏模型(换的是权重,不只是 solver)。
2.3.2 「跳步」在实现里长什么样
Section titled “2.3.2 「跳步」在实现里长什么样”概念上,训练网格是 。采样可以只访问
其中 ,例如 。每一步用网络在 上的预测,映射到 的状态。
Diffusers 里你设的 num_inference_steps=K,scheduler 负责生成这组 并执行更新;你没有改 训练超参,只是换了推理离散化。
2.4 高阶求解器与少步家族
Section titled “2.4 高阶求解器与少步家族”把反向过程看成积分 ODE/SDE 后,可用高阶数值方法:
| 方法族 | 代表 | 典型诉求 |
|---|---|---|
| 高阶 ODE | DPM-Solver / DPM-Solver++ | 约 10–20 NFE 级质量 |
| 设计空间 | EDM 的 Heun 等 | 统一噪声尺度下的稳健采样 |
| 蒸馏/一致性 | Consistency、LCM | 2–8 步甚至更少 |
具体默认超参随库版本变化,以 Diffusers 文档为准;本章只建立「求解器是可替换组件」的接口思维。
2.5 组件拆解:怎么调、会怎样
Section titled “2.5 组件拆解:怎么调、会怎样”| 小组件 | 作用 | 常见选择 | 怎么调 | 现象 |
|---|---|---|---|---|
| 求解器 | 轨迹积分规则 | DDPM、DDIM、DPM-Solver++ | 先加步数,不够再换族 | 步太少 → 结构糊/伪影;够用后增益递减 |
| NFE | 算力预算 | 10–50;蒸馏后更少 | 画质平台期就停 | 延迟与质量主权衡 |
| 随机性 | 多样性 vs 可复现 | 祖先采样有噪;DDIM | 对比实验固定种子 | 种子变 → 样本变;确定性便于 ablation |
| 引导 | 条件强度 | CFG 权重 | 图像文生图常从中等 试;科学任务更保守 | 过大过饱和;过小不听条件 |
CFG(Ho & Salimans)本身是采样期(及训练期条件 dropout)组件,严格推导与调参表在第 6 章;这里只需知道:反向采样更新上还可以乘「条件引导」层。
2.5.1 采样质量的「平台期」如何判断
Section titled “2.5.1 采样质量的「平台期」如何判断”固定提示、固定种子、固定模型:
- 画 的结果;
- 若 30 与 50 几乎无差异,你的预算应停在平台起点附近;
- 若 10 明显结构崩、20 可接受,说明你处于「欠积分」区,应优先加步或换高阶 solver,而不是先加 CFG。
这条曲线比任何博客里的「推荐步数」都可靠,因为它绑定的是你的模型与提示。
2.5.2 多样性从哪里来
Section titled “2.5.2 多样性从哪里来”在确定性 DDIM 下,多样性主要来自:
- 不同的初始 ;
- 不同的条件 / 提示;
- 以及模型本身学到的条件分布宽度。
在随机祖先采样下,轨迹噪声 额外注入多样性,但也让「同种子复现」变难。写论文或做工程回归测试时,优先确定性路径;做探索式生成时再打开随机性。
2.6 可替换成什么
Section titled “2.6 可替换成什么”- 少步蒸馏模型:换的是「网络所表示的轨迹映射」,不只是 solver。
- 流匹配采样:沿更直路径积分。
- 领域采样:3D 等变、离散状态的更新规则不同,但「网络局部预测 + 迭代更新」同构。
2.7 小结(反向采样更新)
Section titled “2.7 小结(反向采样更新)”采样回答的是:「如何把局部去噪规则积成完整样本。」 它是推理算法,默认与训练目标配套,但可以在配套族内替换以换速度与多样性。
2.8 把反向采样更新写进实验日志的最小字段
Section titled “2.8 把反向采样更新写进实验日志的最小字段”以后做任何生成实验,建议至少记录:
| 字段 | 例 | 对应训练与采样公式 |
|---|---|---|
| 模型 id / 修订 | runwayml/stable-diffusion-v1-5 | ② 的权重 |
| prediction_type | epsilon | ② |
| scheduler | DDIMScheduler | ③ |
| num_inference_steps | 30 | ③ NFE 相关 |
| guidance_scale | 7.0 | ③+条件 |
| seed | 0 | ③ 可复现 |
| 提示 / 条件摘要 | … | ② 输入 |
| 输出哈希或缩略图 | … | 结果 |
没有这些字段,你无法判断一次「变好」来自哪一层。第 6、9 章会沿用同一日志习惯。
3. 从公式到实现:Diffusers 与排障
Section titled “3. 从公式到实现:Diffusers 与排障”3.4 与 Diffusers 的对应(工具映射)
Section titled “3.4 与 Diffusers 的对应(工具映射)”| 概念 | Diffusers 中常见位置 |
|---|---|
| 网络 | UNet / Transformer 模型组件 |
| 调度与更新 | scheduler(可替换) |
| 打包推理 | DiffusionPipeline |
| 步数 | num_inference_steps |
| CFG | guidance_scale(条件管线) |
官方说明见 Hugging Face Diffusers 的 pipelines / schedulers 文档(文末 B 层引用)。会调 API ≠ 懂训练与采样公式;但懂训练与采样公式后,API 参数不再是魔法字符串。
3.5 排障决策树(读实现时用)
Section titled “3.5 排障决策树(读实现时用)”遇到「能 load、出图很糟」时,按训练与采样公式逐项查,比盲目改学习率有效:
-
闭式加噪公式 / 调度是否一致? 训练用的 或 日程,与推理 scheduler 配置是否同一家族?数据是否仍在 等约定范围?
-
训练目标 / 参数化是否一致? 权重是 还是 ?损失是否按同一标签算?条件 dropout 概率是否与 CFG 用法匹配?
-
反向采样更新 / 采样是否在合理区? NFE 是否过低?CFG 是否过大?是否该换 solver 而不是加噪声强度?
-
库层
torch_dtype、设备、VAE 缩放(隐空间模型)、安全 checker 是否误伤——这些不属于训练与采样公式,但常被误诊成「扩散坏了」。
把问题标到 ①②③ 哪一层,你就知道该读 paper 的哪一节、该改 Diffusers 的哪一个对象。
3.6 一张「改动影响面」表
Section titled “3.6 一张「改动影响面」表”| 你改的东西 | 主要冲击 | 通常要不要重训 |
|---|---|---|
| 采样步数 NFE | 反向采样更新 | 否 |
| scheduler 类型 | 反向采样更新(有时假设参数化) | 否(同参数化族内) |
| CFG | 反向采样更新 + 条件 | 否(但训练需支持无条件分支) |
| 日程 / 噪声轴 | 闭式加噪公式 + 训练目标标签语义 | 要 |
| 训练目标 + 反向采样更新换算 | 要(或官方转换流程) | |
| 主干 U-Net→DiT | 训练目标容量 | 要 |
| 像素→隐空间 | 闭式加噪公式作用域 | 要(LDM 路线) |
3.9 从公式到配置
Section titled “3.9 从公式到配置”对照下面三列,检查自己处在哪一层:
| 层级 | 你会什么 | 还缺什么 |
|---|---|---|
| L0 名词 | 听说过 DDPM、DDIM | 分不清训练与采样 |
| L1 公式 | 能写闭式与 ε 损失 | 不会映射到代码字段 |
| L2 组件 | 知道调度/参数化/求解器可换 | 不会做平台期与日志 |
| L3 排障 | 能把坏图标到 ①②③ | 需要第 9 章真实验巩固 |
本章目标是把你从 L0/L1 推到 L2,并摸到 L3 的门槛。若你已经能独立完成 §9 练习 E 与 §10.1 代码对照,可以进入第 6 章系统参数,而不必在本章无限加长证明。
4. 常见实现误区
Section titled “4. 常见实现误区”下列误区来自中文教程与工程讨论中的高频混淆;纠正以 A/B 层为准。
误区 1:训练必须逐步加噪 次
Section titled “误区 1:训练必须逐步加噪 ttt 次”错因:把前向定义过程当成训练实现。 纠正:高斯设定下用闭式 一次到位(DDPM)。逐步加噪仅在你实现非闭式前向或做可视化时需要。
误区 2:网络输出的「噪声」就是采样时加的随机数
Section titled “误区 2:网络输出的「噪声」就是采样时加的随机数”错因:把 的预测与采样公式里可选的随机项 混为一谈。 纠正: 是对前向注入噪声的估计,用于构造均值更新;采样是否再注入 由求解器随机性决定(DDPM 有、DDIM 无)。
误区 3: ⇒ 采样 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 等配置走。
误区 5:CFG 拉满就能补坏 prompt
Section titled “误区 5:CFG 拉满就能补坏 prompt”错因:把引导强度当万能锐化。 纠正: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 合适区间依赖模型、分辨率、提示风格甚至是否用了其他引导。正确流程是:固定种子与步数 → 扫描 → 看过饱和与贴合度 → 记在你的实验日志。硬定义回 CFG 论文;社区数字只当搜索起点。
5. 边界与说明
Section titled “5. 边界与说明”- 公式采用 DDPM 常用记号;不同论文对 、 定义可能差一个变换,读实现时以该仓库为准。
- 具体最优超参随数据、分辨率、库版本变化;本文给的是机制与调试方向,不是固定「最佳数字」。
- 社群经验(如某 CFG 区间)仅作起点,须用 A/B 层定义与你自己的验证覆盖。
- 不提供医疗或实验操作建议。
review_status在发布前须人工终审。
5.1 本章边界再强调一次
Section titled “5.1 本章边界再强调一次”| 本章做 | 本章不做 |
|---|---|
| DDPM 训练与采样公式组件级精讲 | 完整 SDE 证明与测度论 |
| 误区纠正与练习 | 30+ 模型清单(导航页) |
| 为工程实现建立坐标系 | 端到端可运行的迷你实验(第 9 章) |
| 参数化/调度/求解器接口思维 | 生物模态专论(第 8 章) |
若你读完仍觉得「公式会背但手里没感觉」,按 §4.4.2 做前向可视化,再按 §6.5.1 对一个公开 pipeline 扫步数——这两步通常比再读一篇综述更有效。
- Denoising Diffusion Probabilistic Models(DDPM) — Ho, Jain, Abbeel · 2026-06-02 · NeurIPS 2020
- Improved Denoising Diffusion Probabilistic Models(iDDPM) — Nichol, Dhariwal · 2026-06-02 · ICML 2021
- Score-Based Generative Modeling through SDEs(统一框架) — Song 等 · 2026-06-02 · ICLR 2021
- Denoising Diffusion Implicit Models(DDIM) — Song, Meng, Ermon · 2026-06-02 · ICLR 2021
- DPM-Solver: 高阶 ODE 求解器 — Lu 等 · 2026-06-02 · NeurIPS 2022
- Elucidating the Design Space of Diffusion-Based Generative Models(Karras EDM) — Karras 等 · 2026-06-02 · NeurIPS 2022
- Consistency Models(少步/单步生成) — Song, Dhariwal, Chen, Sutskever · 2026-06-02 · ICML 2023
- Latent Consistency Models(LCM) — Luo 等 · 2026-06-02 · 2023
- Diffusers: Schedulers — Hugging Face · 2026-07-15 · Docs
- Understanding pipelines, models and schedulers — Hugging Face · 2026-07-15 · Docs
- What are Diffusion Models? (Lil’Log) — Lilian Weng · 2026-07-15 · Blog
- 生成扩散模型漫谈:DDPM = 贝叶斯+去噪 — 苏剑林 · 2026-07-15 · Blog
- DDIM 简明讲解与实现 — 周弈帆 · 2026-07-15 · Blog
- An Introduction to Flow Matching and Diffusion Models (MIT notes PDF) — MIT diffusion course · 2026-07-15 · Lecture notes
主题色
字体
字号
视觉效果
即将离开本站
你将前往外部网站:
该网站与本站无关,本站不对其内容、安全性或可用性负责。确定后将在新标签页打开。