#从常微分方程、随机微分方程与“场”的角度理解 Flow Matching 和 Diffusion
一句话概括:Flow Matching 和 Diffusion 本质上都在描述“一个分布如何连续变形为另一个分布”。ODE 视角关注每个样本点沿确定性速度场怎么走;SDE 视角关注样本点在漂移项和噪声项共同作用下怎么随机游走;场的视角则关注整个概率密度像流体一样如何在空间中被搬运、扩散和压缩。
如果把生成模型看成从简单噪声分布 p_0 到真实数据分布 p_1 的变形,那么核心问题不是“模型一次性画出图像”,而是:
能否构造一个随时间变化的动力系统,使得初始时刻的粒子分布是噪声,终止时刻的粒子分布是数据?
在这个问题下,Flow Matching 和 Diffusion 只是两种不同的动力系统表述:
Flow Matching: 学一个确定性速度场 dx = v_t(x) dt
Diffusion / SDE: 学一个带随机扰动的过程 dx = f_t(x) dt + g_t dW_t
Field view: 学/使用一个让概率密度 p_t(x) 连续演化的场
本文尝试从三个层次统一理解它们:
- ODE:单个样本点沿速度场运动。
- SDE:单个样本点在漂移 + 噪声下随机运动。
- 场:整个概率密度在空间中流动、扩散与守恒。
最后再解释:为什么 Diffusion 和 Flow Matching 看似不同,实际上可以通过 score、反向 SDE、probability flow ODE、continuity equation 串起来。
#1. 先把生成模型看成“分布搬运”问题
假设真实数据分布是:
p_data(x)
噪声分布是:
p_noise(x) = N(0, I)
生成模型要做的是从 p_noise 采样一个点,然后把它变成符合 p_data 的样本。
传统直觉里,我们说模型“生成一张图”。但更底层的数学说法是:
设计一个时间相关的变换
T_t,让T_0作用下的分布是噪声,T_1作用下的分布是数据。
也就是:
x_0 ~ p_0 = p_noise
x_1 = T_1(x_0) ~ p_1 = p_data
如果 T_t 是连续时间的,那么每个样本点都有一条轨迹:
x_0 -> x_t -> x_1
这时候自然就会出现微分方程。
#2. ODE 视角:Flow Matching 是在学习一个确定性速度场
#2.1 常微分方程描述“点怎么动”
常微分方程(ordinary differential equation, ODE)最基本的形式是:
dx_t / dt = v_t(x_t)
其中:
x_t是时刻t的样本位置;v_t(x)是一个时间相关的速度场;- 给定初始点
x_0后,轨迹是确定性的。
这句话非常关键:
ODE 不是直接描述概率分布,而是描述每一个粒子在空间中如何运动。概率分布的变化,是很多粒子一起运动之后的宏观结果。
如果一开始从噪声分布中采样很多粒子,然后让每个粒子都按照同一个 ODE 运动:
x_0 ~ p_noise
solve dx_t/dt = v_t(x_t)
那么这些粒子在每个时刻会形成一个分布 p_t。如果速度场 v_t 设计得好,最终 p_1 就会接近真实数据分布。
#2.2 Flow Matching 的核心:直接监督速度场
Flow Matching 的基本想法是:
不先学习 score,不先构造复杂的反向扩散链,而是直接给出一条从噪声到数据的概率路径,然后训练神经网络预测这条路径上的速度。
最常见的构造是先采样一对点:
x_0 ~ p_noise
x_1 ~ p_data
然后定义中间路径:
x_t = (1 - t) x_0 + t x_1
这是一条最简单的线性插值路径。它的真实速度是:
dx_t/dt = x_1 - x_0
于是训练目标可以写成:
min E[ || v_theta(x_t, t) - (x_1 - x_0) ||^2 ]
这就是最朴素的 Flow Matching 直觉:
给模型一个中间状态 x_t 和时间 t,
让它预测这个点此刻应该往哪里流。
采样时,从噪声开始解 ODE:
x_0 ~ N(0, I)
for t: 0 -> 1
dx_t = v_theta(x_t, t) dt
最终得到数据样本。
#2.3 ODE 视角下,Flow Matching 为什么自然?
因为它直接回答了生成模型最核心的问题:
当前位置 x、当前时间 t,样本应该朝哪个方向移动?
这使得 Flow Matching 的表达非常干净:
- 模型输出是速度
v; - 采样过程是解 ODE;
- 概率路径可以自由设计;
- 不一定需要显式模拟随机噪声;
- 训练目标通常是一个回归问题。
所以从 ODE 角度看,Flow Matching 就是:
学习一个能够把噪声分布连续搬运到数据分布的时间依赖向量场。
#3. SDE 视角:Diffusion 是带噪声的随机动力系统
#3.1 随机微分方程描述“点怎么随机动”
随机微分方程(stochastic differential equation, SDE)的典型形式是:
dx_t = f_t(x_t) dt + g_t dW_t
其中:
f_t(x_t) dt是确定性的漂移项;g_t dW_t是随机噪声项;W_t是布朗运动;- 同一个初始点出发,每次轨迹都可能不同。
ODE 里,一个粒子像沿着河流确定性漂过去;SDE 里,一个粒子像在河流中运动,同时还被热噪声不断随机扰动。
#3.2 Diffusion 的正向过程:把数据逐渐扩散成噪声
Diffusion 的经典做法是先定义一个正向加噪过程:
数据 -> 噪声
连续时间下可以写成 SDE:
dx_t = f_t(x_t) dt + g_t dW_t
它的作用是把真实数据分布逐渐推向简单高斯分布。
直观上:
清晰图片 -> 有一点噪声 -> 很多噪声 -> 纯高斯噪声
离散 DDPM 里常见的写法是:
x_t = alpha_t x_0 + sigma_t epsilon
其中 epsilon ~ N(0, I)。连续化之后,它对应某种 SDE 加噪过程。
#3.3 反向生成:需要知道 score
如果正向过程是:
p_data -> p_noise
那么生成时需要反过来:
p_noise -> p_data
SDE 理论告诉我们,反向过程仍然是一个 SDE,但它的漂移项里会出现一个关键量:
score = ∇_x log p_t(x)
也就是当前噪声水平下概率密度的梯度。
典型形式可以粗略写成:
dx_t = [f_t(x_t) - g_t^2 ∇_x log p_t(x_t)] dt + g_t dW_t
反向时间方向和符号约定在不同论文中会不同,但核心不变:
要把扩散过程倒过来,必须知道每个噪声水平下,样本应该往概率密度更高的方向怎么移动。
这就是 score-based generative modeling 的核心。
#3.4 Diffusion 模型到底在学什么?
Diffusion 模型通常训练网络预测以下几类等价或近似等价的东西:
预测噪声 epsilon
预测干净样本 x_0
预测 score ∇ log p_t(x)
预测 velocity v
它们之间可以通过 x_t = alpha_t x_0 + sigma_t epsilon 互相转换。
比如在高斯扰动下,score 和噪声预测之间有关系:
∇_x log p_t(x_t | x_0) ≈ - epsilon / sigma_t
所以很多 diffusion 训练虽然表面上是在预测噪声,本质上是在学习不同噪声尺度下的 score / denoising direction。
从 SDE 视角看,Diffusion 就是:
先定义一个把数据随机扩散到噪声的过程,再训练模型估计反向随机过程所需的 score,从噪声随机走回数据。
#4. ODE 和 SDE 怎么连起来:Probability Flow ODE
到这里,Flow Matching 看起来是 ODE,Diffusion 看起来是 SDE。它们是不是完全不同?
不是。
Score-based diffusion 里有一个非常关键的结论:
对于某些 SDE,可以构造一个对应的确定性 ODE,它在每个时刻拥有和原 SDE 相同的边缘分布
p_t。
这个 ODE 通常叫 probability flow ODE。
如果正向 SDE 是:
dx = f_t(x) dt + g_t dW_t
那么对应的 probability flow ODE 大致是:
dx = [f_t(x) - 1/2 g_t^2 ∇_x log p_t(x)] dt
这里的 ∇_x log p_t(x) 仍然是 score。
含义是:
SDE: 粒子路径是随机的,但整体分布按某种方式演化
ODE: 粒子路径是确定的,但整体分布可以演化得和 SDE 一样
这非常重要。它说明:
Diffusion 不一定只能用随机采样理解;它也可以转写成一个确定性 ODE 生成过程。
因此 DDIM、score ODE、probability flow ODE,以及后来很多 velocity prediction / rectified flow / flow matching 方法,在概念上会越来越接近。
区别更多变成:
- 你如何定义概率路径
p_t; - 你训练的是 score 还是 velocity;
- 你采样时解 SDE 还是 ODE;
- 路径是否足够直、速度场是否好学、采样步数是否少。
#5. “场”的视角:真正统一的是概率密度的演化
ODE 和 SDE 都是从“单个粒子怎么动”出发。
但生成模型真正关心的是分布:
p_t(x)
这就需要进入“场”的视角。
这里的“场”至少有三层含义:
- 速度场:每个位置有一个速度
v_t(x); - score 场:每个位置有一个概率密度梯度
∇ log p_t(x); - 概率密度场:每个位置有一个密度值
p_t(x)。
Flow Matching 更直接学习速度场;Diffusion 更传统地学习 score 场;两者最终都在塑造概率密度场的演化。
#6. ODE 对应的场方程:连续性方程
如果粒子按 ODE 运动:
dx_t/dt = v_t(x_t)
那么概率密度 p_t(x) 的变化满足连续性方程(continuity equation):
∂p_t/∂t + ∇ · (p_t v_t) = 0
这就是流体力学里很常见的守恒形式。
它说的是:
某个位置的概率密度变多或变少,不是凭空产生或消失,而是因为概率质量被速度场搬进来或搬出去。
其中:
p_t v_t
可以理解为概率流(probability current)。
如果某个区域的速度场把很多概率质量都推进去,那里的密度就会上升;如果速度场把概率质量带走,那里的密度就会下降。
所以 Flow Matching 从“场”的角度看,是在学一个 v_t(x),使得连续性方程的解从 p_noise 变成 p_data:
p_0 = p_noise
∂p_t/∂t + ∇ · (p_t v_t) = 0
p_1 = p_data
这比“预测噪声”更本质:
Flow Matching 是在学习一个让概率密度场按照目标路径流动的速度场。
#7. SDE 对应的场方程:Fokker-Planck 方程
如果粒子按 SDE 运动:
dx_t = f_t(x_t) dt + g_t dW_t
那么概率密度 p_t(x) 的演化满足 Fokker-Planck 方程:
∂p_t/∂t = - ∇ · (f_t p_t) + 1/2 g_t^2 Δ p_t
这里有两项:
- ∇ · (f_t p_t) 漂移造成的搬运
1/2 g_t^2 Δ p_t 随机噪声造成的扩散
第一项像 ODE 的流动,第二项像热扩散。
所以 Diffusion 的正向过程从场的角度看就是:
数据分布这个概率密度场,在漂移和扩散项作用下逐渐被抹平、摊开,最后接近高斯噪声。
反向过程则是在学习一个反向场,让这个被扩散开的密度重新聚集成数据分布。
#8. Score 场:Diffusion 为什么需要 ∇ log p?
score 是:
s_t(x) = ∇_x log p_t(x)
它告诉我们:
在当前时刻、当前位置,往哪个方向走,概率密度上升最快。
如果把 p_t(x) 想成地形高度,那么:
p_t(x)是高度;log p_t(x)是压缩后的高度;∇ log p_t(x)是上坡方向。
Diffusion 的反向去噪需要 score,是因为正向扩散把数据结构逐渐打散了;反过来时,粒子需要知道应该往哪里聚集,才能重新形成数据流形。
直觉上:
噪声点 x_t 周围有很多可能的数据解释,
score 指向那些更像真实数据的方向。
这也是为什么 diffusion 训练常常等价于 denoising:
去噪方向其实就是局部 score 方向的一种估计。
#9. Velocity 场:Flow Matching 为什么学习 v?
Flow Matching 学的是:
v_t(x)
它不是问“哪里概率更高”,而是问:
为了让整个分布按目标路径演化,当前位置的粒子应该以什么速度移动?
这和 score 的侧重点不同:
score field: 当前密度场的局部上坡方向
velocity field: 让密度场实现目标演化的搬运方向
在某些路径设定下,score 和 velocity 可以互相转换;在 diffusion 的 probability flow ODE 中,速度场就包含 score:
v_t(x) = f_t(x) - 1/2 g_t^2 s_t(x)
所以可以这样理解:
Diffusion 先学 score,再由 score 构造反向 SDE 或 probability flow ODE;Flow Matching 则绕过 score,直接学最终要用于搬运的 velocity。
这就是二者的关键差别之一。
#10. 三种视角下的统一对照
| 视角 | Flow Matching | Diffusion |
|---|---|---|
| 单粒子动力学 | ODE:dx = v_t(x)dt | SDE:dx = f_t(x)dt + g_t dW_t,也可转成 probability flow ODE |
| 模型主要学习 | velocity field v_t(x) | score ∇ log p_t(x)、噪声、x_0 或 velocity |
| 概率密度演化 | 连续性方程 | Fokker-Planck 方程;对应 ODE 时也是连续性方程 |
| 随机性 | 采样轨迹通常确定 | 反向 SDE 轨迹随机;ODE 采样可确定 |
| 路径设计 | 可直接指定噪声到数据的路径 | 通常从数据到噪声定义加噪过程 |
| 工程直觉 | 学“该往哪里流” | 学“该如何去噪 / score 指向哪里” |
更短地说:
Flow Matching = 直接学概率流的速度场
Diffusion = 先用随机扩散定义路径,再学反向所需的 score / 去噪方向
#11. 为什么现代模型越来越偏向 Flow / Velocity 表述?
不是因为 Diffusion 错了,而是因为 Flow / Velocity 表述更贴近最终采样过程。
#11.1 训练目标更直接
Diffusion 早期常以预测噪声 epsilon 为主。虽然它可以转换成 score 或 velocity,但概念上绕了一层。
Flow Matching 直接训练:
v_theta(x_t, t) ≈ target velocity
这和采样时需要的量一致。
#11.2 ODE 采样更适合少步数生成
如果速度场比较平滑,采样可以用较少的 ODE solver 步数完成。
这对大模型生成尤其重要:
- 图像生成要快;
- 视频生成更贵;
- 多模态生成 latent 维度更高;
- 每减少一步采样都很有价值。
#11.3 路径可以被设计得更“直”
Diffusion 的原始路径像是:
数据 -> 加噪 -> 噪声 -> 反向去噪
而 Flow Matching / Rectified Flow 更强调把噪声和数据之间的路径拉直:
噪声 ----------------> 数据
路径越直,速度场越简单,采样越容易。
#11.4 表述上更统一
无论是图像、视频、音频、3D、机器人动作,还是 latent representation,只要可以定义一个源分布和目标分布,就可以问:
从源分布到目标分布的速度场是什么?
这个问题非常通用。
#12. 一个最小例子:一维高斯如何从噪声流到数据
假设噪声分布是:
p_0 = N(0, 1)
数据分布是:
p_1 = N(5, 1)
最简单的 Flow Matching 会让每个粒子整体向右移动:
x_t = x_0 + 5t
v_t(x) = 5
ODE 是:
dx/dt = 5
解出来:
x_1 = x_0 + 5
于是整个分布从 N(0,1) 搬到了 N(5,1)。
这就是“速度场搬运分布”。
而 Diffusion 的想法更像是:
- 从
N(5,1)出发不断加噪,变成标准噪声; - 学会每个噪声水平下的 score;
- 生成时从噪声出发,沿反向 SDE 或 probability flow ODE 回到
N(5,1)。
在简单高斯情形下,两者都能做;区别在于中间路径和学习对象不同。
#13. 对图像生成的直觉:像素空间/latent 空间里有一片概率流
在图像生成里,x 不是一维点,而是高维向量:
x ∈ R^{H × W × C}
或者 latent diffusion 里:
z ∈ R^{h × w × c}
这时很难直接想象空间,但数学上仍然一样:
- 每张噪声图是高维空间里的一个点;
- 所有自然图像形成一个复杂的数据分布;
- diffusion / flow 模型学习一个时间相关的场;
- 这个场把高斯噪声区域的点推向自然图像流形。
从这个角度看,所谓“生成一张图”,就是:
在高维空间里,从一个随机噪声点出发,沿学习到的场走到数据流形附近。
Diffusion 的 denoising U-Net / DiT,Flow Matching 的 velocity model,本质上都是在高维空间中估计这个场。
#14. 条件生成:文本提示词如何进入这个场?
如果是文生图,模型不仅看 x_t 和 t,还看文本条件 c:
v_theta(x_t, t, c)
或:
s_theta(x_t, t, c)
这意味着文本条件改变了场。
同一个噪声点,在不同 prompt 下会沿不同方向流动:
prompt = "a cat" -> 流向猫图像分布
prompt = "a mountain" -> 流向山图像分布
所以 classifier-free guidance 也可以从场的角度理解:
它不是神秘地“增强提示词”,而是在条件场和无条件场之间做组合,把粒子更强地推向符合文本条件的概率区域。
#15. 更本质的区别:路径、场、参数化
Flow Matching 与 Diffusion 的差异,可以拆成三层。
#15.1 路径差异
Diffusion 通常先定义:
p_data -> p_noise
也就是正向加噪路径。
Flow Matching 通常直接定义:
p_noise -> p_data
也就是生成方向的插值路径。
#15.2 场的差异
Diffusion 传统上学习 score field:
s_t(x) = ∇ log p_t(x)
Flow Matching 学 velocity field:
v_t(x)
但如果使用 probability flow ODE,Diffusion 也会得到一个 velocity field。
#15.3 参数化差异
现代 diffusion 里也经常预测 velocity,比如 v-prediction。这会让它和 Flow Matching 在训练形式上更接近。
所以不要把二者理解成完全割裂的阵营。更准确的说法是:
Diffusion 是从随机扩散和 score matching 传统发展来的生成框架;Flow Matching 是从概率路径和向量场回归角度重新组织生成过程的框架。它们在 ODE 层面可以汇合。
#16. 从 optimal transport 看:Flow Matching 像在学运输计划
还有一个有用视角是最优传输(optimal transport)。
如果把噪声分布看成一堆沙子,把数据分布看成目标形状,那么生成模型就是要把沙子搬成目标形状。
Flow Matching 更接近直接学习:
每一粒沙子应该怎么移动
Diffusion 更像先把目标形状打散成均匀噪声,再学习如何反向聚合。
Rectified Flow 等方法进一步强调:希望路径尽量直,运输过程尽量简单。
这解释了为什么“直路径”“少步采样”“velocity field”会成为后续工作的关键词。
#17. 一个统一图景
可以用下面这张文字图总结:
单粒子视角
┌─────────────────────┐
│ │
ODE │ dx = v_t(x) dt │ Flow Matching
│ │
└──────────┬──────────┘
│ 诱导
▼
┌─────────────────────┐
│ Continuity Equation │
│ ∂p + ∇·(pv) = 0 │
└──────────▲──────────┘
│ 相同边缘分布
┌──────────┴──────────┐
│ │
SDE │ dx = f dt + g dW │ Diffusion
│ │
└─────────────────────┘
│
▼
Fokker-Planck Equation
∂p = -∇·(fp) + 1/2 g²Δp
进一步压缩:
Flow Matching:
直接学 v_t,让 p_t 通过连续性方程从噪声流到数据。
Diffusion:
定义 SDE 让数据扩散到噪声;学习 score 后,反向 SDE 或 probability flow ODE 从噪声回到数据。
#18. 对研究理解最有用的几句话
如果只记住几个核心判断,可以是:
- ODE 视角:Flow Matching 是速度场学习。 采样就是从噪声点出发解 ODE。
- SDE 视角:Diffusion 是随机过程反演。 正向加噪是 SDE,反向生成需要 score。
- 场视角:二者都在控制概率密度场的演化。 Flow Matching 通过连续性方程,Diffusion 通过 Fokker-Planck / 反向 SDE / probability flow ODE。
- Diffusion 和 Flow Matching 的边界并不绝对。 Diffusion 可以转成 probability flow ODE,现代 diffusion 也常用 velocity parameterization。
- Flow Matching 的优势是表述更直接。 它直接学习最终采样所需的 velocity field,更容易和 ODE solver、直路径、少步采样、多模态生成统一。
#19. 最后的直觉类比
可以用三个类比理解这三种视角。
#ODE / Flow Matching:河流
空间里有一条随时间变化的河流。每个噪声粒子被水流带着走,最后汇入数据分布。
速度场决定粒子怎么流。
#SDE / Diffusion:热运动 + 反向聚合
正向时,数据像墨水滴入水中,被随机热运动逐渐扩散开。反向时,模型学习如何让扩散开的墨水重新聚成原来的形状。
score 决定粒子怎么往高概率区域聚。
#场:概率质量守恒
不管粒子怎么走,真正演化的是整片概率密度。生成模型本质上是在设计一个场,让概率质量从简单形状变成复杂形状。
生成 = 概率密度场的连续变形。
#20. 结语:Flow Matching 与 Diffusion 是同一件事的两种坐标系
如果从模型工程术语看,Diffusion、Flow Matching、Rectified Flow、Score Matching、DDIM、Probability Flow ODE 似乎是很多不同方法。
但如果从动力系统和场的角度看,它们都在回答同一个问题:
如何构造并学习一个连续时间的概率演化过程,把简单分布变成复杂数据分布?
Diffusion 的历史入口是:
随机扩散 -> score matching -> 反向 SDE/ODE
Flow Matching 的历史入口是:
概率路径 -> velocity field matching -> ODE sampling
最终它们在“场”的层面汇合:
p_t(x) 如何随时间演化?
什么样的 score / velocity 能实现这个演化?
所以,最好的理解方式不是问“Flow Matching 是否取代 Diffusion”,而是把它们放在统一框架里:
Diffusion 强调从随机过程和 score 中恢复生成动力学;Flow Matching 强调直接学习生成方向上的速度场。二者都是概率密度场变形的不同建模方式。
这也是为什么今天很多生成模型的表述正在从“去噪模型”转向“流模型”:不是因为去噪直觉失效了,而是因为 速度场 / ODE / 概率流 更接近生成过程的本质表达。