Flow Matching 详解:为什么把生成路径拉直,就能一步出结果

从扩散的弯路讲到 Flow Matching 的直线:速度场、Conditional Flow Matching、Rectified Flow、reflow 去交叉,以及它和扩散模型到底什么关系。附从零实现的最小代码,以及它在图像、机器人、自动驾驶里的落地。

上一篇讲 GoalFlow 用 Flow Matching 一步出轨迹,但那边把 flow matching 当黑盒用了。这篇把它拆开:它到底在学什么、为什么「直」就等于「快」、以及它和扩散模型的关系到底是竞争还是包含。看完再回头看 GoalFlow 和 π0 的动作头,那些设计选择就没有秘密了。

1. 引子:两个问题

有个问题一直悬着:同样是从噪声生成数据,凭什么扩散要跑几十步,Flow Matching 一步就敢出结果?

还有第二个问题,更微妙:Flow Matching 和扩散模型,到底是两套东西,还是同一套东西? 有人说「flow matching 是扩散的直线版」,有人说「扩散是 flow matching 在高斯路径下的特例」,两种说法都对,但听起来完全矛盾。

这篇文章想把这两件事说清楚。核心结论先放这儿:采样步数由轨迹的曲率决定,不由起点终点的距离决定。 扩散是沿着一条弯的路径走,flow matching 想办法把这条路径掰直。而这套框架里,扩散其实是它的一个特例——不是对手,是子集。

2. 扩散为什么慢:曲率才是敌人

先说扩散。它的前向过程是往数据里逐步加噪,把这个过程反过来,就是从纯噪声一步步去噪回到数据。数学上,这个反向过程是一个随机微分方程(SDE),或者它的确定性版本——概率流 ODE(probability flow ODE)。

注意「概率流 ODE」这个词。它说明一件关键的事:扩散本质上就是在求解一个 ODE,把一个分布搬成另一个分布。 只不过它构造出来的这条轨迹,是弯的。

为什么弯?因为扩散的加噪计划(noise schedule)规定了每一步加多少噪声,反向时就得沿着同一条曲线倒着走。整条路径从噪声出发,先被噪声主导,中途剧烈变化,最后收敛到数据——像一条绕远路的盘山公路。

采样时我们用什么数值方法解这个 ODE?最常见的是欧拉法:把总时间切成 N 段,每一段假设速度不变,走一小步。问题就在「假设速度不变」这一句。 曲线路径上速度一直在变,欧拉法每一步都会切到弯道外侧,步长越小误差越小、步数越多。所以要几十步甚至上千步。

这里有个反直觉的推论:误差只跟曲率有关,跟起点终点离多远无关。 一条直线,哪怕跨越整个空间,一步就走完了。一条打转的曲线,哪怕起点终点近在咫尺,也得慢慢挪。

所以「能不能少走几步」这个问题,等价于「能不能把这条路径弄直」。这就是 Flow Matching 的全部动机。

3. Flow Matching 的基本图像:学一个速度场

换个想法。不去设计一个加噪计划再求逆,直接从源头构造一条路径。

设数据分布为 p₁,噪声分布 p₀(一般是标准高斯)。我们要找一条随时间变化的概率密度路径 pₜ,从 p₀ 出发,在 t=1 时到达 p₁。这条路径由速度场 uₜ(x) 生成,满足连续性方程:

∂pₜ(x)/∂t + ∇·(pₜ(x)·uₜ(x)) = 0

不用被这个方程吓到,它的含义很朴素:uₜ(x) 告诉每个位置上的样本此刻该往哪个方向、多快地动。 沿着这个速度场积分,样本就从噪声漂到了数据:

dx/dt = uₜ(x)

这个结构叫连续归一化流(Continuous Normalizing Flow, CNF)。它不是什么新东西,2018 年 Neural ODE 就有了。

但 CNF 原来没法训练。你想直接回归 uₜ(x),可 uₜ 依赖 pₜ 这个边缘分布,而 pₜ 是整条路径上所有样本的平均行为,根本写不出解析式。老办法是用最大似然,训练时得真的把 ODE 模拟一遍再反传梯度——每一步训练都要跑一次完整采样,贵到没法用。这就是 CNF 一直打不过扩散的原因:扩散虽然采样慢,但训练是「模拟无关」(simulation-free)的,不用展开整个过程。

Flow Matching 的贡献,就是给 CNF 找到了一个同样 simulation-free 的训练目标。

4. 关键一跳:Conditional Flow Matching

