生成扩散模型漫谈(十五):构建ODE的一般步骤(中)
By 苏剑林 | 2022-12-22 | 29266位读者 |上周笔者写了《生成扩散模型漫谈(十四):构建ODE的一般步骤(上)》(当时还没有“上”这个后缀),本以为已经窥见了构建ODE扩散模型的一般规律,结果不久后评论区大神 @gaohuazuo 就给出了一个构建格林函数更高效、更直观的方案,让笔者自愧不如。再联想起之前大神之前在《生成扩散模型漫谈(十二):“硬刚”扩散ODE》同样也给出了一个关于扩散ODE的精彩描述(间接启发了上一篇博客的结果),大神的洞察力不得不让人叹服。
经过讨论和思考,笔者发现大神的思路本质上就是一阶偏微分方程的特征线法,通过构造特定的向量场保证初值条件,然后通过求解微分方程保证终值条件,同时保证了初值和终值条件,真的非常巧妙!最后,笔者将自己的收获总结成此文,作为上一篇的后续。
前情回顾 #
简单回顾一下上一篇文章的结果。假设随机变量$\boldsymbol{x}_0\in\mathbb{R}^d$连续地变换成$\boldsymbol{x}_T$,其变化规律服从ODE
\begin{equation}\frac{d\boldsymbol{x}_t}{dt}=\boldsymbol{f}_t(\boldsymbol{x}_t)\label{eq-ode}\end{equation}
那么对应的$t$时刻的分布$p_t(\boldsymbol{x}_t)$服从“连续性方程”:
\begin{equation}\frac{\partial}{\partial t} p_t(\boldsymbol{x}_t) = - \nabla_{\boldsymbol{x}_t}\cdot\Big(\boldsymbol{f}_t(\boldsymbol{x}_t) p_t(\boldsymbol{x}_t)\Big)\label{eq:ode-f-eq-fp}\end{equation}
记$\boldsymbol{u}(t, \boldsymbol{x}_t)=(p_t( \boldsymbol{x}_t), \boldsymbol{f}_t(\boldsymbol{x}_t) p_t(\boldsymbol{x}_t))\in\mathbb{R}^{d+1}$,那么连续性方程可以简写成
\begin{equation}\left\{\begin{aligned}
&\nabla_{(t,\, \boldsymbol{x}_t)}\cdot\boldsymbol{u}(t, \boldsymbol{x}_t)=0 \\
&\boldsymbol{u}_1(0, \boldsymbol{x}_0) = p_0(\boldsymbol{x}_0),\int \boldsymbol{u}_1(t, \boldsymbol{x}_t) d\boldsymbol{x}_t = 1
\end{aligned}\right.\label{eq:div-eq}\end{equation}
为了求解这个方程,可以用格林函数的思想,即先求解
\begin{equation}\left\{\begin{aligned}
&\nabla_{(t,\, \boldsymbol{x}_t)}\cdot\boldsymbol{G}(t, 0; \boldsymbol{x}_t, \boldsymbol{x}_0)=0\\
&\boldsymbol{G}_1(0, 0; \boldsymbol{x}_t, \boldsymbol{x}_0) = \delta(\boldsymbol{x}_t - \boldsymbol{x}_0),\int \boldsymbol{G}_1(t, 0; \boldsymbol{x}_t, \boldsymbol{x}_0) d\boldsymbol{x}_t = 1
\end{aligned}\right.\label{eq:div-green}\end{equation}
那么
\begin{equation}\boldsymbol{u}(t, \boldsymbol{x}_t) = \int \boldsymbol{G}(t, 0; \boldsymbol{x}_t, \boldsymbol{x}_0)p_0(\boldsymbol{x}_0) d\boldsymbol{x}_0 = \mathbb{E}_{\boldsymbol{x}_0\sim p_0(\boldsymbol{x}_0)}[\boldsymbol{G}(t, 0; \boldsymbol{x}_t, \boldsymbol{x}_0)]\label{eq:div-green-int}\end{equation}
就是满足约束条件的解之一。
几何直观 #
所谓格林函数,其实思想很简单,它就是说我们先不要着急解决复杂数据生成,我们先假设要生成的数据只有一个点$\boldsymbol{x}_0$,先解决单个数据点的生成。有的读者想这不是很简单吗?直接$\boldsymbol{x}_T\times 0 + \boldsymbol{x}_0$就完事了?当然不是这么简单,我们需要的是连续的、渐变的生成,如下图所示,就是$t=T$上的任意一点$\boldsymbol{x}_T$,都沿着一条光滑轨迹运行到$t=0$的$\boldsymbol{x}_0$上:
而我们的目的,只是构造一个生成模型出来,所以我们原则上并不在乎轨迹的形状如何,只要它们都穿过$\boldsymbol{x}_0$,那么,我们可以人为地选择我们喜欢的、经过$\boldsymbol{x}_0$的一个轨迹簇,记为
\begin{equation}\boldsymbol{\varphi}_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = \boldsymbol{x}_T\label{eq:track}\end{equation}
再次强调,这代表着以$\boldsymbol{x}_0$为起点、以$\boldsymbol{x}_T$为终点的一个轨迹簇,轨迹自变量、因变量分别为$t,\boldsymbol{x}_t$,起点$\boldsymbol{x}_0$是固定不变的,终点$\boldsymbol{x}_T$是可以任意变化的,轨迹的形状是无所谓的,我们可以选择直线、抛物线等等。
现在我们对式$\eqref{eq:track}$两边求导,由于$\boldsymbol{x}_T$是可以随意变化的,它相当于微分方程的积分常数,对它求导就等于$\boldsymbol{0}$,于是我们有
\begin{equation}\frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)}{\partial \boldsymbol{x}_t}\frac{d\boldsymbol{x}_t}{dt} + \frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)}{\partial t} = \boldsymbol{0} \\
\Downarrow \\
\frac{d\boldsymbol{x}_t}{dt} = - \left(\frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)}{\partial \boldsymbol{x}_t}\right)^{-1} \frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)}{\partial t}\end{equation}
对比式$\eqref{eq-ode}$,我们就得到
\begin{equation}\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = - \left(\frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)}{\partial \boldsymbol{x}_t}\right)^{-1} \frac{\partial \boldsymbol{\varphi}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)}{\partial t}\label{eq:f-xt-x0}\end{equation}
这里将原本的记号$\boldsymbol{f}_t(\boldsymbol{x}_t)$替换为了$\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$,以标记轨线具有公共点$\boldsymbol{x}_0$。也就是说,这样构造出来的力场$\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$所对应的ODE轨迹,必然是经过$\boldsymbol{x}_0$的,这就保证了格林函数的初值条件。
特征线法 #
既然初值条件有保证了,那么我们不妨要求更多一点:再保证一下终值条件。终值条件也就是希望$t=T$时$\boldsymbol{x}_T$的分布是跟$\boldsymbol{x}_0$无关的简单分布。上一篇文章的求解框架的主要缺点,就是无法直接保证终值分布的简单性,只能通过事后分析来研究。这篇文章的思路则是直接通过设计特定的$\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$来保证初值条件,然后就有剩余空间来保证终值条件了。而且,同时保证了初、终值后,在满足连续性方程$\eqref{eq:ode-f-eq-fp}$的前提下,积分条件是自然满足的。
用数学的方式说,我们就是要在给定$\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$和$p_T(\boldsymbol{x}_T)$的前提下,去求解方程$\eqref{eq:ode-f-eq-fp}$,这是一个一阶偏微分方程,可以通过“特征线法”求解,其理论介绍可以参考笔者之前写的《一阶偏微分方程的特征线法》。首先,我们将方程$\eqref{eq:ode-f-eq-fp}$等价地改写成
\begin{equation}\frac{\partial}{\partial t} p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) + \nabla_{\boldsymbol{x}_t}p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) \cdot \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = - p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) \nabla_{\boldsymbol{x}_t}\cdot \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)\end{equation}
同前面类似,由于接下来是在给定起点$\boldsymbol{x}_0$进行求解,所以上式将$p_t(\boldsymbol{x}_t)$替换为$p_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$,以标记这是起点为$\boldsymbol{x}_0$的解。
特征线法的思路,是先在某条特定的轨迹上考虑偏微分方程的解,这可以将偏微分转化为常微分,降低求解难度。具体来说,我们假设$\boldsymbol{x}_t$是$t$的函数,在方程$\eqref{eq-ode}$的轨线上求解。此时由于成立方程$\eqref{eq-ode}$,将上式左端的$\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$替换为$\frac{d\boldsymbol{x}_t}{dt}$后,左端正好是$p_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$的全微分,所以此时有
\begin{equation}\frac{d}{dt}p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = - p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) \nabla_{\boldsymbol{x}_t}\cdot \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)\end{equation}
注意,此时所有的$\boldsymbol{x}_t$应当被替换为对应的$t$的函数,这理论上可以从轨迹方程$\eqref{eq:track}$解出。替换后,上式的$p$、$\boldsymbol{f}$都是纯粹$t$的函数,所以上式只是关于$p$的一个线性常微分方程,可以解得
\begin{equation}p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = C \exp\left(\int_t^T \nabla_{\boldsymbol{x}_s}\cdot \boldsymbol{f}_s(\boldsymbol{x}_s|\boldsymbol{x}_0) ds\right)\end{equation}
代入终值条件$p_T(\boldsymbol{x}_T)$,得到$C=p_T(\boldsymbol{x}_T)$,即
\begin{equation}p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = p_T(\boldsymbol{x}_T) \exp\left(\int_t^T \nabla_{\boldsymbol{x}_s}\cdot \boldsymbol{f}_s(\boldsymbol{x}_s|\boldsymbol{x}_0) ds\right)\label{eq:pt-xt-x0}\end{equation}
把轨迹方程$\eqref{eq:track}$的$\boldsymbol{x}_T$代入,就得到一个只含有$t,\boldsymbol{x}_t,\boldsymbol{x}_0$的函数,便是最终要求解的格林函数$\boldsymbol{G}_1(t, 0; \boldsymbol{x}_t, \boldsymbol{x}_0)$了,相应地有$\boldsymbol{G}_{> 1}(t, 0; \boldsymbol{x}_t, \boldsymbol{x}_0)=p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$。
训练目标 #
有了格林函数,我们就可以得到
\begin{equation}\begin{aligned}
\boldsymbol{u}_1(t, \boldsymbol{x}_t) =&\, \int p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) p_0(\boldsymbol{x}_0) d\boldsymbol{x}_0 = p_t(\boldsymbol{x}_t)\\
\boldsymbol{u}_{> 1}(t, \boldsymbol{x}_t) =&\, \int \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0) p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) p_0(\boldsymbol{x}_0) d\boldsymbol{x}_0
\end{aligned}\end{equation}
于是
\begin{equation}\begin{aligned}
\boldsymbol{f}_t(\boldsymbol{x}_t)=&\,\frac{\boldsymbol{u}_{> 1}(t, \boldsymbol{x}_t)}{\boldsymbol{u}_1(t, \boldsymbol{x}_t)} \\
=&\,\int \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0) \frac{p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) p_0(\boldsymbol{x}_0)}{p_t(\boldsymbol{x}_t)} d\boldsymbol{x}_0 \\
=&\,\int \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0) p_t(\boldsymbol{x}_0|\boldsymbol{x}_t) d\boldsymbol{x}_0 \\
=&\,\mathbb{E}_{\boldsymbol{x}_0\sim p_t(\boldsymbol{x}_0|\boldsymbol{x}_t)}\left[\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)\right]
\end{aligned}\end{equation}
根据《生成扩散模型漫谈(五):一般框架之SDE篇》中构建得分匹配目标的方法,可以构建训练目标
\begin{equation}\begin{aligned}&\,\mathbb{E}_{\boldsymbol{x}_t\sim p
_t(\boldsymbol{x}_t)}\Big[\mathbb{E}_{\boldsymbol{x}_t\sim p
_t(\boldsymbol{x}_0|\boldsymbol{x}_t)}\left[\left\Vert \boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t) - \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)\right\Vert^2\right]\Big] d\boldsymbol{x}_t \\
=&\, \mathbb{E}_{\boldsymbol{x}_0,\boldsymbol{x}_t \sim p_t(\boldsymbol{x}_t|\boldsymbol{x}_0)p
_0(\boldsymbol{x}_0)}\left[\left\Vert \boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t) - \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)\right\Vert^2\right]
\end{aligned}\label{eq:score-match}\end{equation}
它跟《Flow Matching for Generative Modeling》所给出的“Conditional Flow Matching”形式上是一致的,后面我们还会看到,该论文的结果都可以从本文的方法推出。训练完成后,就可以通过求解方程$\frac{d\boldsymbol{x}_t}{dt}=\boldsymbol{v}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)$来生成样本了。从这个训练目标也可以看出,我们对$p_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$的要求是易于采样就行了。
一些例子 #
可能前面的抽象结果对大家来说还是不大好理解,接下来我们来给出一些具体例子,以便加深大家对这个框架的直观理解。至于特征线法本身,笔者在《一阶偏微分方程的特征线法》也说过,一开始笔者也觉得特征线法像是“变魔术”一样难以捉摸,按照步骤操作似乎不困难,但总把握不住关键之处,理解它需要一个反复斟酌的思考过程,无法进一步代劳了。
直线轨迹 #
作为最简单的例子,我们假设$\boldsymbol{x}_T$是沿着直线轨迹变为$\boldsymbol{x}_0$,简单起见我们还可以将$T$设为1,这不会损失一般性,那么$\boldsymbol{x}_t$的方程可以写为
\begin{equation}\boldsymbol{x}_t = (\boldsymbol{x}_1 - \boldsymbol{x}_0)t + \boldsymbol{x}_0\quad\Rightarrow\quad \frac{\boldsymbol{x}_t - \boldsymbol{x}_0}{t} + \boldsymbol{x}_0 = \boldsymbol{x}_1\label{eq:simplest-x1}\end{equation}
根据式$\eqref{eq:f-xt-x0}$,有
\begin{equation}\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = \frac{\boldsymbol{x}_t - \boldsymbol{x}_0}{t}\end{equation}
此时$\nabla_{\boldsymbol{x}_t}\cdot \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)=\frac{d}{t}$,根据式$\eqref{eq:pt-xt-x0}$就有
\begin{equation}p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = \frac{p_1(\boldsymbol{x}_1)}{t^d}\end{equation}
代入式$\eqref{eq:simplest-x1}$中的$\boldsymbol{x}_1$,得到
\begin{equation}p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = \frac{p_1\left(\frac{\boldsymbol{x}_t - \boldsymbol{x}_0}{t} + \boldsymbol{x}_0\right)}{t^d}\end{equation}
特别地,如果$p_1(\boldsymbol{x}_1)$是标准正态分布,那么上式实则意味着$p_t(\boldsymbol{x}_t|\boldsymbol{x}_0)=\mathcal{N}(\boldsymbol{x}_t;(1-t)\boldsymbol{x}_0,t^2\boldsymbol{I})$,这正好是常见的高斯扩散模型之一。这个框架的新结果,是允许我们选择更一般的先验分布$p_1(\boldsymbol{x}_1)$,比如均匀分布。另外在介绍得分匹配$\eqref{eq:score-match}$时也已经说了,对$p_t(\boldsymbol{x}_t|\boldsymbol{x}_0)$我们只需要知道它的采样方式就行了,而上式告诉我们只需要先验分布易于采样就行,因为:
\begin{equation}\boldsymbol{x}_t\sim p_t(\boldsymbol{x}_t|\boldsymbol{x}_0)\quad\Leftrightarrow\quad \boldsymbol{x}_t=(1-t)\boldsymbol{x}_0 + t\boldsymbol{\varepsilon},\,\boldsymbol{\varepsilon}\sim p_1(\boldsymbol{\varepsilon})\end{equation}
效果演示 #
注意,我们假设从$\boldsymbol{x}_0$到$\boldsymbol{x}_1$的轨迹是一条直线,这仅仅是对于单点生成的,也就是格林函数解。当通过格林函数叠加出一般分布对应的的力场$\boldsymbol{f}_t(\boldsymbol{x}_t)$时,其生成轨迹就不再是直线了。
下图演示了先验分布为均匀分布时多点生成的轨线图:
参考作图代码:
import numpy as np
from scipy.integrate import odeint
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rc('text', usetex=True)
matplotlib.rcParams['text.latex.preamble']=[r"\usepackage{amsmath}"]
prior = lambda x: 0.5 if 2 >= x >= 0 else 0
p = lambda xt, x0, t: prior((xt - x0) / t + x0) / t
f = lambda xt, x0, t: (xt - x0) / t
def f_full(xt, t):
x0s = [0.5, 0.5, 1.2, 1.7] # 0.5出现两次,代表其频率是其余的两倍
fs = np.array([f(xt, x0, t) for x0 in x0s]).reshape(-1)
ps = np.array([p(xt, x0, t) for x0 in x0s]).reshape(-1)
return (fs * ps).sum() / (ps.sum() + 1e-8)
for x1 in np.arange(0.01, 1.99, 0.10999/2):
ts = np.arange(1, 0, -0.001)
xs = odeint(f_full, x1, ts).reshape(-1)[::-1]
ts = ts[::-1]
if abs(xs[0] - 0.5) < 0.1:
_ = plt.plot(ts, xs, color='skyblue')
elif abs(xs[0] - 1.2) < 0.1:
_ = plt.plot(ts, xs, color='orange')
else:
_ = plt.plot(ts, xs, color='limegreen')
plt.xlabel('$t$')
plt.ylabel(r'$\boldsymbol{x}$')
plt.show()
一般推广 #
其实上面的结果还可以一般地推广到
\begin{equation}\boldsymbol{x}_t = \boldsymbol{\mu}_t(\boldsymbol{x}_0) + \sigma_t \boldsymbol{x}_1\quad\Rightarrow\quad \frac{\boldsymbol{x}_t - \boldsymbol{\mu}_t(\boldsymbol{x}_0)}{\sigma_t }= \boldsymbol{x}_1\end{equation}
这里的$\boldsymbol{\mu}_t(\boldsymbol{x}_0)$是任意满足$\boldsymbol{\mu}_0(\boldsymbol{x}_0)=\boldsymbol{x}_0, \boldsymbol{\mu}_1(\boldsymbol{x}_0)=\boldsymbol{0}$的$\mathbb{R}^d\mapsto\mathbb{R}^d$函数,$\sigma_t$是任意满足$\sigma_0=0,\sigma_1=1$的单调递增函数。根据式$\eqref{eq:f-xt-x0}$,有
\begin{equation}\boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = \dot{\boldsymbol{\mu}}_t(\boldsymbol{x}_0) + \frac{\dot{\sigma}_t}{\sigma_t}(\boldsymbol{x}_t - \boldsymbol{\mu}_t(\boldsymbol{x}_0))\end{equation}
这也等价于《Flow Matching for Generative Modeling》中的式$(15)$,此时$\nabla_{\boldsymbol{x}_t}\cdot \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)=\frac{d\dot{\sigma}_t}{\sigma_t}$,根据式$\eqref{eq:pt-xt-x0}$就有
\begin{equation}p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = \frac{p_1(\boldsymbol{x}_1)}{\sigma_t^d}\end{equation}
代入$\boldsymbol{x}_1$,最终结果是
\begin{equation}p_t(\boldsymbol{x}_t|\boldsymbol{x}_0) = \frac{p_1\left(\frac{\boldsymbol{x}_t - \boldsymbol{\mu}_t(\boldsymbol{x}_0)}{\sigma_t }\right)}{\sigma_t^d}\end{equation}
这是关于线性ODE扩散的一般结果,包含高斯扩散,也允许使用非高斯的先验分布。
再复杂些? #
前面的例子,都是通过$\boldsymbol{x}_0$(的某个变换)与$\boldsymbol{x}_1$的简单线性插值(插值权重纯粹是$t$的函数)来构建$\boldsymbol{x}_t$的变化轨迹。那么一个很自然的问题就是:可不可以考虑更复杂的轨迹呢?理论上可以,但是更高的复杂度意味着隐含了更多的假设,而我们通常很难检验目标数据是否支持这些假设,因此通常都不考虑更复杂的轨迹了。此外,对于更复杂的轨迹,解析求解的难度通常也更高,不管是理论还是实验,都难以操作下去。
更重要的一点的,我们目前所假设的轨迹,仅仅是单点生成的轨迹而已,前面已经演示了,即便假设为直线,多点生成依然会导致复杂的曲线。所以,如果单点生成的轨迹都假设得不必要的复杂,那么可以想像多点生成的轨迹复杂度将会奇高,模型可能会极度不稳定。
文章小结 #
接着上一篇文章的内容,本文再次讨论了ODE式扩散模型的构建思路。这一次我们从几何直观出发,通过构造特定的向量场保证结果满足初值分布条件,然后通过求解微分方程保证终值分布条件,得到一个同时满足初值和终值条件的格林函数。特别地,该方法允许我们使用任意简单分布作为先验分布,摆脱以往对高斯分布的依赖来构建扩散模型。
转载到请包括本文地址:https://kexue.fm/archives/9379
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Dec. 22, 2022). 《生成扩散模型漫谈(十五):构建ODE的一般步骤(中) 》[Blog post]. Retrieved from https://kexue.fm/archives/9379
@online{kexuefm-9379,
title={生成扩散模型漫谈(十五):构建ODE的一般步骤(中)},
author={苏剑林},
year={2022},
month={Dec},
url={\url{https://kexue.fm/archives/9379}},
}
December 24th, 2022
公式15最后的结果 是不是就是这个paper 里面的conditional flow matching呢?https://arxiv.org/pdf/2210.02747.pdf
嗯嗯,经大家提示,我去看了看该论文,发现本文的方法确实也能复现原论文的大部分结果,重合度较高,所以在正文补充上跟它的联系了。
March 7th, 2023
苏老师您好,我想请问您一下
1、ODE相关的生成扩散模型如何增加条件信息呢?
2、离散的DDIM可以在每个时间步中插入condition,那ODE求解过程中如何插入condition呢?
3、如果有这种条件ODE,那么他的损失函数又该如何考虑呢?
现在是否有相关的条件ODE文献可以学习一下。
期待着您的回复,感谢!
这个问题在 https://kexue.fm/archives/9257 已经讲过了。ODE扩散模型也是通过得分匹配来学习是$\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x})$,那么有条件生成的话,就是要将它换成$\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x}|\boldsymbol{y})$了。或者利用贝叶斯公式有
$$\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x}|\boldsymbol{y}) = \nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x}) + \nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{y}|\boldsymbol{x})$$
也就是说,只需要在原本的$\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{x})$模型上,加上分类器的梯度$\nabla_{\boldsymbol{x}}\log p_t(\boldsymbol{y}|\boldsymbol{x})$就行。
December 7th, 2023
[...]本文我们聚焦于ODE。在本系列的(六)、(十二)、(十四)、(十五)、(十七)等博客中,我们已经推导过ODE与扩散模型的联系,本文则对扩散ODE的采样加速做简单介绍,并重点介绍一种巧妙地利用“中值定理”思想的新颖采样加速方案“AMED”。[...]
November 16th, 2024
请问一下苏神,为什么$\nabla_{\boldsymbol{x}_t}\cdot \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)=\frac{d}{t}$而不是$\nabla_{\boldsymbol{x}_t}\cdot \boldsymbol{f}_t(\boldsymbol{x}_t|\boldsymbol{x}_0)=\frac{1}{t}$呢?
$\nabla_{\boldsymbol{x}} \cdot \boldsymbol{f} = \frac{\partial f_1}{\partial x_1} + \frac{\partial f_2}{\partial x_2} + \cdots + \frac{\partial f_d}{\partial x_d}$,需要求和的~
December 7th, 2024
请问一下,为什么同时保证了初、终值后,在满足连续性方程(2)的前提下,积分条件是自然满足的?
只要初值是一个概率密度(积分为1),那么连续性方程的解对于任意$t$来说都是一个概率密度,所以积分为1,或者说连续性方程本就是概率守恒推导出来的。
当然,你要直接证也可以,对连续性方程两端做全空间积分:
$$\frac{\partial}{\partial t} \int p_t(\boldsymbol{x}_t) d\boldsymbol{x}_t= - \int \nabla_{\boldsymbol{x}_t}\cdot\Big(\boldsymbol{f}_t(\boldsymbol{x}_t) p_t(\boldsymbol{x}_t)\Big)d\boldsymbol{x}_t$$
右端利用高斯散度定理转化为面积分,而全空间的面是无穷远,概率密度在无穷远处等于零,所以积分是零,因此
$$\frac{\partial}{\partial t} \int p_t(\boldsymbol{x}_t) d\boldsymbol{x}_t= 0\quad\Rightarrow\quad \int p_t(\boldsymbol{x}_t) d\boldsymbol{x}_t=\text{常数}$$