笔者最近在看Sora相关的代码仓库,发现很多代码仓都用到了DPM-Solver进行Diffusion Model的采样。于是又去看了下DPM-Solver这篇论文,不看不要紧,一看给自己开了一个新坑,又去狂补习了SDE、ODE、Neural ODE等相关知识,感觉学到了不少,遂整理出来给大家分享一下。
从DPM—Solver说起
首先问大家一个面试中可能遇到的问题:
Diffusion Model能否通过一步采样得到图片?
这里我就不直接给出答案,大家可以在看完本篇文章后,在评论区留言讨论下。相信不少一开始做DDPM模型的朋友都知道,DDPM模型的一大缺点就是采样速度慢,推理往往需要1000多步才能得到较好的图片。而后来的DDIM, DPM-Solver等一系列工作就是为了改进DDPM采样速度慢的缺点。
这里简单了解一下DDIM和DPM-Solver的核心思想。DDPM模型中,我们往往要求扩散过程前向是符合马尔可夫链的,而反向过程也得同样符合马尔可夫链。因此在反向的采样过程中,我们无法省略其中的任何一步去噪过程
。而DDIM模型将前向扩散过程拓展到了non-markovian,同样地,它认为反向过程中只有一部分是符合markovian。因此,它能够实现跳步采样,从而大大缩短了模型采样时间。
而DPM-Solver,则是从另一个角度进行优化。它首先引用了几个结论,即:
DDPM是Diffusion SDE(随机微分方程,Stochastic Differential Equation)的一阶离散化模型,而DDIM是Diffusion ODE(常微分方程,Ordinary Differential Equation)的一阶离散
。DPM-Solver通过这个Diffusion ODE的形式,推导出了二阶、三阶的求解器(分别称为DPM-Solver-2和DPM-Solver-3算法),从而加速了采样过程。具体的原理推导今天就不细说了,等有空再讲一讲。
看到这里,我想大家肯定有不少的疑问:SDE是什么?ODE又是什么?Diffusion模型和SDE、ODE之间又是如何联系到一起的?别着急,今天这篇文章就是来回答上面的所有疑问。
ODE和SDE
首先回顾一下常微分方程ODE的相关知识。ODE通常是解决下面一类问题:存在一个未知的函数
, 如果方程中不仅含有自变量X, 还包含未知函数的导数
, 那么就被称为
微分方程。如果未知函数
只包含一个未知变量, 那么就是常微分方程
。如果
是个多元函数,那么方程为偏微分方程PDE。
ODE可以用公式形式化表示如下:
其中,导数的最高阶
就是ODE的阶。上面就是通常我们国内数学教材上的定义。
但实际上, ODE有一些更直观的物理意义, 它通常是来源于一些牛顿力学问题。ODE中的自变量其实就是物理上的时间
, 未知函数通常表示为时间
的函数
, 因此大家会经常在国外文献看到ODE的另外一种数学形式:
下面简单举一个ODE的例子:
可能很多人能够猜出这个ODE的解
, 但是
也同样是这个方程的解。准确来说, 我们对上式做一个积分, 就可以得到一类解:
那么如何得到一个唯一解呢?
显然, 为了使常数
固定, 仅有微分方程还不够, 我们还需要一个额外的条件, 通常称为初始条件。
这里, 我们假设初始条件为
, 那么上述ODE的解就只有
。刚才说过, ODE其实跟牛顿力学关系紧密, 这里给一个例子: 牛顿第二定律
, 这里
表示的是位移,
表示的是一个位移的二阶导, 其实就是加速度, 所以牛顿第二定律就是一个二阶的ODE方程。
了解完ODE,再来看随机微分方程SDE。和ODE类似,SDE也不是数学家们凭空想出来的一些方程,它和现实世界中的随机过程有着紧密联系。什么叫随机过程呢?随机过程就是指
值随着时间以不确定的方式变化,并且我们只能知道在某个时间点,这个值的分布。(相反地,确定性过程就是只要给定了时间t,我们就能确定这个时间点的值x(t))。
现实世界中,存在最广泛的一类随机过程就是物理课本上的
布朗运动(Brownian motion)
,它还有另外一个常见的名字
Wiener Process(维纳过程)
。下面我们简单了解下
Wiener Process
。
Wiener Process是一种Markov随机过程
,因此它未来时刻的状态只取决于当前状态,而与历史状态无关。它有一些比较特别的性质:
在
时间内发生的变化, 可以用
表示, 其中
。根据这个式子,我们知道
也是一个正态分布:
。方差会随着时间
越来越大, 越来越难预测。
其中,
。这个性质就很有意思, 我们可以简单改写一下上式:
从上面可以看出, Wiener Process的均值恒定不变, 就是
(通常, 我们就取
)。而在某个时刻
的值, 则是多个正态分布随机变量的和
。
从上面均值恒定不变的Wiener Process, 数学家们又推导出了Generalized Wiener Process
这里的
代表drift term, 表示随机过程中平均数的变化, 而
则是 variance rate, 代表方差的变化,
则是普通的Wiener Process里的随机变量。这里有一个结论:
普通的Wiener Process实际上是drift term
, variance rate
的特殊情况。
那么是否还存在更一般的随机过程呢? 存在, 它就是 Itô process (伊藤过程):
这里, 我们看到 Itô process实际上就是将drift term和variance rate从常量变成了x,t的函数。
这里的
和
我们称为drift和velocity。
需要注意的是, 对于伊藤过程, 我们没法直接推导出
和
除此之外,
伊藤过程还有个特殊的名字:diffusion process
。
其实到这里, 我们已经介绍完了SDE。Itô process和Generalized Wiener Process都是SDE, 更一般的, SDE可以写作下面的形式:
其中
的含义是:
是一个随机变量, 并且它满足初始条件
。看到这里, 其实就明白了, 伊藤过程就是general SDE的表达式。
ODE Solver
即然讲到了ODE,就无法避免ODE Solver,它与我们后续聊到的多种多样的采样器有非常大的关联。对于一些简单的ODE,我们可以用积分的方式求出它的显式表达式,而对于复杂的ODE来说,我们只能通过数值计算的方式求解。ODE Solver就是求解ODE方程的一些数值求解方法。下面我们以Euler method简单举个例子:
假设ODE是如下的形式:
已知
能否计算出
。
Euler Method
欧拉法假设h
非常小, 那么我们可以用微分的思想, 用直线代替原本函数的曲线:
而
, 其中
就是
点的斜率。
根据 ODE中的
可以直接得到, 因此可以通过下面方式计算
:
有了上面这个递推公式,我们就可以一步一步计算出y值,如下图所示:
trajectory
Diffusion模型和SDE、ODE之间的联系
连续还是离散
背景知识终于讲解完了,现在我们回到扩散模型这个主题。它与SDE、ODE之间的关系到底是怎么联系起来的呢?要回答这个问题,我们首先得了解:continous-time/discrete-time diffusion model这二者之间的区别。扩散模型的连续和离散其实对应着随机过程里的概念。一般来说,discrete time指的是随机过程中的时间
只能取离散整数值,而continous-time则指的是时间参数
可以取连续值。discrete time随机过程中的参数在一个离散的时间点只能改变一次;而continuous-time随机过程的参数则可以随时发生变化。
DDPM和SDE
回想一下,我们在DDPM里的加噪过程。每一个time step,我们都会按照如下的离散马尔可夫链进行加噪:
为了将上述过程连续化,我们需要引入连续时间随机过程。
而连续时间其实就是让每个离散的时间间隔
无限趋近于0,其实也等价于求出
时,上述马尔可夫链的极限
。
在求极限之前, 我们需要先引入一组辅助的noise scale
, 并将上面的式子改写如下:
在
时, 上面的
就成了一个关于时间
的连续函数
, 并且
。随后, 我们可以假设
, 在每个
时刻, 连续函数