MIT 6.S184 | 基于随机微分方程的生成式AI | 2026 | 笔记 | Lecture 2: Flow Matching
目录
前言
学习 MIT S.184 课程,本篇文章记录课程第二讲:流匹配,记录下个人学习笔记,和大家一起分享交流😄
Website:https://diffusion.csail.mit.edu/
Course Notes:An Introduction to Flow Matching and Diffusion Models
1. Reminder: Flow and Diffusion Models
今天我们开始讨论 流匹配(Flow Matching)。
流匹配是训练流模型的基本算法,也是许多先进生成模型方法背后的重要基础。可以说,这是本课程非常核心的一部分,因为正是这类训练方法,让流模型和扩散模型能够真正从数学定义变成可训练、可生成的模型。
在正式进入流匹配之前,我们先快速回顾上一节课讨论过的流模型和扩散模型:
流模型从一个简单的初始分布开始,通常是标准高斯分布。随后,它通过一个常微分方程(ODE)对样本进行连续演化。这个 ODE 的向量场由神经网络定义,也就是说,神经网络告诉我们在每个时间和位置上,样本应该朝哪个方向移动。
扩散模型的基本思想与流模型非常相似。不同之处在于,扩散模型不再演化一个确定性的 ODE,而是演化一个随机微分方程(SDE)。在 SDE 中,我们会额外加入一个扩散系数,用它来缩放布朗运动的增量。直观地说,扩散模型就是在 ODE 动力学的基础上注入随机噪声。
为了从这些模型中获得样本,我们需要从时间 t = 0 t=0 t=0 到时间 t = 1 t=1 t=1 模拟对应的微分方程,然后返回终点 X 1 X_1 X1 。这个终点就是模型最终生成的对象。
不过,到目前为止,我们只是定义了一个目标:希望模型从初始分布出发,最终生成数据分布中的样本。我们还没有说明如何实现这个目标。也就是说,我们还不知道如何训练神经网络向量场。如果模型没有经过训练,那么从初始噪声出发演化得到的结果通常只会是无意义的样本。
因此,训练的目标就是找到合适的参数,使得前面定义的生成目标在实践中成立。更具体地说,如果我们从随机初始条件出发模拟 ODE,那么希望终点 X 1 X_1 X1 服从数据分布:
X 1 ∼ p data X_1 \sim p_{\text{data}} X1∼pdata
这就是今天要解决的问题。
接下来,我们将推导并解释流匹配算法。虽然推导过程中会涉及一些数学,但最终得到的算法其实非常简单。
Q & A
Q:我们到底知道数据分布的哪些信息?
A:我们通常并不知道数据分布的显式密度函数。
在生成模型中,我们通常只能访问来自数据分布的样本。例如,在图像生成中,我们有一个图像数据集,可以从中取出训练图像,但我们并不知道这些图像背后真实的数据分布密度 p data ( x ) p_{\text{data}}(x) pdata(x) 的解析形式。
这正是生成建模的基本设定:我们只有数据样本,希望学习一个模型来生成新的样本。
这和另一些采样问题不同。例如,在马尔可夫链蒙特卡洛(MCMC)等方法中,常见设定是我们可以访问某个未归一化的密度,但无法直接采样。而在生成模型中,情况通常相反:我们有样本,但不知道密度函数。因此,我们的目标是从已有样本中学习如何生成新的样本。
2. Flow Matching
现在正式开始讨论 Flow Matching。
为了理解流匹配,可以先看一个整体结构。这里可以把它称为 “流匹配矩阵”:
这个矩阵强调了理解流匹配需要掌握的三个核心对象:
- 概率路径(Probability Paths)
- 向量场(Vector Fields)
- 流匹配损失(Flow Matching Loss)
对于每个对象,又都有两个版本:
- 条件版本(conditional version)
- 边缘版本(marginal version)
这里的 “条件版本” 通常是针对单个数据点 z z z 定义的;而 “边缘版本” 则是跨所有数据点、对整个数据分布综合之后得到的对象。
接下来我们会依次看到这三个对象,并且每次都会先讨论条件版本,再讨论边缘版本。目前只需要先记住这些术语,因为它们会反复出现。
2.1 Probability Paths
第一个需要理解的对象是 概率路径(Probability Paths)。
概率路径要回答的问题是:
我们如何从噪声逐渐过渡到数据?
在上一节课中,我们说过,希望将初始噪声分布转换为数据分布。但是中间到底发生了什么?样本应该如何从起点移动到终点?这就需要一个 “路径” 来描述。
因此,概率路径可以理解为一族随时间变化的概率分布。它指定了从初始分布到目标分布之间的连续过渡过程。
在图中,我们可以看到不同数据样本对应的路径。直观上,这些路径是在纯噪声和真实数据之间进行插值。也就是说,时间 t = 0 t=0 t=0 时是纯噪声,时间 t = 1 t=1 t=1 时是数据点,而中间时间则表示二者之间的过渡状态。
下面我们正式定义这个对象。
首先提醒一下,在本课程中,每个数据点都被视为一个向量。设数据点为:
z ∈ R d z\in \mathbb{R}^d z∈Rd
接下来需要引入一个特殊分布:狄拉克分布(Dirac distribution),记作:
δ z \delta_z δz
它的含义是:
X ∼ δ z ⟺ X = z X \sim \delta_z \Longleftrightarrow X=z X∼δz⟺X=z
也就是说,如果一个随机变量服从 δ z \delta_z δz ,那么从这个分布中采样时,总是得到同一个点 z z z 。
因此,狄拉克分布可以理解为集中在单个点上的分布。它没有真正的随机性,但在数学上我们仍然把它当作一种概率分布来处理。
2.1.1 Conditional Probability Paths
现在我们可以定义 条件概率路径(conditional probability path)。
给定一个数据点 z z z ,条件概率路径是一族关于时间变化的条件分布:
p t ( x ∣ z ) , 0 ≤ t ≤ 1 , x , z ∈ R d p_t(x\mid z), \quad 0\leq t\leq 1, \quad x,z\in \mathbb{R}^d pt(x∣z),0≤t≤1,x,z∈Rd
其中, t t t 表示时间, x x x 表示分布中的变量, z z z 表示给定的数据点。
这个条件概率路径需要满足两个条件。
首先,对于任意固定的数据点 z z z 和时间 t t t , p t ( ⋅ ∣ z ) p_t(\cdot\mid z) pt(⋅∣z) 都必须是一个合法的概率分布。
其次,它需要满足起点和终点条件:
p 0 ( ⋅ ∣ z ) = p init , p 1 ( ⋅ ∣ z ) = δ z p_0(\cdot\mid z)=p_{\text{init}}, \qquad p_1(\cdot\mid z)=\delta_z p0(⋅∣z)=pinit,p1(⋅∣z)=δz
第一个条件表示,在时间 t = 0 t=0 t=0 时,条件概率路径从初始分布出发。这个初始分布通常是标准高斯分布,并且与数据点 z z z 无关。也就是说,在起点处,我们还没有关于具体数据点的信息,只是从一个简单的噪声分布开始。
第二个条件表示,在时间 t = 1 t=1 t=1 时,条件概率路径到达数据点 z z z 。此时分布坍缩为狄拉克分布 δ z \delta_z δz ,也就是说,从这个分布中采样时总是得到同一个数据点 z z z 。
下面是一个条件概率路径的可视化:
图中的红色星形表示给定的数据点 z z z 。可以看到,随着时间从 0 0 0 增加到 1 1 1 ,一个初始高斯分布逐渐向这个数据点收缩,并最终坍缩到红色星形所在的位置。
目前,这只是一个定义,但它非常关键。后面我们会看到,流匹配训练算法正是建立在这种条件概率路径之上的。特别地,我们需要能够从这些中间分布中采样,从而构造训练目标。
需要注意的是,条件概率路径并不是唯一的。如何从初始分布过渡到数据点,是一个设计选择。不同的路径设计会对应不同的训练方式和模型行为。
一个非常重要、也最常用的例子是 高斯概率路径(Gaussian probability path)。
为了定义它,我们先引入两个时间相关的系数:
α t , β t ∈ R \alpha_t,\beta_t\in \mathbb{R} αt,βt∈R
它们通常被称为噪声调度器或插值调度器。这里需要记住的是, α t \alpha_t αt 和 β t \beta_t βt 是我们可以选择的已知函数,它们不是模型需要学习的参数。
它们需要满足边界条件:
α 0 = β 1 = 0 , α 1 = β 0 = 1 \alpha_0=\beta_1=0, \qquad \alpha_1=\beta_0=1 α0=β1=0,α1=β0=1
也就是说, α t \alpha_t αt 从 0 0 0 逐渐变化到 1 1 1 ,而 β t \beta_t βt 从 1 1 1 逐渐变化到 0 0 0 。
一个最简单的选择是:
α t = t , β t = 1 − t \alpha_t=t, \qquad \beta_t=1-t αt=t,βt=1−t
当然,我们也可以选择其他形式的调度器。当前阶段只需要知道: α t \alpha_t αt 和 β t \beta_t βt 是人为设定的时间函数,它们控制数据成分和噪声成分在不同时间的比例。
有了这两个调度器之后,高斯条件概率路径定义为:
p t ( ⋅ ∣ z ) = N ( α t z , β t 2 I d ) p_t(\cdot\mid z) = \mathcal{N}(\alpha_t z,\beta_t^2 I_d) pt(⋅∣z)=N(αtz,βt2Id)
也就是说,在时间 t t t ,这个条件分布是一个高斯分布:
- 均值为 α t z \alpha_t z αtz ;
- 协方差为 β t 2 I d \beta_t^2 I_d βt2Id 。
这个定义非常直观。随着时间从 0 0 0 增加到 1 1 1 ,均值会从 0 0 0 移动到数据点 z z z ,而方差会从 I d I_d Id 逐渐缩小到 0 0 0 。因此,分布会从标准高斯噪声逐渐变成集中在数据点 z z z 上的狄拉克分布。
我们检查一下它是否满足条件概率路径的定义。
首先,对于任意 t t t ,高斯分布本身是一个合法的概率分布,因此第一个条件成立。
其次,检查起点:
p 0 ( ⋅ ∣ z ) = N ( α 0 z , β 0 2 I d ) = N ( 0 , I d ) p_0(\cdot\mid z) = \mathcal{N}(\alpha_0z,\beta_0^2I_d) =\mathcal{N}(0,I_d) p0(⋅∣z)=N(α0z,β02Id)=N(0,Id)
由于 α 0 = 0 \alpha_0=0 α0=0 、 β 0 = 1 \beta_0=1 β0=1 ,所以时间 t = 0 t=0 t=0 时,分布就是标准高斯分布,并且与数据点 z z z 无关。这正是我们希望的初始分布:
p init = N ( 0 , I d ) p_{\text{init}}=\mathcal{N}(0,I_d) pinit=N(0,Id)
再检查终点:
p 1 ( ⋅ ∣ z ) = N ( α 1 z , β 1 2 I d ) = N ( z , 0 ) = δ z p_1(\cdot\mid z) = \mathcal{N}(\alpha_1z,\beta_1^2I_d) =\mathcal{N}(z,0) =\delta_z p1(⋅∣z)=N(α1z,β12Id)=N(z,0)=δz
由于 α 1 = 1 \alpha_1=1 α1=1 、 β 1 = 0 \beta_1=0 β1=0 ,所以时间 t = 1 t=1 t=1 时,均值为 z z z ,方差为 0 0 0 。这意味着分布完全坍缩到数据点 z z z ,也就是狄拉克分布 δ z \delta_z δz 。
因此,高斯概率路径确实满足条件概率路径的定义:它从标准高斯分布出发,最终到达给定数据点。
目前,高斯概率路径只是一个基础模块。但后面我们会看到,它将直接用于构造流匹配的训练目标。
Q & A
Q:概率路径可以理解为分布之间的插值吗?
A:可以。概率路径本质上就是一族随时间变化的分布,它在起点分布和终点分布之间进行插值。
在条件概率路径中,起点是初始噪声分布 p init p_{\text{init}} pinit ,终点是集中在单个数据点 z z z 上的狄拉克分布 δ z \delta_z δz 。因此,它描述的是如何从噪声分布逐渐过渡到某个具体数据点。
Q:为什么要关心到达单个数据点?它是否可以看作一族插值路径?
A:是的,它可以看作一族插值路径。
对于每一个数据点 z z z ,我们都可以定义一条从初始分布到 δ z \delta_z δz 的条件概率路径。同时,对于每一种满足边界条件的 α t \alpha_t αt 和 β t \beta_t βt ,也会得到一种不同的概率路径。
因此,从整体上看,条件概率路径确实是一族路径。它既依赖于数据点 z z z ,也依赖于我们选择的调度器 α t \alpha_t αt 和 β t \beta_t βt 。
至于为什么要关心到达单个数据点,原因在于训练时我们只能访问数据分布中的样本,而不是完整的数据分布密度。通过先构造 “从噪声到单个数据样本” 的条件路径,我们可以基于已有数据样本建立训练目标。后面再把这些条件路径在整个数据分布上进行平均,就会得到面向整体数据分布的边缘路径。
2.1.2 Marginal Probability Paths
前面我们定义了 条件概率路径(conditional probability path)。它描述的是:给定一个具体数据点 z z z ,如何从初始噪声分布逐渐过渡到这个数据点。
接下来,我们要从条件概率路径过渡到 边缘概率路径(marginal probability path)。
所谓 “边缘化”,意思是我们不再只针对某一个固定数据点 z z z 进行操作,而是考虑所有可能的数据点。也就是说,我们现在要让数据点 z z z 本身也变成随机变量,并且令它服从数据分布:
z ∼ p data z\sim p_{\text{data}} z∼pdata
在条件概率路径中,我们写作:
p t ( x ∣ z ) p_t(x\mid z) pt(x∣z)
它依赖于给定的数据点 z z z 。而边缘概率路径则写作:
p t ( x ) p_t(x) pt(x)
它不再显式依赖某个具体的数据点,因为我们已经把数据点 z z z 边缘化掉了。
具体来说,从边缘概率路径 p t p_t pt 中采样可以按照下面的过程进行:
z ∼ p data , x ∼ p t ( ⋅ ∣ z ) ⇒ x ∼ p t z \sim p_{\text{data}}, \qquad x\sim p_t(\cdot \mid z) \quad \Rightarrow \quad x\sim p_t z∼pdata,x∼pt(⋅∣z)⇒x∼pt
也就是说,我们先从数据分布中采样一个数据点 z z z ,然后再从对应的条件概率路径 p t ( ⋅ ∣ z ) p_t(\cdot\mid z) pt(⋅∣z) 中采样一个点 x x x 。如果我们只观察 x x x ,而不关心它来自哪个具体的 z z z ,那么 x x x 所服从的分布就是边缘概率路径 p t p_t pt 。
对于高斯概率路径来说,这个过程可以理解为:先采样一个真实数据点,然后对它按照当前时间 t t t 加入一定程度的高斯噪声。随着 t t t 从 0 0 0 增加到 1 1 1,噪声逐渐减少,数据成分逐渐增强。
这个过程也可以看作一个简单的图模型:
z ∼ p data , x ∼ p t ( ⋅ ∣ z ) z \sim p_{\text{data}}, \qquad x \sim p_t(\cdot\mid z) z∼pdata,x∼pt(⋅∣z)
其中, z z z 是从数据分布采样得到的潜在数据点, x x x 是在给定 z z z 后,从条件概率路径中采样得到的中间状态。
下面我们通过可视化来理解这一点:
前面展示的条件概率路径,是从一个初始分布逐渐坍缩到某个固定的数据点。现在,我们不再固定这个红点,而是让它从数据分布中随机采样出来。这样,每次采样都会得到不同的数据点 z z z ,并围绕不同的 z z z 构造对应的条件路径。
下面展示的是边缘概率路径的采样过程:
可以看到,随着时间推移,这个边缘分布在高斯噪声和数据分布之间平滑插值。在时间 t = 0 t=0 t=0 时,它是初始高斯噪声分布;在时间 t = 1 t=1 t=1 时,它变成数据分布。
我们可以验证这两个端点。
首先看 t = 0 t=0 t=0 。由于条件概率路径满足:
p 0 ( ⋅ ∣ z ) = p init p_0(\cdot\mid z)=p_{\text{init}} p0(⋅∣z)=pinit
并且这个分布与 z z z 无关,所以即使我们先采样一个数据点 z z z ,随后也会 “忘记” 这个数据点,只是从初始分布中采样。因此:
p 0 = p init p_0=p_{\text{init}} p0=pinit
也就是说,边缘概率路径的起点仍然是初始分布,通常是标准高斯分布。
再看 t = 1 t=1 t=1 。由于条件概率路径满足:
p 1 ( ⋅ ∣ z ) = δ z p_1(\cdot\mid z)=\delta_z p1(⋅∣z)=δz
所以从 p 1 ( ⋅ ∣ z ) p_1(\cdot\mid z) p1(⋅∣z) 中采样,其实就是得到数据点 z z z 本身。而 z z z 又服从数据分布:
z ∼ p data z\sim p_{\text{data}} z∼pdata
因此:
p 1 = p data p_1=p_{\text{data}} p1=pdata
这说明边缘概率路径正好实现了我们想要的目标:它在分布层面上从初始噪声分布过渡到了真实数据分布。
因此,边缘概率路径可以理解为:
通过先采样数据点,再沿着对应的条件概率路径采样,构造出的从 p init p_{\text{init}} pinit 到 p data p_{\text{data}} pdata 的分布插值。
这个构造本身也是一种设计选择,但它将成为后续训练流模型的基础。
边缘分布的密度可以写成条件分布关于数据分布的积分:
p t ( x ) = ∫ p t ( x ∣ z ) p data ( z ) d z p_t(x)=\int p_t(x\mid z)p_{\text{data}}(z)dz pt(x)=∫pt(x∣z)pdata(z)dz
这个公式就是对 z z z 进行边缘化。换句话说,我们考虑所有可能的数据点 z z z ,并按照它们在数据分布中的概率进行加权,最终得到 x x x 的边缘分布。
Q & A
Q:我们并不知道 p data ( z ) p_{\text{data}}(z) pdata(z),对吗?
A:是的,我们并不知道 p data ( z ) p_{\text{data}}(z) pdata(z) 的显式表达式,也无法直接计算某个点 z z z 在数据分布下的密度。
但是,生成建模的关键设定是:虽然我们不知道数据分布的密度,但我们可以从中采样。也就是说,我们拥有数据集,可以从数据集中抽取样本。后面会看到,仅凭这些样本,我们仍然可以学习一个模型来从数据分布中生成新的样本。
Q:这个边缘分布具体是什么?
A:它是将条件路径 p t ( x ∣ z ) p_t(x\mid z) pt(x∣z) 对数据点 z z z 进行边缘化后得到的分布:
p t ( x ) = ∫ p t ( x ∣ z ) p data ( z ) , d z p_t(x)=\int p_t(x\mid z)p_{\text{data}}(z),dz pt(x)=∫pt(x∣z)pdata(z),dz
虽然我们无法显式计算这个积分,因为不知道 p data p_{\text{data}} pdata 的密度,但我们可以通过采样过程得到来自 p t p_t pt 的样本:
z ∼ p data , x ∼ p t ( ⋅ ∣ z ) z\sim p_{\text{data}}, \qquad x\sim p_t(\cdot\mid z) z∼pdata,x∼pt(⋅∣z)
这正是后续训练算法能够工作的关键。
回顾一下,条件概率路径描述的是从高斯噪声到单个数据点之间的插值:
最常用的条件路径是带有调度器 α t \alpha_t αt 和 β t \beta_t βt 的高斯路径:
p t ( ⋅ ∣ z ) = N ( α t z , β t 2 I d ) p_t(\cdot\mid z)=\mathcal{N}(\alpha_t z,\beta_t^2I_d) pt(⋅∣z)=N(αtz,βt2Id)
其中, α t \alpha_t αt 控制数据成分的强度, β t \beta_t βt 控制噪声成分的强度。我们选择它们,使得路径从噪声分布开始,并最终到达数据点。
而边缘概率路径则是通过先从数据集中采样数据点,再从对应条件路径中采样得到的:
它的密度形式为:
p t ( x ) = ∫ p t ( x ∣ z ) p data ( z ) d z p_t(x)=\int p_t(x\mid z)p_{\text{data}}(z)dz pt(x)=∫pt(x∣z)pdata(z)dz
这正是对条件分布进行边缘化的结果。
2.2 Vector Field
前面我们讨论的是概率路径,也就是一族随时间变化的分布。
但我们最终想要训练的是一个流模型,而流模型的核心对象是 向量场。因此,接下来我们需要引入动力学,并思考:怎样构造一个向量场,使得它的 ODE 演化能够沿着前面定义的概率路径移动?
2.2.1 Conditional Vector Field
我们首先定义 条件向量场(conditional vector field),记作:
u t target ( x ∣ z ) u_t^{\text{target}}(x\mid z) uttarget(x∣z)
它是关于当前位置 x x x 和给定数据点 z z z 的函数,输出一个 d d d 维向量。因此,它本质上是一个依赖于数据点 z z z 的向量场。
条件向量场的定义是:
给定一个数据点 z z z ,如果从初始分布出发,并沿着该向量场定义的 ODE 演化,那么任意时间 t t t 的样本分布都应该等于条件概率路径 p t ( ⋅ ∣ z ) p_t(\cdot\mid z) pt(⋅∣z) 。
形式化地说,如果:
X 0 ∼ p i n i t , d d t X t = u t t a r g e t ( X t ∣ z ) X_0 \sim p_{\mathrm{init}}, \qquad \frac{d}{dt}X_t = u_t^{\mathrm{target}}(X_t\mid z) X0∼pinit,dtdXt=uttarget(Xt∣z)
那么我们希望:
X t ∼ p t ( ⋅ ∣ z ) , 0 ≤ t ≤ 1 X_t\sim p_t(\cdot\mid z), \qquad 0\leq t\leq 1 Xt∼pt(⋅∣z),0≤t≤1
这就是条件向量场需要满足的条件。
换句话说,条件向量场定义了一种动力学。对于每个固定的数据点 z z z,它都会给出一个对应的向量场。如果我们从初始高斯噪声出发,并沿着这个向量场模拟 ODE,那么样本在每个时间点的分布都应该恰好等于前面定义的条件概率路径。
也就是说,条件向量场的作用是:让 ODE 的演化过程与条件概率路径保持一致。
下面是一个例子:
图中展示的是一个条件概率路径及其对应条件向量场。起点是一个高斯分布,随着时间推移,分布逐渐坍缩到一个数据点。背景中的密度表示随时间变化的条件概率路径,红色轨迹表示样本点的运动路径,蓝色箭头表示条件向量场。
可以看到,如果沿着蓝色箭头模拟 ODE,那么样本的分布会沿着我们定义好的条件概率路径演化,最终坍缩到目标数据点。
到目前为止,我们只是说明了条件向量场应该满足什么性质,还没有说明如何得到它。接下来我们看一个重要例子:高斯条件概率路径对应的条件向量场。
对于前面定义的高斯条件概率路径:
p t ( ⋅ ∣ z ) = N ( α t z , β t 2 I d ) p_t(\cdot\mid z)=\mathcal{N}(\alpha_tz,\beta_t^2I_d) pt(⋅∣z)=N(αtz,βt2Id)
它对应的条件目标向量场可以写作:
u t t a r g e t ( x ∣ z ) = ( α ˙ t − β ˙ t β t α t ) z + β ˙ t β t x u_t^{\mathrm{target}}(x\mid z) = \left( \dot{\alpha}_t - \frac{\dot{\beta}_t}{\beta_t}\alpha_t \right)z + \frac{\dot{\beta}_t}{\beta_t}x uttarget(x∣z)=(α˙t−βtβ˙tαt)z+βtβ˙tx
这个公式看起来有些复杂,但不需要死记硬背。它的核心结构其实很简单:它是 z z z 和 x x x 的线性组合。
其中:
- z z z 是目标数据点;
- x x x 是当前位置;
- α t , β t \alpha_t,\beta_t αt,βt 以及它们的导数由我们选择的调度器决定。
因此,这个条件向量场是一个已知函数,并且对 x x x 和 z z z 都是线性的。它描述了:在时间 t t t 、当前位置 x x x 、目标数据点为 z z z 时,样本应该朝哪个方向移动,才能让整体分布沿着高斯条件概率路径演化。
下面我们简单验证一下为什么这个向量场是正确的。
我们声称该向量场对应的流为:
ψ t t a r g e t ( x ∣ z ) = α t z + β t x \psi_t^{\mathrm{target}}(x\mid z) = \alpha_tz+\beta_t x ψttarget(x∣z)=αtz+βtx
这里的 x x x 可以理解为初始点。也就是说,如果初始位置是 x x x ,那么经过时间 t t t 后的位置就是:
α t z + β t x \alpha_tz+\beta_t x αtz+βtx
要验证它确实是该向量场的流,需要检查两件事:
首先,在 t = 0 t=0 t=0 时:
ψ 0 t a r g e t ( x ∣ z ) = α 0 z + β 0 x = 0 ⋅ z + 1 ⋅ x = x \psi_0^{\mathrm{target}}(x\mid z) = \alpha_0z+\beta_0x =0\cdot z+1\cdot x =x ψ0target(x∣z)=α0z+β0x=0⋅z+1⋅x=x
这满足流的初始条件,即时间 0 0 0 时保持原位置不变。
其次,需要对它关于时间求导,并验证:
d d t ψ t t a r g e t ( x ∣ z ) = u t t a r g e t ( ψ t t a r g e t ( x ∣ z ) ∣ z ) \frac{d}{dt} \psi_t^{\mathrm{target}}(x\mid z) = u_t^{\mathrm{target}} ( \psi_t^{\mathrm{target}}(x\mid z) \mid z ) dtdψttarget(x∣z)=uttarget(ψttarget(x∣z)∣z)
这一步只是代数计算。讲义中有更详细的证明,这里只保留核心直觉:如果将
ψ t t a r g e t ( x ∣ z ) = α t z + β t x \psi_t^{\mathrm{target}}(x\mid z) = \alpha_tz+\beta_t x ψttarget(x∣z)=αtz+βtx
代入上面的目标向量场公式,确实可以得到它关于时间的导数。因此,它满足 ODE 的定义,所以它就是该向量场产生的流。
接下来我们验证这个流是否真的产生高斯条件概率路径。
令初始点服从标准高斯分布:
X 0 ∼ N ( 0 , I d ) X_0\sim \mathcal{N}(0,I_d) X0∼N(0,Id)
那么在时间 t t t,由流得到:
X t = ψ t t a r g e t ( X 0 ∣ z ) = α t z + β t X 0 X_t = \psi_t^{\mathrm{target}}(X_0\mid z) =\alpha_t z+\beta_t X_0 Xt=ψttarget(X0∣z)=αtz+βtX0
由于 X 0 X_0 X0 是标准高斯随机变量,线性变换后的 X t X_t Xt 仍然是高斯分布。它的均值为:
E [ X t ] = α t z + β t E [ X 0 ] = α t z \mathbb{E}[X_t] = \alpha_t z + \beta_t\mathbb{E}[X_0] = \alpha_t z E[Xt]=αtz+βtE[X0]=αtz
协方差为:
C o v ( X t ) = β t 2 I d \mathrm{Cov}(X_t) = \beta_t^2 I_d Cov(Xt)=βt2Id
因此:
X t ∼ N ( α t z , β t 2 I d ) = p t ( ⋅ ∣ z ) X_t \sim \mathcal{N}(\alpha_t z,\beta_t^2 I_d) = p_t(\cdot\mid z) Xt∼N(αtz,βt2Id)=pt(⋅∣z)
这正好说明,如果我们沿着这个条件向量场模拟 ODE,那么样本分布就会严格遵循高斯条件概率路径。
这就是高斯条件向量场的意义。
它告诉我们:对于每一个给定的数据点 z z z ,存在一个非常简单的线性向量场,可以将初始高斯噪声分布连续地推向这个数据点。
需要强调的是,在后续 Flow Matching 中,这个条件向量场将成为训练目标的核心。我们会用它来构造监督信号,让神经网络学习应该输出怎样的速度向量。
Q & A
Q:动画中的等高线图为什么看起来像出现了一个环?是否做了裁剪?
A:这只是绘图伪影。图中绘制的是密度等高线,当分布逐渐坍缩到一个点时,等高线的显示方式可能会产生类似环状的视觉效果,但这并不表示分布本身真的变成了环。
Q:构建这个条件向量场有什么用?
A:到目前为止,它确实还不能直接解决生成问题。
原因是,条件向量场依赖于一个已经给定的数据点 z z z 。如果我们已经知道 z z z ,那么沿着这个向量场演化,最终只是生成这个已知的数据点。因此,仅仅从这个角度看,它似乎没有实际生成价值。
但它的重要性在于:它可以作为一个构建模块。
我们先学会如何构造 “从噪声到单个数据点” 的向量场,然后再把这些条件向量场在整个数据分布上进行整合。这样就可以得到一个不依赖具体数据点的边缘向量场,它能够把噪声分布推向整个数据分布。
这正是下一步要做的事情:从条件对象过渡到边缘对象,从而真正构建能够生成整个数据分布的流模型。
2.2.2 Marginal Vector Field
前面我们已经构造了条件向量场:
u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x\mid z) uttarget(x∣z)
它描述的是:给定一个具体数据点 z z z ,如何通过 ODE 将初始噪声分布推向这个数据点。
不过,真正的生成模型并不是为了生成某一个已知的数据点,而是为了生成整个数据分布。因此,我们需要从条件向量场进一步构造 边缘向量场(marginal vector field)。
和边缘概率路径类似,在构造边缘向量场时,我们也要把数据点 z z z 边缘化掉。也就是说,最终得到的向量场不再依赖某个具体数据点,而只依赖当前位置 x x x 和时间 t t t :
u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x)
边缘向量场定义为:
u t t a r g e t ( x ) = ∫ u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) p t ( x ) d z u_t^{\mathrm{target}}(x) = \int u_t^{\mathrm{target}}(x\mid z) \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) } dz uttarget(x)=∫uttarget(x∣z)pt(x)pt(x∣z)pdata(z)dz
这个公式看起来比较复杂,我们逐项解释一下。
首先,
u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x\mid z) uttarget(x∣z)
是前面推导出来的条件向量场。对于高斯概率路径来说,它是 x x x 和 z z z 的线性函数,表示如果目标数据点是 z z z ,那么当前位置 x x x 应该朝哪个方向移动。
其次,
p t ( x ∣ z ) p d a t a ( z ) p t ( x ) \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) } pt(x)pt(x∣z)pdata(z)
这一项可以用贝叶斯公式来理解。它其实是给定当前中间状态 x x x 后,数据点 z z z 的后验分布:
p t ( z ∣ x ) = p t ( x ∣ z ) p d a t a ( z ) p t ( x ) p_t(z\mid x) = \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) } pt(z∣x)=pt(x)pt(x∣z)pdata(z)
因此,边缘向量场也可以写成更加直观的形式:
u t t a r g e t ( x ) = ∫ u t t a r g e t ( x ∣ z ) p t ( z ∣ x ) d z u_t^{\mathrm{target}}(x) = \int u_t^{\mathrm{target}}(x\mid z) p_t(z\mid x) dz uttarget(x)=∫uttarget(x∣z)pt(z∣x)dz
也就是说,边缘向量场是在后验分布 p t ( z ∣ x ) p_t(z\mid x) pt(z∣x) 下,对条件向量场取期望:
u t t a r g e t ( x ) = E z ∼ p t ( z ∣ x ) [ u t t a r g e t ( x ∣ z ) ] u_t^{\mathrm{target}}(x) = \mathbb{E}_{z\sim p_t(z\mid x)} \left[ u_t^{\mathrm{target}}(x\mid z) \right] uttarget(x)=Ez∼pt(z∣x)[uttarget(x∣z)]
这个解释非常重要。
直观地说,当我们处在某个中间点 x x x 时,并不知道它最终应该对应哪个干净数据点 z z z 。它可能来自许多不同的数据点。于是,我们需要考虑所有可能的 z z z ,并根据 “这个 z z z 通过加噪过程产生当前 x x x 的可能性” 来加权。
如果某个数据点 z z z 更可能是当前 x x x 的来源,那么它对应的条件向量场就应该占更大权重;如果某个 z z z 不太可能产生当前 x x x ,那么它的权重就应该较小。
因此,边缘向量场可以理解为:
在当前位置 x x x 处,根据所有可能来源数据点的后验概率,对这些条件向量场做加权平均。
这就是从 “生成单个数据点” 过渡到 “生成整个数据分布” 的关键。
接下来是一个核心结论:
如果从初始分布出发,并沿着这个边缘向量场演化 ODE:
X 0 ∼ p i n i t , d d t X t = u t t a r g e t ( X t ) X_0\sim p_{\mathrm{init}}, \qquad \frac{d}{dt}X_t = u_t^{\mathrm{target}}(X_t) X0∼pinit,dtdXt=uttarget(Xt)
那么任意时间 t t t 的分布都会等于前面定义的边缘概率路径:
X t ∼ p t , 0 ≤ t ≤ 1 X_t\sim p_t, \qquad 0\leq t\leq 1 Xt∼pt,0≤t≤1
这句话非常重要。它说明,前面构造出来的边缘向量场正是我们真正想要的对象。为什么呢?因为边缘概率路径满足:
p 0 = p i n i t , p 1 = p d a t a p_0=p_{\mathrm{init}}, \qquad p_1=p_{\mathrm{data}} p0=pinit,p1=pdata
因此,如果我们沿着边缘向量场从初始分布开始演化,那么到时间 t = 1 t=1 t=1 时就有:
X 1 ∼ p d a t a X_1\sim p_{\mathrm{data}} X1∼pdata
这正是生成模型的目标。
所以,边缘向量场的意义在于:如果我们能够学习这个向量场,那么就可以从高斯噪声出发,通过模拟 ODE 生成数据分布中的样本。
这也是 Flow Matching 的核心思想之一。
下面看一个可视化例子:
图中左侧是初始分布,右侧是目标数据分布。初始分布通常是高斯分布,而目标数据分布可以是任意复杂的分布。在这个 toy example 中,目标分布是一个人为构造的二维图案。
沿着边缘概率路径演化时,分布会逐渐从高斯噪声变成数据分布:
上一讲中我们曾经看到过类似的图,当时它只是作为一个 “将噪声转换为数据的流模型” 来展示。现在我们知道,这背后的向量场正是这里定义的边缘向量场。也就是说,边缘向量场的流能够把初始噪声分布推送到目标数据分布。
到这里为止,我们已经在数学上构造出了一个真正有用的对象:一个能够生成数据分布的向量场。接下来需要证明这个结论为什么成立。
注意,这个证明并不是理解课程后续内容的必要条件。如果只是想掌握算法和直觉,可以先记住结论。但如果想深入理解 Flow Matching 的数学基础,这个证明非常关键,因为它解释了为什么可以从每个数据点的条件向量场,构造出面向整个数据分布的边缘向量场。
证明中会用到一个重要工具:连续性方程(continuity equation)。
连续性方程描述了一个概率密度如何在向量场作用下随时间变化。如果一个随机变量 X t X_t Xt 沿着向量场 u t u_t ut 演化:
d d t X t = u t ( X t ) \frac{d}{dt}X_t=u_t(X_t) dtdXt=ut(Xt)
并且 X t X_t Xt 的分布密度为 p t ( x ) p_t(x) pt(x) ,那么 p t p_t pt 与 u t u_t ut 之间满足连续性方程:
d d t p t ( x ) = − div ( p t u t ) ( x ) \frac{d}{dt}p_t(x) = -\operatorname{div}(p_tu_t)(x) dtdpt(x)=−div(ptut)(x)
这个方程的含义可以这样理解:某一点 x x x 处的概率密度会随时间变化。为什么会变化?因为概率质量会流入或流出这个位置。
如果流入的概率质量多于流出的概率质量,那么该点处的概率密度会上升;如果流出的概率质量多于流入的概率质量,那么该点处的概率密度会下降。
向量场 u t u_t ut 描述了概率质量如何移动,而 p t ( x ) p_t(x) pt(x) 则描述了当前位置有多少概率质量。因此, p t u t p_tu_t ptut 可以理解为概率质量的流。
连续性方程表达的就是一种 “概率质量守恒” 关系:
密度的变化 = 流入与流出的净效果。
公式中的散度算子 div \operatorname{div} div 用来刻画某一点附近的净流出量。因为我们关心的是密度变化,所以方程中出现了负号:
d d t p t ( x ) = − div ( p t u t ) ( x ) \frac{d}{dt}p_t(x) = -\operatorname{div}(p_tu_t)(x) dtdpt(x)=−div(ptut)(x)
如果某点附近净流出较大,那么该点密度下降;如果净流入较大,那么密度上升。
散度的定义如下。对于一个向量场:
v t ( x ) = ( v t 1 ( x ) , v t 2 ( x ) , … , v t d ( x ) ) v_t(x)= \left( v_t^1(x),v_t^2(x),\dots,v_t^d(x) \right) vt(x)=(vt1(x),vt2(x),…,vtd(x))
其散度为:
div ( v t ( x ) ) = ∑ i = 1 d ∂ ∂ x i v t i ( x ) \operatorname{div}(v_t(x)) = \sum_{i=1}^{d} \frac{\partial}{\partial x_i} v_t^i(x) div(vt(x))=i=1∑d∂xi∂vti(x)
也就是说,散度是向量场每个分量对对应坐标偏导数的求和。
在这里,我们可以把连续性方程看作一个判别工具:
如果某个向量场 u t u_t ut 和某条概率路径 p t p_t pt 满足连续性方程,那么沿着这个向量场演化的随机变量,其分布就会遵循这条概率路径。
因此,要证明边缘向量场会生成边缘概率路径,我们只需要证明它们满足连续性方程。
下面证明边缘向量场确实会让分布遵循边缘概率路径。
我们从边缘概率路径的时间导数开始:
d d t p t ( x ) = ( i ) d d t ∫ p t ( x ∣ z ) p d a t a ( z ) d z = ∫ d d t p t ( x ∣ z ) p d a t a ( z ) d z = ( i i ) ∫ − div ( p t ( ⋅ ∣ z ) u t t a r g e t ( ⋅ ∣ z ) ) ( x ) p d a t a ( z ) d z = ( i i i ) − div ( ∫ p t ( x ∣ z ) u t t a r g e t ( x ∣ z ) p d a t a ( z ) d z ) = ( i v ) − div ( p t ( x ) ∫ u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) p t ( x ) d z ) = ( v ) − div ( p t u t t a r g e t ) ( x ) \begin{aligned} \frac{d}{dt} p_t(x) &\overset{(i)}{=} \frac{d}{dt} \int p_t(x\mid z) p_{\mathrm{data}}(z)dz \\[6pt] &= \int \frac{d}{dt} p_t(x\mid z) p_{\mathrm{data}}(z)dz \\[10pt] &\overset{(ii)}{=} \int -\operatorname{div} \left( p_t(\cdot\mid z) u_t^{\mathrm{target}}(\cdot\mid z) \right)(x) p_{\mathrm{data}}(z)dz \\[10pt] &\overset{(iii)}{=} -\operatorname{div} \left( \int p_t(x\mid z) u_t^{\mathrm{target}}(x\mid z) p_{\mathrm{data}}(z)dz \right) \\[10pt] &\overset{(iv)}{=} -\operatorname{div} \left( p_t(x) \int u_t^{\mathrm{target}}(x\mid z) \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) } dz \right) \\[10pt] &\overset{(v)}{=} -\operatorname{div} \left( p_tu_t^{\mathrm{target}} \right)(x) \end{aligned} dtdpt(x)=(i)dtd∫pt(x∣z)pdata(z)dz=∫dtdpt(x∣z)pdata(z)dz=(ii)∫−div(pt(⋅∣z)uttarget(⋅∣z))(x)pdata(z)dz=(iii)−div(∫pt(x∣z)uttarget(x∣z)pdata(z)dz)=(iv)−div(pt(x)∫uttarget(x∣z)pt(x)pt(x∣z)pdata(z)dz)=(v)−div(ptuttarget)(x)
这个推导逐步解释如下。
步骤 ( i ) (i) (i) 使用了边缘概率路径的定义:
p t ( x ) = ∫ p t ( x ∣ z ) p d a t a ( z ) d z p_t(x) = \int p_t(x\mid z) p_{\mathrm{data}}(z)dz pt(x)=∫pt(x∣z)pdata(z)dz
也就是说,边缘路径是对条件路径关于数据分布进行积分得到的。
接着,我们将时间导数移入积分内部:
d d t ∫ p t ( x ∣ z ) p d a t a ( z ) d z = ∫ d d t p t ( x ∣ z ) p d a t a ( z ) d z \frac{d}{dt} \int p_t(x\mid z)p_{\mathrm{data}}(z)dz = \int \frac{d}{dt}p_t(x\mid z)p_{\mathrm{data}}(z)dz dtd∫pt(x∣z)pdata(z)dz=∫dtdpt(x∣z)pdata(z)dz
这一步在合适的正则性条件下成立。
步骤 ( i i ) (ii) (ii) 使用了条件概率路径和条件向量场之间的连续性方程。因为对于每个固定的 z z z ,条件向量场 u t t a r g e t ( ⋅ ∣ z ) u_t^{\mathrm{target}}(\cdot\mid z) uttarget(⋅∣z) 会让分布遵循条件概率路径 p t ( ⋅ ∣ z ) p_t(\cdot\mid z) pt(⋅∣z) ,所以有:
d d t p t ( x ∣ z ) = − div ( p t ( ⋅ ∣ z ) u t t a r g e t ( ⋅ ∣ z ) ) ( x ) \frac{d}{dt}p_t(x\mid z) = -\operatorname{div} \left( p_t(\cdot\mid z) u_t^{\mathrm{target}}(\cdot\mid z) \right)(x) dtdpt(x∣z)=−div(pt(⋅∣z)uttarget(⋅∣z))(x)
步骤 ( i i i ) (iii) (iii) 将散度算子移到积分外面。因为散度本质上是对 x x x 的偏导数求和,而积分变量是 z z z ,所以在合适条件下可以交换二者的顺序。
步骤 ( i v ) (iv) (iv) 同时乘以并除以 p t ( x ) p_t(x) pt(x) :
∫ p t ( x ∣ z ) u t t a r g e t ( x ∣ z ) p d a t a ( z ) d z = p t ( x ) ∫ u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) p t ( x ) d z \int p_t(x\mid z) u_t^{\mathrm{target}}(x\mid z) p_{\mathrm{data}}(z)dz = p_t(x) \int u_t^{\mathrm{target}}(x\mid z) \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) }dz ∫pt(x∣z)uttarget(x∣z)pdata(z)dz=pt(x)∫uttarget(x∣z)pt(x)pt(x∣z)pdata(z)dz
这样做的目的,是为了把积分中的权重写成后验分布:
p t ( z ∣ x ) = p t ( x ∣ z ) p d a t a ( z ) p t ( x ) p_t(z\mid x) = \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) } pt(z∣x)=pt(x)pt(x∣z)pdata(z)
步骤 ( v ) (v) (v) 使用边缘向量场的定义:
u t t a r g e t ( x ) = ∫ u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) p t ( x ) d z u_t^{\mathrm{target}}(x) = \int u_t^{\mathrm{target}}(x\mid z) \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) } dz uttarget(x)=∫uttarget(x∣z)pt(x)pt(x∣z)pdata(z)dz
于是得到:
d d t p t ( x ) = − div ( p t u t t a r g e t ) ( x ) \frac{d}{dt}p_t(x) = -\operatorname{div} \left( p_tu_t^{\mathrm{target}} \right)(x) dtdpt(x)=−div(ptuttarget)(x)
这正是连续性方程。
因此,边缘概率路径 p t p_t pt 与边缘向量场 u t t a r g e t u_t^{\mathrm{target}} uttarget 满足连续性方程。由连续性方程可知,如果我们从初始分布出发,并沿着边缘向量场演化 ODE,那么样本分布就会遵循边缘概率路径。
最终,在时间 t = 1 t=1 t=1 时,我们得到:
X 1 ∼ p 1 = p d a t a X_1\sim p_1=p_{\mathrm{data}} X1∼p1=pdata
这就证明了边缘向量场确实能够生成数据分布。
这个推导也解释了边缘向量场公式的来源。我们并不是随便定义:
u t t a r g e t ( x ) = ∫ u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) p t ( x ) d z u_t^{\mathrm{target}}(x) = \int u_t^{\mathrm{target}}(x\mid z) \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) } dz uttarget(x)=∫uttarget(x∣z)pt(x)pt(x∣z)pdata(z)dz
而是为了让它满足连续性方程,从而确保它的流能够沿着边缘概率路径演化。
换句话说,这个公式的作用是:把每个数据点对应的条件向量场,以后验概率作为权重进行平均,得到一个真正能够生成整个数据分布的全局向量场。
Q & A
Q:为什么不能直接对 p data ( z ) p_{\text{data}}(z) pdata(z) 加权平均,而要使用后验权重?
A:如果只用 p data ( z ) p_{\text{data}}(z) pdata(z) 加权平均,那么得到的是对所有数据点的无条件平均速度。这会忽略一个关键信息:我们当前已经知道样本位于 x x x 。
也就是说,在当前位置 x x x ,不同数据点 z z z 作为其来源的可能性并不相同。某些数据点更可能通过加噪过程产生当前的 x x x ,另一些数据点则不太可能。
因此,我们应该根据当前观察到的 x x x 来更新对来源数据点 z z z 的信念。这正是贝叶斯规则所做的事情:
p t ( z ∣ x ) = p t ( x ∣ z ) p data ( z ) p t ( x ) p_t(z\mid x) = \frac{ p_t(x\mid z)p_{\text{data}}(z) }{ p_t(x) } pt(z∣x)=pt(x)pt(x∣z)pdata(z)
所以边缘向量场使用的是后验加权平均,而不是先验加权平均。它是在回答:
- 给定当前处于位置 x x x,它最可能来自哪些数据点?
- 在这些可能来源的加权平均下,当前应该往哪个方向移动?
这就是后验权重的意义。
Q:这个后验有什么特别之处?
A:对于高斯条件路径来说, p t ( x ∣ z ) p_t(x\mid z) pt(x∣z) 本质上会根据 x x x 和 z z z 之间的距离来分配权重。距离当前 x x x 更近、或者更可能在加噪后产生 x x x 的数据点,会获得更高的后验概率。
但它不只是简单地看距离,还会结合数据分布本身的形状即 p data ( z ) p_{\text{data}}(z) pdata(z) ,因此,后验分布同时考虑了两件事:
- 某个数据点 z z z 在真实数据分布中是否常见;
- 给定这个 z z z ,它通过条件概率路径产生当前 x x x 的可能性有多大。
这正是边缘向量场能够反映整个数据分布结构的原因。
Q:如果固定概率路径 p t p_t pt ,满足连续性方程的向量场是否唯一?
A:一般来说并不唯一。
对于同一条概率路径,可能存在多个向量场都能让分布沿着这条路径演化。也就是说,从 “分布如何随时间变化” 反推 “每个点具体如何移动”,通常不是唯一的。
这也是为什么边缘向量场的构造很重要。Flow Matching 并不是在所有可能向量场中随便选择一个,而是通过条件向量场和后验加权平均,明确构造出一个特定的目标向量场 u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x) ,然后训练神经网络去学习这个向量场。
所以,虽然满足相同概率路径的向量场可能有很多,但这里我们已经明确指定了要学习哪一个。
Q:向量场和概率路径之间是否是一一对应的?
A:不是。
一个向量场不一定唯一对应一条概率路径。例如,如果向量场处处为零,那么任何静态不变的分布路径都可以与它兼容。也就是说,不同的概率路径可能对应同一个向量场。
反过来,同一条概率路径也可能由不同的向量场实现。因此,向量场和概率路径之间一般不是一一对应关系。
在 Flow Matching 中,我们关心的不是所有可能的向量场,而是通过公式明确构造出来的边缘目标向量场。只要这个向量场能够实现从初始分布到数据分布的传输目标,它就是一个有效的训练目标。
最后快速回顾一下:
边缘向量场是 Flow Matching 中非常关键的对象。因为如果我们能够学习它,并用它来模拟 ODE,就可以从初始噪声分布生成数据分布中的样本。
下面这些生成结果就是由学习了边缘向量场的模型生成的:
因此,边缘向量场并不只是抽象的数学对象。它是真正能够用于生成图像、视频或其他复杂数据的核心对象。
2.3 Learning the Marginal Vector Field
前面我们已经构造出了 边缘向量场:
u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x)
它是我们真正想要的对象。因为如果从初始分布出发,并沿着这个边缘向量场模拟 ODE,那么终点分布就会变成数据分布:
X 0 ∼ p i n i t , d d t X t = u t t a r g e t ( X t ) ⇒ X 1 ∼ p d a t a X_0\sim p_{\mathrm{init}}, \qquad \frac{d}{dt}X_t=u_t^{\mathrm{target}}(X_t) \quad\Rightarrow\quad X_1\sim p_{\mathrm{data}} X0∼pinit,dtdXt=uttarget(Xt)⇒X1∼pdata
因此,接下来的问题就是:如何学习这个边缘向量场?
这正是 Flow Matching 要解决的问题。
换句话说,Flow Matching 的核心任务就是训练一个神经网络,使它能够逼近边缘目标向量场。
Q & A
Q:在生成视频时,通常还会基于语言 prompt 进行条件控制,这部分如何处理?
A:语言条件控制是后面课程要讨论的内容。它仍然建立在当前讲解的 Flow Matching 框架之上,只是会额外引入条件变量,例如文本 prompt。当前我们先讨论无条件生成,也就是如何从噪声生成数据分布本身。
现在重新引入神经网络。我们用一个带参数 θ \theta θ 的神经网络表示向量场:
u t θ ( x ) u_t^\theta(x) utθ(x)
它接收时间 t t t 和当前位置 x x x ,输出一个速度向量。
我们的目标是让这个神经网络逼近边缘目标向量场:
u t θ ( x ) ≈ u t t a r g e t ( x ) u_t^\theta(x)\approx u_t^{\mathrm{target}}(x) utθ(x)≈uttarget(x)
如果能够做到这一点,那么训练完成后,我们就可以从高斯噪声出发,沿着神经网络给出的向量场模拟 ODE,最终得到数据分布中的样本。
既然目标是让神经网络逼近边缘向量场,一个最自然的想法就是做回归。也就是说,我们希望在不同时间 t t t 和不同位置 x x x 上,让网络输出:
u t θ ( x ) u_t^\theta(x) utθ(x)
尽可能接近目标向量场:
u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x)
因此,可以定义 Flow Matching 损失:
L F M ( θ ) = E t ∼ U n i f , x ∼ p t [ ∥ u t θ ( x ) − u t t a r g e t ( x ) ∥ 2 ] = E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ ∥ u t θ ( x ) − u t t a r g e t ( x ) ∥ 2 ] \begin{align*} \mathcal{L}_{\mathrm{FM}}(\theta) &= \mathbb{E}_{t\sim\mathrm{Unif},\,x\sim p_t} \!\left[ \left\| u_t^\theta(x) - u_t^{\mathrm{target}}(x) \right\|^2 \right] \\[10pt] &= \mathbb{E}_{t\sim\mathrm{Unif},\,z\sim p_{\mathrm{data}},\,x\sim p_t(\,\cdot\mid z)} \!\left[ \left\| u_t^\theta(x) - u_t^{\mathrm{target}}(x) \right\|^2 \right] \end{align*} LFM(θ)=Et∼Unif,x∼pt[ utθ(x)−uttarget(x) 2]=Et∼Unif,z∼pdata,x∼pt(⋅∣z)[ utθ(x)−uttarget(x) 2]
第一行的含义很直接:随机采样一个时间 t t t ,再从边缘概率路径 p t p_t pt 中采样一个点 x x x ,然后让神经网络输出的速度向量接近边缘目标向量场。
第二行只是把从 p t p_t pt 中采样写成了前面定义过的边缘化采样过程:
z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) z\sim p_{\mathrm{data}}, \qquad x\sim p_t(\cdot\mid z) z∼pdata,x∼pt(⋅∣z)
也就是说,我们可以先从数据分布中采样一个数据点 z z z ,再从对应的条件概率路径中采样 x x x 。
这个损失的最小化器非常清楚。如果我们真的能够计算:
u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x)
那么最小化这个均方误差损失后,神经网络自然会学到边缘目标向量场。
问题在于:边缘目标向量场本身无法直接计算。因为它的定义中包含对整个数据分布的积分:
u t t a r g e t ( x ) = ∫ u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) p t ( x ) d z u_t^{\mathrm{target}}(x) = \int u_t^{\mathrm{target}}(x\mid z) \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) }dz uttarget(x)=∫uttarget(x∣z)pt(x)pt(x∣z)pdata(z)dz
而我们并不知道 p d a t a p_{\mathrm{data}} pdata 的密度,也无法直接计算这个后验加权平均。所以,Flow Matching 损失虽然是我们真正想优化的目标,但它在实践中不可直接计算。
这时我们需要换一个思路:既然边缘向量场不好算,那能不能回归条件向量场?
前面我们已经推导过条件目标向量场:
u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x\mid z) uttarget(x∣z)
对于高斯概率路径,它有明确的解析公式:
u t t a r g e t ( x ∣ z ) = ( α ˙ t − β ˙ t β t α t ) z + β ˙ t β t x u_t^{\mathrm{target}}(x\mid z) = \left( \dot{\alpha}_t - \frac{\dot{\beta}_t}{\beta_t}\alpha_t \right)z + \frac{\dot{\beta}_t}{\beta_t}x uttarget(x∣z)=(α˙t−βtβ˙tαt)z+βtβ˙tx
这个对象是已知的、可计算的。因此,我们可以定义一个可训练的损失,让神经网络直接回归条件向量场:
L C F M ( θ ) = E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ ∥ u t θ ( x ) − u t t a r g e t ( x ∣ z ) ∥ 2 ] \mathcal{L}_{\mathrm{CFM}}(\theta)= \mathbb{E}_{t \sim \mathrm{Unif},\, z \sim p_{\mathrm{data}},\, x \sim p_t(\cdot|z)} \left[ \left\| u_t^\theta(x) - u_t^{\mathrm{target}}(x|z) \right\|^2 \right] LCFM(θ)=Et∼Unif,z∼pdata,x∼pt(⋅∣z)[ utθ(x)−uttarget(x∣z) 2]
这就是 Conditional Flow Matching Loss 条件流匹配损失。
它的采样过程非常简单:
首先,随机采样一个时间:
t ∼ U n i f ( [ 0 , 1 ] ) t\sim \mathrm{Unif}([0,1]) t∼Unif([0,1])
也就是说,我们在 0 0 0 到 1 1 1 之间随机选一个时间。这样做是因为我们希望神经网络在整个时间区间内都能输出正确的速度向量,而不是只在某个固定时间上正确。
然后,从数据分布中采样一个数据点:
z ∼ p d a t a z\sim p_{\mathrm{data}} z∼pdata
在实际训练中,这一步就是从训练数据集中取一个样本。例如,对于图像生成,就是从图像数据集中随机取一张图片。
接着,从条件概率路径中采样:
x ∼ p t ( ⋅ ∣ z ) x\sim p_t(\cdot\mid z) x∼pt(⋅∣z)
对于高斯概率路径,这一步可以理解为对数据点 z z z 加噪,得到时间 t t t 对应的中间状态 x x x 。
最后,计算神经网络输出和条件目标向量场之间的均方误差:
∥ u t θ ( x ) − u t t a r g e t ( x ∣ z ) ∥ 2 \left\| u_t^\theta(x) - u_t^{\mathrm{target}}(x|z) \right\|^2 utθ(x)−uttarget(x∣z) 2
这看起来就是一个普通的监督学习回归问题:输入是 ( x , t ) (x,t) (x,t) ,目标是条件向量场给出的速度向量。
不过,这里有一个关键问题:我们真正想学习的是边缘向量场 u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x) ,但现在训练时回归的是条件向量场 u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x\mid z) uttarget(x∣z) ,这两个目标并不一样。那么为什么训练条件流匹配损失,最后会得到我们想要的边缘向量场呢?
这正是 Flow Matching 中最重要的结论。
Flow Matching 的核心结论是:
L F M ( θ ) = L C F M ( θ ) + C \mathcal{L}_{\mathrm{FM}}(\theta) = \mathcal{L}_{\mathrm{CFM}}(\theta) + C LFM(θ)=LCFM(θ)+C
这里的 C C C 是一个与神经网络参数 θ \theta θ 无关的常数。等价地,也可以写成二者只相差一个与 θ \theta θ 无关的偏移量。
这句话的含义是:Flow Matching 损失和 Conditional Flow Matching 损失虽然数值不完全相同,但它们作为关于参数 θ \theta θ 的函数,形状是一样的,只是整体上下平移了一个常数。
因此,它们有两个重要性质。
第一个性质是,它们的梯度相同:
∇ θ L F M ( θ ) = ∇ θ L C F M ( θ ) \nabla_\theta \mathcal{L}_{\mathrm{FM}}(\theta) = \nabla_\theta \mathcal{L}_{\mathrm{CFM}}(\theta) ∇θLFM(θ)=∇θLCFM(θ)
因为常数项 C C C 与 θ \theta θ 无关,所以对 θ \theta θ 求导时会消失。
这对训练非常重要。训练神经网络时,我们通常使用随机梯度下降或其变体,本质上依赖的是损失函数对参数的梯度。既然两个损失的梯度相同,那么优化 Conditional Flow Matching 损失,就等价于优化真正想要的 Flow Matching 损失。
第二个性质是,它们的最小化器相同。
虽然两个损失的具体数值可能不同,但由于只相差一个常数,所以使它们达到最小值的参数 θ \theta θ 是一样的。也就是说:
arg min θ L F M ( θ ) = arg min θ L C F M ( θ ) \arg\min_\theta \mathcal{L}_{\mathrm{FM}}(\theta) = \arg\min_\theta \mathcal{L}_{\mathrm{CFM}}(\theta) argθminLFM(θ)=argθminLCFM(θ)
因此,如果我们最小化可计算的 Conditional Flow Matching 损失,最终得到的神经网络也会逼近边缘目标向量场。
这就是 Flow Matching 最美妙的地方:我们真正想优化的损失不可直接计算,但它和一个可计算的损失只差一个常数。因此,我们可以放心地训练可计算的条件流匹配损失。
更直观地说,我们定义了两个损失:
第一个是 Flow Matching 损失:
L F M ( θ ) \mathcal{L}_{\mathrm{FM}}(\theta) LFM(θ)
它直接回归边缘向量场,是我们真正想优化的目标,但无法高效计算。
第二个是 Conditional Flow Matching 损失:
L C F M ( θ ) \mathcal{L}_{\mathrm{CFM}}(\theta) LCFM(θ)
它回归条件向量场,是可计算、可采样、可训练的目标。
最初我们并不清楚第二个损失是否真的有用。但核心定理告诉我们,这两个损失只相差一个与参数无关的常数。因此,它们有相同的梯度和相同的最小化器。
这意味着我们可以通过训练条件流匹配损失,间接学习真正想要的边缘向量场。
下面来看 Flow Matching 的实际训练算法:
实践中,训练过程可以概括为以下几步。
首先,我们有一个训练数据集,它可以看作来自数据分布 p d a t a p_{\mathrm{data}} pdata ,同时,我们有一个神经网络向量场 u t θ ( x ) u_t^\theta(x) utθ(x) 。对于每一批训练数据,我们重复以下过程:
1. 从数据集中采样一个数据点:
z ∼ p d a t a z\sim p_{\mathrm{data}} z∼pdata
2. 从 [ 0 , 1 ] [0,1] [0,1] 中均匀采样一个时间:
t ∼ U n i f ( [ 0 , 1 ] ) t\sim \mathrm{Unif}([0,1]) t∼Unif([0,1])
3. 从条件概率路径中采样中间状态:
x ∼ p t ( ⋅ ∣ z ) x\sim p_t(\cdot\mid z) x∼pt(⋅∣z)
对于高斯概率路径,这通常就是生成一个带噪版本:
x = α t z + β t ϵ , ϵ ∼ N ( 0 , I d ) x=\alpha_t z+\beta_t \epsilon, \qquad \epsilon\sim\mathcal{N}(0,I_d) x=αtz+βtϵ,ϵ∼N(0,Id)
4. 计算条件目标向量场:
u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x\mid z) uttarget(x∣z)
5. 计算回归损失:
L ( θ ) = ∥ u t θ ( x ) − u t t a r g e t ( x ∣ z ) ∥ 2 \mathcal{L}(\theta) = \left\| u_t^\theta(x) - u_t^{\mathrm{target}}(x\mid z) \right\|^2 L(θ)= utθ(x)−uttarget(x∣z) 2
6. 使用反向传播和梯度下降更新神经网络参数 θ \theta θ 。
这就是 Flow Matching 的训练过程。
从实现角度看,它非常像普通监督学习。我们构造输入 ( x , t ) (x,t) (x,t) ,构造监督目标 u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x\mid z) uttarget(x∣z) ,然后训练神经网络做回归。它的简洁之处在于:一个看起来复杂的生成建模问题,最终被转化成了一个标准的向量回归问题。
下面我们来证明前面提到的关键结论:
L F M ( θ ) = L C F M ( θ ) + C \mathcal{L}_{\mathrm{FM}}(\theta)=\mathcal{L}_{\mathrm{CFM}}(\theta)+C LFM(θ)=LCFM(θ)+C
其中, C C C 是一个与模型参数 θ \theta θ 无关的常数。
再次强调,这个证明不是掌握本课程的必要条件。如果只关心算法本身,可以记住结论:优化条件流匹配损失等价于优化真正想要的流匹配损失。不过,这个证明能帮助我们理解为什么这个训练方法成立。
我们需要用到的基本公式是平方范数展开:
∣ a − b ∣ 2 = ∣ a ∣ 2 − 2 a ⊤ b + ∣ b ∣ 2 \left|a-b\right|^2 = \left|a\right|^2 - 2a^\top b + \left|b\right|^2 ∣a−b∣2=∣a∣2−2a⊤b+∣b∣2
证明方法是将均方误差展开成三个部分,然后去掉与参数无关的常数项:
L F M ( θ ) = ( i ) E t ∼ U n i f , x ∼ p t [ ∥ u t θ ( x ) − u t t a r g e t ( x ) ∥ 2 ] = ( i i ) E t ∼ U n i f , x ∼ p t [ ∥ u t θ ( x ) ∥ 2 − 2 u t θ ( x ) T u t t a r g e t ( x ) + ∥ u t t a r g e t ( x ) ∥ 2 ] = ( i i i ) E t ∼ U n i f , x ∼ p t [ ∥ u t θ ( x ) ∥ 2 ] − 2 E t ∼ U n i f , x ∼ p t [ u t θ ( x ) T u t t a r g e t ( x ) ] + E t ∼ U n i f [ 0 , 1 ] , x ∼ p t [ ∥ u t t a r g e t ( x ) ∥ 2 ] ⏟ = : C 1 = ( i v ) E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ ∥ u t θ ( x ) ∥ 2 ] − 2 E t ∼ U n i f , x ∼ p t [ u t θ ( x ) T u t t a r g e t ( x ) ] + C 1 \begin{aligned} \mathcal{L}_{\mathrm{FM}}(\theta) &\overset{(i)}{=} \mathbb{E}_{t\sim\mathrm{Unif},\,x\sim p_t} \!\left[\left\|u_t^\theta(x) - u_t^{\mathrm{target}}(x) \right\|^2 \right] \\[10pt] &\overset{(ii)}{=} \mathbb{E}_{t\sim\mathrm{Unif},\,x\sim p_t} \!\left[ \|u_t^\theta(x)\|^2 - 2\,u_t^\theta(x)^T u_t^{\mathrm{target}}(x) + \|u_t^{\mathrm{target}}(x)\|^2 \right] \\[10pt] &\overset{(iii)}{=} \mathbb{E}_{t\sim\mathrm{Unif},\,x\sim p_t} \!\left[ \|u_t^\theta(x)\|^2 \right] - 2\, \mathbb{E}_{t\sim\mathrm{Unif},\,x\sim p_t} \!\left[ u_t^\theta(x)^T u_t^{\mathrm{target}}(x) \right] + \underbrace{ \mathbb{E}_{t\sim\mathrm{Unif}[0,1],\,x\sim p_t} \!\left[\|u_t^{\mathrm{target}}(x)\|^2 \right]}_{=:C_1}\\[12pt] &\overset{(iv)}{=} \mathbb{E}_{t\sim\mathrm{Unif},\,z\sim p_{\mathrm{data}},\,x\sim p_t(\,\cdot\mid z)} \!\left[\|u_t^\theta(x)\|^2\right]-2\,\mathbb{E}_{t\sim\mathrm{Unif},\,x\sim p_t}\!\left[u_t^\theta(x)^T u_t^{\mathrm{target}}(x)\right] + C_1 \end{aligned} LFM(θ)=(i)Et∼Unif,x∼pt[ utθ(x)−uttarget(x) 2]=(ii)Et∼Unif,x∼pt[∥utθ(x)∥2−2utθ(x)Tuttarget(x)+∥uttarget(x)∥2]=(iii)Et∼Unif,x∼pt[∥utθ(x)∥2]−2Et∼Unif,x∼pt[utθ(x)Tuttarget(x)]+=:C1 Et∼Unif[0,1],x∼pt[∥uttarget(x)∥2]=(iv)Et∼Unif,z∼pdata,x∼pt(⋅∣z)[∥utθ(x)∥2]−2Et∼Unif,x∼pt[utθ(x)Tuttarget(x)]+C1
其中,在步骤 ( i ) (i) (i) 中,我们直接使用了定义,在步骤 ( i i ) (ii) (ii) 中,我们使用了公式 ∥ a − b ∥ 2 = ∥ a ∥ 2 − 2 a T b + ∥ b ∥ 2 \|a-b\|^2 = \|a\|^2 - 2a^Tb + \|b\|^2 ∥a−b∥2=∥a∥2−2aTb+∥b∥2 ,在步骤 ( i i i ) (iii) (iii) 中,我们定义了常数 C 1 C_1 C1 ,在步骤 ( i v ) (iv) (iv) 中,我们使用了 p t p_t pt 对应的采样过程。
现在,让我们重新表示第二项:
E t ∼ U n i f , x ∼ p t [ u t θ ( x ) T u t t a r g e t ( x ) ] = ( i ) ∫ 0 1 ∫ p t ( x ) u t θ ( x ) T u t t a r g e t ( x ) d x d t = ( i i ) ∫ 0 1 ∫ p t ( x ) u t θ ( x ) T [ ∫ u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) p t ( x ) d z ] d x d t = ( i i i ) ∫ 0 1 ∫ ∫ u t θ ( x ) T u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) d z d x d t = ( i v ) E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ u t θ ( x ) T u t t a r g e t ( x ∣ z ) ] \begin{aligned} \mathbb{E}_{t\sim\mathrm{Unif},\,x\sim p_t} \!\left[ u_t^\theta(x)^T u_t^{\mathrm{target}}(x) \right] &\overset{(i)}{=} \int_0^1 \int p_t(x)\, u_t^\theta(x)^T u_t^{\mathrm{target}}(x) \,dx\,dt \\[12pt] &\overset{(ii)}{=} \int_0^1 \int p_t(x)\, u_t^\theta(x)^T \left[ \int u_t^{\mathrm{target}}(x\mid z)\, \frac{ p_t(x\mid z)\, p_{\mathrm{data}}(z) }{ p_t(x) } \,dz \right] dx\,dt \\[12pt] &\overset{(iii)}{=} \int_0^1 \int \int u_t^\theta(x)^T u_t^{\mathrm{target}}(x\mid z)\, p_t(x\mid z)\, p_{\mathrm{data}}(z) \,dz\,dx\,dt \\[12pt] &\overset{(iv)}{=} \mathbb{E}_{t\sim\mathrm{Unif},\,z\sim p_{\mathrm{data}},\,x\sim p_t(\,\cdot\mid z)} \!\left[ u_t^\theta(x)^T u_t^{\mathrm{target}}(x\mid z) \right] \end{aligned} Et∼Unif,x∼pt[utθ(x)Tuttarget(x)]=(i)∫01∫pt(x)utθ(x)Tuttarget(x)dxdt=(ii)∫01∫pt(x)utθ(x)T[∫uttarget(x∣z)pt(x)pt(x∣z)pdata(z)dz]dxdt=(iii)∫01∫∫utθ(x)Tuttarget(x∣z)pt(x∣z)pdata(z)dzdxdt=(iv)Et∼Unif,z∼pdata,x∼pt(⋅∣z)[utθ(x)Tuttarget(x∣z)]
其中,在步骤 ( i ) (i) (i) 中,我们把期望写成积分,在步骤 ( i i ) (ii) (ii) 中,我们使用了 公式 (18),在步骤 ( i i i ) (iii) (iii) 中,我们利用了积分的线性性,在步骤 ( i v ) (iv) (iv) 中,我们重新把积分写成期望。
注意,这是整个证明中最关键的一步:原本交叉项里出现的是不可直接计算的边缘向量场 u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x) ,但通过边缘向量场的定义,它被转换成了关于条件向量场 u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x\mid z) uttarget(x∣z) 的期望。
现在,将其代回 L F M \mathcal{L}_{\mathrm{FM}} LFM 的表达式中:
L F M ( θ ) = ( i ) E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ ∥ u t θ ( x ) ∥ 2 ] − 2 E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ u t θ ( x ) T u t t a r g e t ( x ∣ z ) ] + C 1 = ( i i ) E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ ∥ u t θ ( x ) ∥ 2 − 2 u t θ ( x ) T u t t a r g e t ( x ∣ z ) + ∥ u t t a r g e t ( x ∣ z ) ∥ 2 − ∥ u t t a r g e t ( x ∣ z ) ∥ 2 ] + C 1 = ( i i i ) E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ ∥ u t θ ( x ) − u t t a r g e t ( x ∣ z ) ∥ 2 ] + E t ∼ U n i f , z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) [ − ∥ u t t a r g e t ( x ∣ z ) ∥ 2 ] ⏟ C 2 + C 1 = ( i v ) L C F M ( θ ) + C 2 + C 1 ⏟ = : C \begin{aligned} \mathcal{L}_{\mathrm{FM}}(\theta) &\overset{(i)}{=} \mathbb{E}_{t\sim\mathrm{Unif},\,z\sim p_{\mathrm{data}},\,x\sim p_t(\,\cdot\mid z)} \!\left[ \|u_t^\theta(x)\|^2 \right] - 2\, \mathbb{E}_{t\sim\mathrm{Unif},\,z\sim p_{\mathrm{data}},\,x\sim p_t(\,\cdot\mid z)} \!\left[ u_t^\theta(x)^T u_t^{\mathrm{target}}(x\mid z) \right] + C_1 \\[14pt] &\overset{(ii)}{=} \mathbb{E}_{t\sim\mathrm{Unif},\,z\sim p_{\mathrm{data}},\,x\sim p_t(\,\cdot\mid z)} \!\left[ \|u_t^\theta(x)\|^2 - 2\,u_t^\theta(x)^T u_t^{\mathrm{target}}(x\mid z) \right. \left. + \|u_t^{\mathrm{target}}(x\mid z)\|^2 - \|u_t^{\mathrm{target}}(x\mid z)\|^2 \right] + C_1 \\[14pt] &\overset{(iii)}{=} \mathbb{E}_{t\sim\mathrm{Unif},\,z\sim p_{\mathrm{data}},\,x\sim p_t(\,\cdot\mid z)} \!\left[\|u_t^\theta(x) - u_t^{\mathrm{target}}(x\mid z)\|^2 \right] + \underbrace{ \mathbb{E}_{t\sim\mathrm{Unif},\,z\sim p_{\mathrm{data}},\,x\sim p_t(\,\cdot\mid z)} \!\left[ -\|u_t^{\mathrm{target}}(x\mid z)\|^2 \right] }_{C_2} + C_1 \\[14pt] &\overset{(iv)}{=} \mathcal{L}_{\mathrm{CFM}}(\theta) + \underbrace{ C_2+C_1}_{=:C} \end{aligned} LFM(θ)=(i)Et∼Unif,z∼pdata,x∼pt(⋅∣z)[∥utθ(x)∥2]−2Et∼Unif,z∼pdata,x∼pt(⋅∣z)[utθ(x)Tuttarget(x∣z)]+C1=(ii)Et∼Unif,z∼pdata,x∼pt(⋅∣z)[∥utθ(x)∥2−2utθ(x)Tuttarget(x∣z)+∥uttarget(x∣z)∥2−∥uttarget(x∣z)∥2]+C1=(iii)Et∼Unif,z∼pdata,x∼pt(⋅∣z)[∥utθ(x)−uttarget(x∣z)∥2]+C2 Et∼Unif,z∼pdata,x∼pt(⋅∣z)[−∥uttarget(x∣z)∥2]+C1=(iv)LCFM(θ)+=:C C2+C1
其中,在步骤 ( i ) (i) (i) 中,我们代入了前面推导得到的表达式,在步骤 ( i i ) (ii) (ii) 中,我们加减了同一个量,在步骤 ( i i i ) (iii) (iii) 中,我们再次使用平方展开公式,在步骤 ( i v ) (iv) (iv) 中,我们定义了一个与 θ \theta θ 无关的常数项,证明完毕。
这说明二者虽然数值不同,但作为关于 θ \theta θ 的优化目标,它们只相差一个常数。因此:
∇ θ L F M ( θ ) = ∇ θ L C F M ( θ ) \nabla_\theta \mathcal{L}_{\mathrm{FM}}(\theta) = \nabla_\theta \mathcal{L}_{\mathrm{CFM}}(\theta) ∇θLFM(θ)=∇θLCFM(θ)
并且二者具有相同的最小化器。
这就是 Flow Matching 能够成立的核心原因:我们无法直接计算边缘向量场,却可以通过回归条件向量场来间接学习它。
Q & A
Q:这里是不是也应该对数据点 z z z 取期望?
A:是的。这里可以有两种等价写法。
一种写法是直接从边缘路径中采样:
x ∼ p t x\sim p_t x∼pt
另一种写法是使用边缘路径的采样过程:
z ∼ p d a t a , x ∼ p t ( ⋅ ∣ z ) z\sim p_{\mathrm{data}}, \qquad x\sim p_t(\cdot\mid z) z∼pdata,x∼pt(⋅∣z)
这两种写法是等价的。为了教学上更清楚地展示条件路径和边缘路径之间的关系,推导中常常会显式写出对 z z z 的采样。
现在我们可以停下来欣赏一下这个结果的意义。
Flow Matching 的一个非常重要的特点是:训练时不需要模拟 ODE。
我们训练的是一个流模型,最终生成时确实需要从噪声出发模拟 ODE。但在训练过程中,我们并不需要真的从 t = 0 t=0 t=0 一步一步积分到 t = 1 t=1 t=1 ,也不需要展开完整轨迹。这被称为 simulation-free training,也就是无模拟训练。
在 Flow Matching 之前,如果想训练一个基于连续流的生成模型,通常需要在训练过程中反复模拟 ODE,这会带来很高的计算成本。因为每次训练都可能需要很多步数值积分,每一步还要调用神经网络。而 Flow Matching 完全避免了这一点。
训练时,我们只需要:采样一个数据点;采样一个时间;采样一个噪声;构造中间状态;调用一次神经网络;做一次回归。也就是说,训练过程不需要轨迹展开,只需要单点监督回归。
这也是 Flow Matching 强大的原因之一。它把复杂的生成建模问题转化成了一个非常简单的回归问题。推导过程可能比较复杂,但最终算法非常简洁。
下面我们把前面的公式具体化到最常用的 高斯概率路径。
对于高斯条件概率路径,我们有:
p t ( ⋅ ∣ z ) = N ( α t z , β t 2 I d ) p_t(\cdot\mid z) = \mathcal{N}(\alpha_t z,\beta_t^2 I_d) pt(⋅∣z)=N(αtz,βt2Id)
从这个分布中采样可以写成:
x ∼ p t ( ⋅ ∣ z ) ⟺ x = α t z + β t ϵ , ϵ ∼ N ( 0 , I d ) x\sim p_t(\cdot\mid z) \quad\Longleftrightarrow\quad x=\alpha_t z+\beta_t\epsilon, \qquad \epsilon\sim\mathcal{N}(0,I_d) x∼pt(⋅∣z)⟺x=αtz+βtϵ,ϵ∼N(0,Id)
这只是高斯重参数化采样。也就是说,我们不需要直接从复杂表达式中采样,只需要采样标准高斯噪声 ϵ \epsilon ϵ ,然后通过线性变换得到 x x x 。
对应的条件目标向量场为:
u t t a r g e t ( x ∣ z ) = ( α ˙ t − β ˙ t β t α t ) z + β ˙ t β t x u_t^{\mathrm{target}}(x\mid z) = \left( \dot{\alpha}_t - \frac{\dot{\beta}_t}{\beta_t}\alpha_t \right)z + \frac{\dot{\beta}_t}{\beta_t}x uttarget(x∣z)=(α˙t−βtβ˙tαt)z+βtβ˙tx
现在将采样表达式:
x = α t z + β t ϵ x=\alpha_t z+\beta_t\epsilon x=αtz+βtϵ
代入条件向量场,可以得到一个非常简洁的速度目标。
它关于时间的导数为:
d d t x t = α ˙ t z + β ˙ t ϵ \frac{d}{dt}x_t = \dot{\alpha}_t z+\dot{\beta}_t\epsilon dtdxt=α˙tz+β˙tϵ
因此,Conditional Flow Matching Loss 可以写成:
L C F M ( θ ) = E t ∼ U n i f , z ∼ p d a t a , ϵ ∼ N ( 0 , I d ) [ ∥ u t θ ( α t z + β t ϵ ) − ( α ˙ t z + β ˙ t ϵ ) ∥ 2 ] \mathcal{L}_{\mathrm{CFM}}(\theta) = \mathbb{E}_{t\sim\mathrm{Unif},z\sim p_{\mathrm{data}},\epsilon\sim\mathcal{N}(0,I_d)} \left[ \left\| u_t^\theta(\alpha_t z+\beta_t\epsilon) - (\dot{\alpha}_t z+\dot{\beta}_t\epsilon) \right\|^2 \right] LCFM(θ)=Et∼Unif,z∼pdata,ϵ∼N(0,Id)[ utθ(αtz+βtϵ)−(α˙tz+β˙tϵ) 2]
这个公式非常直观:
- 网络输入是噪声和数据的插值点: α t z + β t ϵ \alpha_t z+\beta_t\epsilon αtz+βtϵ
- 网络要预测的是这条插值路径在时间 t t t 的速度: α ˙ t z + β ˙ t ϵ \dot{\alpha}_t z+\dot{\beta}_t\epsilon α˙tz+β˙tϵ
换句话说,Flow Matching 要求神经网络学会:在任意一个噪声与数据之间的中间点上,应该以什么速度继续运动,才能最终从噪声走向数据。
接下来我们选择最简单的调度器,也就是直线调度:
令:
α t = t , β t = 1 − t \alpha_t=t, \qquad \beta_t=1-t αt=t,βt=1−t
那么:
α ˙ t = 1 , β ˙ t = − 1 \dot{\alpha}_t=1, \qquad \dot{\beta}_t=-1 α˙t=1,β˙t=−1
代入前面的 CFM 损失:
L C F M ( θ ) = E t , z , ϵ [ ∥ u t θ ( α t z + β t ϵ ) − ( α ˙ t z + β ˙ t ϵ ) ∥ 2 ] \mathcal{L}_{\mathrm{CFM}}(\theta) = \mathbb{E}_{t,z,\epsilon} \left[ \left\| u_t^\theta(\alpha_t z+\beta_t\epsilon) - (\dot{\alpha}_t z+\dot{\beta}_t\epsilon) \right\|^2 \right] LCFM(θ)=Et,z,ϵ[ utθ(αtz+βtϵ)−(α˙tz+β˙tϵ) 2]
得到:
L C F M ( θ ) = E t ∼ U n i f , z ∼ p d a t a , ϵ ∼ N ( 0 , I d ) [ ∥ u t θ ( t z + ( 1 − t ) ϵ ) − ( z − ϵ ) ∥ 2 ] \mathcal{L}_{\mathrm{CFM}}(\theta) = \mathbb{E}_{t\sim\mathrm{Unif},z\sim p_{\mathrm{data}},\epsilon\sim\mathcal{N}(0,I_d)} \left[ \left\| u_t^\theta(tz+(1-t)\epsilon) - (z-\epsilon) \right\|^2 \right] LCFM(θ)=Et∼Unif,z∼pdata,ϵ∼N(0,Id)[ utθ(tz+(1−t)ϵ)−(z−ϵ) 2]
这就是最常用、也最直观的 Flow Matching 训练形式。
它的含义非常简单:
- 采样一个噪声点 ϵ \epsilon ϵ ;
- 采样一个真实数据点 z z z ;
- 在二者之间取线性插值 x t = t z + ( 1 − t ) ϵ x_t=tz+(1-t)\epsilon xt=tz+(1−t)ϵ ;
- 让神经网络预测从噪声点指向数据点的速度 z − ϵ z-\epsilon z−ϵ 。
也就是说,网络输入的是噪声和数据之间的某个中间点,训练目标是这条直线从噪声走向数据的方向。
下面是这个过程的可视化:
图中左边是噪声 ϵ \epsilon ϵ ,右边是数据点 z z z 。在训练时,我们随机选择一个时间 t t t ,取直线上的中间点 t z + ( 1 − t ) ϵ tz+(1-t)\epsilon tz+(1−t)ϵ ,然后让神经网络预测从噪声到数据的差值 z − ϵ z-\epsilon z−ϵ ,这就是直线路径下的 Flow Matching。
基于上面的直线调度,我们可以得到一个非常具体的训练算法:
这个算法非常简单。它本质上就是:
给数据加噪,得到中间点;让神经网络预测从噪声到数据的方向。
需要注意的是,训练时网络并不知道干净数据点 z z z 是什么。网络只看到当前中间状态 x x x 和时间 t t t,但监督信号来自我们构造出的目标速度 z − ϵ z-\epsilon z−ϵ 。因此,网络必须学会从带噪中间状态中推断合理的运动方向。
这正是 Flow Matching 可扩展的关键:训练目标是一个普通回归问题,而且每一步训练只需要一次神经网络调用。
前面这个算法并不只是一个教学简化版,它实际上就是现代大规模生成模型使用的核心训练方法之一。
例如,Meta 的 Movie Gen 视频生成模型就使用了类似的 Flow Matching 训练目标:
这些视频样本背后的神经网络,就是通过前面类似的算法训练得到的。也就是说,模型通过学习噪声到数据之间的速度场,最终能够生成复杂的视频内容。
Stable Diffusion 3 也采用了 Flow Matching 相关的训练思想:
这些例子说明,Flow Matching 并不是纯粹抽象的数学构造,而是已经成为大规模图像和视频生成模型中的实际训练方法。
训练完成之后,我们如何真正生成图像或视频?答案其实在 Lecture 1 中已经讲过:使用训练好的神经网络向量场模拟 ODE。
在实际中,我们会使用欧拉法或更高级的 ODE 采样器来近似求解这个 ODE。如果步数足够多,例如几十步到上百步,通常可以得到较好的生成结果。
不过,这也带来了一个缺点:生成速度较慢。
因为采样时需要多次调用神经网络。对于图像生成,这已经有一定计算成本;对于视频生成,计算成本更高,因为视频本身是一个很大的张量,并且每一步都需要对整个视频表示进行神经网络计算。
因此,Flow Matching 的一个重要权衡是:
- 训练过程非常简单、稳定、可扩展;
- 但推理采样需要多步 ODE 模拟,因此生成成本较高。
这也是为什么视频生成模型通常价格较高、生成速度较慢的原因之一。
3. Summary
最后,我们回顾一下今天推导的整体结构:
Flow Matching 的核心对象可以分成三类:
- Probability Path
- Vector Field
- Flow Matching Loss
每一类又都有条件版本和边缘版本。
首先是概率路径。
条件概率路径 p t ( ⋅ ∣ z ) p_t(\cdot\mid z) pt(⋅∣z) 描述从初始噪声分布到单个数据点 z z z 的插值。边缘概率路径 p t p_t pt 则通过对数据点 z z z 边缘化得到,描述从初始噪声分布到整个数据分布的插值。
然后是向量场。
条件向量场 u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x\mid z) uttarget(x∣z) 是可解析计算的,它让 ODE 遵循条件概率路径。边缘向量场 u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x) 是我们真正想学习的对象,因为它让 ODE 遵循边缘概率路径,并最终生成数据分布。
最后是损失函数。
边缘 Flow Matching Loss L F M ( θ ) \mathcal{L}_{\mathrm{FM}}(\theta) LFM(θ) 直接回归边缘向量场,是我们真正想优化的目标,但不可直接计算。条件 Flow Matching Loss L C F M ( θ ) \mathcal{L}_{\mathrm{CFM}}(\theta) LCFM(θ) 回归条件向量场,是可计算、可训练的目标。
核心定理告诉我们:
L F M ( θ ) = L C F M ( θ ) + C \mathcal{L}_{\mathrm{FM}}(\theta) = \mathcal{L}_{\mathrm{CFM}}(\theta) + C LFM(θ)=LCFM(θ)+C
因此,二者有相同的梯度和最小化器。于是,我们可以通过最小化条件 Flow Matching Loss 来学习边缘向量场。
下面再次总结条件对象:
条件概率路径、高斯条件向量场和条件流匹配损失都是可处理的。对于高斯路径,它们都有明确的解析公式。
条件概率路径:
p t ( ⋅ ∣ z ) = N ( α t z , β t 2 I d ) p_t(\cdot\mid z) = \mathcal{N}(\alpha_tz,\beta_t^2I_d) pt(⋅∣z)=N(αtz,βt2Id)
条件向量场:
u t t a r g e t ( x ∣ z ) = ( α ˙ t − β ˙ t β t α t ) z + β ˙ t β t x u_t^{\mathrm{target}}(x\mid z) = \left( \dot{\alpha}_t - \frac{\dot{\beta}_t}{\beta_t}\alpha_t \right)z + \frac{\dot{\beta}_t}{\beta_t}x uttarget(x∣z)=(α˙t−βtβ˙tαt)z+βtβ˙tx
条件流匹配损失:
L C F M ( θ ) = E t , z , x [ ∥ u t θ ( x ) − u t t a r g e t ( x ∣ z ) ∥ 2 ] \mathcal{L}_{\mathrm{CFM}}(\theta) = \mathbb{E}_{t,z,x} \left[ \left\| u_t^\theta(x) - u_t^{\mathrm{target}}(x\mid z) \right\|^2 \right] LCFM(θ)=Et,z,x[ utθ(x)−uttarget(x∣z) 2]
这些对象都是可采样、可计算、可用于训练的。
再看边缘对象:
边缘概率路径:
p t ( x ) = ∫ p t ( x ∣ z ) p d a t a ( z ) d z p_t(x) = \int p_t(x\mid z)p_{\mathrm{data}}(z)dz pt(x)=∫pt(x∣z)pdata(z)dz
边缘向量场:
u t t a r g e t ( x ) = ∫ u t t a r g e t ( x ∣ z ) p t ( x ∣ z ) p d a t a ( z ) p t ( x ) d z u_t^{\mathrm{target}}(x) = \int u_t^{\mathrm{target}}(x\mid z) \frac{ p_t(x\mid z)p_{\mathrm{data}}(z) }{ p_t(x) } dz uttarget(x)=∫uttarget(x∣z)pt(x)pt(x∣z)pdata(z)dz
边缘 Flow Matching Loss:
L F M ( θ ) = E t , z , x [ ∥ u t θ ( x ) − u t t a r g e t ( x ) ∥ 2 ] \mathcal{L}_{\mathrm{FM}}(\theta) = \mathbb{E}_{t,z,x} \left[ \left\| u_t^\theta(x) - u_t^{\mathrm{target}}(x) \right\|^2 \right] LFM(θ)=Et,z,x[ utθ(x)−uttarget(x) 2]
这些边缘对象通常不可直接计算,因为它们涉及未知的数据分布密度和复杂积分。
但神奇的是,我们仍然可以学习它们。通过可计算的条件流匹配损失,我们可以间接学习不可直接计算的边缘向量场。
这就是 Flow Matching 的核心美妙之处:
我们从未显式看到边缘向量场,却仍然能够训练神经网络学会它。
本节课的核心目标是回答:如何训练流模型?
我们首先构造了概率路径,用来描述从噪声到数据的连续插值。条件概率路径描述从噪声到单个数据点的过渡,边缘概率路径则描述从噪声到整个数据分布的过渡。
然后,我们构造了条件向量场和边缘向量场。条件向量场是可解析计算的,但只能生成已知数据点;边缘向量场是真正有用的对象,因为它能把初始噪声分布推向数据分布。
接着,我们定义了两个损失函数:Flow Matching Loss 和 Conditional Flow Matching Loss。前者是我们真正想优化的目标,但不可计算;后者是可计算的回归目标。关键结论是,这两个损失只相差一个与参数无关的常数,因此具有相同的梯度和最小化器。
最后,在最常用的直线路径下,Flow Matching 训练算法变得极其简单:
x = t z + ( 1 − t ) ϵ , L ( θ ) = ∥ u t θ ( x ) − ( z − ϵ ) ∥ 2 x=tz+(1-t)\epsilon, \qquad \mathcal{L}(\theta) = \left\| u_t^\theta(x) - (z-\epsilon) \right\|^2 x=tz+(1−t)ϵ,L(θ)= utθ(x)−(z−ϵ) 2
也就是说,我们只需要采样数据、采样噪声、做线性插值,然后让神经网络预测从噪声指向数据的速度。
这就是 Flow Matching 的核心:用一个简单的监督回归任务,训练出能够从噪声生成数据的向量场。
下一节课将继续讨论 Guidance 和 Score Matching。我们会从新的视角理解这些模型,并进一步讨论如何根据文本 prompt 等条件来控制生成结果。
结语
本节课系统推导并建立了 Flow Matching 的完整训练框架,它为流模型提供了一种高效、稳定且可扩展的学习方法,使得基于 ODE 的生成模型从理论构造真正走向可训练实现。
从整体上看,Flow Matching 的核心思想可以概括为:我们不直接学习复杂且不可计算的边缘向量场,而是通过构造条件概率路径与条件向量场,将问题转化为一个可采样、可回归的监督学习任务。
在这一过程中,我们首先定义了概率路径(Probability Paths),将从噪声分布到数据分布的生成过程形式化为一族连续分布的演化轨迹。其中,条件概率路径描述从噪声逐步收缩到单个数据点的过程,而边缘概率路径则通过对数据分布进行边缘化,刻画整体分布随时间的变化。
随后,我们构造了与之对应的向量场(Vector Fields)。条件向量场能够精确匹配给定数据点下的概率路径演化,而边缘向量场则进一步描述整个数据分布的动力学演化,并保证其 ODE 流与目标分布一致。
在训练目标上,本节课的关键结论是:虽然我们无法直接优化边缘 Flow Matching 损失,但可以通过等价的 Conditional Flow Matching Loss 进行训练。二者仅相差一个与参数无关的常数,因此具有相同的梯度与最优解。这一结果使得复杂的分布匹配问题转化为标准的向量回归问题。
进一步地,在高斯概率路径的设定下,Flow Matching 被简化为一种非常直观的训练方式:从数据点与噪声之间进行线性插值,并让神经网络学习预测其对应的“速度场”。这一形式不仅易于实现,也与现代大规模生成模型(如图像与视频扩散模型)中的训练方式高度一致。
总体而言,本节课完成了从 “生成模型定义” 到 “可训练算法构造” 的关键桥梁。我们不再仅仅描述如何从噪声生成数据,而是明确了如何通过构造路径、定义向量场以及设计损失函数,系统性地学习这一生成过程。
最后可以看到,Flow Matching 不仅统一了 ODE 视角下的生成建模方法,也为后续的 Score Matching 与 Guidance 机制奠定了基础。下一步的重点,将是如何在这一框架上引入条件控制,使生成过程能够响应文本等外部信息,从而迈向真正可控的生成式 AI 系统。
下一讲我们将重点讨论 Score Function 和 Score Matching,敬请期待🤗
参考
更多推荐
所有评论(0)