扩散模型这条线我从 DDPM 的原始论文一路跟到 Flow Matching中间踩过的坑、绕过的弯路说实话比看论文的时间还多。Text2Video 系列写到第三篇前两篇聊了文本编码和视频时空建模这一篇专门把生成模型这条主干拎出来讲清楚从 DDPM 的加噪去噪到 DDIM 的确定性采样加速再到 SDE/ODE 连续视角的统一最后落到 Flow Matching 这条新路线。这几个东西不是并列关系而是一条清晰的演进脉络理解了这条脉络你再看任何一篇视频生成的新论文基本都能快速定位它在哪个环节做了改进。这篇文章适合谁看如果你已经跑过 Stable Diffusion 的推理脚本知道 scheduler 是什么但说不清 DDIM 和 DDPM 采样到底差在哪如果你看 Flow Matching 的论文被直线路径条件向量场这些词绕晕如果你想自己改采样器、做少步蒸馏、或者给视频模型换一个更快的采样方案那这篇就是给你写的。我会尽量用从业者的视角把每个环节为什么这么设计参数怎么算实操怎么调讲透而不是复述公式。1. 从 DDPM 说起为什么加噪再还原能生成图像1.1 DDPM 的核心直觉与两个过程DDPMDenoising Diffusion Probabilistic Models的出发点特别朴素如果我能把一张图逐步加噪直到它变成纯高斯噪声那我反过来学会从噪声逐步还原出图就能从随机噪声生成新图像。这个思路和传统的 GAN、VAE 完全不同——GAN 是一次性从噪声映射到图像训练不稳定VAE 是学一个隐空间再解码生成质量偏糊而 DDPM 把生成拆成了几百上千个微小步骤每一步只做一点点去噪单步任务足够简单所以训练特别稳。它包含两个过程。前向过程forward process是固定的不需要学习给定一张干净图 $x_0$按预设的噪声调度 $\beta_1, \beta_2, ..., \beta_T$ 逐步加高斯噪声经过 $T$ 步后 $x_T$ 近似标准正态分布。反向过程reverse process是需要学习的训练一个网络 $\epsilon_\theta$ 去预测每一步加的噪声然后从 $x_T$ 开始逐步去噪最终得到 $x_0$。这里有个关键技巧叫重参数化前向过程不需要一步步迭代可以直接从 $x_0$ 一步采样到任意时刻 $x_t$$$x_t \sqrt{\bar\alpha_t} x_0 \sqrt{1 - \bar\alpha_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)$$其中 $\bar\alpha_t \prod_{s1}^{t} \alpha_s$$\alpha_s 1 - \beta_s$。这个公式是整个 DDPM 训练的基石因为它让训练时可以在任意随机时刻 $t$ 采样而不必跑完整条链。我第一次推导这个公式的时候才真正理解为什么 DDPM 训练这么快——它把序列生成问题变成了单步回归问题。1.2 训练目标为什么简化成预测噪声原始 DDPM 论文推导的变分下界ELBO其实很复杂但作者做了一个非常聪明的简化把损失函数直接写成预测噪声的 MSE$$L_{simple} \mathbb{E}{t, x_0, \epsilon} \left[ | \epsilon - \epsilon\theta(x_t, t) |^2 \right]$$为什么可以这么简化因为 ELBO 展开后每一项本质上都是真实后验 $q(x_{t-1}|x_t, x_0)$ 和模型预测分布 $p_\theta(x_{t-1}|x_t)$ 的 KL 散度而这两个分布都是高斯KL 散度就退化成均值之间的 MSE。真实后验的均值里含有 $x_0$而 $x_0$ 又可以用 $x_t$ 和 $\epsilon$ 反解出来所以最终等价于预测噪声 $\epsilon$。这个简化带来的实际好处是训练极其稳定不需要对抗训练不需要复杂的损失权重虽然论文里也给了带权重的版本但实践中 $L_{simple}$ 就够用。我在实际训练小规模模型时验证过用 $L_{simple}$ 收敛曲线非常平滑几乎不会出现 loss 爆炸。1.3 采样公式与实操中的坑训练完之后采样是从 $x_T \sim \mathcal{N}(0, I)$ 开始逐步执行$$x_{t-1} \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar\alpha_t}} \epsilon_\theta(x_t, t) \right) \sigma_t z$$其中 $z \sim \mathcal{N}(0, I)$$t 1$ 时$\sigma_t^2 \beta_t$ 或 $\tilde\beta_t$。注意最后那个 $\sigma_t z$ 项——这是 DDPM 采样的随机性来源也是它慢的原因之一每一步都要注入新噪声必须走完 $T$ 步通常 1000 步才能得到结果。实操里几个坑我列一下。第一噪声调度的选择很关键线性调度linear schedule在低分辨率图像上还行但高分辨率下末尾几步噪声太大信息几乎全丢导致生成质量下降后来 cosine schedule 基本成了默认。第二时间步嵌入timestep embedding一定要用正弦位置编码加 MLP直接喂标量 $t$ 效果很差。第三采样时如果忘了把 $\sigma_t$ 在 $t1$ 时置零最后一步会引入额外噪声图像会偏灰。提示DDPM 的 1000 步采样在视频生成里几乎不可接受一段 16 帧的视频如果每帧都跑 1000 步推理时间会爆炸。这就是为什么后面必须要有 DDIM。2. DDIM把随机采样变成确定性采样2.1 DDIM 的核心洞察非马尔可夫前向过程DDPM 的反向过程是马尔可夫的每一步只依赖前一步。DDIMDenoising Diffusion Implicit Models的作者发现前向过程其实不必是马尔可夫的可以构造一族非马尔可夫的前向过程它们共享同一个边缘分布 $q(x_t|x_0)$但反向过程可以有不同的联合分布。换句话说训练好的 DDPM 模型可以直接拿来做 DDIM 采样不需要重新训练。这个洞察的价值在于既然边缘分布一样那模型学到的 $\epsilon_\theta(x_t, t)$ 依然有效但反向过程的构造方式变了我们可以选择让它变成确定性的。DDIM 的反向采样公式是$$x_{t-1} \sqrt{\bar\alpha_{t-1}} \underbrace{\left( \frac{x_t - \sqrt{1 - \bar\alpha_t} \epsilon_\theta(x_t, t)}{\sqrt{\bar\alpha_t}} \right)}{\text{预测的 } x_0} \sqrt{1 - \bar\alpha{t-1}} \cdot \epsilon_\theta(x_t, t)$$注意这里没有随机噪声项了当 $\eta 0$ 时。公式的结构很清晰先估计出 $x_0$再用这个 $x_0$ 和当前噪声预测重新组合出 $x_{t-1}$。当 $\eta 1$ 时它退化成 DDPM当 $\eta 0$ 时就是完全确定性的 DDIM。2.2 为什么 DDIM 能加速子序列采样的数学依据DDIM 最实用的特性是跳步采样。因为反向过程是确定性的我们可以只取原始 $T$ 步中的一个子序列 $\tau_1 \tau_2 ... \tau_S$$S \ll T$然后在这个子序列上执行采样。比如从 1000 步里取 50 步推理速度直接提升 20 倍而生成质量下降有限。为什么跳步还能work直觉上DDIM 的确定性采样相当于在求解一个 ODE这个联系后面会详细讲而 ODE 的数值求解本来就可以用更大的步长。当然步长太大误差会累积所以实践中 50 步是个甜点20 步以下质量开始明显下降。我实测过 Stable Diffusion 上 DDIM 20 步和 50 步的差异20 步时细节比如手指、文字会糊50 步基本和 100 步看不出区别。2.3 DDIM 实操参数与踩坑记录用 DDIM 采样时几个参数需要关注参数含义推荐值说明num_inference_steps采样步数5020 以下质量下降明显eta随机性系数0.00 为确定性1 退化为 DDPMguidance_scale分类器-free 引导强度7.5太高会过饱和timestep_spacing时间步间隔方式leading影响子序列选取踩过的坑第一eta不要随便设成中间值0 和 1 是两个有明确语义的端点中间值反而不好调。第二不同 scheduler 的timestep_spacing语义不一样leading从 $t0$ 开始取trailing从 $tT$ 开始取视频生成里通常用leading更稳。第三DDIM 的确定性意味着同样的初始噪声一定生成同样的结果这对复现实验是好事但也意味着你没法靠换随机种子来抽卡多样性要靠改初始噪声。注意DDIM 虽然叫Implicit但它和后面要讲的 SDE/ODE 视角是同一件事的两面。理解了 DDIM 的确定性采样再看概率流 ODE 会顺畅很多。3. SDE/ODE 统一视角把离散步骤变成连续时间3.1 从离散到连续随机微分方程登场DDPM 和 DDIM 都是离散时间步的步数 $T$ 是固定的。但如果我们把 $T \to \infty$步长 $\Delta t \to 0$整个加噪去噪过程就变成了连续时间的随机微分方程SDE。前向 SDE 可以写成$$dx f(x, t) dt g(t) dw$$其中 $f$ 是漂移项drift$g$ 是扩散项diffusion$w$ 是标准布朗运动。对于 DDPM 的噪声调度$f(x,t) -\frac{1}{2}\beta(t) x$$g(t) \sqrt{\beta(t)}$。这个连续视角的好处是它把 DDPM、DDIM、以及后面所有的变体统一到一个框架里你只需要换不同的 $f$ 和 $g$就能得到不同的模型。更妙的是Song 等人证明了对同一个前向 SDE存在一个概率流 ODEprobability flow ODE它的边缘分布 $p_t(x)$ 和前向 SDE 完全一致但是确定性的$$dx \left[ f(x, t) - \frac{1}{2} g(t)^2 \nabla_x \log p_t(x) \right] dt$$这里的 $\nabla_x \log p_t(x)$ 就是score function而扩散模型训练的 $\epsilon_\theta$ 和 score 的关系是 $\nabla_x \log p_t(x) \approx -\epsilon_\theta(x_t, t) / \sqrt{1 - \bar\alpha_t}$。所以训练好的扩散模型本质上是在学 score而采样就是在解这个 ODE。3.2 ODE 求解器怎么选从 Euler 到 DPM-Solver既然采样变成了求解 ODE那数值求解器的选择就变得非常重要。最朴素的是欧拉法Euler每步沿当前梯度方向走一小段一阶精度。DDIM 本质上就是一阶的欧拉法。往上走还有Heun 法二阶、Runge-Kutta 法四阶以及专门为扩散模型设计的DPM-Solver系列。DPM-Solver 的核心洞察是扩散 ODE 的解可以写成关于 $\lambda_t \log(\bar\alpha_t / \sqrt{1 - \bar\alpha_t})$ 的积分形式而这个积分可以用指数积分器高精度近似。所以 DPM-Solver 在 10-20 步就能达到 DDIM 50 步的质量。我实测下来DPM-Solver 在 15 步左右就能出可用的图是当前性价比最高的选择之一。求解器阶数典型步数特点Euler (DDIM)150简单稳定步数多Heun225每步两次网络评估DPM-Solver2-315-20专为扩散设计快DPM-Solver2-310-15改进版更稳UniPC2-310-15统一预测校正3.3 SDE 采样 vs ODE 采样什么时候用哪个SDE 采样比如 DDPM、Euler-Maruyama每步注入噪声好处是能纠正前面步骤的误差鲁棒性强坏处是慢且结果不可复现。ODE 采样DDIM、DPM-Solver确定性快可复现但误差会累积步数太少时质量掉得厉害。实操建议追求速度用 ODE追求质量上限用 SDE。视频生成里因为帧数多、总计算量大基本都用 ODE 类采样器。另外做图像编辑比如 SDEdit时SDE 的随机性反而有帮助因为它能在保持结构的同时增加细节变化。提示从 SDE 视角看DDIM 就是概率流 ODE 的欧拉离散化这个等价关系是理解整个扩散模型家族的关键。你如果只记一个公式就记概率流 ODE。4. Flow Matching绕开 SDE 的另一条路4.1 Flow Matching 的核心思想直接学一个向量场前面讲的扩散模型无论 DDPM 还是 SDE/ODE本质上都是加噪-去噪框架训练目标是预测噪声等价于学 score。Flow MatchingFM换了个思路我不学噪声我直接学一个向量场$v_\theta(x, t)$它定义了从噪声分布到数据分布的一条概率路径。采样时解一个常微分方程$$\frac{dx}{dt} v_\theta(x, t)$$从 $t0$ 的噪声出发积分到 $t1$ 就得到样本。这个框架叫Continuous Normalizing FlowCNF理论上比扩散模型更一般——扩散模型只是 FM 的一个特例当概率路径是特定的高斯路径时。FM 的关键创新在于训练目标的设计。直接学向量场很难因为真实的概率路径未知。FM 的做法是构造一条条件概率路径$p_t(x|x_1)$它从噪声到某个具体数据点 $x_1$ 是已知的比如直线插值然后学一个向量场去拟合这条条件路径的向量场最后证明边缘向量场就是条件向量场的期望。这样训练目标就变成了简单的回归$$L_{FM} \mathbb{E}{t, x_0, x_1} | v\theta(x_t, t) - (x_1 - x_0) |^2$$其中 $x_t (1-t) x_0 t x_1$ 是直线插值。注意这个目标极其简洁——就是让网络预测从噪声指向数据的方向。我第一次看到这个公式的时候有点不敢相信因为它比 DDPM 的 ELBO 推导简单太多了。4.2 直线路径 vs 扩散路径为什么 FM 采样更快FM 默认用直线路径linear interpolation而扩散模型用的是高斯扩散路径曲线。直线路径的好处是从噪声到数据的距离更短ODE 求解需要的步数更少。理论上如果向量场学得足够准直线路径一步就能到位因为路径就是直线。实践中因为向量场有误差还是需要多步但通常 10-20 步就能出好结果比扩散模型的 50 步少很多。这就是为什么最近的视频生成模型比如一些基于 FM 的工作能在推理速度上大幅领先。少步采样对视频尤其重要因为视频的 token 数是图像的几十倍每省一步都是巨大的算力节省。4.3 Rectified Flow 与实操要点Rectified Flow是 FM 的一个重要变体它的核心是回流reflow操作先用直线路径训一个 FM 模型然后用它生成的样本对 $(x_0, x_1)$ 重新训练让路径变得更直。反复几次后路径接近完美直线采样步数可以降到 1-4 步。这个思路和蒸馏有点像但更优雅因为它不需要教师模型的中间步骤。实操中几个要点。第一时间采样分布很重要均匀采样 $t$ 在直线路径下效果不错但如果用 logit-normal 分布偏向中间时刻会更好因为中间时刻的向量场最难学。第二条件路径的选择不一定是直线也可以用扩散路径这时 FM 就退化成扩散模型所以 FM 是更一般的框架。第三网络输出要预测向量场而不是噪声改代码时别搞混否则训练完全不收敛。对比项扩散模型 (DDPM/DDIM)Flow Matching训练目标预测噪声 $\epsilon$预测向量场 $v$概率路径高斯扩散路径曲线直线路径默认典型采样步数20-5010-20reflow 后 1-4理论框架SDE / 概率流 ODECNF / ODE少步能力需蒸馏天然支持注意FM 和扩散模型不是对立的扩散模型可以看作 FM 在特定路径下的特例。理解了这一点你就不会纠结该学哪个而是根据任务选路径和求解器。5. 从图像到视频这些采样器在 Text2Video 里怎么用5.1 视频生成的额外挑战时间一致性与算力把上面这些采样器搬到视频生成会多出两个约束。第一是时间一致性视频的相邻帧必须连贯如果每帧独立采样即使每帧质量都高拼起来也会闪烁。解决办法通常是在 3D U-Net 或 Transformer 里做时空注意力让采样过程本身考虑帧间关系。第二是算力一段 16 帧 512x512 的视频token 数是单帧图像的 16 倍以上如果用 DDPM 1000 步采样根本跑不动。所以视频生成几乎必然选择少步采样器。当前主流方案是 DPM-Solver 或 Flow Matching步数控制在 15-30 之间。有些工作还会用蒸馏把步数压到 4-8 步但蒸馏会损失一些多样性需要权衡。5.2 采样器切换的实操以 diffusers 为例在 diffusers 里切换采样器非常简单但有几个细节要注意。假设你已经有一个训练好的视频扩散模型pipe想从 DDPM 换成 DPM-Solverfrom diffusers import DPMSolverMultistepScheduler pipe.scheduler DPMSolverMultistepScheduler.from_config( pipe.scheduler.config, algorithm_typedpmsolver, solver_order2, use_karras_sigmasTrue, # Karras 噪声调度质量更好 ) video pipe( prompta cat walking on grass, num_inference_steps20, guidance_scale7.5, num_frames16, ).frames几个坑第一from_config会继承原 scheduler 的噪声调度参数但不同 scheduler 对beta_start、beta_end的敏感度不同换完最好重新验证一下。第二use_karras_sigmasTrue会改变时间步的选取方式通常能提升质量但和某些模型不兼容要试。第三视频模型的num_frames和采样步数是独立的别把两者搞混。5.3 少步采样的质量-速度权衡表我在实际项目里做过一组对比用同一个视频模型只换采样器和步数记录生成质量和耗时相对值采样器步数相对耗时主观质量时间一致性DDPM100050x高好DDIM502.5x高好DPM-Solver201x高好DPM-Solver100.5x中轻微闪烁Flow Matching150.75x高好FM Reflow40.2x中高可接受从表里能看出DPM-Solver 20 步是性价比拐点再往下质量掉得比耗时省得快。Flow Matching 在同等步数下略优reflow 后能做到 4 步但质量有损。实际选型要看你的场景如果做实时预览4 步 FM 可以接受如果做最终输出20 步 DPM-Solver 更稳。6. 常见问题与排查技巧实录6.1 采样出图发灰、过曝、糊成一团怎么办这是最高频的问题我按排查顺序列一下。发灰通常是最后一步没把噪声项置零或者guidance_scale太低低于 5。过曝/过饱和一般是guidance_scale太高高于 12分类器-free 引导会把条件方向的梯度放大过头。糊成一团多半是步数太少或者噪声调度和模型训练时不一致——比如模型用 cosine 训的你采样用 linear分布对不上。排查顺序建议先确认 scheduler 的beta_schedule和训练时一致再调guidance_scale到 7-8最后加步数。这三步能解决 80% 的质量问题。6.2 换采样器后结果完全崩坏这种情况我遇到过好几次原因通常是模型和采样器的匹配问题。扩散模型的训练目标预测 $\epsilon$ 还是预测 $v$ 还是预测 $x_0$必须和采样器的假设一致。比如有些模型训练时预测的是 velocity $v \alpha_t \epsilon - \sigma_t x_0$你用一个假设预测 $\epsilon$ 的采样器结果必然崩。解决办法是查模型的prediction_type配置diffusers 里通常是epsilon、v_prediction、sample三选一采样器要选支持对应类型的。DPM-Solver 和 UniPC 都支持这三种DDIM 主要支持epsilon。6.3 视频闪烁、帧间不连贯这是视频特有的问题。如果单帧质量没问题但拼起来闪说明时间建模不足。排查方向第一确认模型有没有用 temporal attention 或 3D 卷积第二采样时是否对每帧用了不同的初始噪声——视频生成通常要求所有帧共享同一个初始噪声或者用固定的噪声序列第三guidance_scale太高会放大帧间差异适当降低。我踩过的一个坑是为了增加多样性给每帧喂了不同的随机种子结果视频闪得像频闪灯。后来改成所有帧共享初始噪声只在时空注意力里做变化立刻就稳了。6.4 常见问题速查表现象可能原因排查方向图像发灰末步噪声未清零检查 scheduler 的 final step过饱和guidance 过高降到 7-8糊步数太少加到 20换采样器崩坏prediction_type 不匹配查模型配置视频闪烁帧间噪声不一致共享初始噪声采样极慢用了 DDPM 全步换 DPM-Solver结果不可复现用了 SDE 采样换 ODE 采样器6.5 几个独家避坑技巧第一先在小分辨率上验证采样器。视频模型跑一次很贵换采样器时先用 64x64 的小模型或单帧验证确认没问题再上全尺寸。第二保存中间步骤。调试采样器时把每一步的 $x_t$ 存下来可视化噪声的演化能快速定位是哪一步出的问题。第三别迷信论文里的默认参数论文的步数是在特定数据集上调的换数据集要重新扫。第四Flow Matching 的 reflow 不要贪多reflow 两次以上路径会过度拉直多样性损失明显通常一次就够。7. 我个人的选型建议与经验总结如果你现在要做一个 Text2Video 项目我的建议是训练阶段用 Flow Matching 或扩散模型都行看你的团队熟悉哪个采样阶段优先用 DPM-Solver 或 FM 的 ODE 求解器步数 15-20如果对速度有极致要求再考虑 reflow 或蒸馏到 4-8 步。别一上来就追求 1 步生成那个质量目前还撑不起生产环境。从 DDPM 到 Flow Matching 这条线我最大的体会是生成模型的演进本质上是如何用更少的步骤、更简单的目标、更直的路径完成从噪声到数据的映射。DDPM 用 1000 步换稳定DDIM 用确定性换速度SDE/ODE 用连续视角换统一Flow Matching 用直线路径换少步。每一步都在做权衡没有免费的午餐。最后分享一个我调试采样器时的小习惯把不同采样器、不同步数的结果拼成一张网格图横轴是步数纵轴是采样器一眼就能看出哪个组合是性价比拐点。这个习惯帮我省了无数次盲目调参的时间。视频生成这条路上采样器的选择往往比模型结构更能决定你的推理成本值得花时间吃透。