核心 trick 是:别管边缘路径,去管单个样本的路径。

对某一个具体的数据点 x₁,从噪声 x₀ 到 x₁,你总能随手写一条光滑路径,并且它的速度是能算出来的。比如走直线,那速度就是常数。既然每条「条件路径」的速度都是已知的,就退化成最简单的回归:

L(θ) = E[ ‖ v_θ(xₜ, t) − uₜ(xₜ | x₀, x₁) ‖² ]

这就是 Conditional Flow Matching(CFM) 的目标。Lipman 等人在 2022 年的论文(arXiv:2210.02747)里证明了一件事:这个目标对 θ 的梯度,和直接回归边缘速度场 uₜ 完全一样。 虽然边缘场算不出来,但用条件场做回归,期望意义上等价。

所以训练循环简单到离谱:抽一个数据点、抽一份噪声、抽一个时间 t,把条件速度的解析解算出来,做一次均方误差。训练时完全不碰 ODE 求解器。 这正是扩散当年赢 CNF 的那张牌,flow matching 原样拿了回来。

5. 最省事的选择:直线插值(这就是 Rectified Flow)

CFM 把「路径长什么样」留成了自由设计项。最懒得想的选择是:直线。

xₜ = (1 − t)·x₀ + t·x₁        路径是线段
uₜ = x₁ − x₀                   速度是常数

速度跟 t 无关,就是这个位移向量本身。于是训练目标变成:

L(θ) = E_{t, x₀, x₁}[ ‖ v_θ((1−t)x₀ + t·x₁, t) − (x₁ − x₀) ‖² ]

没有噪声计划,没有 SNR 加权,没有 ᾱₜ 那一堆调度表。这一版就是 Rectified Flow(Liu, Gong, Liu, 2022,arXiv:2209.03003)。它比 Lipman 那篇早一个月挂出来,两边是从不同门进来的同一个房间——线性插值这个特例下,两个框架在数学上完全重合。 现在社区基本混着叫,说「rectified flow training」时强调 reflow 那套流程,说「flow matching」时强调条件概率路径这个视角。

6. 一维例子:为什么直了就能一步

用一个最小的数字把「曲率决定步数」讲清楚。

起点 x₀ = −1,终点 x₁ = 2,总位移是 3。

走直线:速度处处等于 3,恒定。欧拉一步:−1 + 1×3 = 2,精确命中,误差 0。

走扩散那种弯曲路径(用 = cos(πt/2)x₀ + sin(πt/2)x₁ 近似,也就是 VP 路径那个形状):在起点算初始速度,是 π/2 × x₁ ≈ π ≈ 3.14。欧拉一步:−1 + 3.14 = 2.14,偏离了 0.14,占总位移的约 4.7%。 只有一步就错这么多,维度一叠、轨迹一弯,误差立刻失控,这就是扩散必须几十步的原因。

一维里这种「速度和位置无关」的路径,其实正是最优传输(Optimal Transport)在一维的唯一解——单调耦合。高维里没法直接这么利索,但 reflow 那个过程可以被理解成往这个方向收敛的、保持边缘分布的近似。

7. 反直觉的地方:条件路径是直的,边缘场还是弯的

这里是最容易翻车的一步,务必分清两件事:

训练时,每条条件路径都是完美的直线。但网络学的是边缘场,而边缘场是弯的。

原因在于「交叉」。两个不同的样本对 (x₀, x₁) 和 (x₀’, x₁’),它们的直线段可能在空间中相交。在那个交叉点上,两条训练样本给出的目标速度不一样,而回归的只能是它们的平均——平均一下,轨迹就拐弯了。 多个交叉点叠起来,积分曲线就成了一条弯的。

所以严格来说,刚训完的 rectified flow 并不直。 它是「在直线的目标上训练的」,这是两个不同的命题。论文里给的数字很能说明问题:1-Rectified Flow 用 RK45 自适应求解器(127 次函数评估)能拿到 CIFAR-10 上 FID 2.58,但如果只用一步欧拉法,FID 会崩到 378——基本是噪声。路径不够直,一步就是灾难。

8. Reflow:把交叉点抹掉

既然问题出在交叉,那就消灭交叉。

关键在于:一个 ODE 的轨迹是永远不会自我交叉的。 因为在同一个时空点上,速度场只给一个方向。所以如果用模型自己诱导出来的配对,替换掉原来那个「噪声配随机数据」的独立配对,新配对天然就是无交叉的。

