DDPM、DDIM、Euler 等 Scheduler 有什么区别?
简化版
Scheduler 决定扩散模型如何从当前噪声状态走到下一步。模型负责预测噪声、速度或干净样本,Scheduler 则把预测值代入更新方程;同一模型换 Scheduler,速度、随机性、细节和稳定性都可能变化。
DDPM 是随机的祖先采样,步骤多但与原始训练过程一致;DDIM 可以使用确定性路径,较少步骤也能得到稳定结果;Euler 把生成过程看成常微分方程,用一阶数值方法沿 sigma 轨迹积分。DPM-Solver 等高阶方法用更复杂近似减少函数评估次数。
Scheduler 不是“画风滤镜”。它是逆扩散方程的数值求解器,前提是噪声参数化、时间步和模型输入缩放完全匹配。
详细版
一次采样可抽象为:
model_output = model(x_t, t, condition)
x_{next} = scheduler.step(model_output, t, x_t, random_noise)
DDPM 更新中通常保留后验方差噪声,所以相同初始状态也可能因每步随机量不同而变化。DDIM 引入参数 η:η=0 时路径可确定,η>0 时重新加入随机性。Euler 系列常在 sigma 空间处理:
d = (x - x0_pred) / σ
x_next = x + d × (σ_next - σ)
| 方法 | 随机性 | 阶数/性质 | 典型步数 | 适合场景 |
|---|---|---|---|---|
| DDPM | 每步随机 | 祖先采样 | 数百到上千 | 理论基线、强调多样性 |
| DDIM | η 可控 | 非马尔可夫路径 | 20~100 | 可复现编辑、快速基线 |
| Euler | 可确定 | 一阶 ODE | 20~50 | 通用、直观、稳定 |
| Euler Ancestral | 有额外噪声 | 一阶祖先采样 | 20~50 | 希望增加纹理与变化 |
| DPM-Solver++ | 通常确定 | 高阶求解 | 10~30 | 低步数高质量 |
例如 20 步采样不等于所有方法都调用模型 20 次:二阶方法可能在某些更新中需要额外评估。比较速度应使用 NFE(模型函数评估次数)和真实延迟,而不只看 UI 中的 steps。
完整版教学
1. 模型与 Scheduler 的职责边界
去噪网络学习一个局部方向,例如预测 ε、v 或 x0。它通常不会自己决定完整的积分轨迹。Scheduler 保存噪声网格、时间步映射和更新公式,把网络输出转换为下一个样本。
初始噪声 x_T
-> Scheduler 选 t 与缩放输入
-> 网络预测 model_output
-> Scheduler 换算 x0 / ε / derivative
-> 更新到 x_{t-1}
-> 重复直到 x_0
这解释了为什么训练权重不变,换 Scheduler 仍会改变结果。
2. DDPM 为什么是随机祖先采样
DDPM 学习逆向条件分布 pθ(x_{t-1}|x_t),每一步从高斯后验采样:
x_{t-1} = μθ(x_t, t) + σ_t z
z ~ N(0, I), t > 0
随机项帮助覆盖数据分布,但误差要经过很多小步逐渐修正。原始配置常使用 1000 步,直接用于交互式生成成本较高。
3. DDIM 如何构造确定性路径
DDIM 使用与 DDPM 相同的边缘分布训练目标,却选择另一条逆向路径。其更新可写成“预测干净样本 + 指向噪声方向 + 可选随机项”。参数 η 控制随机项强度。
当 η=0,给定相同初始 latent、条件和数值环境,路径理论上确定。这对图像反演、局部编辑和 A/B 对比很有价值,因为变更来源更容易定位。
4. Euler 为什么属于数值积分思路
概率流 ODE 或等价 sigma 参数化把生成看成连续轨迹。Euler 方法用当前位置的导数近似整个小区间:
x(σ_next) ≈ x(σ) + f(x, σ) × Δσ
它是一阶方法,单步便宜、实现透明,但网格太稀时局部截断误差会累积。Euler Ancestral 在更新中额外注入噪声,通常带来更多纹理变化,也降低完全可复现的确定性。
5. 高阶采样器为什么能减少步数
Heun、LMS、DPM-Solver 等方法会利用多个导数、历史导数或针对扩散方程的解析结构,获得更高阶近似。相同步长下误差可能更低,因此常能在 10~30 步得到可用结果。
但“高阶”不保证任何设置下都更好。强 CFG 会让向量场更僵硬,模型预测误差也不是纯数值误差;极低步数时,噪声网格选择甚至比求解器阶数更重要。
6. Karras Sigma 与时间步间距的作用
采样器不仅包含更新公式,还包含在哪里取点。Karras 类 sigma 网格会重新分配噪声层级,让更多步落在对视觉质量更敏感的区域。
假设从 σ_max=14 走到 σ_min=0.03,20 个点在线性 sigma、对数 sigma 和 Karras 网格中的位置完全不同。即便都标记为 Euler 20 steps,实际任务难度分配也会不同。
比较 Scheduler 时,要同时固定模型、Prompt、种子、CFG、步数、sigma 网格和预测目标;否则无法把差异归因到更新算法。
7. Prediction Type 与输入缩放必须一致
Scheduler 需要知道网络输出表示什么:
| prediction_type | 网络输出 | Scheduler 的工作 |
|---|---|---|
| epsilon | 噪声 ε | 从 x_t 和 ε 还原 x0 |
| sample | 干净样本 x0 | 直接构造下一步方向 |
| v_prediction | 速度 v | 用 α、σ 换算 x0 与 ε |
某些 Scheduler 还要求 scale_model_input(x, t)。漏掉缩放或缩放两次,会导致网络输入幅度偏离训练分布。代码能运行不代表数学上兼容。
8. 如何公平比较速度与质量
应记录 NFE,而不仅是步数。例如方法 A 的 20 步每步调用一次网络,NFE=20;方法 B 的 15 步有 10 步调用两次,NFE=25,实际可能更慢。
评测可以固定 500 个 Prompt 和种子,记录:
CLIP / 人工偏好 / FID
构图失败率 / 手部失败率 / 文本渲染失败率
平均与 P95 延迟
峰值显存
每张图 NFE 与能耗
同时分别测试 10、20、30、50 步,画出质量—延迟前沿,避免只报告一个有利点。
9. 工程上常见的 Scheduler 错配
最常见问题不是算法本身,而是配置组合错误:
模型 prediction_type
-> 训练 noise schedule / alphas_cumprod
-> 推理 timestep 或 sigma 序列
-> model input scaling
-> step() 更新与随机数生成器
还要注意 steps_offset、是否包含终点、时间步去重和最后一步 sigma。排错时可用固定小 Tensor,对每一步的 t、σ、输入均值和输出均值做快照测试。
10. 怎样为业务选 Scheduler
交互式文生图通常优先低延迟与稳定质量,可从 DPM-Solver++ 或 Euler 20~30 步起测;需要可复现编辑时可选 η=0 的 DDIM;探索多样性可测试祖先采样;科学复现则应严格使用论文原配置。
选型最终由质量—延迟曲线决定,而不是社区流行名称。不同基础模型、LoRA、分辨率和 CFG 下都应保留回归集。
11. 常见误区与追问
- 误区:采样步数越多,质量一定越高。 超过有效区间后收益趋平,某些求解器还可能因误差累积变差。
- 误区:相同种子一定生成相同图片。 Scheduler 随机项、设备算子、精度和实现版本都会影响结果。
- 误区:DDIM 就是 DDPM 的简单跳步。 DDIM 定义了不同的非马尔可夫逆向路径,并用 η 控制随机性。
- 误区:高阶 Solver 一定比 Euler 快。 应比较 NFE 与真实延迟,高阶步骤可能需要额外网络调用。
- 误区:Scheduler 可以脱离训练配置随意更换。 Prediction Type、噪声曲线和输入缩放必须兼容。
- 追问:为什么 Euler A 比 Euler 更有随机感? Ancestral 更新会在部分去噪后重新加入匹配方差的噪声。
- 追问:低步数失败先查什么? 先查 sigma 网格、prediction_type、输入缩放和 CFG,再比较求解器。
12. 加强记忆
- 模型给方向,Scheduler 走路径。
- DDPM 随机且步多,DDIM 的 η 控制随机性。
- Euler 是一阶积分,高阶 Solver 用更多信息降低离散误差。
- 步数不等于 NFE,速度看真实网络调用和延迟。
- 公式、噪声网格、预测目标、输入缩放必须成套匹配。