Flow Matching
流匹配训练网络预测将噪声转化为数据的速度场,这是 Stable Diffusion 3、FLUX.1 和 Movie Gen 背后的训练目标。
流匹配是一种训练生成模型的方法,模型通过沿着学习到的速度场移动,将随机噪声转换为数据。神经网络会学习在 0 到 1 之间的任意时刻,任意点应朝哪个方向、以多快的速度移动;生成样本时,则从高斯噪声开始,通过常微分方程(ODE)求解器对该速度进行积分,直到时间达到 1。Meta AI 和魏茨曼科学研究院的 Yaron Lipman 等人在 ICLR 2023 上发表的论文《生成建模的流匹配》提出了该方法;另外两篇同期论文以整流流和随机插值的名称提出了几乎相同的目标函数。流匹配无需在训练期间模拟 ODE,就能训练连续归一化流,并将扩散模型涵盖为一个特例;它也是 Stable Diffusion 3、FLUX.1、Meta 的 Movie Gen 以及许多近期语音和机器人模型背后的训练目标。
流匹配的工作原理#
训练过程中不会生成任何内容。每个步骤都会抽取一个数据样本 x1、一个来自标准高斯分布的噪声样本 x0,以及一个介于 0 和 1 之间的时间 t,然后在两者之间的直线上取一个点:xt = (1 - t) * x0 + t * x1。该直线上的点以恒定速度 x1 - x0移动,因此网络 v(xt, t)通过普通均方误差进行训练,以预测 x1 - x0。每一对噪声和数据只定义一条路径,但许多路径都会经过任意给定的点;该点处从噪声到数据的整体流速是这些路径速度的平均值。论文证明,对简单的逐对目标进行回归,所得梯度与对难以计算的平均值进行回归相同,因此训练只是一个普通的回归损失函数,无需模拟 ODE。
生成过程会将 dx/dt = v(x, t) 从 t = 0 积分到 t = 1,通常使用欧拉法或更高阶的求解器步骤。下面的 PyTorch代码在两个 2D 点簇上训练一个小型速度网络,然后分别使用 1、2 和 8 个欧拉步骤进行采样:
import torch
from torch import nn
torch.manual_seed(0)
# Velocity network v(x, t) for 2D points; the data are two clusters at (2, 2) and (-2, -2)
net = nn.Sequential(nn.Linear(3, 128), nn.SiLU(), nn.Linear(128, 128), nn.SiLU(), nn.Linear(128, 2))
optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)
centers = torch.tensor([[2.0, 2.0], [-2.0, -2.0]])
for step in range(2000):
x1 = centers[torch.randint(0, 2, (256,))] + 0.2 * torch.randn(256, 2) # data samples
x0 = torch.randn(256, 2) # noise samples
t = torch.rand(256, 1)
xt = (1 - t) * x0 + t * x1 # point on the straight path from noise to data
loss = ((net(torch.cat([xt, t], dim=1)) - (x1 - x0)) ** 2).mean() # regress the path's velocity
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Generate: start from noise and follow the learned velocity field with Euler steps
for steps in (1, 2, 8):
x = torch.randn(1000, 2)
with torch.no_grad():
for i in range(steps):
x = x + net(torch.cat([x, torch.full((1000, 1), i / steps)], dim=1)) / steps
near = (torch.cdist(x, centers).min(dim=1).values < 0.6).float().mean()
print(f"{steps}-step sampling: {near:.0%} of samples land near a cluster")它会输出 1-step sampling: 0% of samples land near a cluster,然后报告 2 步时为 47%、8 步时为 94%。在 t = 0 处,每个噪声点的期望目标相同,即数据的均值,因此一步就会把所有样本送到两个点簇之间的空白区域。每条训练路径都是直线,但起点相近的路径最终会落入不同点簇;将这些路径平均后得到的学习流仍然是弯曲的。因此,步数较少的生成器会采用重流等技术,通过对模型自己的噪声到样本配对重新训练来拉直流,或者将模型蒸馏为一致性模型。
流匹配与相关方法的区别#
- 扩散模型:扩散训练会按照噪声计划逐渐向数据添加噪声,并训练网络预测添加的噪声,然后通过反转该过程进行采样。流匹配论文表明,其目标函数可接受任意高斯概率路径,包括扩散模型使用的路径,并发现这种训练扩散模型的方式更加稳定。直线路径则是另一种独立且简单的选择。两类方法都使用扩散 Transformer(DiT)等架构、无分类器引导和 ODE 采样器。
- 整流流:使用相同的直线插值和速度损失,因此对于线性路径,这两个名称大体上可以互换。整流流论文还加入了重流过程,以进一步拉直轨迹。
- 归一化流:离散归一化流会堆叠可逆层,并通过精确似然进行训练。连续归一化流是一种神经 ODE,它通过 ODE 定义变换,但以最大似然方式训练,每个训练步骤都要求解 ODE。流匹配通过回归训练同类 ODE 模型,无需进行该求解。
- 光流:尽管名称相似,但两者毫无关联。光流是视频帧之间像素的表观运动,而流匹配是在可能的数据空间中移动样本。
流匹配的应用场景#
- 图像生成:Stability AI 使用整流流 Transformer训练了 Stable Diffusion 3,并从偏向中等噪声水平的 Logit 正态分布中采样训练时间步;Black Forest Labs 的 FLUX.1则是一种拥有 120 亿参数的整流流 Transformer。这些文生图模型生成的图像可作为合成数据,为训练YOLO26检测模型的数据集补充稀有物体、天气和视角。
- 视频生成:Meta 的 Movie Gen 是一个使用流匹配训练、拥有 300 亿参数的 Transformer,可生成最长 16 秒、每秒 16 帧的 1080p 视频。
- 语音:Meta 的 Voicebox 使用超过 50,000 小时的语音训练了非自回归流匹配模型;在零样本文本转语音任务中,其词错误率为 1.9%,而 VALL-E 为 5.9%,运行速度最高快 20 倍。后来的 F5-TTS 将流匹配与扩散 Transformer 相结合。
- 机器人控制:Physical Intelligence 的 π0在一个拥有 30 亿参数的视觉语言模型中加入了一个拥有 3 亿参数的流匹配“动作专家”,每次生成包含 50 个未来动作的动作块,经过 10 个积分步骤后,以最高 50 Hz 的频率控制机器人。










