MIT 6.S184 Lecture 2:Flow Matching
来源
本笔记基于
Lecture 2 Flow Matchingslides 与 MIT 6.S184 lecture notes 中 Flow / Diffusion Models、Flow Matching 相关章节整理。Slides 的主线是推导 flow model 的训练算法;lecture notes 给出了更完整的定义、定理和训练算法。
参见:
0. 本讲主线
一句话总结:
Flow Matching 的目标是:
不用在训练时模拟 ODE,而是把训练 flow model 变成一个简单的 supervised regression 问题。
我们最终想训练一个 neural network vector field:
使得从简单噪声分布出发,沿着 ODE 走到 时,得到数据分布:
Slides 里把本讲目标说得很直接:训练就是找到参数 ,让从 出发、沿着 vector field 走到终点后的分布等于 。
1. 学习优先级
必须掌握
- Probability Path:从噪声到数据的一族分布。
- conditional vs marginal 的区别。
- Conditional Flow Matching loss 为什么可训练。
- Gaussian / CondOT path 下的核心公式:
- Flow Matching 训练不需要模拟 ODE;采样时才需要模拟 ODE。
需要理解,但不必死磕证明
- marginalization trick。
- continuity equation。
- 为什么 conditional loss 和 marginal loss 的梯度相同。
可以一笔带过
- ODE / SDE 的严格存在唯一性证明。
- continuity equation 的完整 PDE 推导。
- 复杂 numerical solver,例如 Heun method。Euler method 理解即可。
2. Recap:Flow Model 和 Diffusion Model
Slides 开头回顾了两个模型:
Flow Model
其中 是 neural network vector field。采样时,从 模拟到 ,返回 。
Diffusion Model
相比 flow model,多了 stochastic noise term 。
这节课主要关注 Flow Model
本讲的训练算法是 Flow Matching,所以重点是 ODE 版本:
3. Flow Matching Matrix:本讲的概念地图
Slides 用一个矩阵组织 Flow Matching 的核心对象:
| 层次 | Conditional | Marginal |
|---|---|---|
| Probability Path | ||
| Vector Field | ||
| Flow Matching Loss |
关键理解:
- Conditional:针对单个 data point 。
- Marginal:对整个 data distribution 做平均。
- Conditional objects 通常可计算。
- Marginal objects 才是我们真正想要的,但通常不可直接计算。
- Flow Matching 的核心技巧是:
训练 conditional loss,却等价于优化 marginal loss。
4. Probability Path:只规定分布快照,不规定粒子轨迹
4.1 Conditional Probability Path
给定一个数据点 ,conditional probability path 是一族分布:
满足:
意思是:
- :还是噪声分布。
- :坍缩到单个数据点 。
- 中间的 :从噪声逐渐过渡到数据点。
容易误解
Probability path 只规定每个时间点的 marginal distribution,也就是每一帧长什么样。
它本身不规定单个 particle 如何随时间运动。Slides 也特别强调:probability path says nothing about the evolution of a single particle in time.
4.2 Marginal Probability Path
如果先采样一个数据点:
再从 conditional path 采样:
那么 的分布就是 marginal probability path:
它满足:
直觉
Conditional path 是“从噪声到某一个具体数据点 ”。
Marginal path 是“从噪声到整个数据分布 ”。
5. Gaussian Probability Path:最重要的例子
Gaussian conditional probability path 定义为:
其中 是 noise schedule,满足:
因此:
- :
- :
也就是说,它确实从标准高斯噪声走到数据点 。
实际采样时:
lecture notes 指出 Gaussian probability path 是最重要的例子,也是很多 state-of-the-art 模型使用的路径形式。
6. Vector Field:让粒子真的动起来
Probability path 只告诉我们“每个时间点的分布应该是什么”,但还没有告诉我们:
粒子 应该怎么移动,才能让 ?
这就需要 vector field。
6.1 Conditional Vector Field
Conditional vector field 记作:
它的作用是:如果
并且
那么:
也就是说,它让 ODE 的分布跟随 conditional probability path。
6.2 Gaussian Path 下的 Conditional Vector Field
对于:
Conditional target vector field 是:
其中:
lecture notes 给出了这个公式,并说明它的 ODE 轨迹会产生 Gaussian conditional probability path。
6.3 更好记的形式
因为:
所以它的时间导数是:
因此 Gaussian path 下的训练 target 可以写成:
这个形式在实现时更直接。
7. CondOT Path:最常用、最简单的特例
取:
则:
并且:
所以 target velocity 是:
这是本讲最应该记住的公式
对 CondOT path:
这就是 Flow Matching 训练可以变得非常简单的原因。lecture notes 也把这个特例总结为简单有效的训练过程。
8. Marginal Vector Field:真正想学,但不可直接算
我们真正想要的是一个 vector field:
使得:
推出:
特别是:
这个 marginal vector field 由 conditional vector field 加权平均得到:
可以把它理解成:
关键困难
这个 marginal vector field 才是我们采样时想要的,但它通常不可直接计算,因为里面有对整个数据分布的积分,而且 本身也难算。
Slides 后半部分也强调:marginal probability path、marginal vector field、marginal FM loss 都是我们想要的对象,但它们本身不可 tractable;不过仍然可以通过 conditional objects 学到。
9. Continuity Equation:理解即可
Continuity equation 说的是:
直觉:
-
左边 :位置 附近概率质量随时间的变化。
-
右边 :净流入的概率质量。
-
如果一个 vector field 真能让分布沿着 走,那么概率质量的变化必须满足这个守恒关系。
lecture notes 用 continuity equation 证明了 marginalization trick:由 conditional vector field 可以构造出 follows marginal path 的 marginal vector field。
学习建议
这里不需要第一次就掌握完整 PDE 证明。
你只需要记住它的作用:
用来证明某个 vector field 的 ODE 轨迹确实会产生指定 probability path。
10. Flow Matching Loss
10.1 理想目标:Marginal Flow Matching Loss
理想情况下,我们想让 neural network 学到:
自然的 MSE loss 是:
问题是:
不可直接计算。
10.2 可训练目标:Conditional Flow Matching Loss
于是改用:
这个 loss 是 tractable 的,因为:
-
可以从 dataset 取。
-
可以从 均匀采样。
-
可以通过加噪采样出来。
-
有解析公式。
lecture notes 明确指出,虽然我们真正想最小化 marginal loss,但 conditional velocity field 是 tractable 的,因此可以最小化 conditional loss。
11. 为什么 conditional loss 可以替代 marginal loss?
核心定理:
其中 与 无关。
因此:
这意味着:
最小化 conditional flow matching loss,等价于最小化 marginal flow matching loss。
这就是 Flow Matching 的核心理论保证。lecture notes 将其表述为 Theorem 12,并强调二者梯度一致。
12. Gaussian Path 下的最终训练目标
一般 Gaussian path:
训练 loss:
对于 CondOT path:
得到:
实现视角
训练时模型输入是:
模型输出是:
监督信号是:
13. Flow Matching Training Algorithm
以 Gaussian CondOT path 为例:
- 从 dataset 采样数据:
- 采样时间:
- 采样噪声:
- 构造 noisy sample:
- 构造 target velocity:
- 计算 loss:
- 对 做 gradient update。
lecture notes 中的 Algorithm 3 正是这个过程,并指出 Flow Matching 训练有几个重要特点:不需要在训练时模拟 ODE,是一个简单的 regression objective,且非常适合大规模模型训练。
14. 训练 vs 采样:不要混淆
训练时
不模拟 ODE。
只做:
然后回归:
采样时
才需要模拟 ODE:
从 积分到 ,返回:
核心区别
Flow Matching 的训练是 simulation-free。
但生成样本时仍然要 solve / simulate ODE。
15. 和 Stable Diffusion 3 / MovieGen 的关系
Slides 后面提到,Stable Diffusion 3 和 Meta MovieGen 的生成网络使用了前面介绍的 Flow Matching 类训练算法。
这里不需要深究模型架构。当前阶段只要理解:
大模型里的核心训练目标,本质上可以简化成:
在 noisy data 上预测从 noise 指向 data 的 velocity。
16. 常见误区
误区 1:Probability path 就是 particle trajectory
不是。
Probability path 只是每个时间点的分布快照。
Trajectory 是由 vector field / ODE 决定的。
误区 2:Conditional vector field 就够了
不够。
Conditional vector field 是针对某个固定数据点 的。
如果直接用它,终点会坍缩到这个 ,不是生成新的 data sample。
真正用于生成的是 marginal vector field。
误区 3:训练时要 rollout ODE
不需要。
Flow Matching 的优势正是训练时不 rollout。
只需要采样 、采样 noise、构造 ,然后做 MSE regression。
误区 4:Conditional loss 和 marginal loss 是一样的函数
严格说不是。
它们相差一个与参数 无关的常数:
所以优化时等价,因为梯度相同。
17. 记忆版总结
Flow Matching in one page
目标:
先设计 probability path:
Gaussian path:
CondOT path:
target velocity:
训练目标:
训练后采样:
返回:
18. 和后续内容的连接
Flow Matching 学的是:
后续 Score Matching 会学习:
对于 Gaussian probability path,lecture notes 说明 vector field 和 score function 可以互相转换,所以 Flow Matching 和 Diffusion / Score Matching 之间有很深的联系。
19. 复习问题
- 为什么 probability path 本身不等于 ODE trajectory?
- Conditional probability path 和 marginal probability path 的区别是什么?
- 为什么 marginal vector field 是真正想学的对象?
- 为什么 marginal vector field 不 tractable?
- CondOT path 下,为什么 target velocity 是 ?
- 为什么训练 conditional flow matching loss 等价于训练 marginal flow matching loss?
- Flow Matching 训练时为什么不需要模拟 ODE?
- 采样时为什么又必须模拟 ODE?
20. 最小实现伪代码
假设使用 CondOT path:
for z in dataloader:
t = Uniform(0, 1).sample()
eps = Normal(0, 1).sample(shape=z.shape)
x_t = t * z + (1 - t) * eps
target = z - eps
pred = model(x_t, t)
loss = mse(pred, target)
loss.backward()
optimizer.step()采样时:
x = Normal(0, 1).sample(shape)
for t in time_grid_from_0_to_1:
x = x + dt * model(x, t)
return x