家用扩散模型 (1):SDE从入门到弃疗
(2026年的)前言
(2023年)入行diffusion的人在点开开山大作DDPM的第一瞬间,会发现里面是一大堆复杂的离散概率来回求和,动不动一整屏幕公式,看起来一个头两个大。
然而,经过Mizore的研究,发现完全有办法在不学这一大堆离散玩意的情况下搞懂diffusion,因为在连续的语境下其实diffusion还挺优美的——这就是宋飏老师的传奇大作Score-Based Generative Modeling through Stochastic Differential Equations(ICLR '21),也是“家用扩散模型“这个系列的最初动机。
以下所有过程都非常不严谨——严谨的推导和证明请看参考资料。需要稍微还记得一点工科数学,包括微积分1,微积分2,线性代数和概率论。
如果想要啃离散大部头,热情推荐苏剑林老师的中文blog。喜欢看英文版离散方法的可以看翁荔老师的blog。
SDE的动机
一个传统的,没有噪声的Ordinary Differential Equation(ODE)形式上长这样:
有边际条件之后,两头对t积分我们就得到了通解,所以微分形式和积分形式可以相互转换。
假设我们要加入一个随机噪声,形式上姑且写作\(\boldsymbol{\xi}(t)=\frac{d}{dt}\boldsymbol{W}(t)\) ,那么我们可以依样画葫芦,得到一个Stochastic Differential Equation (SDE):
有了SDE+边际条件之后,我们两头对t积分就能得到通解——理论上说是这样,但这里有一些问题需要解决:
- 怎样定义噪声dW——在这里我们将会选择Wiener过程(一个更大名鼎鼎的名字是“布朗运动”)
- 怎样定义噪声/随机变量的积分\(\int_0^{T} \boldsymbol{\sigma}d\boldsymbol{W}\) ?
- “这玩意存在/唯一吗”也是个重要问题,但本文一点也不数学,所以这里就不管了。
Wiener过程 \(W(t)\)
首先考虑1D的情况。1D的 \(W(t)\) 满足如下性质:
- \(W(0)=0\)
- 如果 \(t \ge s \ge 0\),那么 \(W(t)-W(s)\) 是一个高斯分布 \(N(0, t-s)\)。这里的动机近似的来自大数定律。
- 对一个时间序列,\(W(t_1), W(t_2-t_1), \dots\) 每一项都是相互独立的——总之这个过程是马尔可夫的。
推论:
- \(E(W(t))=0,\quad E(W^2(t)) = t\)
- \(E(W(t)W(s))=\min(s, t)\)
事实上 \(W\) 是不可导的,但我们近似的还是有 \(E(\xi(t)\xi(s)) = \delta_0(s-t)\) 。
高维的情况类似,总归意思已经传达到了。
Itô积分 \(\int_0^{T} \boldsymbol{G}d\boldsymbol{W}\)
和经典的黎曼积分很像,大致上就是把G拆成很多段,然后求和:
推论:
- \(E(\int_{0}^{T}GdW)=0\)
- \(E(\int_{0}^{T}GdW\int_{0}^{T}HdW)=E(\int_{0}^{T}GHdt)\)
把G和W推广到高维的时候就是简单的做一个内积,类似的有:
- \(E(\int_{0}^{T}\boldsymbol{G}d\boldsymbol{W})=0\)
- \(E(\|\int_{0}^{T}\boldsymbol{G}d\boldsymbol{W}\|^2)=E(\int_{0}^{T}\|\boldsymbol{G}\|^2dt)\)
伊藤引理 Itô's Lemma
\(d\boldsymbol{X}(t) = \boldsymbol{\mu}(\boldsymbol{X}, t)dt + \boldsymbol{\sigma}(\boldsymbol{X}, t)d\boldsymbol{W}\) 这个式子非常好,因为你对X(t)算mean和var都非常好算。
但是很多时候式子是关于另一个数u(X, t)的——也就是说我们需要一个链式法则。
- Itô product rule: d(X1X2) = X1dX2 + X2dX1 + dX1dX2。
- 一般的,对SDE \(d\boldsymbol{X}= \boldsymbol{b}dt + \boldsymbol{G}d\boldsymbol{W}\) ,symbolically的有:
然后舍弃高阶无穷小((dW)^2和dt是一个量级,所以比dt更高阶的无穷小都可以扔了):
得到的式子就是Itô's Lemma:
其中
- \(A:B=\sum_{i, j}A_{ij}B_{ij} = Tr(A^TB)\) 是矩阵内积
- \(\nabla\) 是对x的各个维度的梯度
- \(\nabla^2\) 是对x的各个维度的Hessian(注意不是Laplacian)
Kolmogorov Backward Equation和Fokker-Planck Equation
// Kolmogorov当年其实同时提出来了两个式子,backward的和forward的,backward的是已知时间t算之前的时间s,forward的是已知时间t算之后的时间s。后来大家发现forward版的版权已经在物理学里被F-P抢注了,所以就只有backward一说。
对SDE \(d\boldsymbol{X}(t) = \boldsymbol{b}(\boldsymbol{X}, t)dt + \boldsymbol{\sigma}(\boldsymbol{X}, t)d\boldsymbol{W}\) :
我们记infinitesimal generator L,使得 \((\mathcal{L} f)(x, t) = \boldsymbol{b}(x, t)\cdot \nabla f(x)+ \boldsymbol{a}(x, t):\nabla^2f(x)\) ,其中 \(\boldsymbol{a}= \frac{1}{2}\boldsymbol{\sigma}\boldsymbol{\sigma}^T\) 。一般来说这里的b叫drift(也记作 \(\mu\) ),而a叫diffusion coefficient。
首先考虑backward的情况。将伊藤引理的式子两边从时刻s到时刻t积分,然后两边取在X_s=y时刻的期望 \(E^{y,s}[\cdot] = E[\cdot | \boldsymbol{X}_s=y]\) ,得到:
因为是期望,所以dW项就消失了。
现在考虑 \(u(y, s):=E^{y, s}[f(\boldsymbol{X}_t)]=E^{y, s}[u(\boldsymbol{X}_t, t)]\) (这是因为此时由定义,u(X_t, t)恒等于f(X_t))——注意此时f是任意函数。两边同取 \(\lim_{t \rightarrow s}{\frac{1}{t-s}}\) (其中t>s),LHS收敛到0,我们得到
- \(\partial_s u(y, s) + \mathcal{L}u(y, s) = 0, s<t, u(y, t)= f(y)\) (1)
记 \(p(x, t|y, s)\) 为转移概率,有 \(u(y, s)=\int f(x)p(t, x|s, y)dx\) ,代入上式,由于f是任意函数,所以我们就消掉了f的积分,从而得到:
- \(\partial_s p + \mathcal{L}p = 0, s<t, p(x, t|y, t)=\delta(x-y)\) (2)
(1)和(2)即为Kolmogorov Backward Equation。
然后考虑forward的情况。我们取 \(\mathcal{L}\) 的伴随 \(\mathcal{L}^*: \langle\mathcal{L}f, g\rangle=\langle f, \mathcal{L}^*g\rangle\)
通过一系列分部积分(详询参考资料),可以得到 \((\mathcal{L}^* g)(x, t) = -\nabla \cdot (\boldsymbol{b}(x, t) g(x)) + \nabla^2: (\boldsymbol{a}(x, t) g(x))\)
(注意这里g在括号内,和f不同)
然后用类似的方法,就可以得到正向的Kolmogorov Forward Equation或Fokker-Planck Equation:
- \(\partial_t \rho(x, t) = \mathcal{L}^*\rho (x, t), t>0, \rho(x, 0)=\rho_0(x)\) (3),这里\rho是t时刻X_t的概率密度。
- \(\partial_t p = \mathcal{L}^*p, t>0, p(x, s|y,s) =\delta(x-y)\) (4),这里p是p(x, t|y, s)
Reverse-time diffusion equation models
我们把KBE(2)倒着写(也就是取反向的s>t,对t求导数)
然后KFE(3)告诉我们 \(-\partial_t p(x, t) = \nabla \cdot (\boldsymbol{b}(x, t) p(x, t)) - \nabla^2: (\boldsymbol{a}(x, t) p(x, t))\),t>0 。
又, \(p(x, t, y, s) = p(y, s|x, t)p(x, t)\) ,这三个式子联立,只留下p(x, t, y, s),我们得到:
\(-\partial_t p(x, t, y, s) = \nabla \cdot (\overline{\boldsymbol{b}}(x, t) p(x, t, y, s)) - \nabla^2 : (\boldsymbol{a}(x, t)p(x, t, y, s))\) (5)
其中 \(\overline{\boldsymbol{b}^i}=\boldsymbol{b}^i - \frac{2}{p(x, t)}\nabla\cdot (p(x, t)\boldsymbol{a}^i)\) ,这里 \(\boldsymbol{a}^i\) 是a的第i行, \(\boldsymbol{b}^i\) 是b的第i个元素。
大致的思路:记 \(p_1=p(y, s|x, t), p_2=p(x, t)\)
由梯度的运算法则,有 \(\nabla \cdot(p_1p_2\boldsymbol{b})=p_2\boldsymbol{b}\cdot \nabla p_1 + p_1\nabla \cdot(p_2\boldsymbol{b})\)
按矩阵内积的定义展开,有
\(\nabla^2: (p_1p_2\boldsymbol{a}) = p_2\boldsymbol{a}:\nabla^2 p_1 + 2\sum_i \frac{\partial}{\partial_{x_i}}(p_1\nabla\cdot (p_2\boldsymbol{a}^i)) - p_1\nabla^2:(p_2\boldsymbol{a})\)
所以
\(-\partial_t(p_1p_2) = -p_2\partial_tp_1-p_1\partial_tp_2 = p_2\boldsymbol{b}\cdot \nabla p_1 + p_2\boldsymbol{a}:\nabla^2p_1 + p_1\nabla \cdot (p_2\boldsymbol{b})-p_1\nabla^2 : (p_2\boldsymbol{a})\)
化简一下就得到(5)。
那么好了,(5)是不是看着很眼熟呢?
对啦,(5)长得和(3)形式上一模一样,实际上它就是以下反向过程SDE的KFE:
这里 \(d\overline{\boldsymbol{W}}=d\boldsymbol{W}+\frac{1}{p(\boldsymbol{X_t},t)}\nabla\cdot (p(\boldsymbol{X_t}, t)\boldsymbol{\sigma}^i(\boldsymbol{X_t}, t))dt\)
你说得对,但是扩散模型是由...
现在我们回到扩散模型。根据原文,正向过程的方差是个和X无关的函数,它的SDE是:
所以反向过程SDE是:
其中 \(\overline{\boldsymbol{f}^i}=\boldsymbol{f}^i - \frac{1}{p(\boldsymbol{X}_t, t)}\frac{\partial}{\partial x_i}(p(\boldsymbol{X}_t, t)g^2(t))\)
化简一下这个式子,就得到 \(\overline{\boldsymbol{f}}=\boldsymbol{f} - \nabla (g^2(t)\log p(\boldsymbol{X}_t, t))\)
这就是原文中的3.2 GENERATING SAMPLES BY REVERSING THE SDE。
下期预告
- 其实SDE还有很多别的用处(比如Black-Scholes Model,大概做金融的人需要努力学SDE),不过和我们diffusion的关系也不大(
- 其实这里推了老半天,和diffusion基本上没什么关系,感觉作为家用扩散模型的第一篇非常不成功(