扩散模型教程第3章:DDPM 三式精讲
本章是系列第 3 章:只深挖 DDPM 三式坐标系(闭式加噪 / ε 损失 / 采样),不讲 SD 代际与 ControlNet 工程史。
分工:产品线架构见 Stable Diffusion 架构与演进;隐空间设计见 隐空间扩散深入;模型清单见 扩散模型导航。
系列内:前向/反向直觉见第 2 章;旋钮总表见第 6 章;可运行采样见 第 9 章 Diffusers 实验课(正文后续)。
1. 本章目标与验收标准
Section titled “1. 本章目标与验收标准”学完本章,你应能在不看笔记的情况下完成下列自检:
- 写出闭式加噪公式,并说明 变小时 发生了什么。
- 写出 ε-prediction 训练目标,解释「随机抽 」为何合法。
- 说明训练步数 与采样 NFE 不是一回事,并举出至少一种少步采样替换。
- 对「调度 / 预测参数化 / 求解器」各举一个「怎么调 → 会怎样」的例子。
- 指出至少两个常见误区,并能用论文级说法纠正。
字数定位:单章深讲(约 8500–12000 汉字)。不在本章训练大模型;不抄导航页模型大全。
2. 符号表与问题设定
Section titled “2. 符号表与问题设定”| 符号 | 含义 |
|---|---|
| 干净数据样本(图像、隐变量等) | |
| 时刻 的带噪样本 | |
| 离散扩散最大步数(训练常用网格,如 1000) | |
| 第 步噪声方差调度(或等价参数) | |
| 单步信号保留系数 | |
| 累积信号系数 | |
| 标准高斯噪声 | |
| 以 参数化的噪声预测网络 | |
| NFE | Number of Function Evaluations,采样时网络前向次数 |
问题设定(DDPM 经典离散时间高斯扩散)
数据在欧氏空间 上。前向过程按预设调度逐步混入高斯噪声,使 近似标准正态;反向过程用神经网络学习如何从 退到 ,从而从纯噪声生成新样本。
Ho, Jain, Abbeel(2020)的关键工程贡献之一,是把繁琐变分目标简化成预测噪声的均方误差,使训练像回归一样稳,扩散才真正好用。出处见文末 DDPM 条目。
在更早的非平衡热力学表述(Sohl-Dickstein 等,2015)里,「加噪—去噪」思想已经出现;DDPM 的历史地位在于把目标与实现简化到工业可复现。你读本章时,把 2015 当作思想源头、把 2020 当作工程引爆点即可,不必在入门阶段陷入全部历史细节。
3. 总览:训练与采样为何必须分家
Section titled “3. 总览:训练与采样为何必须分家”很多人第一次读论文会把「加噪 步、去噪 步」理解成训练循环也必须滚完整条链。真正实现里是两套逻辑:
| 训练 | 采样(生成) | |
|---|---|---|
| 输入 | 数据集中的 | 随机噪声 |
| 时间 | 均匀(或加权)随机抽 | 从 走到 (可跳步) |
| 前向 | 用闭式一次得到 | 通常不跑前向 |
| 网络用途 | 回归 (或 /) | 提供每步去噪方向 |
| 优化 | 梯度下降最小化损失 | 无梯度,只推理 |
flowchart TB subgraph train [训练] X0["数据 x0"] --> CT["闭式得到 xt"] CT --> NET["网络预测 ε 或 x0/v"] NET --> LOSS["MSE 等回归损失"] end subgraph sample [采样] N["噪声 xT"] --> LOOP["求解器循环"] LOOP --> NET2["同一网络"] NET2 --> LOOP LOOP --> OUT["样本 x0"] end LOSS -.->|"学到的 θ"| NET2
记住这句就够入门:前向定义「噪声有多脏」;损失教网络「在该脏度下如何指回数据」;采样器决定「用多少步、是否随机、如何跳」把局部预测积成整条轨迹。
3.1 一个完整「故事线」版本
Section titled “3.1 一个完整「故事线」版本”把三式讲成故事,便于记忆:
-
出题人(第一式)
从真实数据里拿一张图,按日程表洒上已知强度的沙,得到考题 。出题人知道沙是哪一把(),也知道洒了多狠( 或 )。 -
考生(第二式)
网络只能看到 和「有多脏」的提示,要猜沙长什么样。猜错了按像素/通道算均方惩罚。日复一日,考生在各种脏度上考试。 -
作家(第三式)
创作时不再有真实图。作家从纯沙开始,反复问考生「现在这堆沙里噪声大概长啥样」,按求解器规则一点点抹掉,直到纸上出现新图。作家可以问得勤一点(多步)或跳着问(少步),也可以在有提示词时更听提示(CFG)。
故事的好处是分清角色:出题人不用训练,考生要训练,作家是推理算法。 很多实现 bug 都是三角色串台——比如作家用的抹法与考生训练时的评分标准不一致。
3.2 和「自回归一步生成」差在哪
Section titled “3.2 和「自回归一步生成」差在哪”自回归语言模型一次预测下一个 token;扩散在状态空间上做迭代精炼。代价是多次网络前向(NFE);收益是:
- 可以在连续向量、图像网格、坐标、隐变量上工作;
- 条件注入与引导手段成熟;
- 训练目标局部、稳定。
理解这一点,有助于你在第 5 章看到离散扩散、在第 8 章看到蛋白骨架扩散时,不觉得「怎么又是另一套东西」——骨架仍是「加扰 → 学逆过程 → 迭代采样」。
4. 第一式:闭式加噪
Section titled “4. 第一式:闭式加噪”4.1 直觉
Section titled “4.1 直觉”不必把照片真的加噪 500 次才得到「第 500 步的雪花图」。在高斯线性加噪设定下,任意时刻的 都可以写成:
原图缩一点 + 一团已知强度的高斯噪声。
训练时,随机选一个「脏度」,直接造出对应的 ,让网络学习。
4.2 公式
Section titled “4.2 公式”单步前向(马尔可夫核):
对高斯链做边缘化后,得到任意 的闭式(DDPM 记号):
其中 ,。
增大时 变小:信号系数 下降,噪声系数 上升,直到 接近纯噪声。
4.2.1 一维数值例子(把符号变成数)
Section titled “4.2.1 一维数值例子(把符号变成数)”设某一维「像素」,某时刻 (则 ,),并抽到 :
同一 、同一 ,若换成更晚的时刻使 ,则 ,:
你应看到两件事:
- 信号被压扁: 前面的系数从 掉到 ,原图信息越来越弱。
- 噪声主导:后一项由 决定,高 时 更像噪声而不是数据。
训练时网络在低 主要「擦细噪」,在高 则要在几乎纯噪声里猜结构——这就是噪声课程(noise curriculum)的来源。
4.2.2 信噪比(SNR)直觉
Section titled “4.2.2 信噪比(SNR)直觉”常把
当作「还有多少信号相对噪声」。 大 → 图还比较干净; 小 → 接近纯噪声。
后面凡是「加权损失」「连续噪声水平 」「EDM 预处理」,很多都是在重新标定 SNR 轴,而不是推翻闭式本身。读实现时先问:这个库的噪声轴是离散 还是连续 ?与 如何换算?
4.2.3 从单步核到闭式:你需要保留的推导骨架
Section titled “4.2.3 从单步核到闭式:你需要保留的推导骨架”不必默写全部代数,但要能讲清逻辑链:
- 单步:。
- 线性叠加高斯:多步之后 仍对 线性,且噪声项仍是高斯。
- 合并系数得到 与 。
- 因此 边缘 有闭式,训练可跳过中间 。
若有人问「为什么必须是高斯」,工程回答是:高斯对加法封闭,闭式漂亮;换离散状态或流形就要重做前向定义(第 5 章)。
4.3 为什么要这样设计
Section titled “4.3 为什么要这样设计”-
可训练性
若没有闭式,每次训练都要从 滚 步,成本高、实现啰嗦。闭式把复杂度从 降到 。 -
目标清晰
闭式把「任意噪声水平」参数化成连续脏度(离散网格上的 )。网络必须在所有脏度上学会去噪,而不是只会最后一步。 -
与采样衔接
训练见过全范围 后,采样器才能在轨迹的任意位置查询网络。
4.4 组件拆解:怎么调、会怎样
Section titled “4.4 组件拆解:怎么调、会怎样”| 小组件 | 作用 | 常见选择 | 怎么调 | 现象(经验层) |
|---|---|---|---|---|
| 形状 | 噪声加多快 | linear;cosine(iDDPM) | 高分辨率/细节任务更常试 cosine 或连续噪声参数化 | 过早把信号打没 → 后期难学;加噪太慢 → 高噪声区欠训练 |
| 训练离散网格 | 经典约 1000 | 与采样步数解耦理解 | 太小,单步变化太大;过大则算力与实现复杂 | |
| 方差是否学习 | 反向分布的 | DDPM 固定;iDDPM 可学 | 更在意 log-likelihood 时再开 | 主要改善似然,FID 不一定总涨 |
| 数据预处理 | 归一化、缩放 | 等 | 与网络最后一层激活匹配 | 尺度错会导致训练不稳定 |
iDDPM(Nichol & Dhariwal, 2021)在调度与学习方差上的改进,是「同一三式骨架上换组件」的早期范例。
4.4.1 linear 与 cosine 调度:怎么读曲线
Section titled “4.4.1 linear 与 cosine 调度:怎么读曲线”不必死记公式系数,先建立图像:
- linear: 随 近似线性爬升。实现简单,早期 DDPM 常用。缺点是某些分辨率下,中段 SNR 下降方式可能不够「匀速」,细节与结构的学习负担不均。
- cosine(iDDPM 推广):让 随 更平滑地过渡,避免过早把信号打没,也避免长时间停在极低噪声。许多图像实验报告在似然或样本质量上更稳。
调参时不要同时随机改 、 端点、预测目标三件事。一次只动一类组件,否则你无法归因。
4.4.2 可视化前向:你自己就能做的最小实验(不必训练)
Section titled “4.4.2 可视化前向:你自己就能做的最小实验(不必训练)”用任意一张小图(甚至随机张量当 ):
- 选定调度,预计算 。
- 固定一个 ,画出 的 。
- 再换一个 ,重复。
你应看到:同一 下结构随 被噪声淹没的过程是平滑的;换 则「雪花纹理」变了。这能把闭式从纸面公式变成肌肉记忆。第 9 章会在 Diffusers 里做推理侧消融;这里的前向可视化甚至不需要 GPU。
4.5 可替换成什么
Section titled “4.5 可替换成什么”| 替换方向 | 代表 | 换的是什么 |
|---|---|---|
| 连续时间 SDE | Score SDE(Song 等) | 离散链 → VE/VP 等连续噪声过程 |
| 设计空间重参数 | EDM(Karras 等) | 不以 表为中心,而用噪声尺度与预处理 |
| 非高斯前向 | D3PM 等离散扩散 | 高斯 → 类别转移矩阵(序列/图标签) |
| 隐空间前向 | LDM | 先对 编码再扩散,算力结构变了 |
本章仍以 DDPM 高斯闭式为主;离散与等变前向在第 5 章展开。
4.6 小结(第一式)
Section titled “4.6 小结(第一式)”闭式加噪回答的是:「脏成什么样」可以闭式点名。 它不训练网络,但定义了网络要在哪些脏度上考试。
5. 第二式:训练目标——让网络认出噪声
Section titled “5. 第二式:训练目标——让网络认出噪声”5.1 直觉
Section titled “5.1 直觉”随机抽一个 ,用第一式造 。此时你知道刚才用的真实 。让网络看着 和 ,猜这个 。猜得准,就等于在该噪声水平下知道「该擦掉什么」。
5.2 公式(ε-prediction)
Section titled “5.2 公式(ε-prediction)”DDPM 实践中最常用的简化目标:
完整变分推导里还有加权与方差项;工程实现常落到这种 MSE。网络输入是带噪样本与时刻(或噪声水平)嵌入,输出与 同形状。
等价视角:从闭式解出
故预测 与预测 在信息上常可互推;选哪种是参数化选择,不是世界观对立。
5.3 为什么回归噪声有效
Section titled “5.3 为什么回归噪声有效”-
优化友好
目标是监督回归,没有 GAN 式对抗博弈,损失曲面相对平滑,超参更宽容。 -
多任务耦合
不同 对应不同难度:小 接近重构细节,大 接近从噪声里「幻想」结构。一个共享网络覆盖整条噪声课程(noise curriculum)。 -
与采样接口简单
许多采样公式直接吃 或由它还原的 。
5.3.1 为什么「随机抽 」在一个 batch 里也合理
Section titled “5.3.1 为什么「随机抽 ttt」在一个 batch 里也合理”一个 mini-batch 里,样本 A 可能抽到 ,样本 B 抽到 。这不是 bug:
- 每个样本的监督信号只依赖自己的 ;
- 网络用 嵌入区分难度,相当于多任务共享骨干;
- 长期训练后,各噪声水平都被反复考到。
对容量的要求是:骨干必须同时擅长「细修」与「从噪声里长结构」。U-Net 的多尺度跳跃连接、或 DiT 的全局注意力,都是在给这种多难度课程提供表示能力;换主干不改变第二式,只改变「谁来答题」。
5.3.2 ε、、:同一事实的三种写法
Section titled “5.3.2 ε、x0x_0x0、vvv:同一事实的三种写法”由闭式:
再引入速度型参数化(常见写法之一,系数随论文略有出入):
三者描述同一几何关系的不同投影。工程含义:
| 参数化 | 训练标签 | 常见场景 | 风险 |
|---|---|---|---|
| 前向用的噪声 | DDPM 默认、大量图像权重 | 与某些高分辨率设置配合一般 | |
| 干净样本 | 部分实现/可视化直观 | 高噪声区数值可能别扭 | |
| 速度型组合 | 蒸馏、部分现代管线 | 必须配对应采样换算 |
硬规则:checkpoint 写 epsilon / v_prediction / sample 时,训练标签与 scheduler 更新必须同一套。只改网络头或只改采样一侧,是最常见的「能跑但全花」来源。
5.3.3 条件生成时第二式多了什么
Section titled “5.3.3 条件生成时第二式多了什么”无条件时,网络看 。条件生成时多一个 (类别、文本嵌入、结构图等):
训练若希望采样期使用 CFG,通常要以一定概率把 丢掉(条件 dropout),让网络同时学有条件与无条件分数。CFG 的采样公式在第 6 章展开;本章只需记住:条件是第二式输入的扩展,不是第三式凭空变出来的。
5.4 组件拆解:参数化、嵌入、条件、加权
Section titled “5.4 组件拆解:参数化、嵌入、条件、加权”| 小组件 | 作用 | 常见选择 | 怎么调 | 现象 |
|---|---|---|---|---|
| 预测目标 | 网络输出语义 | (DDPM 默认);; | 跟社区权重与采样器文档;蒸馏/高分辨率常见 | 与采样公式不匹配 → 图像崩或需重推系数 |
| 时刻嵌入 | 告诉网络「有多脏」 | 正弦位置编码 + MLP | 连续 (EDM)时嵌噪声水平而非离散 | 嵌错尺度 → 只在中间 好用 |
| 条件注入 | 类别/文本/结构 | 拼接、交叉注意力、AdaLN | 要做 CFG 需训练时条件 dropout | 条件弱则采样听不懂;过强则模式单一 |
| 损失加权 | 各 是否等权 | 均匀 ;SNR 加权等 | 细节差时调整中高噪声段权重(依实现) | 影响纹理/结构平衡 |
| 主干 | 谁算 | U-Net;DiT 等 | 分辨率与扩展性驱动 | 改变容量与归纳偏置,不改变三式骨架 |
Progressive distillation 等工作常与 -prediction 等参数化一起出现;细节见文末相关条目。记住原则:参数化、训练目标、采样更新必须同一套约定。
5.4.1 时刻嵌入与「网络是否知道有多脏」
Section titled “5.4.1 时刻嵌入与「网络是否知道有多脏」”若去掉 (或 )条件,网络会被迫用同一套权重处理「几乎干净」和「几乎纯噪」的输入,任务冲突极强。嵌入的作用是:
- 把标量脏度映射到高维特征;
- 通过加法、FiLM/AdaLN 或拼接注入 U-Net / Transformer 各层;
- 让不同噪声水平走不同的内部计算路径。
排障时:若只有某一段 生成正常,优先怀疑嵌入尺度、调度换算或训练时 采样分布,而不是急着加层数。
5.4.2 损失曲线该怎么读
Section titled “5.4.2 损失曲线该怎么读”健康训练常见现象:
- 总损失先快速下降再缓慢平台;
- 不同 分桶的损失可能差一个数量级(高噪声更「容易」或更「难」取决于参数化);
- 过拟合数据时,训练损失仍可能好看,但采样出现记忆化伪影。
不健康信号:
- 损失 NaN:学习率、混合精度、数据未归一化、数值溢出;
- 损失几乎不降:学习率过小、标签与参数化不一致、条件全丢/全不丢配置错误;
- 损失降但采样纯噪:第三式配置错、VAE 解码错、或训练根本没学到有效 。
第二式优化成功 不等于 第三式展示成功——这是误区 7 的根源。
5.5 可替换成什么
Section titled “5.5 可替换成什么”| 方向 | 代表 | 说明 |
|---|---|---|
| Score matching | NCSN / Score SDE | 学 ,与 SDE 采样统一 |
| 流匹配 | Flow Matching / Rectified Flow | 回归速度场,路径更直,少步友好 |
| 离散目标 | D3PM / SEDD | 交叉熵或 score entropy,而非高斯 MSE |
| 一致性蒸馏 | Consistency / LCM | 把多步轨迹压到少步/单步映射 |
这些替换不否定第二式的地位:你仍然在学「某噪声水平下的局部去噪/搬运规则」,只是监督信号与路径定义变了。
5.6 小结(第二式)
Section titled “5.6 小结(第二式)”ε 损失回答的是:「在给定脏度下,网络考试题是什么。」 它是 DDPM 能稳定训练的核心工程开关。
6. 第三式:反向采样——从噪声退回样本
Section titled “6. 第三式:反向采样——从噪声退回样本”6.1 直觉
Section titled “6.1 直觉”训练从未要求网络「一次生成整张图」。它只学会了:给定 ,估计噪声或干净样本。采样则是:从 出发,反复询问网络,按规则更新状态,直到 。
因此:换采样器常常不用重训——这是性价比最高的加速旋钮之一(第 6、9 章会反复用到)。
6.2 DDPM 祖先采样(思想)
Section titled “6.2 DDPM 祖先采样(思想)”DDPM 构造条件高斯 :均值由 (或等价 估计)决定,方差可用固定调度或学习方差。每步采样:
(最后一步常不再加噪声。)步数多、轨迹带随机性,多样性好,但慢。
6.3 DDIM:确定性与跳步
Section titled “6.3 DDIM:确定性与跳步”DDIM(Song, Meng, Ermon)构造非马尔可夫推断过程,允许:
- 使用子序列时刻,步数远小于训练 ;
- 时走确定性轨迹,同种子可复现。
直觉:训练仍可按 DDPM 目标;采样换成另一族更新规则。这直接打脸「 就必须采 1000 步」的误解。
6.3.1 DDPM 与 DDIM:对照表
Section titled “6.3.1 DDPM 与 DDIM:对照表”| 维度 | DDPM 祖先采样 | DDIM(典型 ) |
|---|---|---|
| 轨迹随机性 | 每步可注入 | 可完全确定性 |
| 步数 | 常接近训练 | 可用稀疏子序列,步数少很多 |
| 可复现性 | 依赖每步随机数 | 同种子更易对齐 |
| 多样性 | 通常更高 | 更依赖起点噪声 |
| 训练是否重做 | 经典设定下不必 | 通常不必(同 ) |
你可以这样选用:
- 要对比实验、调参消融:优先确定性 DDIM 或文档推荐的确定性/半确定性 solver,固定种子。
- 要样本多样性展示:祖先采样或带随机性的 solver,多抽几次 。
- 要延迟预算:先减 NFE,再换 DPM-Solver 族;仍不够再考虑蒸馏模型(换的是权重,不只是 solver)。
6.3.2 「跳步」在实现里长什么样
Section titled “6.3.2 「跳步」在实现里长什么样”概念上,训练网格是 。采样可以只访问
其中 ,例如 。每一步用网络在 上的预测,映射到 的状态。
Diffusers 里你设的 num_inference_steps=K,scheduler 负责生成这组 并执行更新;你没有改 训练超参,只是换了推理离散化。
6.4 高阶求解器与少步家族
Section titled “6.4 高阶求解器与少步家族”把反向过程看成积分 ODE/SDE 后,可用高阶数值方法:
| 方法族 | 代表 | 典型诉求 |
|---|---|---|
| 高阶 ODE | DPM-Solver / DPM-Solver++ | 约 10–20 NFE 级质量 |
| 设计空间 | EDM 的 Heun 等 | 统一噪声尺度下的稳健采样 |
| 蒸馏/一致性 | Consistency、LCM | 2–8 步甚至更少 |
具体默认超参随库版本变化,以 Diffusers 文档为准;本章只建立「求解器是可替换组件」的接口思维。
6.5 组件拆解:怎么调、会怎样
Section titled “6.5 组件拆解:怎么调、会怎样”| 小组件 | 作用 | 常见选择 | 怎么调 | 现象 |
|---|---|---|---|---|
| 求解器 | 轨迹积分规则 | DDPM、DDIM、DPM-Solver++ | 先加步数,不够再换族 | 步太少 → 结构糊/伪影;够用后增益递减 |
| NFE | 算力预算 | 10–50;蒸馏后更少 | 画质平台期就停 | 延迟与质量主权衡 |
| 随机性 | 多样性 vs 可复现 | 祖先采样有噪;DDIM | 对比实验固定种子 | 种子变 → 样本变;确定性便于 ablation |
| 引导 | 条件强度 | CFG 权重 | 图像文生图常从中等 试;科学任务更保守 | 过大过饱和;过小不听条件 |
CFG(Ho & Salimans)本身是采样期(及训练期条件 dropout)组件,严格推导与调参表在第 6 章;这里只需知道:第三式上还可以乘「条件引导」层。
6.5.1 采样质量的「平台期」如何判断
Section titled “6.5.1 采样质量的「平台期」如何判断”固定提示、固定种子、固定模型:
- 画 的结果;
- 若 30 与 50 几乎无差异,你的预算应停在平台起点附近;
- 若 10 明显结构崩、20 可接受,说明你处于「欠积分」区,应优先加步或换高阶 solver,而不是先加 CFG。
这条曲线比任何博客里的「推荐步数」都可靠,因为它绑定的是你的模型与提示。
6.5.2 多样性从哪里来
Section titled “6.5.2 多样性从哪里来”在确定性 DDIM 下,多样性主要来自:
- 不同的初始 ;
- 不同的条件 / 提示;
- 以及模型本身学到的条件分布宽度。
在随机祖先采样下,轨迹噪声 额外注入多样性,但也让「同种子复现」变难。写论文或做工程回归测试时,优先确定性路径;做探索式生成时再打开随机性。
6.6 可替换成什么
Section titled “6.6 可替换成什么”- 少步蒸馏模型:换的是「网络所表示的轨迹映射」,不只是 solver。
- 流匹配采样:沿更直路径积分。
- 领域采样:3D 等变、离散状态的更新规则不同,但「网络局部预测 + 迭代更新」同构。
6.7 小结(第三式)
Section titled “6.7 小结(第三式)”采样回答的是:「如何把局部去噪规则积成完整样本。」 它是推理算法,默认与训练目标配套,但可以在配套族内替换以换速度与多样性。
6.8 把第三式写进实验日志的最小字段
Section titled “6.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 章会沿用同一日志习惯。
7. 三式串起来
Section titled “7. 三式串起来”7.1 一张心智图
Section titled “7.1 一张心智图”flowchart LR A["① 闭式加噪<br/>定义 xt"] --> B["② ε 损失<br/>学 εθ"] B --> C["③ 采样器<br/>从 xT 积分到 x0"] A -.->|"共享噪声调度语义"| C
| 式 | 一句话职责 | 不负责的事 |
|---|---|---|
| ① 闭式加噪 | 点名任意脏度的 | 不更新网络参数 |
| ② ε 损失 | 在脏度 上监督学习 | 不直接输出最终作品展示策略 |
| ③ 采样 | 推理轨迹 | 不重新定义训练集 |
7.2 训练循环(伪代码级)
Section titled “7.2 训练循环(伪代码级)”重复: 从数据集取 x0 采样 t ~ 均匀{1..T}(或加权) 采样 ε ~ N(0, I) 用闭式构造 xt = sqrt(ᾱ_t) x0 + sqrt(1-ᾱ_t) ε 预测 ε̂ = εθ(xt, t) 损失 = ||ε - ε̂||² 反向传播更新 θ7.3 采样循环(伪代码级)
Section titled “7.3 采样循环(伪代码级)”xT ~ N(0, I)for t = T, T-1, ..., 1: # 或子序列时刻 用 εθ(xt, t) 估计噪声或 x0 按所选求解器更新 xt-1返回 x07.4 与 Diffusers 的对应(预习第 9 章)
Section titled “7.4 与 Diffusers 的对应(预习第 9 章)”| 概念 | Diffusers 中常见位置 |
|---|---|
| 网络 | UNet / Transformer 模型组件 |
| 调度与更新 | scheduler(可替换) |
| 打包推理 | DiffusionPipeline |
| 步数 | num_inference_steps |
| CFG | guidance_scale(条件管线) |
官方说明见 Hugging Face Diffusers 的 pipelines / schedulers 文档(文末 B 层引用)。会调 API ≠ 懂三式;但懂三式后,API 参数不再是魔法字符串。
7.5 排障决策树(读实现时用)
Section titled “7.5 排障决策树(读实现时用)”遇到「能 load、出图很糟」时,按三式逐项查,比盲目改学习率有效:
-
第一式 / 调度是否一致?
训练用的 或 日程,与推理 scheduler 配置是否同一家族?数据是否仍在 等约定范围? -
第二式 / 参数化是否一致?
权重是 还是 ?损失是否按同一标签算?条件 dropout 概率是否与 CFG 用法匹配? -
第三式 / 采样是否在合理区?
NFE 是否过低?CFG 是否过大?是否该换 solver 而不是加噪声强度? -
库层
torch_dtype、设备、VAE 缩放(隐空间模型)、安全 checker 是否误伤——这些不属于三式,但常被误诊成「扩散坏了」。
把问题标到 ①②③ 哪一层,你就知道该读 paper 的哪一节、该改 Diffusers 的哪一个对象。
7.6 一张「改动影响面」表
Section titled “7.6 一张「改动影响面」表”| 你改的东西 | 主要冲击 | 通常要不要重训 |
|---|---|---|
| 采样步数 NFE | 第三式 | 否 |
| scheduler 类型 | 第三式(有时假设参数化) | 否(同参数化族内) |
| CFG | 第三式 + 条件 | 否(但训练需支持无条件分支) |
| 日程 / 噪声轴 | 第一式 + 第二式标签语义 | 要 |
| 第二式 + 第三式换算 | 要(或官方转换流程) | |
| 主干 U-Net→DiT | 第二式容量 | 要 |
| 像素→隐空间 | 第一式作用域 | 要(LDM 路线) |
7.7 口试级串讲稿(约三分钟)
Section titled “7.7 口试级串讲稿(约三分钟)”你可以按下面顺序向别人(或向未来的自己)口述本章:
「DDPM 把生成拆成加噪与去噪。加噪用高斯链,任意时刻有闭式,所以训练不用真的滚很多步。训练时随机抽时刻,让网络猜加进去的噪声,损失是均方误差。生成时从纯噪声出发,反复问网络并按求解器更新状态。训练步数和采样步数不是一回事;换 DDIM 或 DPM-Solver 常常不用重训。参数化、调度和采样公式必须同一套约定。排障时先分清是调度问题、预测目标问题还是采样超参问题。」
若你能不看稿讲清以上每一句对应哪一式,本章的知识目标就达成了。细节公式可以查笔记,坐标系应留在脑子里。
7.8 与 Score SDE 的接口句(超前预习)
Section titled “7.8 与 Score SDE 的接口句(超前预习)”当你在第 5 章或论文里遇到 score 时,先记住三句接口话:
- 在高斯扩散里,score 与噪声残差常有解析关系;
- 因此「预测 」和「预测 score」往往是同一枚硬币的两面;
- SDE/ODE 采样器是第三式在连续时间语言下的亲戚。
入门阶段不必展开 Fokker–Planck;把这三句当作以后读 Song 等人工作的门牌号即可。等你真要改连续时间实现时,再回填数学细节。
7.9 从「会背三式」到「会改一行配置」
Section titled “7.9 从「会背三式」到「会改一行配置」”对照下面三列,检查自己处在哪一层:
| 层级 | 你会什么 | 还缺什么 |
|---|---|---|
| L0 名词 | 听说过 DDPM、DDIM | 分不清训练与采样 |
| L1 公式 | 能写闭式与 ε 损失 | 不会映射到代码字段 |
| L2 组件 | 知道调度/参数化/求解器可换 | 不会做平台期与日志 |
| L3 排障 | 能把坏图标到 ①②③ | 需要第 9 章真实验巩固 |
本章目标是把你从 L0/L1 推到 L2,并摸到 L3 的门槛。若你已经能独立完成 §9 练习 E 与 §10.1 代码对照,可以进入第 6 章系统旋钮,而不必在本章无限加长证明。
8. 常见误区(社群观察 + 权威纠正)
Section titled “8. 常见误区(社群观察 + 权威纠正)”下列误区来自中文教程与工程讨论中的高频混淆;纠正以 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 论文;社区数字只当搜索起点。
9. 练习与自检
Section titled “9. 练习与自检”练习 A(闭式)
Section titled “练习 A(闭式)”设某 有 。若 某像素为 ,(一维示意),计算 。
再令 ,描述 的极限行为。
参考答案要点
,,
。
当 ,,与 无关,即高噪声端。
练习 B(训练)
Section titled “练习 B(训练)”用语言说明:为什么一个 batch 里不同样本可以抽不同的 ?这对网络容量提出了什么要求?
参考答案要点
各样本损失项独立,只依赖自身 ; 嵌入区分难度。网络需在同一套参数下覆盖低噪声精修与高噪声构型,故需要足够的多尺度/全局建模能力。
练习 C(采样)
Section titled “练习 C(采样)”同一训练好的 ,比较:
(1)1000 步 DDPM 祖先采样;
(2)50 步 DDIM ;
(3)20 步 DPM-Solver。
你预期在速度、多样性、可复现性上如何排序?哪些预期必须用实验验证(放到第 9 章)?
参考答案要点
速度:(3)≳(2)≫(1)。可复现性:(2)通常最好(确定性)。多样性:带随机性的(1)往往更强,但与数据/CFG 耦合。画质排序不能先验钉死,必须固定提示与种子做消融。
练习 D(参数化)
Section titled “练习 D(参数化)”若 checkpoint 标明 v_prediction,你却按 ε 更新公式采样,可能出现什么现象?应如何排查?
参考答案要点
常见现象:色彩崩坏、结构撕裂、全噪/全灰、或「有轮廓但一塌糊涂」。排查:读模型卡/model_index.json 的 prediction_type;确认 scheduler 配置一致;用官方 pipeline 默认采样作对照。
练习 E(排障分层)
Section titled “练习 E(排障分层)”现象:同一提示,步数从 20 提到 50,几乎不变差也不变好;把 CFG 从 3 提到 15,迅速过饱和。
请判断主要矛盾更可能在第二式还是第三式?你下一步改什么?
参考答案要点
步数已进入平台期 → 第三式 NFE 饱和;过饱和随 CFG 出现 → 第三式引导过强(或提示本身冲突)。下一步:降 CFG、改提示,而不是继续加步;若仍结构错误,再查 VAE/参数化(第二式/表示)。
- 能默写闭式与 ε 损失
- 能做 §4.2.1 类数值心算
- 能说明 必须与采样一致
- 能画训练/采样分家图
- 能列举 ≥3 个采样组件旋钮
- 能按 §7.5 把 bug 标到 ①②③ 层
- 能纠正 §8 中至少 5 个误区
练习 F(写给自己的检查单)
Section titled “练习 F(写给自己的检查单)”打开任意一个你最近用过的生成脚本或网页 UI,回答:
- 它的噪声轴是离散 还是连续 ?
- 网络预测的是 、 还是 ?你依据什么文件/配置得出?
- 默认采样步数是多少?你有没有扫过 10/20/30/50 的平台期?
- 若有 CFG,训练侧是否可能做了条件 dropout?
- 若结果异常,你准备先查 ①②③ 哪一层?下一步改哪个字段?
把答案写进笔记。这比再刷一篇「扩散详解」更接近真学会。
10. 与系列其他页的关系
Section titled “10. 与系列其他页的关系”| 页面 | 关系 |
|---|---|
| 指南(课程地图) | 本章是主干必修 |
| 第 2 章 前向/反向 | 更偏过程直觉;本章给公式与组件 |
| 第 4 章 vs GAN/VAE | 用「回归目标 vs 对抗」对照本章第二式 |
| 第 5 章 机制族 | 三式骨架上换前向/状态空间 |
| 第 6 章 旋钮 | 调度、CFG、NFE 系统实验设计 |
| 第 9 章 Diffusers | 把第三式旋钮落到可运行消融 |
| 导航页 | 查模型与文献表,不重复抄清单 |
| 隐空间扩散深入 | 第一式改在 latent 上时的设计原则 |
| Stable Diffusion 专文 | UNet→DiT→MM-DiT、ControlNet、SD1→FLUX 工程谱系(不是本章加长版) |
学习顺序建议:第 2 章(若尚未读)→ 本章 → 第 6 章 → 第 9 章;要读 SD 产品线时再进 SD 专文;机制与生物在 5、8 章。
10.1 读完本章后,你在代码仓库里该看哪些文件
Section titled “10.1 读完本章后,你在代码仓库里该看哪些文件”以开源扩散仓库或 Diffusers 为例(名称因项目而异):
| 你想核对的三式部件 | 常见代码位置 |
|---|---|
| 闭式加噪 / | scheduler.add_noise、训练脚本里的 noise_scheduler |
| ε 损失 | training_step 中 noise/target 的构造与 F.mse_loss |
| 参数化 | prediction_type、get_velocity 一类工具函数 |
| 采样循环 | pipeline.__call__ 内的 timestep 循环 |
| CFG | 同循环内 noise_pred_uncond 与 noise_pred_text 的组合 |
对照阅读时,把每一行标成 ①②③ 之一:你会对「库为什么这么写」突然顺很多。这是本章存在的最终目的——给后续所有章与所有库一个共同坐标系。
10.2 一张「一周自学」时间表(可改)
Section titled “10.2 一张「一周自学」时间表(可改)”假设你每天能投入 1.5–2 小时:
| 日 | 任务 | 验收 |
|---|---|---|
| Day 1 | 读 §1–§4,做 §4.2.1 数值与 §4.4.2 前向可视化 | 能默写闭式,能解释 SNR |
| Day 2 | 读 §5,对照一份训练脚本的 loss 构造 | 能指出 与标签 |
| Day 3 | 读 §6–§7,画训练/采样分家图 + 排障树 | 能说明 NFE≠T |
| Day 4 | 读 §8–§9,做练习 A–E(可只写要点) | 误区能纠正 ≥5 条 |
| Day 5 | 打开 Diffusers 文档,把 num_inference_steps/guidance_scale 映射回第三式 | 为第 9 章实验写好日志字段 |
不必严格按日;但若你跳过 Day 1–2 直接调 API,后面排障成本通常更高。
10.3 与「只背公式」路线的对比
Section titled “10.3 与「只背公式」路线的对比”| 路线 | 短期 | 三个月后 |
|---|---|---|
| 只背三式符号 | 考试能写 | 换库就懵 |
| 只跟 Diffusers demo | 出图快 | 改不动参数化 |
| 本章:符号 + 组件 + 误区 + 代码坐标 | 稍慢 | 能读 paper 与源码 |
系列选择第三条路。你现在读的就是坐标系,不是终点。
11. FAQ
Section titled “11. FAQ”训练时为什么可以随机抽 而不逐步加噪?
高斯前向下存在闭式 ,任意 可一步得到带噪样本。逐步加噪是定义,不是训练循环的必需实现。
网络一定要预测噪声 ε 吗?
不必。、、 等参数化常可互推;必须与采样公式和 checkpoint 约定一致。
训练 是否意味着采样也必须 1000 步?
不必须。DDIM、DPM-Solver 等可在更少 NFE 上工作;训练网格 ≠ 采样步数。
本章要自己训练一个大模型吗?
不要。本章建立三式与旋钮语言;加载、步数与 CFG 消融在第 9 章。
只看 Diffusers 教程能不能跳过本章?
能跑 demo,但难以改参数化、读懂 scheduler 源码或排查「训练/推理配置不一致」。三式是读实现的坐标系。
闭式加噪是否意味着前向「没有随机性」?
不是。闭式里仍然抽样 ;随机性在 ,不在「逐步累加」的路径实现上。固定 时, 对 是确定函数。
为什么有的代码用 continuous time ,有的用整数 0…1000?
这是噪声轴的离散化选择。Score SDE / Flow Matching / 部分现代实现偏连续;经典 DDPM 偏整数网格。两者可通过调度函数互译,但混用时必须做显式换算,不能把整数 直接塞进期望 的网络嵌入。
本章公式与某篇中文博客不一致怎么办?
以原论文与你使用的官方实现为准。中文材料适合建立直觉与误区清单(C 层),硬系数以 A/B 层核对。系列 social-digest 也按这个优先级写。
12. 说明与限制
Section titled “12. 说明与限制”- 公式采用 DDPM 常用记号;不同论文对 、 定义可能差一个变换,读实现时以该仓库为准。
- 具体最优超参随数据、分辨率、库版本变化;本文给的是机制与调试方向,不是固定「最佳数字」。
- 社群经验(如某 CFG 区间)仅作起点,须用 A/B 层定义与你自己的验证覆盖。
- 不提供医疗或实验操作建议。
review_status在发布前须人工终审。
12.1 本章边界再强调一次
Section titled “12.1 本章边界再强调一次”| 本章做 | 本章不做 |
|---|---|
| DDPM 三式组件级精讲 | 完整 SDE 证明与测度论 |
| 误区纠正与练习 | 30+ 模型清单(导航页) |
| 为 Diffusers 建立坐标系 | 端到端可运行大实验(第 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
主题色
字体
字号
视觉效果
即将离开本站
你将前往外部网站:
该网站与本站无关,本站不对其内容、安全性或可用性负责。确定后将在新标签页打开。