流匹配与整流流 本节摘要:扩散模型要 20-50 步采样,因为它走的是一条从噪声到数据的曲线路径。流匹配(Flow Matching,Lipman 等 2023)和整流流(Rectified Flow,Liu 等 2022)训练的是直线路径——路径越直,所需步数越少,推理越快。Stable Diffusion 3、Flux.1、AudioCraft 2 在 2024 年全都切到了流匹配。本节是本章的数学高潮之一:我们从零推导直线插值 为何给出常数时间导数 、条件流匹配损失 为何「无需仿真」(训练时不展开 ODE)、推理时如何用 Euler 步反向积分,以及整流流的 reflow 迭代如何把弯曲的学到的路径逐步拉直(两轮 reflow 后,2 步采样匹敌 50 步 DDPM)。
本节摘要:扩散模型要 20-50 步采样,因为它走的是一条从噪声到数据的曲线路径。流匹配(Flow Matching,Lipman 等 2023)和整流流(Rectified Flow,Liu 等 2022)训练的是直线路径——路径越直,所需步数越少,推理越快。Stable Diffusion 3、Flux.1、AudioCraft 2 在 2024 年全都切到了流匹配。本节是本章的数学高潮之一:我们从零推导直线插值
x_t = t·x_1 + (1−t)·x_0为何给出常数时间导数dx_t/dt = x_1 − x_0、条件流匹配损失L = E||v_θ(x_t,t) − (x_1−x_0)||²为何「无需仿真」(训练时不展开 ODE)、推理时如何用 Euler 步反向积分,以及整流流的 reflow 迭代如何把弯曲的学到的路径逐步拉直(两轮 reflow 后,2 步采样匹敌 50 步 DDPM)。我们还会严格说清流匹配与 DDPM 的代数等价性(高斯条件路径下,流匹配 = 特定噪声调度的扩散)。
对应原课程:Phase 08 · Lesson 13 ·
flow-matching-rectified-flows(原英文phases/08-generative-ai/13-flow-matching-rectified-flows/docs/en.md)。
阅读完本节,你应当能够:
x_t = t·x_1 + (1−t)·x_0 给出常数导数 x_1 − x_0,训练向量场 v_θ(x_t, t) 匹配它,损失 E||v_θ − (x_1−x_0)||²。(x_0, x_1, t) 做回归,不展开 ODE;这与 DDPM 的「一步前向加噪」异曲同工。(x_1, x_0),在配对上训 v_2——配对「ODE 匹配」后,插值路径真的更平直。DDPM 的反向过程是从 N(0, I) 回到数据分布的 1000 步随机游走。DDIM 把它压缩到 20-50 步确定性。你想要更少步数——理想是一步。阻碍在于:解反向过程的 ODE 是刚性的(stiff);路径是弯曲的。
如果你能把模型训成「噪声到数据的路径是直线」,那么从 t=1 到 t=0 的单步 Euler 就够了。流匹配直接构建这一点:定义从 x_1 ~ N(0, I) 到 x_0 ~ 数据 的直线插值,训一个向量场 v_θ(x, t) 去匹配它的时间导数,推理时积分。
整流流(Liu 2022)更进一步:用 reflow 过程迭代地把路径拉直,产出一个逐步逼近线性的 ODE。两轮 reflow 后,2 步采样器匹敌 50 步 DDPM 质量。
定义:
x_t = t · x_1 + (1 − t) · x_0, t ∈ [0, 1]
其中 x_0 ~ 数据,x_1 ~ N(0, I)。沿这条直线的时间导数是常数:
dx_t / dt = x_1 − x_0
定义一个神经向量场 v_θ(x_t, t),训练它匹配这个导数:
L = E_{x_0, x_1, t} || v_θ(x_t, t) − (x_1 − x_0) ||²
这就是条件流匹配损失(Lipman 2023)。训练无需仿真:你永远不展开 ODE。只采样 (x_0, x_1, t) 做回归。
💡 「无需仿真」的分量:在流匹配之前,有些生成模型(如基于朗之万动力学的分数匹配)训练时需要在模型自身上跑 MCMC 采样,极慢且不稳。流匹配的突破在于:目标
(x_1 − x_0)是闭式的,你只需采样数据点、采样噪声、采样时间,就能直接算出监督信号——训练成本与 DDPM 的「采样(x_0, t, ε)做回归」一样便宜。这是它能快速取代扩散的训练侧原因。
推理时,反向积分学到的向量场:
x_{t−Δt} = x_t − Δt · v_θ(x_t, t)
从 x_1 ~ N(0, I) 起,Euler 步下到 t=0。
直线流匹配能跑,但学到的路径并非真的直——它们弯曲,因为许多 x_0 可以映到同一个 x_1。整流流的 reflow 步骤:
x_1 积分 v_1 到其落点 x_0,采样 N 个配对 (x_1, x_0)。实践中 2 轮 reflow 就逼近线性,实现 2-4 步推理。SDXL-Turbo、SD3-Turbo、LCM 都是从流匹配蒸馏来的模型。
三个原因:
高斯条件路径的流匹配,就是「特定噪声调度的扩散」。取 x_t = α(t)·x_0 + σ(t)·x_1 调度,流匹配恢复成 Stratonovich 重表述的扩散,v = α'·x_0 − σ'·x_1。两者对高斯路径代数等价。
流匹配增加的是:目标的清晰性(一个朴素的「速度」)、更干净的损失、以及实验非高斯插值的许可。
⚠️ 关键澄清:流匹配没有在数学能力上「超过」扩散——对高斯路径它们是同一个东西。它的真正贡献是视角上的:把「学去噪」重新表述成「学一个向量场」,让「直线路径」这一选项变得自然,从而让 reflow、整流、一致性蒸馏这些「拉直路径以减少步数」的技术有了清晰的优化目标。SD3 论文的标题「Scaling Rectified Flow Transformers」就直白点明了这一点。
code/main.py 在双峰高斯混合上实现一维流匹配。向量场 v_θ(x, t) 是一个小 MLP,用直线目标训练。推理时积分 1、2、4、20 步 Euler,比较样本质量。
def train_step(x0, net, rng, lr): x1 = rng.gauss(0, 1) # 噪声端 t = rng.random() # t ∈ [0,1] x_t = t * x1 + (1 - t) * x0 # 直线插值 target = x1 - x0 # 常数导数 pred = net_forward(x_t, t) loss = (pred - target) ** 2 # 反向传播 + 更新
def sample(net, num_steps): x = rng.gauss(0, 1) # 从 x_1 ~ N(0,I) 出发 for i in range(num_steps): t = 1.0 - i / num_steps dt = 1.0 / num_steps x -= dt * net_forward(x, t) # Euler 反向积分 return x
预期 4 步采样器已经匹敌 20 步质量——这对延迟意义重大。
时间参数化:流匹配用 t ∈ [0, 1],t=0 在数据、t=1 在噪声。DDPM 用 t ∈ [0, T],t=0 在数据、t=T 在噪声。方向相同,尺度不同。论文里常常搞错。
调度选择:整流流的直线是「那个」流匹配调度,但你也可以用 cosine 或 logit-normal 的 t 采样(SD3 这么做)以获得更好的尺度覆盖。
reflow 成本:为 reflow 生成配对数据集,是每样本一次完整推理。只有你真需要 1-2 步推理时才做 reflow。
无分类器引导仍适用:只需在线性组合里把 ε 换成 v:v_cfg = (1+w)·v_cond − w·v_uncond。
💡 logit-normal t 采样为何有用:均匀采
t会让训练信号在t两端(纯噪声/纯数据)浪费——那里任务太平凡。logit-normal 把采样集中到中间 t,那里梯度最强、对最终质量贡献最大。这与 DDPM 里「Ho 扔掉系数反而更好」是同一个直觉的延续。
| 用例 | 2026 年栈 |
|---|---|
| 文生图、最佳质量 | 流匹配:SD3、Flux.1-dev |
| 文生图、1-4 步 | 蒸馏流匹配:Flux.1-schnell、SD3-Turbo、SDXL-Turbo |
| 实时推理 | 从流匹配底座的一致性蒸馏(LCM、PCM) |
| 音频生成 | 流匹配:Stable Audio 2.5、AudioCraft 2 |
| 视频生成 | 流匹配与扩散混合(Sora、Veo、Stable Video) |
| 科学/物理(粒子轨迹、分子) | 流匹配 + 等变向量场 |
2025-2026 年,凡是论文说「比扩散快」,几乎总是流匹配 + 蒸馏。
流匹配的生产胜利是 Flux.1-schnell——一个蒸馏到 1-4 步推理、同时保持 Flux-dev 级质量的流匹配 DiT。Niels 的「在 8GB 机器上跑 Flux」笔记本是参考部署配方:T5 + CLIP 编码,量化 MMDiT 去噪(schnell 4 步 vs dev 50 步),VAE 解码。成本核算:
| 变体 | 步数 | L4 上 1024² 延迟 | 总 FLOPs(相对) |
|---|---|---|---|
| Flux.1-dev(原始) | 50 | ~15 s | 1.0× |
| Flux.1-schnell | 4 | ~1.2 s | 0.08×(快 12 倍) |
| SDXL-base | 30 | ~4 s | 0.25× |
| SDXL-Lightning 2-step | 2 | ~0.3 s | 0.03× |
生产法则:流匹配底座 + 蒸馏 = 2026 年快速文生图的默认选择。每个主要厂商都交付这个组合:SD3-Turbo(SD3 + 流 + 蒸馏)、Flux-schnell(Flux-dev + 整流流拉直)、CogView-4-Flash。纯扩散底座只存在于遗留 checkpoint。
本节产出一个调参技能文件(位于原课程 outputs/skill-fm-tuner.md)。
skill-fm-tuner.md:输入一个扩散式模型规格,转成流匹配训练配置:调度选择、时间采样分布(均匀 / logit-normal)、优化器、reflow 计划、目标步数、评估协议。简单。 跑 code/main.py,比较 1 步 vs 20 步相对真实数据分布的 MSE。
中等。 把均匀 t 采样换成 logit-normal(把采样集中到中间 t)。模型质量提升吗?
困难。 实现一轮 reflow:通过积分第一个模型生成配对 (x_0, x_1),在配对上训第二个模型,比较 1 步样本质量。
x_t = t·x_1 + (1−t)·x_0,导数 = x_1 − x_0(常数);训练 v_θ(x_t,t) 匹配它,损失 E||v_θ − (x_1−x_0)||²。(x_0,x_1,t) 回归,不展开 ODE;成本与 DDPM 一样便宜——这是它能快速取代扩散的训练侧原因。v_cfg = (1+w)·v_cond − w·v_uncond;logit-normal t 采样集中训练信号。下一节,我们暂时离开生成方法本身,转向评估——FID 与 CLIP 分数:如何用 Fréchet 距离衡量「生成分布与真实分布的差距」、用 CLIP 衡量「图文匹配度」,以及为什么这两个指标各有已知失败模式,必须与人类评估配合使用。