Flow Matching 想学什么?
学一个连续时间的“速度场” vθ(x,t),让随机噪声分布 p0 在 ODE 的推动下,逐渐变成数据分布 p1。
也就是:
x0∼p0,dtdxt=vθ(xt,t),x1∼pdata
如果学得好,从 t=0 积分到 t=1,就可以把噪声样本变成真实数据样本。
从 ODE 生成模型开始
Flow Matching 的生成过程是一个连续时间 ODE:
dtdxt=vt(xt)
其中:
- xt 是时间 t 时刻的样本;
- vt(x) 是在位置 x、时间 t 的速度;
- t∈[0,1];
- p0 是简单分布,比如标准高斯;
- p1 是目标数据分布。
如果我们知道真实速度场 vt(x),那么只要解 ODE:
x1=x0+∫01vt(xt)dt
就可以把噪声 x0∼p0 推到数据分布。
所以目标是:
vθ(x,t)≈vt(x)
问题是:真实的 vt(x) 怎么来?
分布随速度场变化:连续性方程
假设 xt 的概率密度是 pt(x)。如果样本按照速度场 vt(x) 运动,那么分布 pt(x) 会满足连续性方程:
∂t∂pt(x)+∇⋅(pt(x)vt(x))=0
连续性方程推导细节见文末
它的含义是:概率质量不会凭空产生或消失,只是在速度场 vt 的推动下流动。
有点像流体力学里的守恒方程。
如果有一个速度场 vt 能让 p0 逐渐变成 p1,那么它必须满足:
⎩⎨⎧∂t∂pt(x)+∇⋅(pt(x)vt(x))=0,pt=0=p0,pt=1=p1.
Flow Matching 的核心就是:
构造一条从 p0 到 p1 的概率路径 pt,然后学习与这条路径对应的速度场。
最理想的训练目标:Flow Matching Objective
如果我们知道真实速度场 ut(x),就可以直接做回归:
LFM(θ)=Et∼U[0,1],x∼pt[∣vθ(x,t)−ut(x)∣2]
这里:
- ut(x) 是真实速度场;
- vθ(x,t) 是神经网络预测的速度场;
- x∼pt 是中间时刻的样本。
这个目标很自然:在每个时间 t、每个位置 x,让网络预测真实的速度。
但是有个大问题:ut(x) 通常是未知的。
因为我们只知道:
p0,p1
却不知道中间分布 pt 以及对应的真实速度场。
Flow Matching 的聪明之处在于:它不直接求复杂的边缘速度场,而是通过条件路径来构造一个可监督学习的目标。符号化表述就是不直接学习 ut(x) ,而是学习 ut(x∣x1) 。
条件概率路径
设真实数据样本为:
x1∼pdata
我们为每个数据点 x1 构造一条从噪声到该数据点附近的条件路径:
pt(x∣x1)
它满足:
p0(x∣x1)≈p0(x)
p1(x∣x1)≈δ(x−x1)
也就是说:
- t=0 时,大致是噪声分布;
- t=1 时,集中到数据点 x1。
边缘分布就是:pt(x)=∫pt(x∣x1)pdata(x1)dx1
也就是说,整体路径 pt 是所有条件路径的混合。
根据我们自己人为设计的条件路径 pt(x∣x1) ,和条件连续性方程
∂t∂pt(x∣x1)+∇⋅(pt(x∣x1)ut(x∣x1))=0
我们可以推导出其条件速度场 ut(x∣x1) 。
这里介绍两种条件路径设计:
- 高斯条件路径:xt=μt(x1)+σtϵ pt(x∣x1)=N(x;μt(x1),σt2I)
- 线性插值路径:xt=(1−t)x0+tx1
高斯条件路径
令:
xt=μt(x1)+σtϵ
其中:
ϵ∼N(0,I)
于是:
pt(x∣x1)=N(x;μt(x1),σt2I)
对 xt 关于 t 求导:
dtdxt=μ˙t(x1)+σ˙tϵ
又因为:
xt−μt(x1)=σtϵ
所以:
ϵ=σtxt−μt(x1)
代回去:
dtdxt=μ˙t(x1)+σtσ˙t(xt−μt(x1))
因此条件速度场为:
ut(x∣x1)=μ˙t(x1)+σtσ˙t(x−μt(x1))
这就是 Flow Matching 中非常经典的一个速度目标。
神经网络可以用样本监督学习:
x1∼pdata,ϵ∼N(0,I),t∼U[0,1]
构造:
xt=μt(x1)+σtϵ
然后训练:
vθ(xt,t)≈ut(xt∣x1)
LCFM(θ)=Et,x1,x∼pt(x∣x1)[∣vθ(x,t)−ut(x∣x1)∣2]
这就是训练时真正使用的目标。
表面上看,这和原本的目标不一样。
原本想学的是边缘速度场:
ut(x)
现在学的是条件速度场:
ut(x∣x1)
那为什么可以?
这就是 Flow Matching 的核心推导。
为什么 Conditional Flow Matching 等价于 Flow Matching?
我们希望证明:LCFM 和 LFM 对 θ 的优化方向是一致的。
先定义边缘分布:
pt(x)=∫pt(x∣x1)pdata(x1)dx1
边缘速度场定义为条件速度场的后验平均:
ut(x)=E[ut(x∣x1)∣x]
更完整地写:
ut(x)=pt(x)∫ut(x∣x1)pt(x∣x1)pdata(x1)dx1
推导细节见文末
这个式子意思是:在同一个位置 x 和时间 t,不同数据点 x1 的条件路径可能都经过这里。边缘速度是这些条件速度的加权平均。
现在来看 CFM loss:
LCFM=E[∣vθ(x,t)−ut(x∣x1)∣2]
对固定的 x,t,里面是:
Ex1∣x,t[∣vθ(x,t)−ut(x∣x1)∣2]
- 预测值:令 V=vθ(x,t)。因为 x 和 t 是固定的,所以对于当前的期望运算 Ex1∣x,t 来说,V 是一个常数(它不依赖于 x1)。
- 目标变量:令 U=ut(x∣x1)。这是一个随机变量,因为它的值取决于你抽到的具体终点 x1。
- 目标均值:令 Uˉ=Ex1∣x,t[U]。这是随机变量 U 的期望值,也就是我们在上一节推导出的边缘速度 ut(x)。注意,Uˉ 也是一个常数。
- 推导流程 可以简化为:
E[∣V−U∣2]=E[∣(V−Uˉ)−(U−Uˉ)∣2]=∣V−Uˉ∣2+E[∣U−Uˉ∣2]
展开平方:
Ex1∣x,t[∣vθ(x,t)−ut(x∣x1)∣2]=∣vθ(x,t)−E[ut(x∣x1)∣x,t]∣2+C(x,t)
其中 C(x,t) 是条件方差项:
C(x,t)=E[∣ut(x∣x1)−ut(x)∣2∣x,t]
它不依赖于 θ。
而:
E[ut(x∣x1)∣x,t]=ut(x)
所以:
LCFM(θ)=LFM(θ)+constant
因此它们有相同的最优解:
vθ∗(x,t)=ut(x)
这就是 Flow Matching 最漂亮的地方:
虽然训练时用的是条件速度 ut(x∣x1),但最优网络学到的是边缘速度 ut(x)。
线性插值路径
一个非常常见、也很直观的路径是:
xt=(1−t)x0+tx1
其中:
x0∼p0,x1∼pdata
这表示从噪声 x0 到数据 x1 做直线插值。
对 t 求导:
dtdxt=x1−x0
所以速度目标就是:
ut=x1−x0
训练目标变成:
L(θ)=Et,x0,x1[∣vθ((1−t)x0+tx1,t)−(x1−x0)∣2]
这就是很多人讲 Flow Matching / Rectified Flow 时最容易理解的形式。
它的含义非常简单:
给网络一个中间点 xt,告诉它这个点应该朝着 x1 的方向走,速度是 x1−x0。
训练完以后,采样时从噪声开始:
x0∼N(0,I)
解 ODE:
dtdxt=vθ(xt,t)
具体到实际图像生成的离散迭代中:
假设离散 step N=50,Δt=501=0.02
xti+1=xti+vθ(xti,ti)⋅Δt
ti+1=ti+Δt
得到:
x1
就是生成样本。
总结
Flow Matching 的数学核心是:
dtdxt=vθ(xt,t)
我们希望这个 ODE 把:
p0⟶p1
于是构造一条概率路径 pt,并学习满足连续性方程的速度场。
原始目标是:
LFM=Et,x∼pt[∣vθ(x,t)−ut(x)∣2]
但边缘速度 ut(x) 不好直接得到,于是使用条件路径:
pt(x∣x1)
得到可计算的条件速度:
ut(x∣x1)
训练:
LCFM=E[∣vθ(x,t)−ut(x∣x1)∣2]
并且由于:
ut(x)=E[ut(x∣x1)∣x,t]
所以 CFM 和 FM 只差一个与 θ 无关的常数,最优解相同。
一些细节推导与理解
- 连续性方程推导
假设在多维空间中,我们任意画一个固定的闭合区域 V,这个区域的表面(边界)记为 ∂V。
区域 V 内部包含的总概率质量,就是把密度 pt(x) 在区域内积分。那么,这个区域内的总概率随时间 t 的变化率就是:
内部变化率=dtd∫Vpt(x)dx=∫V∂t∂pt(x)dx
由于概率不能凭空产生或消失,区域 V 内部概率的任何增加或减少,必须等于通过边界 ∂V 流入或流出的概率。
在边界上的任意一点,流动的通量是 pt(x)vt(x)。如果我们用向外的法向量 n 来表示表面的朝向,那么单位时间内“穿过边界流出”的总量可以通过面积分表示:
流出总量=∮∂V(pt(x)vt(x))⋅nds
因为“内部增加的量”必然等于“外部流入的量”(即负的流出总量),我们得到:
∫V∂t∂pt(x)dx=−∮∂V(pt(x)vt(x))⋅nds
引入散度定理,定理公式为 ∮∂VF⋅nds=∫V∇⋅Fdx。
我们把 F 替换成概率流 pt(x)vt(x),应用在等式右边:
∫V∂t∂pt(x)dx=−∫V∇⋅(pt(x)vt(x))dx
把等式右边移到左边,把两个积分合并起来:
∫V(∂t∂pt(x)+∇⋅(pt(x)vt(x)))dx=0
因为我们最初假定的区域 V 是完全任意选取的。唯一能让积分对所有可能的区域都等于 0 的情况,就是积分号里面的式子在空间中的每一个点处处等于 0。
因此,积分符号可以去掉,我们得到了微观层面(每一个点上)的方程:
∂t∂pt(x)+∇⋅(pt(x)vt(x))=0
- ut(x)=pt(x)∫ut(x∣x1)pt(x∣x1)pdata(x1)dx1
对于每一个固定的终点 x1,其对应的条件概率路径 pt(x∣x1) 和条件速度场 ut(x∣x1) 必须满足连续性方程:
∂t∂pt(x∣x1)=−∇⋅(pt(x∣x1)ut(x∣x1))
我们知道边缘概率 pt(x) 是所有条件概率的积分:
pt(x)=∫pt(x∣x1)pdata(x1)dx1
两边同时对时间 t 求偏导:
∂t∂pt(x)=∫∂t∂pt(x∣x1)pdata(x1)dx1
把第1步的式子代入第2步的等号右边:
∂t∂pt(x)=∫[−∇⋅(pt(x∣x1)ut(x∣x1))]pdata(x1)dx1
因为 ∇⋅ 是对空间变量 x 求导,而积分是对 x1 积分,两者互不干扰,所以可以把 ∇⋅ 提到积分号外面:
∂t∂pt(x)=−∇⋅(∫pt(x∣x1)ut(x∣x1)pdata(x1)dx1)
同时,宏观的边缘分布 pt(x) 和宏观的边缘速度场 ut(x) 本身也必须满足连续性方程:
∂t∂pt(x)=−∇⋅(pt(x)ut(x))
对比第 4 步和第 5 步等号右边的括号内部,我们可以直接让它们相等(要让散度相等,最直接的方法就是令内部的向量场相等):
pt(x)ut(x)=∫pt(x∣x1)ut(x∣x1)pdata(x1)dx1
把 pt(x) 除过去,得到:
ut(x)=pt(x)∫ut(x∣x1)pt(x∣x1)pdata(x1)dx1
- Flow Matching 和 Diffusion 的关系
Score-based diffusion 直接学习 score;DDPM 类模型常通过预测噪声/数据间接得到 score 或采样方向:
sθ(x,t)≈∇xlogpt(x)
然后通过 SDE 或 probability flow ODE 生成样本。
Flow Matching 直接学习速度场:
vθ(x,t)≈ut(x)
二者都在建模一条从噪声到数据的连续路径,但监督信号不同
Flow Matching 的一个优势是训练目标很直接:预测速度
而不是先预测噪声、score 或 denoised sample,再转换成采样动态。
数学上的对比:
-
在 Diffusion 中,预测 Score ∇xlogpt(x),采样 ODE 速度公式(包含漂移项 f 和扩散项 g):
dtdxt=f(xt,t)−21g(t)2∇xlogpt(xt)
需要把预测的 Score 塞进这个带系数的公式里,才能拼凑出最终的速度
-
在 Flow Matching 中,预测速度场 vθ(x,t),采样 ODE 速度公式长这样:
dtdxt=vθ(xt,t)