Flow Matching 想学什么? 学一个连续时间的“速度场” vθ(x,t)v_\theta(x,t),让随机噪声分布 p0p_0 在 ODE 的推动下,逐渐变成数据分布 p1p_1。

也就是:

x0∼p0,dxtdt=vθ(xt,t),x1∼pdatax_0 \sim p_0,\qquad \frac{d x_t}{dt}=v_\theta(x_t,t),\qquad x_1 \sim p_{\text{data}}

如果学得好,从 t=0t=0 积分到 t=1t=1,就可以把噪声样本变成真实数据样本。


从 ODE 生成模型开始

Flow Matching 的生成过程是一个连续时间 ODE:

dxtdt=vt(xt)\frac{d x_t}{dt}=v_t(x_t)

其中:

  • xtx_t 是时间 tt 时刻的样本;
  • vt(x)v_t(x) 是在位置 xx、时间 tt 的速度;
  • t∈[0,1]t\in[0,1];
  • p0p_0 是简单分布,比如标准高斯;
  • p1p_1 是目标数据分布。

如果我们知道真实速度场 vt(x)v_t(x),那么只要解 ODE:

x1=x0+∫01vt(xt)dtx_1=x_0+\int_0^1 v_t(x_t)dt

就可以把噪声 x0∼p0x_0\sim p_0 推到数据分布。

所以目标是:

vθ(x,t)≈vt(x)v_\theta(x,t)\approx v_t(x)

问题是:真实的 vt(x)v_t(x) 怎么来?


分布随速度场变化:连续性方程

假设 xtx_t 的概率密度是 pt(x)p_t(x)。如果样本按照速度场 vt(x)v_t(x) 运动,那么分布 pt(x)p_t(x) 会满足连续性方程:

∂pt(x)∂t+∇⋅(pt(x)vt(x))=0\frac{\partial p_t(x)}{\partial t} + \nabla\cdot\bigl(p_t(x)v_t(x)\bigr) = 0

连续性方程推导细节见文末

它的含义是:概率质量不会凭空产生或消失,只是在速度场 vtv_t 的推动下流动。

有点像流体力学里的守恒方程。

如果有一个速度场 vtv_t 能让 p0p_0 逐渐变成 p1p_1,那么它必须满足:

