概率流常微分方程(PFODE)
目录
扩散模型概率流常微分方程(Probability Flow ODE)
核心思想
数学形式
推导要点
实现步骤
注意事项
扩散模型概率流常微分方程(Probability Flow ODE)
扩散模型中的概率流常微分方程(Probability Flow ODE)是一种将随机扩散过程转化为确定性轨迹的方法。它通过构造一个确定性ODE,使得该ODE的解在任意时刻的边际分布与原始随机扩散过程的边际分布一致。
此外,Song et al. (NeurIPS 2020) 在《Score-Based Generative Modeling through Stochastic Differential Equations》表明,与任何由SDE定义的扩散过程相关联,都存在一个由常微分方程(ODE)描述的确定性过程,其轨迹在时间上共享相同的边缘密度,这通常被称为概率流ODE。在扩散模型中前向加噪过程只能用SDE表示,而反向去噪可以由SDE或ODE表示。
核心思想
给定一个随机扩散过程(如SDE),概率流ODE通过去除随机噪声项,保留漂移项的修正形式,从而生成一条确定性轨迹。这种转换在生成样本或计算似然时更高效。
数学形式
对于原始扩散过程的SDE(前向加噪):
对应的概率流ODE(反向,即噪声到干净数据)为:
概率流ODE中缺少了随机噪声项,故PFODE提供了从噪声到干净数据的一条确定性路径。
其中:
是漂移项
是噪声缩放系数
是得分函数(score function)
这两个框架对于后续学习有着非常非常重要的作用。
推导要点
- 福克普朗克(Fokker-Planck)方程:扩散过程的概率密度演化由Fokker-Planck方程描述。概率流ODE的构造需保证其解满足相同的密度演化。
- 得分匹配:得分函数
通常通过训练得分匹配网络(如噪声条件评分网络)近似。
- 确定性采样:通过求解ODE,可以避免SDE采样的随机性,提高生成效率。
实现步骤
训练阶段
- 使用分数匹配方法(如Denoising Score Matching)训练一个网络
近似真实得分函数
。
- 即
- 其中
,
,
.可参考Score Matching-分数匹配和扩散模型SDE(随机微分方程)。
采样阶段
- 初始化
(通常为高斯噪声)。
- 从
到
求解ODE:
- 使用数值ODE求解器(如Runge-Kutta方法)离散化求解。
优势
- 高效采样:相比基于SDE的采样(如Langevin动力学),ODE求解通常需要更少的步骤。
- 精确似然计算:通过ODE的连续归一化流性质,可以精确计算数据点的对数似然。
- 隐空间插值:确定性轨迹便于隐变量的插值操作。
代码示例(PyTorch框架)
import torch from torchdiffeq import odeint def probability_flow_ode(t, x, score_fn, f, g): # x: 当前状态 # score_fn: 训练好的得分函数 # f: 漂移函数 # g: 噪声系数函数 drift = f(x, t) score = score_fn(x, t) return drift - 0.5 * (g(t)**2) * score # 示例采样过程 def sample(score_fn, f, g, T=1.0, num_steps=100): t = torch.linspace(T, 0, num_steps) x_T = torch.randn(batch_size, dim) # 初始噪声 trajectory = odeint( lambda t, x: probability_flow_ode(t, x, score_fn, f, g), x_T, t, method='dopri5' ) return trajectory[-1] # 最终样本注意事项
- 得分函数精度:概率流ODE的性能高度依赖得分函数的估计质量。
- 数值稳定性:ODE求解器的选择(如自适应步长)会影响生成质量。
- 时间反转:需注意ODE的时间方向(通常从噪声向数据方向求解)。
本文来源于网络学习后,通过个人总结等完成,感谢各位前辈的讲解,如有不妥或有误的地方,欢迎大家来讨论,批评指正。
