#从常微分方程、随机微分方程与“场”的角度理解 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) 连续演化的场

本文尝试从三个层次统一理解它们:

  1. ODE:单个样本点沿速度场运动。
  2. SDE:单个样本点在漂移 + 噪声下随机运动。
  3. 场:整个概率密度在空间中流动、扩散与守恒。

最后再解释:为什么 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)

这就需要进入“场”的视角。

这里的“场”至少有三层含义:

  1. 速度场:每个位置有一个速度 v_t(x)
  2. score 场:每个位置有一个概率密度梯度 ∇ log p_t(x)
  3. 概率密度场:每个位置有一个密度值 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 MatchingDiffusion
单粒子动力学ODE:dx = v_t(x)dtSDE: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 的想法更像是:

  1. N(5,1) 出发不断加噪,变成标准噪声;
  2. 学会每个噪声水平下的 score;
  3. 生成时从噪声出发,沿反向 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_tt,还看文本条件 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. 对研究理解最有用的几句话

如果只记住几个核心判断,可以是:

  1. ODE 视角:Flow Matching 是速度场学习。 采样就是从噪声点出发解 ODE。
  2. SDE 视角:Diffusion 是随机过程反演。 正向加噪是 SDE,反向生成需要 score。
  3. 场视角:二者都在控制概率密度场的演化。 Flow Matching 通过连续性方程,Diffusion 通过 Fokker-Planck / 反向 SDE / probability flow ODE。
  4. Diffusion 和 Flow Matching 的边界并不绝对。 Diffusion 可以转成 probability flow ODE,现代 diffusion 也常用 velocity parameterization。
  5. 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 / 概率流 更接近生成过程的本质表达。