这就是 reflow:

  1. 先训一个 1-Rectified Flow;
  2. 采一批噪声 z₀,把它喂进 1-RF 积分到终点,记下它实际落到哪儿 z₁,配成对 (z₀, z₁);
  3. 用这些新配对重新训练一个模型,得到 2-Rectified Flow;
  4. 想再直就重复。

论文证明了 reflow 不会增加凸传输代价,而且每迭代一次轨迹就更直一点。效果非常直观:2-RF 带蒸馏后,一步欧拉法就能到 FID 4.85(对比 1-RF 单步的 378),这个数当年超过了所有一步生成模型,包括 StyleGAN2+ADA。也就是说,reflow 把「一步生成」从不可能变成了可行。

代价也有:每轮 reflow 都是在模型自己生成的合成数据上训练,采样误差会累积,分布会有轻微漂移。所以工业界一般最多做一两轮 reflow,就转入最后的蒸馏,把已经拉直的轨迹压成一个一步学生网络。

9. Flow Matching 和 Diffusion 到底什么关系

回到引子的第二个问题。答案是:包含关系。

如果条件路径选高斯路径 xₜ = α(t)x₀ + σ(t)x₁,那 CFM 的目标就能代数地改写成扩散那个 ε-预测(或 v-预测)损失,中间只差一个时间权重 wₜ。也就是说:

  • 标准扩散的训练目标,是 flow matching 在某个特定路径下的一个实例;
  • 反过来,rectified flow 的线性插值,可以看成扩散过程的一个极限——所有噪声在 t=0 就加完了,路径从弯的布朗桥变成一条直线段。

差异主要在三个地方:

扩散 / Score MatchingFlow Matching(线性路径)
前向过程随机加噪,路径弯曲确定性直线插值
训练目标预测噪声 ε、score ∇log p,或 v预测速度,直线情形就是 x₁ − x₀
采样轨迹弯,需要很多步reflow 后接近直线
噪声计划必须调 schedule / SNR 加权线性情形不需要
训练是否 simulation-free是是(这是继承来的优点)

一句话:flow matching 没有推翻扩散,它把扩散的「路径设计」这个维度打开成了自由项,于是你才能选那条最直的路。附带的好处是损失函数更干净——纯速度回归,没有 SNR 在时间轴两端的病态问题。

10. 从零实现一个最小的 Flow Matching

理论说完,代码其实短得吓人。下面是一个二维分布上的完整版本(PyTorch)。

速度场就是一个吃 (x, t) 出速度的 MLP:

import torch
import torch.nn as nn

class VelocityField(nn.Module):
    def __init__(self, dim=2, h=128):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(dim + 1, h), nn.SiLU(),
            nn.Linear(h, h), nn.SiLU(),
            nn.Linear(h, h), nn.SiLU(),
            nn.Linear(h, dim),
        )

    def forward(self, x, t):          # x: [B, dim]  t: [B, 1]
        return self.net(torch.cat([x, t], dim=-1))

训练一步,就是抽噪声、抽时间、线性插值、回归常数速度:

def train_step(model, opt, x1):
    x0 = torch.randn_like(x1)                       # 先验噪声
    t  = torch.rand(x1.size(0), 1)                  # t ~ U[0, 1]
    xt = (1 - t) * x0 + t * x1                      # 直线插值
    target = x1 - x0                                # 恒定速度,与 t 无关
    loss = ((model(xt, t) - target) ** 2).mean()
    opt.zero_grad(); loss.backward(); opt.step()
    return loss.item()

采样就是从噪声出发,沿速度场积分:

@torch.no_grad()
def sample(model, n, steps=1):
    x = torch.randn(n, 2)                           # t=0 处是纯噪声
    dt = 1.0 / steps
    for i in range(steps):
        t = torch.full((n, 1), i * dt)
        x = x + dt * model(x, t)                    # 欧拉步
    return x                                        # t=1 处是数据

而 reflow,本质上只是换一批训练配对:

# 1. 用 1-RF 采样:把噪声和它实际落到的终点配成对
z0 = torch.randn(N, 2)
z1 = sample(model1, N, steps=128)          # 高步数采样,尽量准
# 2. 用这批 (z0, z1) 重新训练 -> 2-RF,轨迹更直
for x1 in z1:
    train_step(model2, opt, x1[None])
# 3. 蒸馏出一到两步的学生网络后可上线

把 steps 从 128 调到 1,如果模型是 2-RF,输出依然像样;如果是 1-RF,就是一团糊。这个对比亲手跑一遍,比看十页公式都直观。

