流匹配与整流流


文档摘要

流匹配与整流流 本节摘要:扩散模型要 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)。

学习目标

阅读完本节,你应当能够:

  1. 说清扩散为何慢:反向过程是 1000 步随机游走(DDPM)或 20-50 步确定性(DDIM),因为 ODE 刚性、路径弯曲
  2. 推导直线流匹配:x_t = t·x_1 + (1−t)·x_0 给出常数导数 x_1 − x_0,训练向量场 v_θ(x_t, t) 匹配它,损失 E||v_θ − (x_1−x_0)||²
  3. 解释为何训练无需仿真:直接采样 (x_0, x_1, t) 做回归,不展开 ODE;这与 DDPM 的「一步前向加噪」异曲同工。
  4. 讲透整流流的 reflow:先训 v_1,再用 v_1 生成配对 (x_1, x_0),在配对上训 v_2——配对「ODE 匹配」后,插值路径真的更平直。
  5. 说清流匹配与 DDPM 的代数等价:高斯条件路径下,流匹配 = 特定噪声调度的扩散;流匹配的贡献是「目标的清晰性 + 更干净的损失 + 允许非高斯插值」。

一、问题与直觉

DDPM 的反向过程是从 N(0, I) 回到数据分布的 1000 步随机游走。DDIM 把它压缩到 20-50 步确定性。你想要更少步数——理想是一步。阻碍在于:解反向过程的 ODE 是刚性的(stiff);路径是弯曲的

如果你能把模型训成「噪声到数据的路径是直线」,那么从 t=1t=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

整流流(Liu 2022)

直线流匹配能跑,但学到的路径并非真的直——它们弯曲,因为许多 x_0 可以映到同一个 x_1。整流流的 reflow 步骤:

  1. 用随机配对训流模型 v_1。
  2. 通过从 x_1 积分 v_1 到其落点 x_0,采样 N 个配对 (x_1, x_0)
  3. 在这些配对上训 v_2。因为配对现在「ODE 匹配」,它们之间的直线插值真的更平
  4. 重复。

实践中 2 轮 reflow 就逼近线性,实现 2-4 步推理。SDXL-Turbo、SD3-Turbo、LCM 都是从流匹配蒸馏来的模型。

为什么 2024 年图像上它赢了

三个原因:

  1. 训练无需仿真——训练时不展开 ODE,实现简单。
  2. 更好的损失几何——直线路径有一致的信噪比,而 DDPM 的 ε 损失在调度边缘信噪比差。
  3. 推理更快——SDXL-Turbo 质量下 4-8 步;一致性蒸馏下 1 步。

二、流匹配 vs DDPM:精确的联系

高斯条件路径的流匹配,就是「特定噪声调度的扩散」。取 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,比较样本质量。

步骤 1:训练损失

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 # 反向传播 + 更新

步骤 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

步骤 3:比较步数

预期 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 年用例

用例 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 是流匹配的最快形态

流匹配的生产胜利是 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 计划、目标步数、评估协议。

八、练习

  1. 简单。code/main.py,比较 1 步 vs 20 步相对真实数据分布的 MSE。

  2. 中等。 把均匀 t 采样换成 logit-normal(把采样集中到中间 t)。模型质量提升吗?

  3. 困难。 实现一轮 reflow:通过积分第一个模型生成配对 (x_0, x_1),在配对上训第二个模型,比较 1 步样本质量。

本节要点回顾

  1. 扩散慢因为路径弯曲:DDPM 反向 ODE 刚性,需 20-50 步;直线路径只需 1 步 Euler。
  2. 直线流匹配:x_t = t·x_1 + (1−t)·x_0,导数 = x_1 − x_0(常数);训练 v_θ(x_t,t) 匹配它,损失 E||v_θ − (x_1−x_0)||²
  3. 训练无需仿真:直接采样 (x_0,x_1,t) 回归,不展开 ODE;成本与 DDPM 一样便宜——这是它能快速取代扩散的训练侧原因。
  4. 整流流 reflow:用 v_1 生成配对、在配对上训 v_2,迭代拉直;2 轮后 2-4 步匹敌 50 步 DDPM。
  5. 与 DDPM 代数等价:高斯路径下流匹配 = 特定噪声调度的扩散;贡献是「视角清晰 + 损失干净 + 允许非高斯插值」。
  6. CFG 仍适用:v_cfg = (1+w)·v_cond − w·v_uncond;logit-normal t 采样集中训练信号。
  7. 生产法则:流匹配底座 + 蒸馏 = 2026 快速文生图默认(Flux-schnell 4 步快 12 倍);纯扩散底座只剩遗留 checkpoint。

下一节,我们暂时离开生成方法本身,转向评估——FID 与 CLIP 分数:如何用 Fréchet 距离衡量「生成分布与真实分布的差距」、用 CLIP 衡量「图文匹配度」,以及为什么这两个指标各有已知失败模式,必须与人类评估配合使用。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U