flow_models
约 1364 字大约 5 分钟
2026-06-16
Flow Models
我们从定义流开始。想象一下一个点X在二维平面上运动,它走过的路径被称为轨迹(trajectory。 我们首先定义这种形式:
X:[0,1]→Rd,t↦Xt,
从时间 t 映射到 Rd。同时每一个轨迹,都被一个向量场定义,在二维平面运动中,向量场可以理解成每时刻的速度,广义来说是微分几何中描述光滑流形上每一点对应切向量的数学对象。下面给出向量场的定义。
u:Rd×[0,1]→Rd,(x,t)↦ut(x),
对于每个时间 t 和位置 x,我们都可以得到一个向量 ut(x)∈Rd作为空间中的速度。
上面的定义表面,如果我们想得到一个轨迹 X。我们需要从一个起点x0开始,沿着向量场(速度场)的速度大小方向运动的轨迹。我们利用常微分方程来形式化定义这样的轨迹:
dtdXtX0=ut(Xt)=x0▶ 常微分方程▶ 初始条件(1a)(1b)
第一个式子说明了,Xt的倒数就是ut给出的方向。第二个式子说明了,当时间 t=0时,我们从x0这个位置开始。那么当任意时间 t 的时候,Xt又在哪里?我们会用流来回答这个问题,通常是微分方程的解:
ψ:Rd×[0,1]dtdψt(x0)ψ0(x0)→Rd,(x0,t)↦ψt(x0)=ut(ψt(x0))=x0(2a)▶ 流 ODE(2b)▶ 流初始条件(2c)
这些都描述了一件事情,向量场决定了一个常微分方程,而方程的解,就是流。
那么这个解一定存在并且唯一吗,答案是 yes
唯一性定理
如果 u:Rd×[0,1]→Rd 是连续可微且具有有界导数的,那么 (2) 中的常微分方程(ODE)存在由流 ψt 给出的唯一解。在这种情况下,对于所有 t,ψt 是一个 微分同胚(diffeomorphism),即 ψt 是连续可微的,且其逆 ψt−1 也是连续可微的。
其中对于流的解,除非向量场很简单,否则很难计算出解析解,只能通过数值方法来模拟常微分方程,常用的方法是欧拉法。
在欧拉法中,我们初始化 X0=x0 并通过以下公式进行更新:
Xt+h=Xt+hut(Xt)(t=0,h,2h,3h,…,1−h)(4)
其中 h=n−1>0 是 步长 (step size),n∈N 是模拟的步数。对于这一类问题,欧拉法通常已经足够好。为了让你体验一下更复杂的方法,让我们来看看通过以下更新规则定义的 休恩法 (Heun's method):
Xt+h′Xt+h=Xt+hut(Xt)=Xt+2h(ut(Xt)+ut+h(Xt+h′))▶新状态的初始猜测(与欧拉步相同)▶利用当前状态和猜测状态的平均 u 进行更新
直观地说,休恩法的逻辑如下:它首先对下一步的状态 Xt+h′ 做出初步猜测,然后通过这个更新后的猜测来修正最初采取的方向。
现在可以通过常微分方程(ODE)来构造生成模型,将向量场 utθ 设为神经网络。目前只需说明 utθ 是一个带参数 θ 的参数化函数 utθ:Rd×[0,1]→Rd,具体网络架构后文再讨论。
回顾目标:从数据分布 pdata 中生成随机样本 z∼pdata。注意 ODE 本身是确定性的(不含随机性),为注入随机性,我们让初始条件 X0 随机——选取一个初始分布 pinit,通常取简单的高斯分布 pinit=N(0,Id)(标准正态)。关键在于推理时必须能方便地从 pinit 中采样。
流模型由如下 ODE 描述:
{X0∼pinitdtdXt=utθ(Xt)(随机初始化)(ODE 演化)
目标是让轨迹终点 X1 服从数据分布 pdata,即:
X1∼pdata⟺ψ1θ(X0)∼pdata
其中 ψtθ 是由向量场 utθ 诱导出的流(flow)。
虽然叫"流模型",神经网络参数化的是 utθ 而非流 ψtθ;流需要通过数值模拟 ODE 获得。采样流程见 Algorithm 1(从 pinit 采样 X0,数值积分 ODE 至 t=1 得 X1)。
Algorithm 1
Require: Neural network vector field ( utθ ), number of steps ( n )
| Step | Description |
|---|---|
| 1 | Set ( t = 0 ) |
| 2 | Set step size (h=n1) |
| 3 | Draw a sample (X0∼pinit) |
| 4 | for ( i = 1, …, n ) do |
| 5 | Xt+h=Xt+h , utθ(Xt) |
| 6 | Update ( t←t+h ) |
| 7 | end for |
| 8 | return ( X1 ) |
整个流模型,给我的直观感觉。比如图片,从随机采样的点,走向正确的图片采样点,可以理解成点的运动,也可以理解成概率密度的流动,就是在这里采样点出现的概率高或者低,这样采样才能出来类似的图片,不过这里是后续了。