1.1 流模型与扩散模型#
1.1.1 定义#
- 流模型: 流模型是指通过常微分方程(ODE)描述物质在空间中随时间演化的确定性动力学模型。
- 扩散模型: 扩散模型是通过随机微分方程(SDE)描述物质在空间中随机扩散的模型,考虑了确定性漂移和随机波动。
1.1.2 数学描述#
流模型和扩散模型都包含一个确定性的速度向量场分量。区别在于流模型仅包含该分量,而扩散模型还包含一个随机扩散分量。
速度向量场
设有速度向量场 ut(x),定义为
u:Rd×R→Rd,(x,t)↦ut(x)其中 d 是空间维度,t 是时间。
方程形式
对于流模型,通常有以下形式的ODE方程
dXt=ut(Xt)dt,X0=x0对于扩散模型,通常有以下形式的SDE方程
dXt=ut(Xt)dt+σtdWt,X0=x0其中 σt∈Rd×k 是扩散系数矩阵,dWt∈Rk 是标准维纳过程,ut(⋅) 是速度场,x0 是初始位置,Xt 是在时间 t 的位置随机向量。
轨迹
给定一个初始位置 x0,一条轨迹是指在速度向量场 ut 作用下,粒子从 x0 开始随时间演化的路径。一条轨迹对应于一个从特定的初始位置 x0 出发的ODE或SDE解。
流函数
流函数(或称为流映射) ψt(x0) 给出了从初始位置 x0 (这里 x0 是函数的自变量)出发,在时间 t 时的位置,它包含了所有可能轨迹的信息。对于流模型,流函数满足
dtdψt(x0)=ut(ψt(x0)),ψ0(x0)=x0维纳过程
维纳过程是一个重要的随机过程,通常用来描述随机波动。它可以被定义为一个连续时间的随机过程 Wt,满足以下性质:
- W0=0,即初始位置为零。
- Wt 具有独立增量,即对于任意时间点 0≤t1<t2<⋯<tn,增量 Wt2−Wt1,Wt3−Wt2,…,Wtn−Wtn−1 相互独立。
- Wt 的增量服从正态分布,即 Wt−Ws∼N(0,t−s),对于 t>s。
纯扩散过程(无漂移)的动力学方程为
dXt=σtdWtdWt 是什么?如何在数学公式中计算?
dWt 是维纳过程的无穷小增量,表示在时间 t 的瞬时变化。严格数学上,dWt 是随机微分方程中的随机积分记号。满足
E[dWt]=0,Var(dWt)=dt即
dWt=ϵdt,ϵ∼N(0,I)在数值计算中(如Euler-Maruyama方法),dWt 通过离散化近似为
ΔWt=ϵΔt,ϵ∼N(0,I)其中 Δt 是时间步长,ϵ 是标准正态分布的随机向量。
1.2 概率分布函数的演化#
1.2.1 随机过程#
假设有若干粒子在动力学方程 dXt=ut(Xt)dt+σtdWt 的作用下演化,且这些粒子在初始时刻 t=0 的位置服从初始分布 x0∼p0(x0)。随着时间的推移,这些粒子的位置分布会发生变化,形成一个时间依赖的概率分布 pt(x)。
考虑其中一个粒子的运动轨迹 Xt。根据上述分析,位置 Xt 是一个随机变量,其分布由初始分布 p0(x0) 和动力学方程共同决定。也就是说,Xt∼pt(xt) 是一个随机过程。
概率流函数 (Probability Flow)
定义概率流函数为
Jt(x)=ut(x)pt(x)其中 ut(x)∈Rd 是速度场,pt(x)∈R 是时间 t 的概率分布。
需要注意的是,概率流函数 Jt(x) 是一个向量值函数,其每个分量表示在位置 x 处,单位时间内通过该位置的概率质量流动的速率。与前述的流函数 ψt(x0) 不同。
1.2.2 概率分布的演化方程#
Liouville 方程
ODE 方程的概率分布 pt(x) 的演化可以通过偏微分方程来描述。对于满足动力学方程
dXt=ut(Xt)dt的流模型,其概率分布 pt(x) 满足 Liouville 方程
∂t∂pt(x)+∇x⋅(ut(x)pt(x))=0其中 ∇x⋅=∂x1∂+∂x2∂+⋯+∂xd∂ 表示散度算子。Liouville 的推导见 附录 A.1。
引入概率流函数 Jt(x)=ut(x)pt(x),Liouville 方程可以改写为
∂t∂pt(x)+∇x⋅Jt(x)=0Fokker-Planck 方程
Fokker-Planck 方程描述了随机过程的概率分布随时间的演化。对于满足 SDE
dXt=ut(Xt)dt+σtdWt的扩散模型,Fokker-Planck 方程可以表示为
∂t∂pt(x)=−∇x⋅(pt(x)ut(x))+21∇x2:(σtσt⊤pt(x))其中 ∇x2: =∑i=1d∑j=1d∂xi∂xj∂2 表示对矩阵的双重散度操作, Dt=σtσt⊤∈Rd×d 是扩散张量。同理,Fokker-Planck 方程可以类似 Liouville 方程的推导过程得到。
引入概率流函数 Jt(x)=ut(x)pt(x),Fokker-Planck 方程可以改写为
∂t∂pt(x)=−∇x⋅Jt(x)+21∇x2:(Dt⊤pt(x))1.2.3 概率分布演化——一个简单的例子#
分布的设置
设初始分布为标准高斯分布 pinit(x0)=N(0,Id),目标分布为 pdata(x1)=δz,z∈Rd,时间 t∈[0,1]。目标分布设置为 Dirac delta 分布表示我们的目标是为了将所有的初始分布的点都汇聚到 z 这个点上。
这里我们人为地构造演化分布形式,采用 z 构造高斯分布
pt(xt)=N(xt;αtz,βt2Id)这个公式也可以改写为重参数化的形式
xt=αtz+βtϵt,ϵt∼N(0,Id)其中 αt 和 βt 是调度参数。
需要注意的是,人为构造的演化分布 pt 需要满足
{p0(x0)=pinit(x0)p1(x1)=pdata(x1)因此
p0(x0)p1(x1)=N(0,Id)=N(α0z,β02Id)⟹α0=0,β0=1=N(α1z,β12Id)=δz⟹α1=1,β1=0于是我们可以设置调度参数为
αt=t,βt=1−t可视化结果
演化结果如下图所示 
动力学方程的推导
根据
xt=αtz+βtϵt,ϵt∼N(0,Id)对时间 t 求导 (注意到 ϵt 不可导),得到
dxt=dtdαtzdt+dtdβtϵtdt代入 ϵt=βtxt−αtz,得到
dxt=βtz−xtdt即
dxt=1−tz−xtdtLiouville 方程的验证
(a) 计算概率分布函数对时间的导数
pt(x)=N(x;αtz,βt2Id)=(2π)d/2βtd1exp(−2βt2∥x−αtz∥2)取对数方便计算导数
logpt(x)=−2dlog(2π)−dlogβt−2βt2∥x−αtz∥2对时间 t 求导,得到
∂t∂logpt(x)=−dβt1dtdβt+βt2(x−αtz)⊤(dtdαtz+dtdβtβtx−αtz)因此
∂t∂pt(x)=pt(x)[1−td−(1−t)3∥x−tz∥2+(1−t)2(x−tz)⊤z](b) 计算散度项
概率流函数为
Jt(x)=ut(x)pt(x)=1−tz−xpt(x)根据 ∇⋅(av)=a∇⋅v+v⋅∇a 计算散度
∇x⋅Jt(x)=pt(x)ut(x)⋅∇xlogpt(x)+∇x⋅ut(x)pt(x)其中
∇xlogpt(x)=−βt2x−αtz=−(1−t)2x−tz而 ut(x)=1−tz−x=[1−tz0−x0,1−tz1−x1,⋯,1−tzd−xd],因此 ∇x⋅ut(x)=t−1d 于是
∇x⋅Jt(x)=pt(x)[−(1−t)3(x−tz)⊤(z−x)−1−td](c) 两项相加
将 (a) 和 (b) 两项相加,得到
∂t∂pt(x)+∇x⋅Jt(x)=0从而验证了 Liouville 方程。
1.3 动力学方程的基本求解方法#
1.3.1 流模型的求解#
流模型的求解涉及到 ODE 求解。部分 ODE 存在解析解,但大部分 ODE 需要数值解法。常用的数值解法就是欧拉方法。
class EulerMethod:
def __init__(self, ode_u_func):
self.u = ode_u_func
def step(self, xt, t, dt):
# $x_{t+1} = x_t + u_t(x_t) dt$
xt_new = xt + self.u(t, xt) * dt
return xt_new
1.3.2 维纳过程的模拟#
由于扩散过程的动力 SDE 可以分解为 ODE + 维纳过程 的形式,因此我们只要能求解出维纳过程,就可以求解出扩散过程的动力学方程。
离散化
形式上,我们看似可以用积分的方法求解维纳过程
Wt=∫0tdWs=∫0tϵsds但是事实上,只有左侧的公式是正确的 (Wt=∫0tdWs 叫做伊藤积分,见 附录 B),右侧的积分是无法积出来的。最起码的 ds 这个无穷小量的平方根对应的积分是没有定义的。
Wt=∫0tϵsds正确的做法是通过离散极限和的形式得到 Wt 的值
Wt=∫0tdWs=∥Δ∥→0limi=0∑n−1ϵtiΔti,ϵti∼i.i.d.N(0,I)其中 Δti=ti−ti−1>0,Δ=maxi=1nΔti 是时间步长的最大值,ti 是离散化后的时间点。
为什么求解 Wt 时,只有离散化求和的方法?
因为维纳过程的路径虽然连续,但是并不光滑。其运动路径处处不可导的性质决定了我们无法用积分的方式直接求解。

数值解法——欧拉-丸山方法
欧拉-丸山方法是一种常用的数值解法,可用于求解维纳过程的动力学方程。其基本思想是将连续时间的随机过程离散化为一系列小时间步长的近似。具体做法是将时间区间 [0,T] 划分为 N 个小时间步长 Δt=NT,然后在每个时间步长上近似计算维纳过程的增量。
class EulerMaruyamaMethod4Wiener:
def __init__(self, wiener_sigma_func):
self.sigma = wiener_sigma_func
def sample_eps(self, x_size):
return torch.randn(x_size)
def step(self, xt, t, dt):
# $x_{t+1} = x_t + \sigma_t \epsilon_t \sqrt{dt}$
eps = self.sample_eps(xt.shape)
sigma_t = self.sigma(t)
xt_new = xt + sigma_t * eps * torch.sqrt(dt)
return xt_new
1.3.3 扩散模型的求解#
扩散模型的求解可以看作是流模型的扩展。由于扩散模型包含了随机性,因此需要在流模型的基础上加入维纳过程的模拟。我们依然采用数值解法来求解扩散模型的动力学方程。
class EulerMaruyamaMethod:
def __init__(self, sde_u_func, sde_sigma_func):
self.u = sde_u_func
self.sigma = sde_sigma_func
def sample_eps(self, x_size):
return torch.randn(x_size)
def step(self, xt, t, dt):
# $x_{t+1} = x_t + u_t(x_t) dt + \sigma_t \epsilon_t \sqrt{dt}$
eps = self.sample_eps(xt.shape)
u_t = self.u(t, xt)
sigma_t = self.sigma(t)
xt_new = xt + u_t * dt + sigma_t * eps * torch.sqrt(dt)
return xt_new
1.3.4 经典案例#
Ornstein-Uhlenbeck (OU) 过程
Ornstein-Uhlenbeck 过程是一个经典的扩散模型,常用于描述随机振动和物理系统中的噪声。其动力学方程为
dXt=θ(μ−Xt)dt+σdWt,X0=x0其中 θ 是衰减系数,μ 是均值,σ 是扩散系数。OU 过程的解可以通过欧拉-丸山方法进行数值模拟。
class OrnsteinUhlenbeckProcess:
def __init__(self, theta, mu, sigma):
self.theta = theta
self.mu = mu
self.sigma = sigma
def step(self, xt, t, dt):
# $x_{t+1} = x_t + \theta (\mu - x_t) dt + \sigma dW_t$
eps = torch.randn(xt.shape)
drift = self.theta * (self.mu - xt) * dt
diffusion = self.sigma * eps * torch.sqrt(dt)
xt_new = xt + drift + diffusion
return xt_new
OU 过程的解析解是
Xt=ψt(x0)=μ+(x0−μ)e−θt+σ∫0te−θ(t−s)dWs这一点可以通过 dtdψt(x0) 来验证。
dtdψt(x0)=−θ(x0−μ)e−θt+σe−θtdWtLangevin 动力学
Langevin 动力学是一个特殊的 OU 过程,通常用于模拟粒子在流体中的运动。其动力学方程为
dXt=21σ2∇logp(Xt)dt+σdWt,X0=x0可以证明,当满足
p(x)=N(0,2θσ2)Langevin 动力学的解与 OU 过程的解是等价的。
证明:
对于 Langevin 动力学方程
dXt=21σ2∇logp(Xt)dt+σdWt当 p(x)=N(0,2θσ2) 时,有
logp(x)=−σ2θx2+C因此
∇logp(x)=−σ22θx将此代入 Langevin 动力学方程
dXt=21σ2⋅(−σ22θXt)dt+σdWt=−θXtdt+σdWt这正是 OU 过程的动力学方程(当 μ=0 时)
dXt=θ(0−Xt)dt+σdWt=−θXtdt+σdWt因此,当目标分布为零均值高斯分布 N(0,2θσ2) 时,Langevin 动力学等价于均值为零的 OU 过程。
1.4 逆向动力学方程#
在生成模型中,我们通常先定义一个从数据分布 p0 到先验分布 pT 的前向动力学过程(时间从 0 到 T),然后学习并求解其对应的逆向动力学过程(时间从 T 到 0),从而实现从先验分布中采样生成数据。
1.4.1 逆向 ODE#
对于流模型的前向动力学方程
dXt=ut(Xt)dt,X0∼p0其对应的逆向动力学方程为
dXˉt=−uT−t(Xˉt)dt,Xˉ0∼pT这里 Xˉt 表示在逆向时间 t∈[0,T] 下的粒子状态,它与前向过程的关系是 Xˉt=XT−t。注意,逆向过程的速度场是前向速度场的时间反转形式 −uT−t。
1.4.2 逆向 SDE (Anderson 定理)#
对于扩散模型的前向动力学方程
dXt=ut(Xt)dt+σtdWt,X0∼p0根据 Anderson 定理,其对应的逆向 SDE 为
dXˉt=[−uT−t(Xˉt)+σT−t2∇logpT−t(Xˉt)]dt+σT−tdWˉt,Xˉ0∼pT其中 Wˉt 是一个标准维纳过程。这个方程描述了从 t=0 到 t=T 的逆向过程,等价于从 pT 演化到 p0。
在实际应用中,我们通常直接写出从 T 到 0 的反向积分形式,令 t 从 T 走回 0
dXt=[ut(Xt)−σt2∇logpt(Xt)](−dt)+σtdWˉt这里的 (−dt) 表示时间是反向流逝的。在数值求解时,这对应于一个负的时间步长。