DDIM — 把扩散模型 1000 步采样压到 50 步
是什么
DDIM(Denoising Diffusion Implicit Models,去噪扩散隐式模型)是 Stanford 的 Jiaming Song 等人在 2020 年提出的扩散采样方法。它解决一件具体的事:ddpm 出图要 1000 步,太慢了。DDIM 让你只跑 50 步就出几乎一样质量的图,而且不用重训模型。
日常类比:
ddpm 像爬一条 1000 级的楼梯下楼,每级都要踏实落脚。DDIM 发现这楼梯其实可以跳着下——隔 20 级踩一脚,落地一样稳,时间省 20 倍。更妙的是楼梯还是同一个楼梯,不用重新搭(不用重训权重)。
DDIM 是当今所有扩散图像/视频生成默认采样器的祖师爷——Stable Diffusion、DALL-E 2、Midjourney、Sora 用的 DPM-Solver、PLMS 等都是 DDIM 这一脉派生。
为什么重要
不理解 DDIM,下面这些事都解释不通:
- 为什么 Stable Diffusion 出一张图只要几秒——DDPM 原版要跑 1000 次神经网络前向,DDIM 把它压到 20-50 次
- 为什么 img2img / inpainting / 隐空间插值能做——DDPM 采样每步注入随机噪声,结果是不可逆的;DDIM 给了一条确定性的反向路径,让”编辑”成为可能
- 为什么扩散模型能和 score-based-2020 / 概率流 ODE 视角统一——DDIM 的 sigma=0 极限就是 ODE 的 Euler 离散
- 为什么后来的 flow matching、rectified flow、consistency models 都把 DDIM 当基线——它是第一条把扩散从”随机过程”开向”确定性 ODE”的路
核心要点
DDIM 的三个洞察,按重要性排:
-
训练目标只看边缘分布,不看路径。ddpm 训练让神经网络学
q(x_t | x_0)这个边缘分布上的去噪。这个边缘分布并不强制反向过程必须 Markov——只要边缘对,反向怎么走都行。这是整篇文章的钥匙。 -
构造非 Markov 反向过程。论文把反向过程写成一族由参数 sigma 控制的高斯过程。sigma 取 DDPM 那个值时,退回 ddpm;sigma=0 时,反向变成完全确定——给同一个起点 x_T 永远出同一张图。这就是 DDIM。
-
可以跳步采样。因为反向不是 Markov,从 x_T 直接跳到 x_{t-k} 不需要中间每一步。论文实测 50 步质量逼近 1000 步,10 步还能用。
加一句关键事实:DDIM 不需要重训。它和 DDPM 共用同一组权重,只换采样器。
实践案例
案例 1:50 步 vs 1000 步质量对比
CIFAR-10 上 DDPM 1000 步 FID 约 3.17。DDIM 50 步 FID 约 4.67,100 步约 4.04,几乎追平。CelebA 64×64 上 DDIM 100 步 FID 约 6.53,1000 步 DDPM 约 3.26。代价小、收益大,是 2020 年扩散模型上线生产的关键一步。
直观感受一下数量级:原版 DDPM 出一张 256×256 图要 1000 次 U-Net 前向,A100 上约 30 秒。DDIM 50 步同质量约 1.5 秒。这不是”优化”,是数量级的差距,决定了扩散能不能进消费级产品。
案例 2:x_T 隐空间插值
确定性带来一个免费的好东西:插值。给两张猫图片 A、B,分别反向编码出对应的 x_T^A 和 x_T^B(DDIM 反向是确定的,可以从 x_0 反推 x_T)。然后做 spherical lerp(slerp,球面插值):
x_T = sin((1-t)*theta)/sin(theta) * x_T_A + sin(t*theta)/sin(theta) * x_T_B把 t 从 0 滑到 1,每个 t 解码一张图,得到 A 慢慢变成 B 的连续过渡。这就是后来所有扩散应用里”风格混合""语义滑块”的底层机制。在 GAN 时代这叫 latent walk,DDIM 把它免费送给了扩散模型。
案例 3:跳步采样的代码骨架
# DDPM: 1000 步全跑for t in reversed(range(1000)): x = ddpm_step(x, t)
# DDIM: 50 步等间隔steps = list(range(0, 1000, 20)) # [0, 20, 40, ..., 980]for i in reversed(range(len(steps))): t_now = steps[i] t_prev = steps[i-1] if i > 0 else -1 x = ddim_step(x, t_now, t_prev, eta=0.0) # eta=0 就是确定性 DDIMeta 参数控制 sigma 大小:eta=1 退回 DDPM,eta=0 是 DDIM,中间值混合。实践常用 eta=0 + 50 步。
每一步 ddim_step 内部做的事,用一句话总结:先用神经网络从 x_t 估出去噪后的 x_0_hat,再按公式把 x_0_hat 和 t_prev 时间点该有的噪声重新拼起来得到 x_{t_prev}。这种”先估终点再回退”的思路,比 DDPM 的”逐级走一步”在数学上更接近 ODE 求解器。
案例 4:DDIM 反演(inversion)
确定性还有一个反向用法:给一张真实图 x_0,反推它对应的 x_T。把 DDIM 公式倒着跑一遍即可,每步用神经网络估当前噪声然后加回去。这条 x_T 就成了这张图的”扩散种子”。改一下 prompt(在条件扩散里)再正向解码,就得到一张保留原图结构、改变内容的新图——这正是 img2img 和 prompt-to-prompt 编辑的底层机理。
踩过的坑
-
确定性导致多样性下降。eta=0 时同一个 x_T 永远出同一张图。要批量生成多样样本就采样不同的 x_T。如果要在确定路径上稍微注入随机性,取 eta=0.2 左右是常见折中。
-
子序列间隔影响低步数质量。论文比较了 linear(等间隔)和 quadratic(前密后疏)两种取法。步数低于 20 时 quadratic 明显更好,50 步以上两者差不多。Stable Diffusion 默认 quadratic。
-
DDIM 只改采样,不改训练。常见误解是以为 DDIM 是个新模型。其实它和 ddpm 共用权重——你拿 DDPM 训好的权重,换成 DDIM 采样器即可。这也是它能在生产里零成本替换的原因。
-
插值用 lerp(线性)会让范数缩水。x_T 是高斯白噪声,模长服从特定分布。中点做线性插值会把 ‖x_T‖ 拉小,落到分布外,解码质量崩。必须用 slerp(球面插值)保持范数。
-
Implicit 这个名字容易误导。论文叫 implicit probabilistic model 是因为它不写显式似然——只定义了一个生成器(确定性映射)。这跟 GAN 的 implicit 是同一种用法,跟编程里的 implicit 完全无关。
-
eta 不是越小越好。eta=0 在 50 步以上是甜点,但在低于 20 步时质量明显塌——确定性放大了离散误差。低步数下要么换 DPM-Solver 这类高阶求解器,要么稍微调高 eta 用随机性”抹平”离散化误差。
-
训练时仍按完整 1000 步加噪。常见误解:“既然采样只 50 步,能不能训练时也只用 50 步?“答案是不行——DDIM 的边缘分布对应 1000 步前向扩散,缩短前向会改变 q(x_t|x_0),模型学不到对的去噪函数。前向训练时间表不动,反向采样可跳——这是 DDIM 的边界。
适用 vs 不适用场景
适用:
- 已训好的扩散模型想加速推理(图像、视频、音频)——直接换 DDIM 采样器
- 需要确定性的任务:img2img、inpainting、视频帧间一致性、隐空间插值
- 把扩散接进 ODE 求解器(DPM-Solver、Heun、RK4)——sigma=0 时本质就是 ODE 离散化
不适用:
- 需要严格的概率密度估计(如似然评估)——DDIM 的”隐式”指它放弃了显式似然
- 步数压到极致(1-4 步)——这时要用 consistency-models 或蒸馏方法,DDIM 还是基于 ODE,几步内误差大
- 期望多样性高于一切——确定性会牺牲多样性,需要随机采样时仍要 eta>0
历史小故事(可跳过)
- 2015 年:Sohl-Dickstein 等人提出 diffusion probabilistic models,理论漂亮但效果差,几乎没人接。
- 2020 年 6 月:UC Berkeley 的 Ho 等人发 ddpm,把扩散做到图像 SOTA,但采样要 1000 步,慢得没法用。
- 2020 年 10 月:Stanford 的 Jiaming Song 等三人发 DDIM,距 DDPM 仅 4 个月。同期 Yang Song(同名不同人)的 score-based-2020 给出概率流 ODE 视角。两条线殊途同归。
- 2021-2022 年:DPM-Solver、PLMS、Heun 等高阶 ODE 求解器在 DDIM 之上把步数压到 10-20。
- 2022 年:Stable Diffusion 公开发布,默认采样器就是 DDIM 派生。整个生成式 AI 的产品化爆发,靠的就是这条加速路径。
- 2023 年:Consistency Models、Rectified Flow 把步数继续压到 1-4,但所有人都把 DDIM 当起点和参照系——它定义了”扩散加速”这个研究方向的基线。
学到什么
- 训练目标和采样路径可以解耦。这是 DDIM 最深的思想——不动权重,只换推理算法,性能涨 20 倍。后来很多工作(蒸馏、ODE 求解器、consistency)都是在这个发现上继续推。
- 随机过程 → 确定性 ODE 是一条值得走的路。一旦确定,编辑、插值、反演、和 ODE 工具链全部解锁。
- 第一性原理:先问”训练目标到底约束了什么”——只约束边缘分布,那反向过程就有自由度。这种”找出题目里没写的自由度”是研究的核心动作。
- 快不是工程问题,是认知问题。DDIM 不靠并行、不靠 GPU、不靠剪枝——它靠重新看清问题结构。理论价值百倍于实现复杂度。
- 接口稳定的好处。DDIM 和 DDPM 共用权重 = 共用接口。这让生产系统可以热替换采样器而不动训练管线,这是后续 DPM-Solver 等十几种采样器能快速普及的关键。
延伸阅读
- 论文 PDF:Song, Meng, Ermon — DDIM(13 页正文 + 附录,关键推导在附录 B)
- 视频讲解:Yannic Kilcher — DDIM Explained(45 分钟,把数学和直觉都讲清楚)
- 配套代码:官方 ddim 仓库(PyTorch 200 行核心采样循环)
- 后续阅读:Lu et al. — DPM-Solver(在 DDIM 上做高阶 ODE 求解器,10 步出图)
- 中文笔记:苏剑林 — 生成扩散模型漫谈(DDIM 与 ODE 视角的统一推导,中文最清晰版本之一)
- 工程实战:HuggingFace
diffusers库里的DDIMScheduler,几十行代码实现整篇论文(含 inversion)
关联
- ddpm —— DDIM 的训练范式来源;权重共用,只换采样
- score-based-2020 —— 同期的概率流 ODE 视角,与 DDIM sigma=0 等价
- stable-diffusion —— 默认采样器是 DDIM 派生
- dit —— Diffusion Transformer 也用 DDIM 类采样器
- consistency-models —— 在 DDIM 之上进一步把步数压到 1-4
- flow-matching —— 把 DDIM 的 ODE 视角推广,绕开 SDE 直接学速度场