11. 为什么 2024 之后大家都换过来了

不只是图像。列出采用方你就明白这条路线现在有多主流:

图像 / 视频:Stable Diffusion 3 的论文标题直接把 Rectified Flow 写进去了(Scaling Rectified Flow Transformers, arXiv:2403.03206),FLUX.1 同样以 flow matching 为核心,Meta 的 Movie Gen、Wan2.1 这一批视频模型也是。原因是同一句话——少步采样在高分辨率、多帧场景里省得更多。

机器人 / VLA:这条线最值得单说。Physical Intelligence 的 π0 就是「VLM 骨干 + flow matching 动作专家」:PaliGemma 3B 之上挂一个约 300M 的动作专家,一次性输出 50 步的动作块,推理时用约 10 步积分,在 RTX 4090 上整块动作约 73ms,支撑到 50Hz 控制。为什么非 flow matching 不可?因为自回归逐 token 生成在 50 步 × 14 维的动作空间上要串行几百次前向,而 flow matching 的积分成本跟动作维度无关;标准扩散又要几百步去噪,撑不住每步 20ms 的预算。NVIDIA 的 GR00T 系列用 flow-matching 的 DiT 动作头(默认 4 步),Hugging Face 的 SmolVLA 同样如此。

自动驾驶:就是上一篇那两条——GoalFlow 用 Rectified Flow 把轨迹生成压到一步,GuideFlow 更进一步把硬约束焊进生成过程。

所以那个「2025–2026 年前沿在往 flow matching 迁移」的判断,在图像、视频、机器人三条线上都有硬证据,不是媒体话术。

12. 局限:它不是免费午餐

得把话说全,不然就成了吹。flow matching 有几个实打实的边界:

一是它没有消灭复杂度,只是搬了地方。 你依然要选路径、选时间采样方案、选求解器、选步数调度,还得处理 VAE 潜空间的坐标系。而且「大模型 + 少步数」不一定比「小模型 + 多步数」便宜——八次昂贵的 Transformer 前向,完全可能比三十次便宜的 U-Net 前向更贵。比延迟要在固定预算下比,别只比步数。

二是曲率只能压,不能归零。 高维复杂分布上,一步生成往往要在纹理、多样性、条件遵循度上让步。reflow 的每一轮都在用合成数据,轮数一多就漂。

三是它有个前提:数据分布得能被一个相对稳定的噪声到数据的传输描述。 如果目标分布退化成近乎确定的(比如单技能、几乎无歧义的动作),那建模全分布的收益就很有限,直接回归 + 动作分块反而更简单。

所以选型上大致是:推理开销是瓶颈、且你打算从头训练,flow matching 是默认选项;只是想在已有扩散模型上提速,DDIM 这类确定性采样器零成本就能拿到几倍加速,不一定值得重训;动作分布本来就是单峰的(比如多数导航策略),回归加动作分块就够用。

13. 总结

把整篇压成三句话:

第一,采样步数由轨迹曲率决定。直线一步到位,弯路步步累积误差——这是 flow matching 存在的全部理由。

第二,Conditional Flow Matching 把「训练时必须模拟 ODE」这个死结解开了,让 CNF 拿到了扩散当年赢它的那张牌:simulation-free。

第三,它和扩散是包含关系不是替代关系。扩散是 flow matching 在特定高斯路径下的实例;flow matching 做的事,是把「路径」从一个被 schedule 绑死的量,解放成一个可设计的选择——而最简单的那个选择(直线),恰好也是最快的那个。

回到上一篇的 GoalFlow:它选 Rectified Flow 不是为了赶时髦,是因为规划器真的只有 10ms 级的时间预算,而一步生成本质上要求路径得直。搞懂这一层,「为什么是 flow」就不需要再解释了。


主要文献:Flow Matching for Generative Modeling (Lipman et al., arXiv:2210.02747, ICLR 2023);Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow (Liu, Gong, Liu, arXiv:2209.03003);Stochastic Interpolants: A Unifying Framework for Flows and Diffusions (Albergo et al., arXiv:2303.08797);Scaling Rectified Flow Transformers for High-Resolution Image Synthesis (Esser et al., arXiv:2403.03206, SD3);π0: A Vision-Language-Action Flow Model for General Robot Control (Black et al., arXiv:2410.24164)。文中 CIFAR-10 数字来自 Rectified Flow 原论文表 1 及后续复现工作(Improving the Training of Rectified Flows, arXiv:2405.20320),不同来源口径略有差异,横比看趋势即可。