Flow Matching教程
提示:阅读过程中遇到不明白的地方,可以移步文章后面的补充部分,看看是否能解答疑惑。
引言
近年来,Flow Matching (FM) 已成为生成式建模领域的新兴方法之一 (An introduction to Flow Matching · Cambridge MLG Blog)。它结合了连续正常化流 (Continuous Normalizing Flows, CNFs) 和扩散模型 (Diffusion Models, DMs) 的特点,试图缓解两者各自面临的关键问题 (An introduction to Flow Matching · Cambridge MLG Blog)。简单来说,Flow Matching 提供了一种在不进行数值模拟的情况下训练连续正常化流的方法,从而大幅提升了模型训练的效率 (An introduction to Flow Matching · Cambridge MLG Blog) 。得益于这一优势,Flow Matching 在图像、视频、音频、语音甚至生物结构等多个领域的生成任务中都达到了当前的最新水平 ([2412.06264] Flow Matching Guide and Code)。本教程旨在深入介绍 Flow Matching 的背景和数学原理,并展示其与扩散模型、普通正态流等方法的比较,同时提供代码示例,帮助读者掌握这一技术。
从 Diffusion Model 到 Flow Matching
扩散模型的基本原理及数学公式
扩散模型是一类通过逐步添加噪声来训练生成模型的方法。其基本思想是:定义一个正向过程,从原始数据逐渐注入随机噪声,使数据“扩散”成纯噪声;然后学习一个反向过程,能够将噪声逐步“去噪”还原回数据 (Diffusion Meets Flow Matching) 。正向过程通常以时间 t ∈ [ 0 , 1 ] t\in[0,1] t∈[0,1] 表示,其中 t = 0 t=0 t=0 对应干净的真实数据分布, t = 1 t=1 t=1 对应纯高斯噪声分布。一个经典的正向扩散过程公式为:
z t = α t x + σ t ϵ , ϵ ∼ N ( 0 , I ) (1) \mathbf{z}_t = \alpha_t\, \mathbf{x} + \sigma_t\, \boldsymbol{\epsilon}, \qquad \boldsymbol{\epsilon} \sim \mathcal{N}(0, \mathbf{I}) \tag{1} zt=αtx+σtϵ,ϵ∼N(0,I)(1)
其中 x \mathbf{x} x 表示原始数据(如一张图像), z t \mathbf{z}_t zt 表示在时间 t t t 添加噪声后的数据, α t \alpha_t αt 和 σ t \sigma_t σt 是预先设定的噪声调度(schedule)函数 (Diffusion Meets Flow Matching)。例如,在方差保持(variance-preserving)的扩散方案中可以设定 α t 2 + σ t 2 = 1 \alpha_t^2 + \sigma_t^2 = 1 αt2+σt2=1 (Diffusion Meets Flow Matching)。这样的调度确保当 t t t 从 0 增加到 1 时, z t \mathbf{z}_t zt 从接近原始数据逐渐过渡到接近标准高斯噪声 (Diffusion Meets Flow Matching)。
通过上述正向扩散,我们可以在训练时方便地得到任意时间步的带噪数据样本。而生成过程则是学习将噪声逆转回数据的过程:首先从标准高斯噪声采样一个初始输入(对应 t = 1 t=1 t=1 的 z 1 \mathbf{z}_1 z1),然后让模型逐步预测去噪后的数据分布,将 z t \mathbf{z}_t zt 逆向演化为 z t − Δ t \mathbf{z}_{t-\Delta t} zt−Δt,最终在 t = 0 t=0 t=0 得到一条新的数据样本 (Diffusion Meets Flow Matching)。反向过程可以用一个神经网络来近似实现,例如通过学习预测当前带噪样本的“干净”版本或者直接预测噪声,从而指导每个时间步的去噪 (Diffusion Meets Flow Matching)。典型的扩散模型(如DDPM)训练时会使用变分下界或等价的得分匹配损失,随机采样一个时间 t t t并生成相应的带噪样本,然后让网络预测原始数据或噪声,以此逐步学会逆过程。在图像等数据生成任务中,扩散模型已取得极高质量的生成效果,但它也存在一些不足,例如生成速度较慢(通常需要几十到上百步逐渐去噪)、训练过程依赖特定的随机过程设计等。
扩散模型在数据生成任务中的应用
扩散模型自提出以来已广泛应用于数据生成领域,尤其在图像生成方面取得了巨大的成功。通过巧妙设计正向噪声过程和对应的反向去噪网络,扩散模型能够从纯噪声中生成质量逼真的图像。这一方法的代表性成果包括Denoising Diffusion Probabilistic Models (DDPM)及其众多变体,它们在CIFAR-10、ImageNet等数据集上生成样本的质量达到了或超越GAN等传统方法。在语音合成、文本生成等领域,也有相应的扩散模型(如Grad-TTS用于语音,Diffusion-LM用于自然语言)将原始数据通过噪声扩散来训练生成模型。
值得注意的是,扩散模型提供了一种逐步逼近数据分布的思路,即通过一个马尔可夫链的方式生成数据。这种逐步方法虽然稳定,但在推理(生成)阶段需要多次迭代,计算成本较高。因此,人们开始探寻能否加速生成过程或者找到不同的生成范式。Flow Matching便是在这种背景下被提出的:它尝试直接学习一个连续映射,从简单噪声分布到数据分布,在保持生成质量的同时提高生成速度和训练效率 ([2210.02747] Flow Matching for Generative Modeling) 。
Flow Matching 的提出及核心思想
Flow Matching (流匹配) 由 Yaron Lipman 等人于 2022-2023 年提出 ([2210.02747] Flow Matching for Generative Modeling) 。它是一种建立在连续正常化流 (CNF) 基础上的新型生成建模范式,通过回归概率流的速度场来训练模型,而不需要像传统CNF那样每步都数值积分ODE (An introduction to Flow Matching · Cambridge MLG Blog) 。其核心思想可以概括如下:
-
概率流与速度场:在生成建模中,我们希望将一种简单的初始分布(如标准高斯 p 0 p_0 p0)通过连续演化,转换成目标的复杂数据分布 p 1 p_1 p1。这一演化可视为一个连续流 (flow),满足一个一阶常微分方程 d d t x t = u ( t , x t ) \frac{d}{dt}x_t = u(t,x_t) dtdxt=u(t,xt),其中 u ( t , x ) u(t,x) u(t,x)是时间和状态相关的速度场(vector field)。这个速度场决定了数据如何“流动”从 p 0 p_0 p0 变为 p 1 p_1 p1。
-
连续概率流:对应的,数据分布 p t p_t pt 随时间变化满足连续性方程(运输方程) (An introduction to Flow Matching · Cambridge MLG Blog):
∂ p t ( x ) ∂ t = − ∇ ⋅ [ u t ( x ) p t ( x ) ] , \frac{\partial p_t(x)}{\partial t} = -\nabla \cdot [\,u_t(x)\, p_t(x)\,]\,, ∂t∂pt(x)=−∇⋅[ut(x)pt(x)],
其中 ∇ ⋅ \nabla \cdot ∇⋅ 表示散度算子。直观解释是:分布密度 p t p_t pt 的变化由流动引起的质量守恒决定。如果已知速度场 u t ( x ) u_t(x) ut(x),理论上可以通过积分该方程预测任何时刻的分布。特别地,若定义初始分布 p 0 p_0 p0,则经过流场 u t u_t ut 演化至 t = 1 t=1 t=1 时,得到目标分布 p 1 p_1 p1。数学上可以证明:
log p 1 ( x ) = log p 0 ( x ) − ∫ 0 1 [ ∇ ⋅ u t ] ( x t ) d t , \log p_1(x) = \log p_0(x) - \int_0^1 [\nabla \cdot u_t](x_t)\,dt\,, logp1(x)=logp0(x)−∫01[∇⋅ut](xt)dt,
其中 x t x_t xt表示沿流轨迹从初始位置 x 0 x_0 x0(采自 p 0 p_0 p0)到时间 t t t达到位置 x x x (An introduction to Flow Matching · Cambridge MLG Blog)。 -
Flow Matching思想:如果我们能找到一个合适的速度场 u ( t , x ) u(t,x) u(t,x),使其诱导的流把 p 0 p_0 p0准确地转换成 p 1 p_1 p1,那么我们就训练出了一个连续正常化流模型,可以用ODE求解器快速采样生成数据 ([2210.02747] Flow Matching for Generative Modeling)。传统CNF通过最大似然训练需要反复数值积分计算 ∫ ∇ ⋅ u t d t \int \nabla\cdot u_t\,dt ∫∇⋅utdt以匹配真实 log p 1 \log p_1 logp1,这在高维情况下非常耗时 (An introduction to Flow Matching · Cambridge MLG Blog)。Flow Matching则另辟蹊径——它不直接最大化似然,而是构造一个容易采样的参考概率流,并让模型的速度场与该参考流的速度场尽可能匹配。用公式表示,Flow Matching选择一个参考的“真实”速度场 u ( t , x ) u(t,x) u(t,x),然后令模型的参数化速度场 u θ ( t , x ) u_\theta(t,x) uθ(t,x)通过以下回归损失进行训练 (An introduction to Flow Matching · Cambridge MLG Blog):
L FM ( θ ) = E t ∼ U ( 0 , 1 ) E x ∼ p t [ ∥ u θ ( t , x ) − u ( t , x ) ∥ 2 ] . (2) \mathcal{L}_{\text{FM}}(\theta) = \mathbb{E}_{t\sim U(0,1)} \mathbb{E}_{x \sim p_t}\Big[\|\,u_\theta(t,x) - u(t,x)\,\|^2\Big]\,. \tag{2} LFM(θ)=Et∼U(0,1)Ex∼pt[∥uθ(t,x)−u(t,x)∥2].(2)
这里 t t t从 [ 0 , 1 ] [0,1] [0,1]均匀采样, x ∼ p t x \sim p_t x∼pt表示从参考流在时刻 t t t的分布采样一个样本,然后计算模型输出与参考真值之差的平方。 (An introduction to Flow Matching · Cambridge MLG Blog)直观上,模型在训练中就是对每个时间 t t t、每个空间位置 x x x直接回归对应的速度向量 (An introduction to Flow Matching · Cambridge MLG Blog)。当损失收敛趋近于零时,说明 u θ ( t , x ) u_\theta(t,x) uθ(t,x)几乎在各处都与参考 u ( t , x ) u(t,x) u(t,x)一致,此时模型已经学会了如何将初始分布流动变换为目标分布。
-
模拟-free训练:上述训练过程不需要反复模拟流动或求解ODE,而是一次采样直达,因此称为“免模拟 (simulation-free)”训练 (An introduction to Flow Matching · Cambridge MLG Blog)。相比之下,直接训练CNF(如通过最大似然法)通常需要在每次参数更新时解一个ODE来计算对数密度,这非常耗时;Flow Matching则巧妙地避免了这个问题,通过设计一个参考流程使得任意时刻的数据分布和速度都有解析或可采样的形式,从而能够高效地进行随机梯度训练。
Flow Matching 的核心贡献在于提出了上述回归型的训练目标,但关键问题在于:参考速度场 u ( t , x ) u(t,x) u(t,x) 从何而来? 如果我们能直接得到理想的 u ( t , x ) u(t,x) u(t,x) 把 p 0 p_0 p0 变成 p 1 p_1 p1,那就不需要训练模型了。因此,Flow Matching论文提出了条件流匹配 (Conditional Flow Matching, CFM) 的框架,用以构造一个合适的参考概率路径和对应速度场,使得训练成为可能 (An introduction to Flow Matching · Cambridge MLG Blog)。
Flow Matching 数学推导
时间连续的概率流与条件流
如上所述,构造参考的概率流 ( p t ) t ∈ [ 0 , 1 ] (p_t)_{t\in[0,1]} (pt)t∈[0,1] 以及其对应的速度场 u ( t , x ) u(t,x) u(t,x) 是 Flow Matching 的核心难点。Lipman 等人提出可以通过“条件化”的方式来构造这一流 (An introduction to Flow Matching · Cambridge MLG Blog) 。具体而言,我们可以将整个流分解为简单流的混合:
-
首先从目标分布 q 1 ( x ) q_1(x) q1(x)(假设这就是 p 1 p_1 p1)中采样一个“潜在变量” z z z(通常直接取 z = x 1 z=x_1 z=x1表示目标样本),然后条件在这个 z z z上定义一个从初始到目标的条件概率路径 p t ∣ z ( x t ∣ z ) p_{t|z}(x_t|z) pt∣z(xt∣z) (An introduction to Flow Matching · Cambridge MLG Blog)。也就是说,对于每个固定的 z = x 1 z=x_1 z=x1(一个具体的目标样本),我们设计一条从初始分布流向 z z z的概率演化路径。
-
将上述条件路径对 z z z取平均,就得到全局的边际概率路径 p t ( x ) p_t(x) pt(x) (An introduction to Flow Matching · Cambridge MLG Blog):
p t ( x ) = ∫ p ( z ) p t ∣ z ( x t ∣ z ) d z , p_t(x) \;=\; \int p(z)\;p_{t|z}(x_t \mid z)\;dz\,, pt(x)=∫p(z)pt∣z(xt∣z)dz,
其中 p ( z ) p(z) p(z)可以取为目标分布 q 1 ( x 1 ) q_1(x_1) q1(x1)或者初始分布 q 0 ( x 0 ) q_0(x_0) q0(x0),视具体情况而定 (An introduction to Flow Matching · Cambridge MLG Blog)。
Lipman 等人的工作选择了一个自然的方案:令
z
=
x
1
z=x_1
z=x1来自目标分布
q
1
q_1
q1,即将目标数据点本身作为条件变量 (An introduction to Flow Matching · Cambridge MLG Blog)。这样,在
t
=
1
t=1
t=1时条件路径应该“收敛”到
z
z
z本身,而在
t
=
0
t=0
t=0时条件路径应该与初始分布
p
0
p_0
p0一致 (An introduction to Flow Matching · Cambridge MLG Blog)。用公式表示,他们要求条件概率路径满足边界条件 (An introduction to Flow Matching · Cambridge MLG Blog):
p
0
∣
x
1
(
x
∣
x
1
)
=
p
0
(
x
)
,
p
1
∣
x
1
(
x
∣
x
1
)
=
N
(
x
;
x
1
,
σ
min
2
I
)
→
σ
min
→
0
δ
x
1
(
x
)
,
p_{0|x_1}(x \mid x_1) = p_0(x), \qquad p_{1|x_1}(x \mid x_1) = \mathcal{N}(x; x_1, \sigma_{\min}^2 I) \xrightarrow[\sigma_{\min}\to0]{} \delta_{x_1}(x)\,,
p0∣x1(x∣x1)=p0(x),p1∣x1(x∣x1)=N(x;x1,σmin2I)σmin→0δx1(x),
其中
p
0
(
x
)
p_0(x)
p0(x)是选定的简单初始分布(通常取标准高斯分布
N
(
0
,
I
)
\mathcal{N}(0,I)
N(0,I)),
δ
x
1
(
x
)
\delta_{x_1}(x)
δx1(x)表示在
x
1
x_1
x1处的Dirac delta(理想情况下
t
=
1
t=1
t=1时
x
x
x必定等于
x
1
x_1
x1) (An introduction to Flow Matching · Cambridge MLG Blog)。为了实际操作,
σ
min
\sigma_{\min}
σmin取一个很小的正值,使得
p
1
∣
x
1
p_{1|x_1}
p1∣x1在
x
1
x_1
x1附近高度集中特征与
δ
\delta
δ相近即可,如此边际上
t
=
1
t=1
t=1就接近
q
1
q_1
q1 (An introduction to Flow Matching · Cambridge MLG Blog)。
满足这些条件的条件概率路径并不唯一,有许多种可能选择 (An introduction to Flow Matching · Cambridge MLG Blog)。为简单起见,我们可以选择路径均为高斯分布(所谓“Gaussian probability paths”) (An introduction to Flow Matching · Cambridge MLG Blog)。例如,设定对于每个条件的目标点
x
1
x_1
x1,
x
t
∣
x
1
x_t|x_1
xt∣x1服从高斯分布且均值和标准差都是
t
t
t的函数:
p
t
∣
x
1
(
x
)
=
N
(
x
;
μ
t
(
x
1
)
,
σ
t
(
x
1
)
2
I
)
.
p_{t|x_1}(x) = \mathcal{N}\!\big(x; \mu_t(x_1),\; \sigma_t(x_1)^2 I\big)\,.
pt∣x1(x)=N(x;μt(x1),σt(x1)2I).
我们希望
μ
t
(
x
1
)
\mu_t(x_1)
μt(x1)从0连续变化到
x
1
x_1
x1,
σ
t
(
x
1
)
\sigma_t(x_1)
σt(x1)从1连续变化到0,以满足边界条件。一个简单而有效的选择是线性插值 (An introduction to Flow Matching · Cambridge MLG Blog):
μ
t
(
x
1
)
=
t
x
1
,
σ
t
(
x
1
)
=
(
1
−
t
)
+
t
σ
min
.
\mu_t(x_1) = t\,x_1,\qquad \sigma_t(x_1) = (1-t) + t\,\sigma_{\min}\,.
μt(x1)=tx1,σt(x1)=(1−t)+tσmin.
当
σ
min
≈
0
\sigma_{\min}\approx 0
σmin≈0时,
σ
0
(
x
1
)
≈
1
\sigma_0(x_1)\approx 1
σ0(x1)≈1、
σ
1
(
x
1
)
≈
0
\sigma_1(x_1)\approx 0
σ1(x1)≈0,从而有
ϕ
0
(
x
∣
x
1
)
=
μ
0
(
x
1
)
+
σ
0
(
x
1
)
x
=
0
+
1
⋅
x
=
x
∼
p
0
\phi_0(x|x_1)=\mu_0(x_1)+\sigma_0(x_1)x = 0 + 1\cdot x = x \sim p_0
ϕ0(x∣x1)=μ0(x1)+σ0(x1)x=0+1⋅x=x∼p0(因为
x
∼
N
(
0
,
I
)
x\sim\mathcal{N}(0,I)
x∼N(0,I)),以及
ϕ
1
(
x
∣
x
1
)
=
t
x
1
+
0
⋅
x
=
x
1
\phi_1(x|x_1) = t x_1 + 0 \cdot x = x_1
ϕ1(x∣x1)=tx1+0⋅x=x1,说明路径起点分布为
p
0
p_0
p0、终点收敛到目标样本
x
1
x_1
x1 (An introduction to Flow Matching · Cambridge MLG Blog)。通过这种方式,我们为每个目标数据点
x
1
x_1
x1构造了一条从
p
0
p_0
p0到
x
1
x_1
x1的随机路径。
关键公式推导:条件速度场与边际速度场
一旦确定了条件概率路径
p
t
∣
x
1
(
x
)
p_{t|x_1}(x)
pt∣x1(x),我们就可以推导与之对应的条件速度场
u
t
(
x
∣
x
1
)
u_t(x \mid x_1)
ut(x∣x1)。根据连续性方程在条件分布下的形式 (An introduction to Flow Matching · Cambridge MLG Blog):
∂
p
t
(
x
∣
x
1
)
∂
t
=
−
∇
⋅
[
u
t
(
x
∣
x
1
)
p
t
(
x
∣
x
1
)
]
,
\frac{\partial p_{t}(x|x_1)}{\partial t} = -\nabla \cdot [\,u_t(x\mid x_1)\,p_{t}(x|x_1)\,]\,,
∂t∂pt(x∣x1)=−∇⋅[ut(x∣x1)pt(x∣x1)],
我们可以求出在该条件路径下使这一式成立的
u
t
(
x
∣
x
1
)
u_t(x\mid x_1)
ut(x∣x1) 的解析表达式。例如,对于上述高斯条件路径,可以证明其速度场为 (An introduction to Flow Matching · Cambridge MLG Blog):
u
t
(
x
∣
x
1
)
=
σ
˙
t
(
x
1
)
σ
t
(
x
1
)
(
x
−
μ
t
(
x
1
)
)
+
μ
˙
t
(
x
1
)
.
(3)
u_t(x \mid x_1) \;=\; \frac{\dot{\sigma}_t(x_1)}{\sigma_t(x_1)} \Big(x - \mu_t(x_1)\Big) + \dot{\mu}_t(x_1)\,. \tag{3}
ut(x∣x1)=σt(x1)σ˙t(x1)(x−μt(x1))+μ˙t(x1).(3)
这个公式揭示:条件速度场由两部分组成,一部分与偏移
(
x
−
μ
t
)
(x-\mu_t)
(x−μt) 成正比(表示由于方差收缩导致的“指向均值”的速度),另一部分则是均值本身变化所产生的速度 (An introduction to Flow Matching · Cambridge MLG Blog)。以上述线性插值选择为例,
μ
t
(
x
1
)
=
t
x
1
\mu_t(x_1)=t x_1
μt(x1)=tx1 则
μ
˙
t
=
x
1
\dot{\mu}_t = x_1
μ˙t=x1,
σ
t
(
x
1
)
=
1
−
(
1
−
σ
min
)
t
\sigma_t(x_1) = 1 - (1-\sigma_{\min})t
σt(x1)=1−(1−σmin)t 则
σ
˙
t
=
−
(
1
−
σ
min
)
\dot{\sigma}_t = -(1-\sigma_{\min})
σ˙t=−(1−σmin) 是常数。因此代入(3)式,我们得到具体的
u
t
(
x
∣
x
1
)
u_t(x|x_1)
ut(x∣x1):
u
t
(
x
∣
x
1
)
=
−
(
1
−
σ
min
)
1
−
(
1
−
σ
min
)
t
(
x
−
t
x
1
)
+
x
1
,
u_t(x\mid x_1) = \frac{- (1-\sigma_{\min})}{\,1 - (1-\sigma_{\min})t\,}\,\big(x - t x_1\big) + x_1\,,
ut(x∣x1)=1−(1−σmin)t−(1−σmin)(x−tx1)+x1,
稍作化简可写为
u
t
(
x
∣
x
1
)
=
x
1
−
(
1
−
σ
min
)
x
1
−
(
1
−
σ
min
)
t
u_t(x\mid x_1) = \frac{x_1 - (1-\sigma_{\min})\,x}{\,1 - (1-\sigma_{\min})t\,}
ut(x∣x1)=1−(1−σmin)tx1−(1−σmin)x (An introduction to Flow Matching · Cambridge MLG Blog)。当
σ
min
→
0
\sigma_{\min}\to 0
σmin→0时,简化为
u
t
(
x
∣
x
1
)
=
x
1
−
x
1
−
t
u_t(x\mid x_1) = \frac{x_1 - x}{\,1-t\,}
ut(x∣x1)=1−tx1−x,表示
x
x
x朝着目标
x
1
x_1
x1以匀速移动。
有了条件速度场,我们就能得到边际速度场
u
t
(
x
)
u_t(x)
ut(x),即不考虑条件变量时整体流的速度。 (An introduction to Flow Matching · Cambridge MLG Blog)给出了边际速度场可以表示为对条件速度场的加权期望:
u
t
(
x
)
=
E
x
1
∼
p
1
∣
t
(
⋅
∣
x
)
[
u
t
(
x
∣
x
1
)
]
,
u_t(x) \;=\; \mathbb{E}_{x_1 \sim p_{1|t}(\cdot|x)}\,[\,u_t(x\mid x_1)\,]\,,
ut(x)=Ex1∼p1∣t(⋅∣x)[ut(x∣x1)],
其中
p
1
∣
t
(
x
1
∣
x
)
p_{1|t}(x_1|x)
p1∣t(x1∣x) 是在给定当前状态
x
x
x 时,条件变量
x
1
x_1
x1 的后验分布。等价地,可以通过积分公式表示 (An introduction to Flow Matching · Cambridge MLG Blog):
u
t
(
x
)
=
∫
u
t
(
x
∣
x
1
)
p
t
(
x
∣
x
1
)
q
1
(
x
1
)
p
t
(
x
)
d
x
1
,
u_t(x) \;=\; \int u_t(x\mid x_1)\,\frac{p_t(x\mid x_1)\,q_1(x_1)}{p_t(x)}\,dx_1\,,
ut(x)=∫ut(x∣x1)pt(x)pt(x∣x1)q1(x1)dx1,
这里
q
1
(
x
1
)
q_1(x_1)
q1(x1) 是目标分布(数据分布),
p
t
(
x
)
p_t(x)
pt(x) 是时刻
t
t
t的边际分布。利用之前定义的条件路径和Bayes公式可得到上述关系 (An introduction to Flow Matching · Cambridge MLG Blog)。进一步可以证明,这个
u
t
(
x
)
u_t(x)
ut(x)正是使得边际分布满足连续性方程的速度场 (An introduction to Flow Matching · Cambridge MLG Blog)。换言之,经过这样的构造,我们已经找到了一个明确的(但隐式定义的)参考速度场
u
t
(
x
)
u_t(x)
ut(x),它由易采样的条件路径定义,同时保证了将
p
0
p_0
p0运输到
p
1
p_1
p1。
训练目标与优化方法
有了参考速度场,Flow Matching 的训练目标就可以重新表述为关于条件速度场的回归。 (An introduction to Flow Matching · Cambridge MLG Blog) 推导了原始损失 (2) 与以下条件损失是等价的(梯度相同):
L
CFM
(
θ
)
=
E
t
∼
U
(
0
,
1
)
E
x
1
∼
q
1
E
x
t
∼
p
t
∣
x
1
[
∥
u
θ
(
t
,
x
t
)
−
u
t
(
x
t
∣
x
1
)
∥
2
]
.
(4)
\mathcal{L}_{\text{CFM}}(\theta) = \mathbb{E}_{t\sim U(0,1)} \mathbb{E}_{x_1 \sim q_1} \mathbb{E}_{x_t \sim p_{t|x_1}} \Big[\|\,u_\theta(t, x_t) - u_t(x_t \mid x_1)\,\|^2\Big]\,. \tag{4}
LCFM(θ)=Et∼U(0,1)Ex1∼q1Ext∼pt∣x1[∥uθ(t,xt)−ut(xt∣x1)∥2].(4)
这里我们首先从真实数据分布
q
1
q_1
q1 中采样一个目标样本
x
1
x_1
x1,再根据设定的条件概率路径生成时间
t
t
t处的样本
x
t
x_t
xt (An introduction to Flow Matching · Cambridge MLG Blog)。损失要求模型的预测
u
θ
(
t
,
x
t
)
u_\theta(t,x_t)
uθ(t,xt) 接近我们解析得到的目标
u
t
(
x
t
∣
x
1
)
u_t(x_t|x_1)
ut(xt∣x1)。因为
x
t
x_t
xt的采样和
u
t
(
x
∣
x
1
)
u_t(x|x_1)
ut(x∣x1)的计算在训练中都可直接实现,所以整个过程不需要模拟模型本身的流动,而是利用蒙特卡罗采样来近似计算期望 (An introduction to Flow Matching · Cambridge MLG Blog)。每次随机采样
t
t
t,
x
1
x_1
x1,
x
t
x_t
xt组成训练对,这样经过足够多次迭代,模型的向量场会逐渐逼近参考向量场。
在优化方法上,Flow Matching 的训练使用标准的随机梯度下降法(SGD或Adam等)来最小化上述损失。由于 (4) 式定义了一个无偏的损失梯度估计,只需不断采样并计算梯度即可。值得一提的是,在实现中可以对 t t t采用均匀采样或根据某种启发式分布采样(类似扩散模型中有时对不同 t t t加权采样以平衡训练),但Lipman等人选取均匀分布已被证明有效 (An introduction to Flow Matching · Cambridge MLG Blog)。整个优化过程中不需要特殊的技术,仅需保证模型有足够的容量拟合向量场,以及训练采样覆盖充分即可。
小结:通过上述推导,我们构造了一个以条件流为桥梁,将复杂的边际流学习分解为简单的条件流学习的问题。最终,我们得到一个训练好的参数化向量场 u θ ( t , x ) u_\theta(t,x) uθ(t,x)。在生成时,我们只需从初始分布 p 0 p_0 p0采样一个 x 0 x_0 x0,然后在 t : 0 → 1 t:0\to1 t:0→1上利用学到的 u θ u_\theta uθ求解常微分方程 d x d t = u θ ( t , x ) \frac{dx}{dt}=u_\theta(t,x) dtdx=uθ(t,x),即可得到分布 p 1 p_1 p1 上的样本。这一步可以用标准的ODE求解器实现,并支持自适应步长,从而比扩散模型那种离散多步采样更快 ([2210.02747] Flow Matching for Generative Modeling)。
Flow Matching 与其他模型的比较
Flow Matching vs 扩散模型
关系与异同:Flow Matching 与扩散模型在概念上都涉及“从噪声到数据的连续演化”,因此二者有密切联系。事实上,当Flow Matching选择的概率路径为高斯扩散(即 p t ∣ x 1 p_{t|x_1} pt∣x1 采用与扩散模型相同的随机公式)时,可以证明Flow Matching 与扩散模型在数学上是等价的 (Diffusion Meets Flow Matching) 。也就是说,高斯条件流匹配实际上学到的向量场对应于扩散模型的概率流ODE或反向SDE解。因此,有研究将二者视为“一枚硬币的两面” (Diffusion Meets Flow Matching),可相互转换使用。不过由于实现细节不同,不同框架下训练得到的网络参数会有所差异,但本质生成过程可以对齐 (Diffusion Meets Flow Matching) 。
训练方式:传统扩散模型训练时,通过得分匹配(学习噪声 ϵ \epsilon ϵ或得分函数 ∇ x log p t \nabla_x \log p_t ∇xlogpt)实现,这通常需要一个加权MSE损失(例如 ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 \| \epsilon - \epsilon_\theta(x_t,t)\|^2 ∥ϵ−ϵθ(xt,t)∥2)并考虑噪声调度影响。而Flow Matching直接对向量场用统一的MSE损失训练,不需要对不同 t t t重新加权,训练目标更简洁统一 (公式 (4))。同时,扩散模型训练需要一个固定的正向扩散过程 q ( x t ∣ x 0 ) q(x_t|x_0) q(xt∣x0)来提供带噪样本,但幸运的是常用的扩散过程都有解析采样公式,因此二者在训练采样效率上都很高。
采样与生成效率:扩散模型的生成通常需要多步迭代。如果使用反向扩散SDE,每一步包含添加少量噪声和去噪,典型模型需要数百步才能得到高质量样本。如果使用概率流ODE,可以将扩散模型转换为ODE求解以减少步数,但步数过少会降低质量,需要仔细选取积分步长。而Flow Matching天然就是一个ODE形式,只需使用ODE求解器生成。研究表明,Flow Matching 可以用比扩散模型更少的离散步数产生高质量样本,同时还支持自适应步长的求解器以控制误差 ([2210.02747] Flow Matching for Generative Modeling)。Lipman等人在ImageNet上的实验显示,用Flow Matching训练的CNF模型在样本质量和对数似然上都优于基于扩散的方法,并且可以借助标准ODE解算器实现快速而稳定的采样 ([2210.02747] Flow Matching for Generative Modeling)。
稳定性:据报告,使用Flow Matching框架(即通过回归向量场而非直接得分匹配)来训练扩散过程,会得到更稳健和收敛更快的结果 ([2210.02747] Flow Matching for Generative Modeling)。这可能是因为直接回归向量场减少了深度模型必须学到的复杂加权项,同时避免了扩散模型训练中一些数值问题。因此,从训练角度看,Flow Matching 提供了一种替代的扩散模型训练方法,在实现相同目标的同时提升了稳定性 ([2210.02747] Flow Matching for Generative Modeling)。
灵活性:Flow Matching 相对于传统扩散框架的一大优势在于路径的可定制性。扩散模型通常预先固定了正向噪声过程(如添加高斯噪声),而Flow Matching则允许我们选择任意合理的概率路径。从高斯扩散只是其中一种特殊情况。如果我们选取更优的路径(例如基于最优传输的路径,见下文),Flow Matching 能实现比标准扩散更快的训练和生成,并获得更好的泛化性能 ([2210.02747] Flow Matching for Generative Modeling)。
Flow Matching vs Normalizing Flows (正常化流)
训练效率:普通的正常化流(特别是连续正常化流CNF)通过最大似然训练,需要计算流映射的雅可比行列式或求解瞬时变化的ODE,这在高维时代价很大。相比之下,Flow Matching 的免模拟训练避免了在每次参数更新时都解ODE的问题 (An introduction to Flow Matching · Cambridge MLG Blog)。取而代之的是,通过直接对向量场回归,使得训练效率大大提升。一句话,Flow Matching 把CNF的训练转换成了一个监督学习问题,而不是一个内嵌求解的优化问题。这使得CNF可以在以前难以企及的数据规模和模型规模上进行训练 ([2210.02747] Flow Matching for Generative Modeling)。
计算复杂度:由于Flow Matching的训练仅需采样和前向计算网络,梯度计算也只是通过标准的反向传播,因此其每步复杂度与同等规模的扩散模型类似(都需要对网络前向+计算MSE损失)。但整体训练时长上,Flow Matching 通常更短,因为它的优化目标更直接明了,不像最大似然训练那样需要小步积分累积误差。此外,Flow Matching 可以灵活利用并行计算:例如一次采样一批 ( t , x 1 , x t ) (t, x_1, x_t) (t,x1,xt)三元组,并行计算损失。而CNF最大似然训练通常必须顺序地模拟流动来计算每个样本的对数密度,难以并行。
样本质量和密度估计:正常化流的优势是精确的对数密度估计能力和可逆性。Flow Matching训练得到的模型,本质上仍是一个连续流模型,它保持了可逆性,因而可以对生成的样本计算精确的对数密度。如果需要评估生成分布(例如用于下游的异常检测等),Flow Matching模型可以像普通CNF那样,利用 log p 1 ( x ) = log p 0 ( x 0 ) − ∫ 0 1 ∇ ⋅ u θ ( t , x t ) d t \log p_1(x) = \log p_0(x_0) - \int_0^1 \nabla\cdot u_\theta(t,x_t)\,dt logp1(x)=logp0(x0)−∫01∇⋅uθ(t,xt)dt 来计算密度。在Lipman等人的实验中,Flow Matching在ImageNet上达到了比扩散模型更好的对数似然值 ([2210.02747] Flow Matching for Generative Modeling),这说明它充分发挥了流模型在密度建模上的优势。
对比:可以认为,Flow Matching 的出现缩小了CNF和扩散模型之间的性能差距 (GitHub - atong01/conditional-flow-matching: TorchCFM: a Conditional Flow Matching library)。过去,扩散模型风头盖过了流方法,一个重要原因就是训练CNF过于缓慢难用,而Flow Matching让CNF焕发新生。如今,通过Flow Matching,我们既能获得流模型的优势(计算似然、单模型同时具备生成和密度估计功能),又能享受类似扩散模型的高生成质量和训练稳定性 (GitHub - atong01/conditional-flow-matching: TorchCFM: a Conditional Flow Matching library)。唯一需要注意的是,Flow Matching生成仍需解ODE(虽然步数少,但比一次性映射还是慢一些)。对于那些需要实时生成的场景,普通离散的normalizing flow(一步直接采样)可能更快,不过其生成质量往往不及Flow Matching这类深度流模型。总的来说,在生成质量上Flow Matching可比拟甚至优于扩散模型,在密度估计上优于扩散模型,而训练难度和速度又显著好于传统CNF,可谓折中方案中的上佳者。
Flow Matching 的应用
在图像生成中的应用
Flow Matching 已被成功应用于图像生成任务,并展现出卓越的性能。研究者在大规模图像数据集(如ImageNet)上训练Flow Matching模型,发现相对于扩散模型,FM得到的生成模型在图像质量(如FID分数)和对数似然方面均有提升 ([2210.02747] Flow Matching for Generative Modeling)。尤其值得关注的是,Flow Matching 允许我们选择最优传输(Optimal Transport, OT)路径等更高效的概率流。例如,使用OT位移插值作为概率路径的一种(而非简单高斯扩散),可以产生“笔直”的流动轨迹,使数据点沿接近直线的方式从噪声移动到数据 ([2210.02747] Flow Matching for Generative Modeling)。这样做的好处是:训练时每个 t t t的分布差异更小,模型更容易拟合;生成时路径更短更直,ODE求解步数可以更少,生成更快 ([2210.02747] Flow Matching for Generative Modeling)。Lipman等人的报告显示,基于OT路径的Flow Matching在ImageNet上不仅优于扩散模型,也优于同样结构下的高斯路径Flow Matching,表明了路径选择对性能的影响 ([2210.02747] Flow Matching for Generative Modeling)。
除了高质量的图像合成,Flow Matching在图像领域的另一个应用是图像翻译和插值。由于Flow Matching模型学得了从简单分布到复杂分布的连续映射,我们可以在流空间对图像进行连续操作。例如,对两个不同类别的图像,各自映射到噪声空间后,在噪声空间进行线性插值,再通过Flow Matching流映射回来,可以生成混合特征的图像,达到平滑的图像插值效果。这类似于扩散模型的插值性质,但Flow Matching可以更直接地利用其连续流的结构完成这些任务。
在强化学习中的应用
有趣的是,Flow Matching 的思想也被引入到强化学习 (RL) 领域,主要用来改进策略或价值函数的建模。在决策生成任务中,我们可以将“策略产生行动”的过程视为一种从简单分布(随机初始动作)流向复杂分布(优质动作)的过程。因此,研究者提出使用Flow Matching策略来建模复杂的动作分布,以提高策略的表达能力和学习效率 ([2502.02538] Flow Q-Learning)。
例如,2025年早期的工作 Flow Q-Learning (FQL) ([2502.02538] Flow Q-Learning - arXiv) ([2502.02538] Flow Q-Learning)中,引入了流匹配策略,用Flow Matching的方法来训练离线RL的策略网络。具体而言,传统Q-learning面对连续动作空间或复杂分布时,策略往往受限于参数化形式。而FQL通过让策略网络输出一个向量场,将简单噪声映射为复杂动作分布,从而能够表示任意复杂形状的动作分布 ([2502.02538] Flow Q-Learning)。实验表明,在离线RL基准(D4RL等)上,Flow Q-Learning 能取得比现有方法更强的性能 ([2502.02538] Flow Q-Learning)。
另一个例子是Preference Flow Matching (偏好流匹配, PFM) ([2405.19806] Preference Alignment with Flow Matching - arXiv) 。在强化学习的偏好优化(preference-based RL)中,我们希望根据人类偏好调整模型输出。有研究提出直接用Flow Matching来“流转”模型的输出分布,使其更符合偏好:通过引入一个流模型,将“较不优的输出”映射成“较优的输出” ([2405.19806] Preference Alignment with Flow Matching)。这样,不需要明确定义奖励函数或对预训练模型做大幅fine-tune,仅凭人类偏好数据就能逐渐让模型输出对齐人类期望 ([2405.19806] Preference Alignment with Flow Matching)。这在大型语言模型对齐、人机交互策略优化等方面有潜在应用价值。
总的来说,Flow Matching 在决策领域的应用仍处于起步阶段,但已有成果表明它拓展了生成模型在RL中的用武之地。借助Flow Matching,策略网络或生成模型可以高效地学习从随机策略到最优策略的映射,或者在不引入复杂奖励建模的情况下调整输出分布 (On the Guidance of Flow Matching | Papers With Code)。随着对Flow Matching机制理解的深化,我们有理由期待更多创新的RL算法基于这一思想涌现。
代码示例
下面我们通过一个简单的PyTorch示例代码来演示Flow Matching的训练流程。假设我们有二维数据分布为两个高斯团(模拟简单的“双月”形状),我们的目标是训练一个Flow Matching模型,将标准二维高斯分布 p 0 = N ( 0 , I ) p_0 = \mathcal{N}(0,I) p0=N(0,I) 转换为目标分布 p 1 p_1 p1。我们采用前文介绍的条件高斯路径(线性均值插值)作为参考概率流。
import torch
import torch.nn as nn
import torch.optim as optim
# 设置随机种子
torch.manual_seed(42)
# 定义二维向量场网络,输入包括时间t和状态x=(x1,x2),输出为速度向量u=(u1,u2)
class VectorField(nn.Module):
def __init__(self):
super(VectorField, self).__init__()
# 简单的多层感知机
self.net = nn.Sequential(
nn.Linear(2 + 1, 128), # 输入维度2(x维度)+1(时间t)
nn.ReLU(),
nn.Linear(128, 128),
nn.ReLU(),
nn.Linear(128, 2) # 输出维度2(速度场的两个分量)
)
def forward(self, t, x):
# 将时间t扩展成与x相同批大小的张量,并与x拼接
t_input = t.unsqueeze(-1) if t.dim() == 1 else t # 保证t是二维张量 [batch,1]
t_input = t_input.expand(x.size(0), 1)
inp = torch.cat([t_input, x], dim=1) # [batch, 3]
return self.net(inp)
# 定义参考概率路径的函数:给定目标x1、时间t,从条件分布采样x_t,并计算条件速度场u(t, x_t|x1)
def sample_conditional_path(x1, t, sigma_min=0.0):
"""
根据线性插值路径采样给定时间t下的样本x_t和真实速度u(t, x_t|x1)。
x1: [batch, 2] 目标样本
t: [batch] 时间 (0~1之间)
"""
# 线性插值均值和标准差
t = t.view(-1, 1) # [batch, 1]
mu_t = t * x1 # [batch, 2]
sigma_t = (1 - t) + t * sigma_min # [batch, 1], 广播到2维
# 从标准正态采样一个噪声 eps
eps = torch.randn_like(x1)
# 构造条件路径的样本 x_t = mu_t + sigma_t * eps
x_t = mu_t + sigma_t * eps
# 计算条件速度场 u(t, x_t | x1)
# 按公式 u = (dot(sigma)/sigma) * (x - mu) + dot(mu)
# dot(mu_t) = x1 (因为 mu_t = t*x1, 导数为 x1)
# dot(sigma_t) = -1 + sigma_min (因为 sigma_t = 1 - (1-sigma_min)*t )
dot_mu_t = x1
dot_sigma_t = -1.0 + sigma_min
# (dot(sigma)/sigma) * (x - mu)
term1 = (dot_sigma_t / sigma_t) * (x_t - mu_t) # [batch, 2]
term2 = dot_mu_t # [batch, 2]
u_true = term1 + term2
return x_t, u_true
# 初始化模型和优化器
device = torch.device('cpu')
model = VectorField().to(device)
optimizer = optim.Adam(model.parameters(), lr=1e-3)
# 模拟目标数据分布采样函数(例如两个高斯团)
def sample_target_data(batch_size):
# 随机选择左或右团
comp = torch.randint(0, 2, (batch_size,1))
# 左团中心在(-4,0),右团中心在(+4,0),标准差1
centers = torch.tensor([[-4.0, 0.0],[4.0, 0.0]])
center = centers[comp.view(-1)]
data = center + torch.randn(batch_size, 2) # 加随机扰动
return data
# 训练循环
for step in range(10000):
model.train()
batch_size = 128
# 1. 随机采样 t ~ Uniform(0,1),x1 ~ q1(target data)
t = torch.rand(batch_size, device=device)
x1 = sample_target_data(batch_size).to(device)
# 2. 从条件概率路径采样 x_t 和计算真实速度 u_true
x_t, u_true = sample_conditional_path(x1, t, sigma_min=0.0)
# 3. 计算模型预测的速度 u_pred = u_theta(t, x_t)
u_pred = model(t, x_t)
# 4. 计算 MSE 损失
loss = ((u_pred - u_true) ** 2).mean()
# 5. 优化模型参数
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印训练损失
if step % 1000 == 0:
print(f"Step {step}, loss={loss.item():.4f}")
代码解析:
-
我们定义了
VectorField
类来表示速度场网络 u θ ( t , x ) u_\theta(t,x) uθ(t,x)。它接受时间标量 t t t和状态向量 x x x作为输入,输出与 x x x维度相同的向量 u u u。在实现上,我们将 t t t扩展并与 x x x拼接后通过多层感知机(MLP)计算得到 u u u。 -
函数
sample_conditional_path
实现了条件概率路径的采样和真值速度计算。给定目标样本 x 1 x_1 x1和时间 t t t,首先计算线性内插的均值 μ t = t x 1 \mu_t = t x_1 μt=tx1和标准差 σ t = 1 − t \sigma_t = 1-t σt=1−t(此处取 σ min = 0 \sigma_{\min}=0 σmin=0简化,即最终完全收敛到 x 1 x_1 x1)。然后采样标准正态噪声 ϵ \epsilon ϵ并生成 x t = μ t + σ t ϵ x_t = \mu_t + \sigma_t \epsilon xt=μt+σtϵ,最后根据公式(3)计算条件速度场真值 u true u_{\text{true}} utrue。这里dot_mu_t
对应 μ ˙ t = x 1 \dot{\mu}_t = x_1 μ˙t=x1,dot_sigma_t
对应 σ ˙ t = − 1 \dot{\sigma}_t = -1 σ˙t=−1( σ t = 1 − t \sigma_t = 1-t σt=1−t 导数为 − 1 -1 −1)。返回的 x t x_t xt和 u true u_{\text{true}} utrue将用于训练。 -
模拟的目标数据分布
sample_target_data
生成两团高斯数据,以(-4,0)和(4,0)为中心。这只是为了演示;在真实场景中,这相当于我们的数据集样本。 -
训练循环中,每个step进行以下操作:
- 采样一批均匀分布的时间 t t t以及对应数量的目标数据样本 x 1 x_1 x1。
- 基于
x
1
x_1
x1和
t
t
t调用
sample_conditional_path
得到参考路径的样本 x t x_t xt以及真值速度 u true = u ( t , x t ∣ x 1 ) u_{\text{true}} = u(t,x_t|x_1) utrue=u(t,xt∣x1)。 - 将 ( t , x t ) (t,x_t) (t,xt)输入模型,得到预测速度 u pred = u θ ( t , x t ) u_{\text{pred}} = u_\theta(t,x_t) upred=uθ(t,xt)。
- 计算MSE损失 ∥ u pred − u true ∥ 2 \|u_{\text{pred}} - u_{\text{true}}\|^2 ∥upred−utrue∥2并对模型参数求导更新。
-
训练过程中我们会周期性地输出当前损失,观察其下降。如果一切正确,损失应逐渐减小,表示模型的 u θ ( t , x ) u_\theta(t,x) uθ(t,x)正逐渐逼近真实 u ( t , x ) u(t,x) u(t,x)。
虽然上述代码简单,不一定能在如此少的step就收敛很好,但它完整演示了Flow Matching(特别是Target CFM方案)的训练逻辑。在实践中,我们可以使用更复杂的网络(如ResNet、时序编码等)以及更长的训练,配合GPU加速,让模型学习复杂高维数据集的流。
总结与展望
总结:Flow Matching 为生成建模提供了一种新颖而高效的范式。通过将概率流的学习转化为向量场回归问题,它成功地结合了扩散模型和正常化流的优点,避免了二者的缺陷 (An introduction to Flow Matching · Cambridge MLG Blog)。在不需要模拟采样过程的情况下,Flow Matching 实现了对连续流模型的快速训练 (An introduction to Flow Matching · Cambridge MLG Blog)。这种方法不仅理论上与扩散模型一脉相承(在高斯路径情况下等价) (Diffusion Meets Flow Matching)、在实践中弥补了CNF训练缓慢的短板 (GitHub - atong01/conditional-flow-matching: TorchCFM: a Conditional Flow Matching library),还展现出极大的灵活性和拓展空间。例如,我们可以根据任务需求选择最优的概率路径(高斯、最优传输路径、Schrödinger Bridge等),从而在训练速度、生成质量上取得不同折中。
未来发展方向:展望未来,Flow Matching 还有诸多有待探索和改进之处:
-
路径设计:如何设计出最优的中间概率路径仍是开放问题。当前常用的高斯插值路径易于实现,但并不一定在所有任务上最优。未来可能的发展方向是根据数据特点自适应地选择路径,或者将路径参数化并与模型一同学习。
-
理论分析:虽然Flow Matching在实践中效果出色,但对其理论性质(如收敛性、最优性)的理解尚不完全。例如,在什么条件下Flow Matching训练的解与真实分布匹配?不同路径对损失地形的影响如何?这些问题有待深入研究。一些初步工作已将Flow Matching与Schrödinger桥、最优输运等理论联系起来 (GitHub - atong01/conditional-flow-matching: TorchCFM: a Conditional Flow Matching library) ,未来可能看到更多理论上的融合。
-
指导与控制:扩散模型领域已经发展出丰富的引导(guidance)技术(如Classifier guidance、Classifier-free guidance)来控制生成结果。Flow Matching的引导问题相对未知。有近期工作开始研究如何对任意Flow Matching框架进行条件引导,提出了一些通用的引导方法 (On the Guidance of Flow Matching | Papers With Code) 。未来我们可以期待在Flow Matching模型上实现与扩散模型类似的可控生成,包括条件生成、插值、编辑等功能,使其在应用中更加灵活。
-
新应用领域:Flow Matching 的潜力不仅限于图像等感知数据。在科学计算(如分子动力学模拟中的采样)、金融建模(复杂分布的生成)等领域,也存在将概率分布从一种形态变换为另一形态的问题,Flow Matching或可提供高效解。特别是在强化学习、决策生成方面,Flow Matching已经初露锋芒 (On the Guidance of Flow Matching | Papers With Code)。未来可能看到更多将流匹配融入其它机器学习领域的尝试,例如与能量模型、判别模型结合,或用于数据增强、域自适应等任务。
潜在改进方法:除了上述方向,一些具体的改进思路包括:提高模型架构对时间的建模能力(比如用更强大的时序网络确保在不同 t t t下都能准确预测向量场);结合score matching的信息提高训练稳定性(近期有方法将流匹配与得分匹配相结合,求解Schrödinger Bridge问题 (GitHub - atong01/conditional-flow-matching: TorchCFM: a Conditional Flow Matching library) ;以及针对大规模数据在采样层面的优化(如结合多重粒子来估计期望、使用重要性采样减少方差等)。这些改进都有望进一步提升Flow Matching模型的性能和适用范围。
总而言之,Flow Matching作为生成模型领域的新星,已经展示出令人瞩目的性能和潜力。随着研究的深入,我们有理由相信这一方法将在未来得到更广泛的应用和发展,催生出新一代高效、可控的生成模型。
补充
连续性方程(Continuity Equation)介绍
连续性方程(Continuity Equation)描述了随时间演化的概率密度函数 p t ( x ) p_t(x) pt(x) 的变化,它是流体力学、统计物理和概率论中的一个基本方程。数学上,它表述了某个密度(在这里是概率密度 p t ( x ) p_t(x) pt(x))随时间的演化关系,特别是其如何受到一个向量场(在这里是速度场 u t ( x ) u_t(x) ut(x))的影响。
对于流体或概率密度的演化,连续性方程的形式如下:
∂
p
t
(
x
)
∂
t
+
∇
⋅
[
u
t
(
x
)
p
t
(
x
)
]
=
0
\frac{\partial p_t(x)}{\partial t} + \nabla \cdot [ u_t(x) p_t(x) ] = 0
∂t∂pt(x)+∇⋅[ut(x)pt(x)]=0
或者等价地写成:
∂
p
t
(
x
)
∂
t
=
−
∇
⋅
[
u
t
(
x
)
p
t
(
x
)
]
\frac{\partial p_t(x)}{\partial t} = -\nabla \cdot [ u_t(x) p_t(x) ]
∂t∂pt(x)=−∇⋅[ut(x)pt(x)]
其中:
- p t ( x ) p_t(x) pt(x) 表示在时间 t t t 时刻,点 x x x 处的概率密度。
- u t ( x ) u_t(x) ut(x) 是时间 t t t 处的速度场,表示数据点如何随时间移动。
- ∇ ⋅ \nabla \cdot ∇⋅ 是散度算子,表示某个向量场的发散程度。
这条方程的物理意义是:在一个封闭系统内,概率密度的变化只能来源于“流动”——也就是说, p t ( x ) p_t(x) pt(x) 的变化是由 x x x 附近的概率如何流入或流出决定的。
散度算子 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 介绍
散度(Divergence,记作
∇
⋅
\nabla \cdot
∇⋅)是一个向量场的局部发散程度的度量。对一个向量场
u
t
(
x
)
u_t(x)
ut(x),它的散度定义为:
∇
⋅
u
t
(
x
)
=
∑
i
∂
u
t
,
i
(
x
)
∂
x
i
\nabla \cdot u_t(x) = \sum_{i} \frac{\partial u_{t,i}(x)}{\partial x_i}
∇⋅ut(x)=i∑∂xi∂ut,i(x)
其中:
- u t ( x ) = ( u t , 1 ( x ) , u t , 2 ( x ) , … , u t , d ( x ) ) u_t(x) = (u_{t,1}(x), u_{t,2}(x), \dots, u_{t,d}(x)) ut(x)=(ut,1(x),ut,2(x),…,ut,d(x)) 是一个 d d d 维向量场,每个 u t , i ( x ) u_{t,i}(x) ut,i(x) 是 x x x 的一个分量方向的速度。
- ∂ u t , i ( x ) ∂ x i \frac{\partial u_{t,i}(x)}{\partial x_i} ∂xi∂ut,i(x) 是 u t ( x ) u_t(x) ut(x) 在 i i i 维度上的偏导数。
直观地, ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 表示在点 x x x 处的流场 u t ( x ) u_t(x) ut(x) 是“汇聚”(负散度,表示密度增加)还是“发散”(正散度,表示密度减少)。
例如,在二维情况下:
u
t
(
x
)
=
[
u
1
(
x
1
,
x
2
)
u
2
(
x
1
,
x
2
)
]
u_t(x) = \begin{bmatrix} u_1(x_1, x_2) \\ u_2(x_1, x_2) \end{bmatrix}
ut(x)=[u1(x1,x2)u2(x1,x2)]
其散度计算为:
∇
⋅
u
t
(
x
)
=
∂
u
1
∂
x
1
+
∂
u
2
∂
x
2
\nabla \cdot u_t(x) = \frac{\partial u_1}{\partial x_1} + \frac{\partial u_2}{\partial x_2}
∇⋅ut(x)=∂x1∂u1+∂x2∂u2
∇ ⋅ u t ( x t ) \nabla \cdot u_t(x_t) ∇⋅ut(xt) 解释
在流匹配(Flow Matching)理论中,速度场
u
t
(
x
)
u_t(x)
ut(x) 描述了从初始分布
p
0
p_0
p0 到目标分布
p
1
p_1
p1 的概率流。公式:
log
p
1
(
x
)
=
log
p
0
(
x
)
−
∫
0
1
[
∇
⋅
u
t
]
(
x
t
)
d
t
\log p_1(x) = \log p_0(x) - \int_0^1 [\nabla \cdot u_t](x_t)\,dt
logp1(x)=logp0(x)−∫01[∇⋅ut](xt)dt
可以理解为:
- log p 1 ( x ) \log p_1(x) logp1(x) 是目标分布的对数密度。
- log p 0 ( x ) \log p_0(x) logp0(x) 是初始分布的对数密度。
- ∇ ⋅ u t ( x t ) \nabla \cdot u_t(x_t) ∇⋅ut(xt) 是流动场 u t ( x ) u_t(x) ut(x) 在 x t x_t xt 处的散度。
- ∫ 0 1 [ ∇ ⋅ u t ] ( x t ) d t \int_0^1 [\nabla \cdot u_t](x_t)\,dt ∫01[∇⋅ut](xt)dt 是整个流动过程中密度变化的积分。
这个积分项衡量的是:从初始分布 p 0 p_0 p0 经过流动 u t ( x ) u_t(x) ut(x) 变换到最终分布 p 1 p_1 p1 时,密度的变化程度。
如何计算 ∇ ⋅ u t ( x t ) \nabla \cdot u_t(x_t) ∇⋅ut(xt)?
在具体计算中,假设
u
t
(
x
)
u_t(x)
ut(x) 是一个神经网络,我们通常使用自动微分来计算散度。例如,如果
u
t
(
x
)
u_t(x)
ut(x) 由神经网络
f
θ
(
t
,
x
)
f_\theta(t, x)
fθ(t,x) 预测,我们可以计算:
∇
⋅
u
t
(
x
)
=
∑
i
∂
f
θ
,
i
(
t
,
x
)
∂
x
i
\nabla \cdot u_t(x) = \sum_{i} \frac{\partial f_{\theta, i}(t, x)}{\partial x_i}
∇⋅ut(x)=i∑∂xi∂fθ,i(t,x)
在 PyTorch 或 JAX 中,可以使用 torch.autograd.grad
或 jax.grad
计算这个散度,从而用于 Flow Matching 的训练目标。
总结
- 连续性方程 描述了随时间变化的概率密度 p t ( x ) p_t(x) pt(x) 如何受到速度场 u t ( x ) u_t(x) ut(x) 的影响。
- 散度 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 反映了在点 x x x 处流动的“聚集”或“扩散”程度。
- 在 Flow Matching 中,散度的积分 ∫ 0 1 [ ∇ ⋅ u t ] ( x t ) d t \int_0^1 [\nabla \cdot u_t](x_t) dt ∫01[∇⋅ut](xt)dt 直接影响最终的概率密度 p 1 ( x ) p_1(x) p1(x),这也是 Flow Matching 训练的核心目标之一。
这一理论在概率生成模型中至关重要,因为它提供了一种连续的方式来理解从简单分布到复杂数据分布的转换过程。
在公式:
∫
0
1
[
∇
⋅
u
t
]
(
x
t
)
d
t
\int_0^1 [\nabla \cdot u_t](x_t)\,dt
∫01[∇⋅ut](xt)dt
中,方括号 只是一个数学排版符号,用于强调作用范围,并不影响计算的本质。该公式的含义是:沿着轨迹
x
t
x_t
xt 计算散度
∇
⋅
u
t
\nabla \cdot u_t
∇⋅ut,然后对时间
t
t
t 进行积分。
解析: ∇ ⋅ u t ( x t ) \nabla \cdot u_t(x_t) ∇⋅ut(xt) 的数学意义
这里的 ∇ ⋅ u t ( x t ) \nabla \cdot u_t(x_t) ∇⋅ut(xt) 表示:
- ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x):计算速度场 u t ( x ) u_t(x) ut(x) 在点 x x x 处的散度(divergence)。
-
x
t
x_t
xt 是一个时间演化的点,它的运动由微分方程:
d x t d t = u t ( x t ) \frac{dx_t}{dt} = u_t(x_t) dtdxt=ut(xt)
所决定,即 x t x_t xt 是随时间 t t t 变化的。 - ∇ ⋅ u t ( x t ) \nabla \cdot u_t(x_t) ∇⋅ut(xt):表示计算 u t ( x ) u_t(x) ut(x) 在 x t x_t xt 位置的散度。
换句话说,
∇
⋅
u
t
(
x
t
)
\nabla \cdot u_t(x_t)
∇⋅ut(xt) 表示我们先计算
u
t
(
x
)
u_t(x)
ut(x) 的散度公式:
∇
⋅
u
t
(
x
)
=
∑
i
∂
u
t
,
i
(
x
)
∂
x
i
\nabla \cdot u_t(x) = \sum_{i} \frac{\partial u_{t,i}(x)}{\partial x_i}
∇⋅ut(x)=i∑∂xi∂ut,i(x)
然后,将
x
x
x 替换为沿轨迹
x
t
x_t
xt 的值。
最终,我们对
t
t
t 在
[
0
,
1
]
[0,1]
[0,1] 进行积分:
∫
0
1
∇
⋅
u
t
(
x
t
)
d
t
\int_0^1 \nabla \cdot u_t(x_t) dt
∫01∇⋅ut(xt)dt
表示在流动过程中,散度沿着轨迹
x
t
x_t
xt 进行了积分,衡量整个轨迹上的密度变化。
为什么有时加方括号?
方括号 [ ⋅ ] \left[ \cdot \right] [⋅] 只是为了让公式更清晰,没有实际计算上的意义。在这种情况下, [ ∇ ⋅ u t ] ( x t ) [\nabla \cdot u_t](x_t) [∇⋅ut](xt) 和 ∇ ⋅ u t ( x t ) \nabla \cdot u_t(x_t) ∇⋅ut(xt) 是完全等价的,只是方括号让人更容易看清作用范围。
结论
- ∇ ⋅ u t ( x t ) \nabla \cdot u_t(x_t) ∇⋅ut(xt) 代表在 x t x_t xt 处计算速度场 u t ( x ) u_t(x) ut(x) 的散度。
- 方括号只是为了书写清晰,数学上不影响计算。
- 这个项出现在概率密度的对数公式中,表示流动路径上的整体密度变化。
所以,可以放心地忽略方括号,它只是为了帮助阅读公式的结构,没有实际数学上的区别!
条件概率路径边界条件解释
公式解析
p 0 ∣ x 1 ( x ∣ x 1 ) = p 0 ( x ) , p 1 ∣ x 1 ( x ∣ x 1 ) = N ( x ; x 1 , σ min 2 I ) → σ min → 0 δ x 1 ( x ) . p_{0|x_1}(x \mid x_1) = p_0(x), \qquad p_{1|x_1}(x \mid x_1) = \mathcal{N}(x; x_1, \sigma_{\min}^2 I) \xrightarrow[\sigma_{\min}\to0]{} \delta_{x_1}(x)\,. p0∣x1(x∣x1)=p0(x),p1∣x1(x∣x1)=N(x;x1,σmin2I)σmin→0δx1(x).
该公式描述了条件概率路径 p t ∣ x 1 ( x ∣ x 1 ) p_{t|x_1}(x \mid x_1) pt∣x1(x∣x1) 在 t = 0 t=0 t=0 和 t = 1 t=1 t=1 的边界条件,即:
- 在 t = 0 t=0 t=0 时,条件分布 p 0 ∣ x 1 ( x ∣ x 1 ) p_{0|x_1}(x \mid x_1) p0∣x1(x∣x1) 与初始分布 p 0 ( x ) p_0(x) p0(x) 一致。
- 在 t = 1 t=1 t=1 时,条件分布 p 1 ∣ x 1 ( x ∣ x 1 ) p_{1|x_1}(x \mid x_1) p1∣x1(x∣x1) 是以 x 1 x_1 x1 为均值、协方差为 σ min 2 I \sigma_{\min}^2 I σmin2I 的高斯分布,当 σ min → 0 \sigma_{\min} \to 0 σmin→0 时,该高斯分布收敛到一个Dirac delta 分布( δ x 1 ( x ) \delta_{x_1}(x) δx1(x)),意味着 x x x 在 t = 1 t=1 t=1 时严格收敛到 x 1 x_1 x1。
高斯分布中的 I I I 代表什么?
p
1
∣
x
1
(
x
∣
x
1
)
=
N
(
x
;
x
1
,
σ
min
2
I
)
p_{1|x_1}(x \mid x_1) = \mathcal{N}(x; x_1, \sigma_{\min}^2 I)
p1∣x1(x∣x1)=N(x;x1,σmin2I)
在这个高斯分布中:
- x 1 x_1 x1 是均值,即 p 1 ∣ x 1 p_{1|x_1} p1∣x1 是以 x 1 x_1 x1 为中心的正态分布。
-
σ
min
2
I
\sigma_{\min}^2 I
σmin2I 是协方差矩阵,其中:
- I I I 是单位矩阵(Identity matrix)。
- σ min 2 \sigma_{\min}^2 σmin2 是一个很小的正数,控制分布的方差大小。
具体来说:
- 如果 x x x 是 d d d 维向量,那么 I I I 是 d × d d \times d d×d 维的单位矩阵。
- 协方差矩阵 σ min 2 I \sigma_{\min}^2 I σmin2I 说明不同维度之间没有相关性,且每个维度的方差都是 σ min 2 \sigma_{\min}^2 σmin2。
例如,在二维情况下:
I
=
[
1
0
0
1
]
,
σ
min
2
I
=
[
σ
min
2
0
0
σ
min
2
]
.
I = \begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}, \quad \sigma_{\min}^2 I = \begin{bmatrix} \sigma_{\min}^2 & 0 \\ 0 & \sigma_{\min}^2 \end{bmatrix}.
I=[1001],σmin2I=[σmin200σmin2].
这表示
x
x
x 的每个维度的方差均为
σ
min
2
\sigma_{\min}^2
σmin2,且两个维度之间没有相关性。
为什么 p 1 ∣ x 1 ( x ∣ x 1 ) p_{1|x_1}(x \mid x_1) p1∣x1(x∣x1) 会收敛到 Dirac delta 分布?
当
σ
min
→
0
\sigma_{\min} \to 0
σmin→0 时,
p
1
∣
x
1
(
x
∣
x
1
)
p_{1|x_1}(x \mid x_1)
p1∣x1(x∣x1) 变成:
N
(
x
;
x
1
,
σ
min
2
I
)
→
σ
min
→
0
δ
x
1
(
x
)
.
\mathcal{N}(x; x_1, \sigma_{\min}^2 I) \xrightarrow[\sigma_{\min}\to0]{} \delta_{x_1}(x).
N(x;x1,σmin2I)σmin→0δx1(x).
这里的Dirac delta 分布
δ
x
1
(
x
)
\delta_{x_1}(x)
δx1(x) 是一个理想化的概率分布,它的特性是:
- 当 x = x 1 x = x_1 x=x1 时, δ x 1 ( x ) \delta_{x_1}(x) δx1(x) 取值无穷大。
- 当 x ≠ x 1 x \neq x_1 x=x1 时, δ x 1 ( x ) \delta_{x_1}(x) δx1(x) 取值为 0。
- 但它的积分满足:
∫ δ x 1 ( x ) d x = 1. \int \delta_{x_1}(x) \,dx = 1. ∫δx1(x)dx=1.
也就是说, x x x 只能严格取 x 1 x_1 x1,在别的地方的概率密度为 0。
直观上,你可以把 N ( x ; x 1 , σ min 2 I ) \mathcal{N}(x; x_1, \sigma_{\min}^2 I) N(x;x1,σmin2I) 理解为:
- 当 σ min \sigma_{\min} σmin 较大 时, x x x 仍然围绕 x 1 x_1 x1 服从高斯分布,存在较大方差。
- 当 σ min → 0 \sigma_{\min} \to 0 σmin→0 时, x x x 几乎总是等于 x 1 x_1 x1,此时高斯分布就收缩成 Dirac delta 分布。
总结
- I I I 是单位矩阵,用于确保高斯分布的协方差矩阵是 σ min 2 I \sigma_{\min}^2 I σmin2I,表示每个维度的方差相等且无相关性。
- σ min → 0 \sigma_{\min} \to 0 σmin→0 使得高斯分布收敛到 Dirac delta 分布,表示 x x x 在 t = 1 t=1 t=1 时严格等于目标数据点 x 1 x_1 x1,符合我们希望的 Flow Matching 终点条件。
这个边界条件确保了在 t = 0 t=0 t=0 时, x x x 仍然服从一个简单的初始分布 p 0 ( x ) p_0(x) p0(x)(如标准高斯分布),而在 t = 1 t=1 t=1 时,它严格收敛到 x 1 x_1 x1,完成数据的映射。
上面加点的符号解释
在数学公式中,上面加点的符号(dot notation,
σ
˙
t
\dot{\sigma}_t
σ˙t 或
μ
˙
t
\dot{\mu}_t
μ˙t)表示对时间
t
t
t 的导数。也就是说:
σ
˙
t
=
d
σ
t
d
t
,
μ
˙
t
=
d
μ
t
d
t
\dot{\sigma}_t = \frac{d \sigma_t}{dt}, \quad \dot{\mu}_t = \frac{d \mu_t}{dt}
σ˙t=dtdσt,μ˙t=dtdμt
这是常见的记号,特别是在微分方程和动力系统中,表示某个变量关于时间
t
t
t 的变化率。
如何计算 σ ˙ t \dot{\sigma}_t σ˙t 和 μ ˙ t \dot{\mu}_t μ˙t
在 Flow Matching 里,我们定义了条件概率路径,其中均值和标准差的演化方式如下:
-
均值 μ t ( x 1 ) \mu_t(x_1) μt(x1):
μ t ( x 1 ) = t x 1 \mu_t(x_1) = t x_1 μt(x1)=tx1
这里的 t x 1 t x_1 tx1 代表 t t t 时刻的均值是 x 1 x_1 x1 的线性插值。计算对 t t t 的导数:
μ ˙ t = d d t ( t x 1 ) = x 1 . \dot{\mu}_t = \frac{d}{dt} (t x_1) = x_1. μ˙t=dtd(tx1)=x1.
这说明,随着时间 t t t 变化,均值的变化率是 x 1 x_1 x1。 -
标准差 σ t ( x 1 ) \sigma_t(x_1) σt(x1):
σ t ( x 1 ) = 1 − ( 1 − σ min ) t . \sigma_t(x_1) = 1 - (1 - \sigma_{\min}) t. σt(x1)=1−(1−σmin)t.
这里的 σ min \sigma_{\min} σmin 是一个很小的常数,表示在 t = 1 t=1 t=1 时,标准差不会完全消失,而是收缩到 σ min \sigma_{\min} σmin。计算对 t t t 的导数:
σ ˙ t = d d t ( 1 − ( 1 − σ min ) t ) = − ( 1 − σ min ) . \dot{\sigma}_t = \frac{d}{dt} \left( 1 - (1 - \sigma_{\min}) t \right) = -(1 - \sigma_{\min}). σ˙t=dtd(1−(1−σmin)t)=−(1−σmin).
这表明,标准差随着时间 t t t 线性减少,其变化速率是 − ( 1 − σ min ) -(1 - \sigma_{\min}) −(1−σmin)。
公式解释
在条件速度场公式:
u
t
(
x
∣
x
1
)
=
σ
˙
t
σ
t
(
x
−
μ
t
)
+
μ
˙
t
u_t(x \mid x_1) = \frac{\dot{\sigma}_t}{\sigma_t} (x - \mu_t) + \dot{\mu}_t
ut(x∣x1)=σtσ˙t(x−μt)+μ˙t
中,每一项的计算方式如下:
-
σ ˙ t σ t \frac{\dot{\sigma}_t}{\sigma_t} σtσ˙t 计算:
σ ˙ t σ t = − ( 1 − σ min ) 1 − ( 1 − σ min ) t . \frac{\dot{\sigma}_t}{\sigma_t} = \frac{-(1 - \sigma_{\min})}{1 - (1 - \sigma_{\min}) t}. σtσ˙t=1−(1−σmin)t−(1−σmin). -
( x − μ t ) (x - \mu_t) (x−μt) 计算:
x − μ t = x − t x 1 . x - \mu_t = x - t x_1. x−μt=x−tx1. -
μ ˙ t \dot{\mu}_t μ˙t 计算:
μ ˙ t = x 1 . \dot{\mu}_t = x_1. μ˙t=x1.
最终,将这些值代入,得到:
u
t
(
x
∣
x
1
)
=
−
(
1
−
σ
min
)
1
−
(
1
−
σ
min
)
t
(
x
−
t
x
1
)
+
x
1
.
u_t(x \mid x_1) = \frac{-(1 - \sigma_{\min})}{1 - (1 - \sigma_{\min})t} (x - t x_1) + x_1.
ut(x∣x1)=1−(1−σmin)t−(1−σmin)(x−tx1)+x1.
当
σ
min
→
0
\sigma_{\min} \to 0
σmin→0 时,上式进一步简化为:
u
t
(
x
∣
x
1
)
=
x
1
−
x
1
−
t
.
u_t(x \mid x_1) = \frac{x_1 - x}{1 - t}.
ut(x∣x1)=1−tx1−x.
这表示
x
x
x 以匀速向
x
1
x_1
x1 演化,随着
t
t
t 增加,
x
x
x 会逐渐趋近
x
1
x_1
x1。
总结
- μ ˙ t \dot{\mu}_t μ˙t 和 σ ˙ t \dot{\sigma}_t σ˙t 的计算方式:上点( ˙ \dot{} ˙)表示对时间 t t t 求导。
- μ t ( x 1 ) = t x 1 \mu_t(x_1) = t x_1 μt(x1)=tx1 的导数是 x 1 x_1 x1,表示均值随时间 t t t 线性变化。
- σ t ( x 1 ) = 1 − ( 1 − σ min ) t \sigma_t(x_1) = 1 - (1 - \sigma_{\min})t σt(x1)=1−(1−σmin)t 的导数是 − ( 1 − σ min ) -(1 - \sigma_{\min}) −(1−σmin),表示标准差随时间 t t t 线性减少。
- 速度场
u
t
(
x
∣
x
1
)
u_t(x \mid x_1)
ut(x∣x1) 由两个部分组成:
- 第一项: σ ˙ t σ t ( x − μ t ) \frac{\dot{\sigma}_t}{\sigma_t} (x - \mu_t) σtσ˙t(x−μt),控制数据点向均值靠近的速率。
- 第二项: μ ˙ t \dot{\mu}_t μ˙t,控制均值本身的变化。
这最终决定了在 Flow Matching 过程中,如何让数据从初始分布平稳流向目标数据分布。
如何从加权期望公式推导积分公式?
我们希望从 加权期望公式:
u
t
(
x
)
=
E
x
1
∼
p
1
∣
t
(
⋅
∣
x
)
[
u
t
(
x
∣
x
1
)
]
u_t(x) \;=\; \mathbb{E}_{x_1 \sim p_{1|t}(\cdot|x)}\,[\,u_t(x\mid x_1)\,]\,
ut(x)=Ex1∼p1∣t(⋅∣x)[ut(x∣x1)]
推导出 积分公式:
u
t
(
x
)
=
∫
u
t
(
x
∣
x
1
)
p
t
(
x
∣
x
1
)
q
1
(
x
1
)
p
t
(
x
)
d
x
1
.
u_t(x) \;=\; \int u_t(x\mid x_1)\,\frac{p_t(x\mid x_1)\,q_1(x_1)}{p_t(x)}\,dx_1\,.
ut(x)=∫ut(x∣x1)pt(x)pt(x∣x1)q1(x1)dx1.
这实际上是利用了 条件概率的贝叶斯公式,让我们一步步推导。
第一步:条件期望的定义
在概率论中,对于某个随机变量
X
X
X,其关于条件变量
Y
Y
Y 的期望可以写成:
E
[
f
(
X
)
∣
Y
]
=
∫
f
(
x
)
p
(
X
=
x
∣
Y
)
d
x
.
\mathbb{E}[f(X) \mid Y] = \int f(x) p(X = x \mid Y)\,dx.
E[f(X)∣Y]=∫f(x)p(X=x∣Y)dx.
应用到这里,我们有:
u
t
(
x
)
=
E
x
1
∼
p
1
∣
t
(
⋅
∣
x
)
[
u
t
(
x
∣
x
1
)
]
=
∫
u
t
(
x
∣
x
1
)
p
1
∣
t
(
x
1
∣
x
)
d
x
1
.
u_t(x) = \mathbb{E}_{x_1 \sim p_{1|t}(\cdot|x)}[ u_t(x\mid x_1) ] = \int u_t(x\mid x_1) p_{1|t}(x_1 | x)\, dx_1.
ut(x)=Ex1∼p1∣t(⋅∣x)[ut(x∣x1)]=∫ut(x∣x1)p1∣t(x1∣x)dx1.
第二步:使用贝叶斯公式展开 p 1 ∣ t ( x 1 ∣ x ) p_{1|t}(x_1 | x) p1∣t(x1∣x)
根据 贝叶斯定理:
p
1
∣
t
(
x
1
∣
x
)
=
p
t
(
x
∣
x
1
)
q
1
(
x
1
)
p
t
(
x
)
.
p_{1|t}(x_1 | x) = \frac{p_t(x \mid x_1) q_1(x_1)}{p_t(x)}.
p1∣t(x1∣x)=pt(x)pt(x∣x1)q1(x1).
其中:
- q 1 ( x 1 ) q_1(x_1) q1(x1) 是目标分布,即 p 1 ( x 1 ) p_{1}(x_1) p1(x1),表示最终的数据分布。
- p t ( x ∣ x 1 ) p_t(x \mid x_1) pt(x∣x1) 是在时间 t t t 给定目标 x 1 x_1 x1 时, x x x 的条件分布。
-
p
t
(
x
)
p_t(x)
pt(x) 是时间
t
t
t 的边际分布,即:
p t ( x ) = ∫ p t ( x ∣ x 1 ) q 1 ( x 1 ) d x 1 . p_t(x) = \int p_t(x \mid x_1) q_1(x_1) dx_1. pt(x)=∫pt(x∣x1)q1(x1)dx1.
将贝叶斯公式代入条件期望公式:
u
t
(
x
)
=
∫
u
t
(
x
∣
x
1
)
p
1
∣
t
(
x
1
∣
x
)
d
x
1
u_t(x) = \int u_t(x\mid x_1) p_{1|t}(x_1 | x)\, dx_1
ut(x)=∫ut(x∣x1)p1∣t(x1∣x)dx1
=
∫
u
t
(
x
∣
x
1
)
p
t
(
x
∣
x
1
)
q
1
(
x
1
)
p
t
(
x
)
d
x
1
.
= \int u_t(x\mid x_1) \frac{p_t(x\mid x_1)\,q_1(x_1)}{p_t(x)}\,dx_1.
=∫ut(x∣x1)pt(x)pt(x∣x1)q1(x1)dx1.
这就得到了 积分公式:
u
t
(
x
)
=
∫
u
t
(
x
∣
x
1
)
p
t
(
x
∣
x
1
)
q
1
(
x
1
)
p
t
(
x
)
d
x
1
.
u_t(x) \;=\; \int u_t(x\mid x_1)\,\frac{p_t(x\mid x_1)\,q_1(x_1)}{p_t(x)}\,dx_1.
ut(x)=∫ut(x∣x1)pt(x)pt(x∣x1)q1(x1)dx1.
总结
- 条件期望的定义:
u t ( x ) = E x 1 ∼ p 1 ∣ t ( ⋅ ∣ x ) [ u t ( x ∣ x 1 ) ] = ∫ u t ( x ∣ x 1 ) p 1 ∣ t ( x 1 ∣ x ) d x 1 . u_t(x) = \mathbb{E}_{x_1 \sim p_{1|t}(\cdot|x)}[ u_t(x\mid x_1) ] = \int u_t(x\mid x_1) p_{1|t}(x_1 | x)\, dx_1. ut(x)=Ex1∼p1∣t(⋅∣x)[ut(x∣x1)]=∫ut(x∣x1)p1∣t(x1∣x)dx1. - 贝叶斯定理展开
p
1
∣
t
(
x
1
∣
x
)
p_{1|t}(x_1 | x)
p1∣t(x1∣x):
p 1 ∣ t ( x 1 ∣ x ) = p t ( x ∣ x 1 ) q 1 ( x 1 ) p t ( x ) . p_{1|t}(x_1 | x) = \frac{p_t(x \mid x_1) q_1(x_1)}{p_t(x)}. p1∣t(x1∣x)=pt(x)pt(x∣x1)q1(x1). - 代入得到积分公式:
u t ( x ) = ∫ u t ( x ∣ x 1 ) p t ( x ∣ x 1 ) q 1 ( x 1 ) p t ( x ) d x 1 . u_t(x) \;=\; \int u_t(x\mid x_1)\,\frac{p_t(x\mid x_1)\,q_1(x_1)}{p_t(x)}\,dx_1. ut(x)=∫ut(x∣x1)pt(x)pt(x∣x1)q1(x1)dx1.
直观理解:
- p 1 ∣ t ( x 1 ∣ x ) p_{1|t}(x_1 | x) p1∣t(x1∣x) 表示给定当前状态 x x x 时的目标数据 x 1 x_1 x1 的后验分布。
- 由于 p 1 ∣ t ( x 1 ∣ x ) p_{1|t}(x_1 | x) p1∣t(x1∣x) 不容易直接计算,我们用 贝叶斯定理 重新表达,使得公式中只涉及易计算的项 p t ( x ∣ x 1 ) p_t(x\mid x_1) pt(x∣x1) 和 q 1 ( x 1 ) q_1(x_1) q1(x1)。
这个积分公式给出了 边际速度场 u t ( x ) u_t(x) ut(x) 的显式表达,使得 Flow Matching 的框架可以用于学习从 p 0 p_0 p0 到 p 1 p_1 p1 的概率流。
ODE求解器是什么?如何用于生成数据?
在 Flow Matching 和 连续正常化流 (Continuous Normalizing Flow, CNF) 里,概率密度的演化过程由一个常微分方程 (ODE, Ordinary Differential Equation) 描述:
d
x
d
t
=
u
t
(
x
)
,
\frac{dx}{dt} = u_t(x),
dtdx=ut(x),
其中:
- x x x 是数据点的状态,随时间 t t t 变化;
- u t ( x ) u_t(x) ut(x) 是时间 t t t 处的速度场 (vector field),决定 x x x 如何流动;
- 这个方程描述了 x x x 如何从初始分布 p 0 p_0 p0(通常是高斯分布)逐步演化到目标分布 p 1 p_1 p1。
给定一个训练好的
u
t
(
x
)
u_t(x)
ut(x),我们可以从
p
0
p_0
p0 采样初始点
x
0
x_0
x0,然后用 ODE求解器(numerical ODE solver)沿着
u
t
(
x
)
u_t(x)
ut(x) 计算轨迹,生成新的数据点
x
1
x_1
x1,即:
x
1
=
x
0
+
∫
0
1
u
t
(
x
t
)
d
t
.
x_1 = x_0 + \int_0^1 u_t(x_t) dt.
x1=x0+∫01ut(xt)dt.
ODE求解器的作用
ODE求解器用于 数值地 求解上面的微分方程。典型的 ODE 求解方法包括:
- Euler Method(欧拉法):
x t + Δ t = x t + Δ t ⋅ u t ( x t ) . x_{t+\Delta t} = x_t + \Delta t \cdot u_t(x_t). xt+Δt=xt+Δt⋅ut(xt).
这是一阶方法,每次前进一步 Δ t \Delta t Δt。 - Runge-Kutta Methods(龙格库塔方法,如 RK4):
x t + Δ t = x t + (更高阶逼近的步进) x_{t+\Delta t} = x_t + \text{(更高阶逼近的步进)} xt+Δt=xt+(更高阶逼近的步进)
这些方法使用多个中间点计算更准确的近似。 - Adaptive Solvers(自适应步长求解器):
- 如
dopri5
(Dormand–Prince method),可以动态调整步长,在高误差时减少步长,在误差小的地方增加步长,加速计算。
- 如
在 Flow Matching 或 CNF 训练完成后,我们使用 ODE 求解器 一步步模拟样本从 p 0 p_0 p0 演化到 p 1 p_1 p1,生成新的数据点,这比扩散模型的逐步去噪方法更高效,因为 Flow Matching 只需要求解一次 ODE,而扩散模型通常需要 50-1000 步去噪。
传统CNF的最大似然训练:反复数值积分计算
传统的 连续正常化流 (CNF) 通过最大化对数似然来训练,它利用了概率流ODE:
d
log
p
t
(
x
)
d
t
=
−
∇
⋅
u
t
(
x
)
.
\frac{d\log p_t(x)}{dt} = -\nabla \cdot u_t(x).
dtdlogpt(x)=−∇⋅ut(x).
这意味着:
- 在流动过程中,概率密度 p t ( x ) p_t(x) pt(x) 的变化由速度场的散度 (divergence) ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 决定。
- 如果我们要计算最终的对数密度
log
p
1
(
x
)
\log p_1(x)
logp1(x),需要对
∇
⋅
u
t
(
x
)
\nabla \cdot u_t(x)
∇⋅ut(x) 进行时间积分:
log p 1 ( x ) = log p 0 ( x ) − ∫ 0 1 ∇ ⋅ u t ( x t ) d t . \log p_1(x) = \log p_0(x) - \int_0^1 \nabla \cdot u_t(x_t) dt. logp1(x)=logp0(x)−∫01∇⋅ut(xt)dt.
最大似然训练过程
在 CNF 训练时,我们的目标是最大化对数似然:
max
θ
E
x
1
∼
p
data
[
log
p
1
(
x
1
)
]
.
\max_{\theta} \mathbb{E}_{x_1 \sim p_{\text{data}}} [\log p_1(x_1)].
θmaxEx1∼pdata[logp1(x1)].
由于
log
p
1
(
x
)
\log p_1(x)
logp1(x) 需要通过积分计算:
log
p
1
(
x
)
=
log
p
0
(
x
0
)
−
∫
0
1
∇
⋅
u
t
(
x
t
)
d
t
,
\log p_1(x) = \log p_0(x_0) - \int_0^1 \nabla \cdot u_t(x_t) dt,
logp1(x)=logp0(x0)−∫01∇⋅ut(xt)dt,
所以训练过程每次都需要数值积分
∫
0
1
∇
⋅
u
t
d
t
\int_0^1 \nabla \cdot u_t dt
∫01∇⋅utdt,这在高维情况下计算成本极高,因为:
-
计算 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 很难:
- 需要计算 u t ( x ) u_t(x) ut(x) 的雅可比行列式 ∇ x u t ( x ) \nabla_x u_t(x) ∇xut(x),如果 x x x 维度高,计算开销很大。
- 解决方案:Neural ODE 使用 Hutchinson’s trace estimator 近似计算散度,降低计算量:
∇ ⋅ u t ( x ) ≈ E v ∼ N ( 0 , I ) [ v T J ( x ) v ] , \nabla \cdot u_t(x) \approx \mathbb{E}_{v \sim \mathcal{N}(0, I)} [ v^T J(x) v ], ∇⋅ut(x)≈Ev∼N(0,I)[vTJ(x)v],
其中 J ( x ) J(x) J(x) 是 u t ( x ) u_t(x) ut(x) 对 x x x 的雅可比矩阵, v v v 是随机高斯向量。
-
对 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 进行积分开销大:
- 在每次训练 step,需要求解一个 ODE:
d log p t ( x ) d t = − ∇ ⋅ u t ( x ) , \frac{d\log p_t(x)}{dt} = -\nabla \cdot u_t(x), dtdlogpt(x)=−∇⋅ut(x),
并积分求 log p 1 ( x ) \log p_1(x) logp1(x),这导致训练极为耗时。
- 在每次训练 step,需要求解一个 ODE:
Flow Matching 如何避免这个问题?
Flow Matching 提出的核心改进是:不需要反复计算
∇
⋅
u
t
(
x
)
\nabla \cdot u_t(x)
∇⋅ut(x) 并进行积分,而是直接训练一个
u
t
(
x
)
u_t(x)
ut(x) 来匹配一个已知的概率路径,即:
L
FM
(
θ
)
=
E
t
∼
U
(
0
,
1
)
E
x
∼
p
t
[
∥
u
θ
(
t
,
x
)
−
u
(
t
,
x
)
∥
2
]
.
\mathcal{L}_{\text{FM}}(\theta) = \mathbb{E}_{t\sim U(0,1)} \mathbb{E}_{x \sim p_t}\Big[\|\,u_\theta(t,x) - u(t,x)\,\|^2\Big]\,.
LFM(θ)=Et∼U(0,1)Ex∼pt[∥uθ(t,x)−u(t,x)∥2].
区别:
- 传统 CNF 训练:最大化 log p 1 ( x ) \log p_1(x) logp1(x),需要每步计算 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 并进行积分。
- Flow Matching 训练:只需要拟合一个已知路径上的 u t ( x ) u_t(x) ut(x),避免了计算散度和数值积分。
这样,Flow Matching 在训练阶段更快,同时生成数据时仍然可以使用 ODE 求解器,享受 CNF 采样速度快的优势。
4. 总结
-
ODE求解器 用于生成数据:
- 训练后,给定初始分布 p 0 p_0 p0,用 ODE 求解器沿着 u t ( x ) u_t(x) ut(x) 计算轨迹,生成样本。
- 典型方法包括 Euler, RK4, Adaptive Solvers(如
dopri5
)。 - 采样过程比扩散模型快很多,因为扩散模型需要迭代去噪,而 Flow Matching 直接求解 ODE。
-
传统CNF训练的难点:
- 需要计算散度 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x)。
- 需要对 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 进行积分来计算对数似然 log p 1 ( x ) \log p_1(x) logp1(x)。
- 高维数据时计算量巨大,需用 Hutchinson’s trace estimator 近似 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x),但仍然很慢。
-
Flow Matching 训练如何改进?
- 直接拟合 u t ( x ) u_t(x) ut(x),避免计算 ∇ ⋅ u t ( x ) \nabla \cdot u_t(x) ∇⋅ut(x) 和数值积分,使得训练速度更快。
- 生成时仍然可以用 ODE 求解器高效采样,继承 CNF 采样快的优势。
因此,Flow Matching 提供了一种 比扩散模型生成快,又比传统 CNF 训练简单 的方法!
后记
2025年2月26日13点05分于上海,在GPT 4o with Deep Research帮助下完成。