{∂pt(x)∂t+∇⋅(pt(x)vt(x))=0,pt=0=p0,pt=1=p1.\begin{cases} \frac{\partial p_t(x)}{\partial t} + \nabla\cdot\bigl(p_t(x)v_t(x)\bigr) = 0,\\ p_{t=0}=p_0,\\ p_{t=1}=p_1. \end{cases}

Flow Matching 的核心就是:

构造一条从 p0p_0 到 p1p_1 的概率路径 ptp_t,然后学习与这条路径对应的速度场。


最理想的训练目标:Flow Matching Objective

如果我们知道真实速度场 ut(x)u_t(x),就可以直接做回归:

LFM(θ)=Et∼U[0,1],x∼pt[∣vθ(x,t)−ut(x)∣2]\mathcal L_{\text{FM}}(\theta) = \mathbb E_{t\sim U[0,1],x\sim p_t} \left[ \left|v_\theta(x,t)-u_t(x)\right|^2 \right]

这里:

  • ut(x)u_t(x) 是真实速度场;
  • vθ(x,t)v_\theta(x,t) 是神经网络预测的速度场;
  • x∼ptx\sim p_t 是中间时刻的样本。

这个目标很自然:在每个时间 tt、每个位置 xx,让网络预测真实的速度。

但是有个大问题:ut(x)u_t(x) 通常是未知的。

因为我们只知道:

p0,p1p_0,\quad p_1

却不知道中间分布 ptp_t 以及对应的真实速度场。

Flow Matching 的聪明之处在于:它不直接求复杂的边缘速度场,而是通过条件路径来构造一个可监督学习的目标。符号化表述就是不直接学习 ut(x)u_t(x) ,而是学习 ut(x∣x1)u_t(x\mid x_1) 。


条件概率路径

设真实数据样本为:

x1∼pdatax_1\sim p_{\text{data}}

我们为每个数据点 x1x_1 构造一条从噪声到该数据点附近的条件路径:

pt(x∣x1)p_t(x\mid x_1)

它满足:

p0(x∣x1)≈p0(x)p_0(x\mid x_1)\approx p_0(x) p1(x∣x1)≈δ(x−x1)p_1(x\mid x_1)\approx \delta(x-x_1)

也就是说:

  • t=0t=0 时,大致是噪声分布;
  • t=1t=1 时,集中到数据点 x1x_1。

边缘分布就是:pt(x)=∫pt(x∣x1)pdata(x1)dx1p_t(x) = \int p_t(x\mid x_1)p_{\text{data}}(x_1)dx_1 也就是说,整体路径 ptp_t 是所有条件路径的混合。

根据我们自己人为设计的条件路径 pt(x∣x1)p_t(x\mid x_1) ,和条件连续性方程

∂pt(x∣x1)∂t+∇⋅(pt(x∣x1)ut(x∣x1))=0\frac{\partial p_t(x\mid x_1)}{\partial t} + \nabla\cdot \left( p_t(x\mid x_1)u_t(x\mid x_1) \right) = 0

我们可以推导出其条件速度场 ut(x∣x1)u_t(x\mid x_1) 。

这里介绍两种条件路径设计:

  • 高斯条件路径:xt=μt(x1)+σtϵ                  pt(x∣x1)=N(x;μt(x1),σt2I)x_t=\mu_t(x_1)+\sigma_t\epsilon \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ p_t(x\mid x_1) = \mathcal N \left( x;\mu_t(x_1),\sigma_t^2I \right)
  • 线性插值路径:xt=(1−t)x0+tx1x_t=(1-t)x_0+t x_1

高斯条件路径

令:

xt=μt(x1)+σtϵx_t=\mu_t(x_1)+\sigma_t\epsilon

其中:

ϵ∼N(0,I)\epsilon\sim\mathcal N(0,I)

于是:

pt(x∣x1)=N(x;μt(x1),σt2I)p_t(x\mid x_1) = \mathcal N \left( x;\mu_t(x_1),\sigma_t^2I \right)

对 xtx_t 关于 tt 求导:

dxtdt=μ˙t(x1)+σ˙tϵ\frac{d x_t}{dt} = \dot \mu_t(x_1)+\dot\sigma_t\epsilon

又因为:

xt−μt(x1)=σtϵx_t-\mu_t(x_1)=\sigma_t\epsilon

所以:

ϵ=xt−μt(x1)σt\epsilon=\frac{x_t-\mu_t(x_1)}{\sigma_t}

代回去:

dxtdt=μ˙t(x1)+σ˙tσt(xt−μt(x1))\frac{d x_t}{dt} = \dot\mu_t(x_1) + \frac{\dot\sigma_t}{\sigma_t} \left( x_t-\mu_t(x_1) \right)

因此条件速度场为:

ut(x∣x1)=μ˙t(x1)+σ˙tσt(x−μt(x1))u_t(x\mid x_1) = \dot\mu_t(x_1) + \frac{\dot\sigma_t}{\sigma_t} \left( x-\mu_t(x_1) \right)

这就是 Flow Matching 中非常经典的一个速度目标。

神经网络可以用样本监督学习:

x1∼pdata,ϵ∼N(0,I),t∼U[0,1]x_1\sim p_{\text{data}}, \qquad \epsilon\sim\mathcal N(0,I), \qquad t\sim U[0,1]

构造:

xt=μt(x1)+σtϵx_t=\mu_t(x_1)+\sigma_t\epsilon

然后训练:

vθ(xt,t)≈ut(xt∣x1)v_\theta(x_t,t)\approx u_t(x_t\mid x_1) LCFM(θ)=Et,x1,x∼pt(x∣x1)[∣vθ(x,t)−ut(x∣x1)∣2]\mathcal L_{\text{CFM}}(\theta) = \mathbb E_{t,x_1,x\sim p_t(x\mid x_1)} \left[ \left| v_\theta(x,t)-u_t(x\mid x_1) \right|^2 \right]

这就是训练时真正使用的目标。

表面上看,这和原本的目标不一样。

原本想学的是边缘速度场:

ut(x)u_t(x)

现在学的是条件速度场:

ut(x∣x1)u_t(x\mid x_1)

那为什么可以?

这就是 Flow Matching 的核心推导。

为什么 Conditional Flow Matching 等价于 Flow Matching?

我们希望证明:LCFM\mathcal L_{\text{CFM}} 和 LFM\mathcal L_{\text{FM}} 对 θ\theta 的优化方向是一致的。

先定义边缘分布:

pt(x)=∫pt(x∣x1)pdata(x1)dx1p_t(x) = \int p_t(x\mid x_1)p_{\text{data}}(x_1)dx_1

边缘速度场定义为条件速度场的后验平均:

ut(x)=E[ut(x∣x1)∣x]u_t(x) = \mathbb E \left[ u_t(x\mid x_1) \mid x \right]

更完整地写:

ut(x)=∫ut(x∣x1)pt(x∣x1)pdata(x1)dx1pt(x)u_t(x) = \frac{ \int u_t(x\mid x_1)p_t(x\mid x_1)p_{\text{data}}(x_1)dx_1 }{ p_t(x) }

推导细节见文末

这个式子意思是:在同一个位置 xx 和时间 tt,不同数据点 x1x_1 的条件路径可能都经过这里。边缘速度是这些条件速度的加权平均。

现在来看 CFM loss:

LCFM=E[∣vθ(x,t)−ut(x∣x1)∣2]\mathcal L_{\text{CFM}} = \mathbb E \left[ \left| v_\theta(x,t)-u_t(x\mid x_1) \right|^2 \right]

对固定的 x,tx,t,里面是:

Ex1∣x,t[∣vθ(x,t)−ut(x∣x1)∣2]\mathbb E_{x_1\mid x,t} \left[ \left| v_\theta(x,t)-u_t(x\mid x_1) \right|^2 \right]
  • 预测值:令 V=vθ(x,t)V = v_\theta(x, t)。因为 xx 和 tt 是固定的,所以对于当前的期望运算 Ex1∣x,t\mathbb{E}_{x_1|x,t} 来说,VV 是一个常数(它不依赖于 x1x_1)。
  • 目标变量:令 U=ut(x∣x1)U = u_t(x \mid x_1)。这是一个随机变量,因为它的值取决于你抽到的具体终点 x1x_1。
  • 目标均值:令 Uˉ=Ex1∣x,t[U]\bar{U} = \mathbb{E}_{x_1|x,t}[U]。这是随机变量 UU 的期望值,也就是我们在上一节推导出的边缘速度 ut(x)u_t(x)。注意,Uˉ\bar{U} 也是一个常数。
  • 推导流程 可以简化为:
E[∣V−U∣2]=E[∣(V−Uˉ)−(U−Uˉ)∣2]=∣V−Uˉ∣2+E[∣U−Uˉ∣2]\mathbb{E}\left[|V - U|^2\right] = \mathbb{E}\left[|(V - \bar{U}) - (U - \bar{U})|^2\right] = |V - \bar{U}|^2 + \mathbb{E}\left[|U - \bar{U}|^2\right]

展开平方:

Ex1∣x,t[∣vθ(x,t)−ut(x∣x1)∣2]=∣vθ(x,t)−E[ut(x∣x1)∣x,t]∣2+C(x,t)\begin{aligned} &\mathbb E_{x_1\mid x,t} \left[ \left| v_\theta(x,t)-u_t(x\mid x_1) \right|^2 \right] \\ &= \left| v_\theta(x,t) - \mathbb E[u_t(x\mid x_1)\mid x,t] \right|^2 + C(x,t) \end{aligned}

其中 C(x,t)C(x,t) 是条件方差项:

C(x,t)=E[∣ut(x∣x1)−ut(x)∣2∣x,t]C(x,t) = \mathbb E \left[ \left| u_t(x\mid x_1)-u_t(x) \right|^2 \mid x,t \right]

它不依赖于 θ\theta。

而:

E[ut(x∣x1)∣x,t]=ut(x)\mathbb E[u_t(x\mid x_1)\mid x,t]=u_t(x)

所以:

LCFM(θ)=LFM(θ)+constant\mathcal L_{\text{CFM}}(\theta) = \mathcal L_{\text{FM}}(\theta) + \text{constant}

因此它们有相同的最优解:

vθ∗(x,t)=ut(x)v_\theta^*(x,t)=u_t(x)

这就是 Flow Matching 最漂亮的地方:

虽然训练时用的是条件速度 ut(x∣x1)u_t(x\mid x_1),但最优网络学到的是边缘速度 ut(x)u_t(x)。


线性插值路径

一个非常常见、也很直观的路径是:

xt=(1−t)x0+tx1x_t=(1-t)x_0+t x_1

其中:

x0∼p0,x1∼pdatax_0\sim p_0,\qquad x_1\sim p_{\text{data}}

这表示从噪声 x0x_0 到数据 x1x_1 做直线插值。

对 tt 求导:

dxtdt=x1−x0\frac{d x_t}{dt} = x_1-x_0

所以速度目标就是:

ut=x1−x0u_t=x_1-x_0

训练目标变成:

L(θ)=Et,x0,x1[∣vθ((1−t)x0+tx1,t)−(x1−x0)∣2]\mathcal L(\theta) = \mathbb E_{t,x_0,x_1} \left[ \left| v_\theta((1-t)x_0+t x_1,t) - (x_1-x_0) \right|^2 \right]

这就是很多人讲 Flow Matching / Rectified Flow 时最容易理解的形式。

它的含义非常简单:

给网络一个中间点 xtx_t,告诉它这个点应该朝着 x1x_1 的方向走,速度是 x1−x0x_1-x_0。

训练完以后,采样时从噪声开始:

x0∼N(0,I)x_0\sim \mathcal N(0,I)

解 ODE:

dxtdt=vθ(xt,t)\frac{d x_t}{dt}=v_\theta(x_t,t)

具体到实际图像生成的离散迭代中: 假设离散 step N=50,Δt=150=0.02\Delta t = \frac{1}{50} = 0.02 xti+1=xti+vθ(xti,ti)⋅Δtx_{t_{i+1}} = x_{t_i} + v_\theta(x_{t_i}, t_i) \cdot \Delta t ti+1=ti+Δtt_{i+1} = t_i + \Delta t

得到:

x1x_1

就是生成样本。


总结

Flow Matching 的数学核心是:

dxtdt=vθ(xt,t)\boxed{ \frac{d x_t}{dt}=v_\theta(x_t,t) }

我们希望这个 ODE 把:

p0⟶p1p_0 \longrightarrow p_1

于是构造一条概率路径 ptp_t,并学习满足连续性方程的速度场。

原始目标是:

LFM=Et,x∼pt[∣vθ(x,t)−ut(x)∣2]\boxed{ \mathcal L_{\text{FM}} = \mathbb E_{t,x\sim p_t} \left[ |v_\theta(x,t)-u_t(x)|^2 \right] }

但边缘速度 ut(x)u_t(x) 不好直接得到,于是使用条件路径:

pt(x∣x1)p_t(x\mid x_1)

得到可计算的条件速度:

ut(x∣x1)u_t(x\mid x_1)

训练:

LCFM=E[∣vθ(x,t)−ut(x∣x1)∣2]\boxed{ \mathcal L_{\text{CFM}} = \mathbb E \left[ |v_\theta(x,t)-u_t(x\mid x_1)|^2 \right] }

并且由于:

ut(x)=E[ut(x∣x1)∣x,t]u_t(x)= \mathbb E[u_t(x\mid x_1)\mid x,t]

所以 CFM 和 FM 只差一个与 θ\theta 无关的常数,最优解相同。

一些细节推导与理解

  1. 连续性方程推导

假设在多维空间中,我们任意画一个固定的闭合区域 VV,这个区域的表面(边界)记为 ∂V\partial V。

区域 VV 内部包含的总概率质量,就是把密度 pt(x)p_t(x) 在区域内积分。那么,这个区域内的总概率随时间 tt 的变化率就是:

内部变化率=ddt∫Vpt(x) dx=∫V∂pt(x)∂t dx\text{内部变化率} = \frac{d}{dt} \int_V p_t(x) \, dx = \int_V \frac{\partial p_t(x)}{\partial t} \, dx

由于概率不能凭空产生或消失,区域 VV 内部概率的任何增加或减少,必须等于通过边界 ∂V\partial V 流入或流出的概率。

在边界上的任意一点,流动的通量是 pt(x)vt(x)p_t(x)v_t(x)。如果我们用向外的法向量 n\mathbf{n} 来表示表面的朝向,那么单位时间内“穿过边界流出”的总量可以通过面积分表示:

流出总量=∮∂V(pt(x)vt(x))⋅n ds\text{流出总量} = \oint_{\partial V} (p_t(x)v_t(x)) \cdot \mathbf{n} \, ds

因为“内部增加的量”必然等于“外部流入的量”(即负的流出总量),我们得到:

∫V∂pt(x)∂t dx=−∮∂V(pt(x)vt(x))⋅n ds\int_V \frac{\partial p_t(x)}{\partial t} \, dx = - \oint_{\partial V} (p_t(x)v_t(x)) \cdot \mathbf{n} \, ds

引入散度定理,定理公式为 ∮∂VF⋅n ds=∫V∇⋅F dx\oint_{\partial V} \mathbf{F} \cdot \mathbf{n} \, ds = \int_V \nabla \cdot \mathbf{F} \, dx。

我们把 F\mathbf{F} 替换成概率流 pt(x)vt(x)p_t(x)v_t(x),应用在等式右边:

∫V∂pt(x)∂t dx=−∫V∇⋅(pt(x)vt(x)) dx\int_V \frac{\partial p_t(x)}{\partial t} \, dx = - \int_V \nabla \cdot (p_t(x)v_t(x)) \, dx

把等式右边移到左边,把两个积分合并起来:

∫V(∂pt(x)∂t+∇⋅(pt(x)vt(x))) dx=0\int_V \left( \frac{\partial p_t(x)}{\partial t} + \nabla \cdot (p_t(x)v_t(x)) \right) \, dx = 0

因为我们最初假定的区域 VV 是完全任意选取的。唯一能让积分对所有可能的区域都等于 0 的情况,就是积分号里面的式子在空间中的每一个点处处等于 0。

因此,积分符号可以去掉,我们得到了微观层面(每一个点上)的方程:

∂pt(x)∂t+∇⋅(pt(x)vt(x))=0\frac{\partial p_t(x)}{\partial t} + \nabla \cdot (p_t(x)v_t(x)) = 0
  1. ut(x)=∫ut(x∣x1)pt(x∣x1)pdata(x1)dx1pt(x)u_t(x) = \frac{ \int u_t(x\mid x_1)p_t(x\mid x_1)p_{\text{data}}(x_1)dx_1 }{ p_t(x) }

对于每一个固定的终点 x1x_1,其对应的条件概率路径 pt(x∣x1)p_t(x \mid x_1) 和条件速度场 ut(x∣x1)u_t(x \mid x_1) 必须满足连续性方程:

∂pt(x∣x1)∂t=−∇⋅(pt(x∣x1)ut(x∣x1))\frac{\partial p_t(x \mid x_1)}{\partial t} = -\nabla \cdot (p_t(x \mid x_1)u_t(x \mid x_1))

我们知道边缘概率 pt(x)p_t(x) 是所有条件概率的积分:

pt(x)=∫pt(x∣x1)pdata(x1)dx1p_t(x) = \int p_t(x \mid x_1)p_{\text{data}}(x_1)dx_1

两边同时对时间 tt 求偏导:

∂pt(x)∂t=∫∂pt(x∣x1)∂tpdata(x1)dx1\frac{\partial p_t(x)}{\partial t} = \int \frac{\partial p_t(x \mid x_1)}{\partial t} p_{\text{data}}(x_1)dx_1

把第1步的式子代入第2步的等号右边:

∂pt(x)∂t=∫[−∇⋅(pt(x∣x1)ut(x∣x1))]pdata(x1)dx1\frac{\partial p_t(x)}{\partial t} = \int \left[ -\nabla \cdot (p_t(x \mid x_1)u_t(x \mid x_1)) \right] p_{\text{data}}(x_1)dx_1

因为 ∇⋅\nabla \cdot 是对空间变量 xx 求导,而积分是对 x1x_1 积分,两者互不干扰,所以可以把 ∇⋅\nabla \cdot 提到积分号外面:

∂pt(x)∂t=−∇⋅(∫pt(x∣x1)ut(x∣x1)pdata(x1)dx1)\frac{\partial p_t(x)}{\partial t} = -\nabla \cdot \left( \int p_t(x \mid x_1)u_t(x \mid x_1)p_{\text{data}}(x_1)dx_1 \right)

同时,宏观的边缘分布 pt(x)p_t(x) 和宏观的边缘速度场 ut(x)u_t(x) 本身也必须满足连续性方程:

∂pt(x)∂t=−∇⋅(pt(x)ut(x))\frac{\partial p_t(x)}{\partial t} = -\nabla \cdot (p_t(x)u_t(x))

对比第 4 步和第 5 步等号右边的括号内部,我们可以直接让它们相等(要让散度相等,最直接的方法就是令内部的向量场相等):

pt(x)ut(x)=∫pt(x∣x1)ut(x∣x1)pdata(x1)dx1p_t(x)u_t(x) = \int p_t(x \mid x_1)u_t(x \mid x_1)p_{\text{data}}(x_1)dx_1

把 pt(x)p_t(x) 除过去,得到:

ut(x)=∫ut(x∣x1)pt(x∣x1)pdata(x1)dx1pt(x)u_t(x) = \frac{\int u_t(x \mid x_1)p_t(x \mid x_1)p_{\text{data}}(x_1)dx_1}{p_t(x)}
  1. Flow Matching 和 Diffusion 的关系

Score-based diffusion 直接学习 score;DDPM 类模型常通过预测噪声/数据间接得到 score 或采样方向:

sθ(x,t)≈∇xlog⁡pt(x)s_\theta(x,t)\approx \nabla_x \log p_t(x)

然后通过 SDE 或 probability flow ODE 生成样本。

Flow Matching 直接学习速度场:

vθ(x,t)≈ut(x)v_\theta(x,t)\approx u_t(x)

二者都在建模一条从噪声到数据的连续路径,但监督信号不同

Flow Matching 的一个优势是训练目标很直接:预测速度

而不是先预测噪声、score 或 denoised sample,再转换成采样动态。

数学上的对比:

  • 在 Diffusion 中,预测 Score ∇xlog⁡pt(x)\nabla_x \log p_t(x),采样 ODE 速度公式(包含漂移项 ff 和扩散项 gg):

    dxtdt=f(xt,t)−12g(t)2∇xlog⁡pt(xt)\frac{dx_t}{dt} = f(x_t, t) - \frac{1}{2}g(t)^2 \nabla_x \log p_t(x_t)
    需要把预测的 Score 塞进这个带系数的公式里,才能拼凑出最终的速度
  • 在 Flow Matching 中,预测速度场 vθ(x,t)v_\theta(x, t),采样 ODE 速度公式长这样:

dxtdt=vθ(xt,t)\frac{dx_t}{dt} = v_\theta(x_t, t)
Categories