跳转到内容

扩散模型教程第3章:DDPM 三式精讲

本章是系列第 3 章:只深挖 DDPM 三式坐标系(闭式加噪 / ε 损失 / 采样),不讲 SD 代际与 ControlNet 工程史。
分工:产品线架构见 Stable Diffusion 架构与演进;隐空间设计见 隐空间扩散深入;模型清单见 扩散模型导航
系列内:前向/反向直觉见第 2 章;旋钮总表见第 6 章;可运行采样见 第 9 章 Diffusers 实验课(正文后续)。

学完本章,你应能在不看笔记的情况下完成下列自检:

  1. 写出闭式加噪公式,并说明 αˉt\bar\alpha_t 变小时 xtx_t 发生了什么。
  2. 写出 ε-prediction 训练目标,解释「随机抽 tt」为何合法。
  3. 说明训练步数 TT 与采样 NFE 不是一回事,并举出至少一种少步采样替换。
  4. 对「调度 / 预测参数化 / 求解器」各举一个「怎么调 → 会怎样」的例子。
  5. 指出至少两个常见误区,并能用论文级说法纠正。

字数定位:单章深讲(约 8500–12000 汉字)。在本章训练大模型;抄导航页模型大全。


符号含义
x0x_0干净数据样本(图像、隐变量等)
xtx_t时刻 tt 的带噪样本
TT离散扩散最大步数(训练常用网格,如 1000)
βt\beta_ttt 步噪声方差调度(或等价参数)
αt=1βt\alpha_t=1-\beta_t单步信号保留系数
αˉt=s=1tαs\bar\alpha_t=\prod_{s=1}^{t}\alpha_s累积信号系数
ϵN(0,I)\epsilon\sim\mathcal{N}(0,I)标准高斯噪声
ϵθ(xt,t)\epsilon_\theta(x_t,t)θ\theta 参数化的噪声预测网络
NFENumber of Function Evaluations,采样时网络前向次数

问题设定(DDPM 经典离散时间高斯扩散)
数据在欧氏空间 Rd\mathbb{R}^d 上。前向过程按预设调度逐步混入高斯噪声,使 xTx_T 近似标准正态;反向过程用神经网络学习如何从 xtx_t 退到 xt1x_{t-1},从而从纯噪声生成新样本。

Ho, Jain, Abbeel(2020)的关键工程贡献之一,是把繁琐变分目标简化成预测噪声的均方误差,使训练像回归一样稳,扩散才真正好用。出处见文末 DDPM 条目。

在更早的非平衡热力学表述(Sohl-Dickstein 等,2015)里,「加噪—去噪」思想已经出现;DDPM 的历史地位在于把目标与实现简化到工业可复现。你读本章时,把 2015 当作思想源头、把 2020 当作工程引爆点即可,不必在入门阶段陷入全部历史细节。


3. 总览:训练与采样为何必须分家

Section titled “3. 总览:训练与采样为何必须分家”

很多人第一次读论文会把「加噪 TT 步、去噪 TT 步」理解成训练循环也必须滚完整条链。真正实现里是两套逻辑:

训练采样(生成)
输入数据集中的 x0x_0随机噪声 xTx_T
时间均匀(或加权)随机抽 ttTT 走到 00(可跳步)
前向闭式一次得到 xtx_t通常不跑前向
网络用途回归 ϵ\epsilon(或 x0x_0/vv提供每步去噪方向
优化梯度下降最小化损失无梯度,只推理
训练 vs 采样

记住这句就够入门:前向定义「噪声有多脏」;损失教网络「在该脏度下如何指回数据」;采样器决定「用多少步、是否随机、如何跳」把局部预测积成整条轨迹。

把三式讲成故事,便于记忆:

  1. 出题人(第一式)
    从真实数据里拿一张图,按日程表洒上已知强度的沙,得到考题 xtx_t。出题人知道沙是哪一把(ϵ\epsilon),也知道洒了多狠(ttσ\sigma)。

  2. 考生(第二式)
    网络只能看到 xtx_t 和「有多脏」的提示,要猜沙长什么样。猜错了按像素/通道算均方惩罚。日复一日,考生在各种脏度上考试。

  3. 作家(第三式)
    创作时不再有真实图。作家从纯沙开始,反复问考生「现在这堆沙里噪声大概长啥样」,按求解器规则一点点抹掉,直到纸上出现新图。作家可以问得勤一点(多步)或跳着问(少步),也可以在有提示词时更听提示(CFG)。

故事的好处是分清角色:出题人不用训练,考生要训练,作家是推理算法。 很多实现 bug 都是三角色串台——比如作家用的抹法与考生训练时的评分标准不一致。

3.2 和「自回归一步生成」差在哪

Section titled “3.2 和「自回归一步生成」差在哪”

自回归语言模型一次预测下一个 token;扩散在状态空间上做迭代精炼。代价是多次网络前向(NFE);收益是:

  • 可以在连续向量、图像网格、坐标、隐变量上工作;
  • 条件注入与引导手段成熟;
  • 训练目标局部、稳定。

理解这一点,有助于你在第 5 章看到离散扩散、在第 8 章看到蛋白骨架扩散时,不觉得「怎么又是另一套东西」——骨架仍是「加扰 → 学逆过程 → 迭代采样」。


不必把照片真的加噪 500 次才得到「第 500 步的雪花图」。在高斯线性加噪设定下,任意时刻的 xtx_t 都可以写成:

原图缩一点 + 一团已知强度的高斯噪声。

训练时,随机选一个「脏度」tt,直接造出对应的 xtx_t,让网络学习。

单步前向(马尔可夫核):

q(xtxt1)=N(xt;1βtxt1,βtI)q(x_t\mid x_{t-1})=\mathcal{N}\big(x_t;\sqrt{1-\beta_t}\,x_{t-1},\,\beta_t I\big)

对高斯链做边缘化后,得到任意 tt 的闭式(DDPM 记号):

xt=αˉtx0+1αˉtϵ,ϵN(0,I)x_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\epsilon,\qquad \epsilon\sim\mathcal{N}(0,I)

其中 αt=1βt\alpha_t=1-\beta_tαˉt=s=1tαs\bar\alpha_t=\prod_{s=1}^{t}\alpha_s
tt 增大时 αˉt\bar\alpha_t 变小:信号系数 αˉt\sqrt{\bar\alpha_t} 下降,噪声系数 1αˉt\sqrt{1-\bar\alpha_t} 上升,直到 xTx_T 接近纯噪声。

4.2.1 一维数值例子(把符号变成数)

Section titled “4.2.1 一维数值例子(把符号变成数)”

设某一维「像素」x0=0.8x_0=0.8,某时刻 αˉt=0.49\bar\alpha_t=0.49(则 αˉt=0.7\sqrt{\bar\alpha_t}=0.71αˉt=0.510.714\sqrt{1-\bar\alpha_t}=\sqrt{0.51}\approx 0.714),并抽到 ϵ=0.5\epsilon=0.5

xt0.7×0.8+0.714×0.5=0.56+0.357=0.917x_t \approx 0.7\times 0.8 + 0.714\times 0.5 = 0.56 + 0.357 = 0.917

同一 x0x_0、同一 ϵ\epsilon,若换成更晚的时刻使 αˉt=0.01\bar\alpha_t=0.01,则 αˉt=0.1\sqrt{\bar\alpha_t}=0.11αˉt0.995\sqrt{1-\bar\alpha_t}\approx 0.995

xt0.1×0.8+0.995×0.5=0.08+0.4975=0.5775x_t \approx 0.1\times 0.8 + 0.995\times 0.5 = 0.08 + 0.4975 = 0.5775

你应看到两件事:

  1. 信号被压扁x0x_0 前面的系数从 0.70.7 掉到 0.10.1,原图信息越来越弱。
  2. 噪声主导:后一项由 ϵ\epsilon 决定,高 ttxtx_t 更像噪声而不是数据。

训练时网络在低 tt 主要「擦细噪」,在高 tt 则要在几乎纯噪声里猜结构——这就是噪声课程(noise curriculum)的来源。

常把

SNR(t)=αˉt1αˉt\mathrm{SNR}(t)=\frac{\bar\alpha_t}{1-\bar\alpha_t}

当作「还有多少信号相对噪声」。SNR\mathrm{SNR} 大 → 图还比较干净;SNR\mathrm{SNR} 小 → 接近纯噪声。
后面凡是「加权损失」「连续噪声水平 σ\sigma」「EDM 预处理」,很多都是在重新标定 SNR 轴,而不是推翻闭式本身。读实现时先问:这个库的噪声轴是离散 tt 还是连续 σ\sigma?与 αˉt\bar\alpha_t 如何换算?

4.2.3 从单步核到闭式:你需要保留的推导骨架

Section titled “4.2.3 从单步核到闭式:你需要保留的推导骨架”

不必默写全部代数,但要能讲清逻辑链:

  1. 单步:xt=1βtxt1+βtϵtx_t=\sqrt{1-\beta_t}\,x_{t-1}+\sqrt{\beta_t}\,\epsilon_t
  2. 线性叠加高斯:多步之后 xtx_t 仍对 x0x_0 线性,且噪声项仍是高斯。
  3. 合并系数得到 αˉt\sqrt{\bar\alpha_t}1αˉt\sqrt{1-\bar\alpha_t}
  4. 因此 边缘 q(xtx0)q(x_t\mid x_0) 有闭式,训练可跳过中间 x1,,xt1x_1,\ldots,x_{t-1}

若有人问「为什么必须是高斯」,工程回答是:高斯对加法封闭,闭式漂亮;换离散状态或流形就要重做前向定义(第 5 章)。

  1. 可训练性
    若没有闭式,每次训练都要从 x0x_0tt 步,成本高、实现啰嗦。闭式把复杂度从 O(t)O(t) 降到 O(1)O(1)

  2. 目标清晰
    闭式把「任意噪声水平」参数化成连续脏度(离散网格上的 tt)。网络必须在所有脏度上学会去噪,而不是只会最后一步。

  3. 与采样衔接
    训练见过全范围 tt 后,采样器才能在轨迹的任意位置查询网络。

小组件作用常见选择怎么调现象(经验层)
{βt}\{\beta_t\} 形状噪声加多快linear;cosine(iDDPM)高分辨率/细节任务更常试 cosine 或连续噪声参数化过早把信号打没 → 后期难学;加噪太慢 → 高噪声区欠训练
TT训练离散网格经典约 1000与采样步数解耦理解TT 太小,单步变化太大;过大则算力与实现复杂
方差是否学习反向分布的 Σ\SigmaDDPM 固定;iDDPM 可学更在意 log-likelihood 时再开主要改善似然,FID 不一定总涨
数据预处理归一化、缩放[1,1][-1,1]与网络最后一层激活匹配尺度错会导致训练不稳定

iDDPM(Nichol & Dhariwal, 2021)在调度与学习方差上的改进,是「同一三式骨架上换组件」的早期范例。

4.4.1 linear 与 cosine 调度:怎么读曲线

Section titled “4.4.1 linear 与 cosine 调度:怎么读曲线”

不必死记公式系数,先建立图像:

  • linearβt\beta_ttt 近似线性爬升。实现简单,早期 DDPM 常用。缺点是某些分辨率下,中段 SNR 下降方式可能不够「匀速」,细节与结构的学习负担不均。
  • cosine(iDDPM 推广):让 αˉt\bar\alpha_ttt 更平滑地过渡,避免过早把信号打没,也避免长时间停在极低噪声。许多图像实验报告在似然或样本质量上更稳。

调参时不要同时随机改 TTβ\beta 端点、预测目标三件事。一次只动一类组件,否则你无法归因。

4.4.2 可视化前向:你自己就能做的最小实验(不必训练)

Section titled “4.4.2 可视化前向:你自己就能做的最小实验(不必训练)”

用任意一张小图(甚至随机张量当 x0x_0):

  1. 选定调度,预计算 αˉt\bar\alpha_t
  2. 固定一个 ϵ\epsilon,画出 t=0,T/4,T/2,3T/4,Tt=0, T/4, T/2, 3T/4, Txtx_t
  3. 再换一个 ϵ\epsilon,重复。

你应看到:同一 ϵ\epsilon 下结构随 tt 被噪声淹没的过程是平滑的;换 ϵ\epsilon 则「雪花纹理」变了。这能把闭式从纸面公式变成肌肉记忆。第 9 章会在 Diffusers 里做推理侧消融;这里的前向可视化甚至不需要 GPU。

替换方向代表换的是什么
连续时间 SDEScore SDE(Song 等)离散链 → VE/VP 等连续噪声过程
设计空间重参数EDM(Karras 等)不以 βt\beta_t 表为中心,而用噪声尺度与预处理
非高斯前向D3PM 等离散扩散高斯 → 类别转移矩阵(序列/图标签)
隐空间前向LDM先对 x0x_0 编码再扩散,算力结构变了

本章仍以 DDPM 高斯闭式为主;离散与等变前向在第 5 章展开。

闭式加噪回答的是:「脏成什么样」可以闭式点名。 它不训练网络,但定义了网络要在哪些脏度上考试。


5. 第二式:训练目标——让网络认出噪声

Section titled “5. 第二式:训练目标——让网络认出噪声”

随机抽一个 tt,用第一式造 xtx_t。此时你知道刚才用的真实 ϵ\epsilon。让网络看着 xtx_ttt,猜这个 ϵ\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(xt1αˉ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

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

Section titled “5.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 的全局注意力,都是在给这种多难度课程提供表示能力;换主干不改变第二式,只改变「谁来答题」。

5.3.2 ε、x0x_0vv:同一事实的三种写法

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

由闭式:

ϵ=xtαˉtx01αˉt,x0=xt1αˉ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αˉtx0v=\sqrt{\bar\alpha_t}\,\epsilon-\sqrt{1-\bar\alpha_t}\,x_0

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

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

硬规则:checkpoint 写 epsilon / v_prediction / sample 时,训练标签与 scheduler 更新必须同一套。只改网络头或只改采样一侧,是最常见的「能跑但全花」来源。

5.3.3 条件生成时第二式多了什么

Section titled “5.3.3 条件生成时第二式多了什么”

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

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

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

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

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

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

5.4.1 时刻嵌入与「网络是否知道有多脏」

Section titled “5.4.1 时刻嵌入与「网络是否知道有多脏」”

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

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

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

健康训练常见现象:

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

不健康信号:

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

第二式优化成功 不等于 第三式展示成功——这是误区 7 的根源。

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

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

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


6. 第三式:反向采样——从噪声退回样本

Section titled “6. 第三式:反向采样——从噪声退回样本”

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

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

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

xt1=μθ(xt,t)+σtz,zN(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)。

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

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

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

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

其中 KTK\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 章;这里只需知道:第三式上还可以乘「条件引导」层。

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

Section titled “6.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 等变、离散状态的更新规则不同,但「网络局部预测 + 迭代更新」同构。

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

6.8 把第三式写进实验日志的最小字段

Section titled “6.8 把第三式写进实验日志的最小字段”

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

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

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


三式数据流
一句话职责不负责的事
① 闭式加噪点名任意脏度的 xtx_t不更新网络参数
② ε 损失在脏度 tt 上监督学习不直接输出最终作品展示策略
③ 采样推理轨迹不重新定义训练集
重复:
从数据集取 x0
采样 t ~ 均匀{1..T}(或加权)
采样 ε ~ N(0, I)
用闭式构造 xt = sqrt(ᾱ_t) x0 + sqrt(1-ᾱ_t) ε
预测 ε̂ = εθ(xt, t)
损失 = ||ε - ε̂||²
反向传播更新 θ
xT ~ N(0, I)
for t = T, T-1, ..., 1: # 或子序列时刻
用 εθ(xt, t) 估计噪声或 x0
按所选求解器更新 xt-1
返回 x0

7.4 与 Diffusers 的对应(预习第 9 章)

Section titled “7.4 与 Diffusers 的对应(预习第 9 章)”
概念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 路线)

你可以按下面顺序向别人(或向未来的自己)口述本章:

「DDPM 把生成拆成加噪与去噪。加噪用高斯链,任意时刻有闭式,所以训练不用真的滚很多步。训练时随机抽时刻,让网络猜加进去的噪声,损失是均方误差。生成时从纯噪声出发,反复问网络并按求解器更新状态。训练步数和采样步数不是一回事;换 DDIM 或 DPM-Solver 常常不用重训。参数化、调度和采样公式必须同一套约定。排障时先分清是调度问题、预测目标问题还是采样超参问题。」

若你能不看稿讲清以上每一句对应哪一式,本章的知识目标就达成了。细节公式可以查笔记,坐标系应留在脑子里。

7.8 与 Score SDE 的接口句(超前预习)

Section titled “7.8 与 Score SDE 的接口句(超前预习)”

当你在第 5 章或论文里遇到 score xlogpt(x)\nabla_x\log p_t(x) 时,先记住三句接口话:

  1. 在高斯扩散里,score 与噪声残差常有解析关系;
  2. 因此「预测 ϵ\epsilon」和「预测 score」往往是同一枚硬币的两面;
  3. 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:训练必须逐步加噪 tt

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

错因:把前向定义过程当成训练实现。
纠正:高斯设定下用闭式 q(xtx0)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 论文;社区数字只当搜索起点。


设某 ttαˉt=0.5\bar\alpha_t=0.5。若 x0x_0 某像素为 0.80.8ϵ=0.2\epsilon=0.2(一维示意),计算 xtx_t
再令 αˉt0\bar\alpha_t\to 0,描述 xtx_t 的极限行为。

参考答案要点
αˉt=0.50.707\sqrt{\bar\alpha_t}=\sqrt{0.5}\approx 0.7071αˉt=0.50.707\sqrt{1-\bar\alpha_t}=\sqrt{0.5}\approx 0.707
xt0.707×0.8+0.707×0.20.566+0.141=0.707x_t\approx 0.707\times 0.8+0.707\times 0.2\approx 0.566+0.141=0.707
αˉt0\bar\alpha_t\to 0xtϵx_t\to \epsilon,与 x0x_0 无关,即高噪声端。

用语言说明:为什么一个 batch 里不同样本可以抽不同的 tt?这对网络容量提出了什么要求?

参考答案要点
各样本损失项独立,只依赖自身 (xt,ϵ,t)(x_t,\epsilon,t)tt 嵌入区分难度。网络需在同一套参数下覆盖低噪声精修与高噪声构型,故需要足够的多尺度/全局建模能力。

同一训练好的 ϵθ\epsilon_\theta,比较:
(1)1000 步 DDPM 祖先采样;
(2)50 步 DDIM η=0\eta=0
(3)20 步 DPM-Solver。
你预期在速度、多样性、可复现性上如何排序?哪些预期必须用实验验证(放到第 9 章)?

参考答案要点
速度:(3)≳(2)≫(1)。可复现性:(2)通常最好(确定性)。多样性:带随机性的(1)往往更强,但与数据/CFG 耦合。画质排序不能先验钉死,必须固定提示与种子做消融。

若 checkpoint 标明 v_prediction,你却按 ε 更新公式采样,可能出现什么现象?应如何排查?

参考答案要点
常见现象:色彩崩坏、结构撕裂、全噪/全灰、或「有轮廓但一塌糊涂」。排查:读模型卡/model_index.jsonprediction_type;确认 scheduler 配置一致;用官方 pipeline 默认采样作对照。

现象:同一提示,步数从 20 提到 50,几乎不变差也不变好;把 CFG 从 3 提到 15,迅速过饱和。
请判断主要矛盾更可能在第二式还是第三式?你下一步改什么?

参考答案要点
步数已进入平台期 → 第三式 NFE 饱和;过饱和随 CFG 出现 → 第三式引导过强(或提示本身冲突)。下一步:降 CFG、改提示,而不是继续加步;若仍结构错误,再查 VAE/参数化(第二式/表示)。

  • 能默写闭式与 ε 损失
  • 能做 §4.2.1 类数值心算
  • 能说明 ϵ/x0/v\epsilon/x_0/v 必须与采样一致
  • 能画训练/采样分家图
  • 能列举 ≥3 个采样组件旋钮
  • 能按 §7.5 把 bug 标到 ①②③ 层
  • 能纠正 §8 中至少 5 个误区

打开任意一个你最近用过的生成脚本或网页 UI,回答:

  1. 它的噪声轴是离散 tt 还是连续 σ\sigma
  2. 网络预测的是 ϵ\epsilonx0x_0 还是 vv?你依据什么文件/配置得出?
  3. 默认采样步数是多少?你有没有扫过 10/20/30/50 的平台期?
  4. 若有 CFG,训练侧是否可能做了条件 dropout?
  5. 若结果异常,你准备先查 ①②③ 哪一层?下一步改哪个字段?

把答案写进笔记。这比再刷一篇「扩散详解」更接近真学会。


页面关系
指南(课程地图)本章是主干必修
第 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 为例(名称因项目而异):

你想核对的三式部件常见代码位置
闭式加噪 / αˉ\bar\alphascheduler.add_noise、训练脚本里的 noise_scheduler
ε 损失training_stepnoise/target 的构造与 F.mse_loss
参数化prediction_typeget_velocity 一类工具函数
采样循环pipeline.__call__ 内的 timestep 循环
CFG同循环内 noise_pred_uncondnoise_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 构造能指出 ϵ/x0/v\epsilon/x_0/v 与标签
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,后面排障成本通常更高。

路线短期三个月后
只背三式符号考试能写换库就懵
只跟 Diffusers demo出图快改不动参数化
本章:符号 + 组件 + 误区 + 代码坐标稍慢能读 paper 与源码

系列选择第三条路。你现在读的就是坐标系,不是终点。


训练时为什么可以随机抽 tt 而不逐步加噪?
高斯前向下存在闭式 q(xtx0)q(x_t\mid x_0),任意 tt 可一步得到带噪样本。逐步加噪是定义,不是训练循环的必需实现。

网络一定要预测噪声 ε 吗?
不必。ϵ\epsilonx0x_0vv 等参数化常可互推;必须与采样公式和 checkpoint 约定一致。

训练 T=1000T=1000 是否意味着采样也必须 1000 步?
不必须。DDIM、DPM-Solver 等可在更少 NFE 上工作;训练网格 ≠ 采样步数。

本章要自己训练一个大模型吗?
不要。本章建立三式与旋钮语言;加载、步数与 CFG 消融在第 9 章。

只看 Diffusers 教程能不能跳过本章?
能跑 demo,但难以改参数化、读懂 scheduler 源码或排查「训练/推理配置不一致」。三式是读实现的坐标系。

闭式加噪是否意味着前向「没有随机性」?
不是。闭式里仍然抽样 ϵN(0,I)\epsilon\sim\mathcal{N}(0,I);随机性在 ϵ\epsilon,不在「逐步累加」的路径实现上。固定 ϵ\epsilon 时,xtx_tx0x_0 是确定函数。

为什么有的代码用 continuous time t[0,1]t\in[0,1],有的用整数 0…1000?
这是噪声轴的离散化选择。Score SDE / Flow Matching / 部分现代实现偏连续;经典 DDPM 偏整数网格。两者可通过调度函数互译,但混用时必须做显式换算,不能把整数 tt 直接塞进期望 [0,1][0,1] 的网络嵌入。

本章公式与某篇中文博客不一致怎么办?
以原论文与你使用的官方实现为准。中文材料适合建立直觉与误区清单(C 层),硬系数以 A/B 层核对。系列 social-digest 也按这个优先级写。


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