生成扩散模型漫谈(四):DDIM = 高观点DDPM
By 苏剑林 | 2022-07-27 | 197446位读者 |相信很多读者都听说过甚至读过克莱因的《高观点下的初等数学》这套书,顾名思义,这是在学到了更深入、更完备的数学知识后,从更高的视角重新审视过往学过的初等数学,以得到更全面的认知,甚至达到温故而知新的效果。类似的书籍还有很多,比如《重温微积分》、《复分析:可视化方法》等。
回到扩散模型,目前我们已经通过三篇文章从不同视角去解读了DDPM,那么它是否也存在一个更高的理解视角,让我们能从中得到新的收获呢?当然有,《Denoising Diffusion Implicit Models》介绍的DDIM模型就是经典的案例,本文一起来欣赏它。
思路分析 #
在《生成扩散模型漫谈(三):DDPM = 贝叶斯 + 去噪》中,我们提到过该文章所介绍的推导跟DDIM紧密相关。具体来说,文章的推导路线可以简单归纳如下:
\begin{equation}p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})\xrightarrow{\text{推导}}p(\boldsymbol{x}_t|\boldsymbol{x}_0)\xrightarrow{\text{推导}}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)\xrightarrow{\text{近似}}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)\end{equation}
这个过程是一步步递进的。然而,我们发现最终结果有着两个特点:
1、损失函数只依赖于$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$;
2、采样过程只依赖于$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$。
也就是说,尽管整个过程是以$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$为出发点一步步往前推的,但是从结果上来看,压根儿就没$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$的事。那么,我们大胆地“异想天开”一下:
高观点1: 既然结果跟$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$无关,可不可以干脆“过河拆桥”,将$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$从整个推导过程中去掉?
DDIM正是这个“异想天开”的产物!
待定系数 #
可能有读者会想,根据上一篇文章所用的贝叶斯定理
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) = \frac{p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)}{p(\boldsymbol{x}_t|\boldsymbol{x}_0)}\end{equation}
没有给定$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$怎么能得到$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$?这其实是思维过于定式了,理论上在没有给定$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$的情况下,$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$的解空间更大,某种意义上来说是更加容易推导,此时它只需要满足边际分布条件:
\begin{equation}\int p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) p(\boldsymbol{x}_t|\boldsymbol{x}_0) d\boldsymbol{x}_t = p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)\label{eq:margin}\end{equation}
我们用待定系数法来求解这个方程。在上一篇文章中,所解出的$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$是一个正态分布,所以这一次我们可以更一般地设
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) = \mathcal{N}(\boldsymbol{x}_{t-1}; \kappa_t \boldsymbol{x}_t + \lambda_t \boldsymbol{x}_0, \sigma_t^2 \boldsymbol{I})\end{equation}
其中$\kappa_t,\lambda_t,\sigma_t$都是待定系数,而为了不重新训练模型,我们不改变$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)$和$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$,于是我们可以列出
\begin{array}{c|c|c}
\hline
\text{记号} & \text{含义} & \text{采样}\\
\hline
p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0) & \mathcal{N}(\boldsymbol{x}_{t-1};\bar{\alpha}_{t-1} \boldsymbol{x}_0,\bar{\beta}_{t-1}^2 \boldsymbol{I}) & \boldsymbol{x}_{t-1} = \bar{\alpha}_{t-1} \boldsymbol{x}_0 + \bar{\beta}_{t-1} \boldsymbol{\varepsilon} \\
\hline
p(\boldsymbol{x}_t|\boldsymbol{x}_0) & \mathcal{N}(\boldsymbol{x}_t;\bar{\alpha}_t \boldsymbol{x}_0,\bar{\beta}_t^2 \boldsymbol{I}) & \boldsymbol{x}_t = \bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon}_1 \\
\hline
p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) & \mathcal{N}(\boldsymbol{x}_{t-1}; \kappa_t \boldsymbol{x}_t + \lambda_t \boldsymbol{x}_0, \sigma_t^2 \boldsymbol{I}) & \boldsymbol{x}_{t-1} = \kappa_t \boldsymbol{x}_t + \lambda_t \boldsymbol{x}_0 + \sigma_t \boldsymbol{\varepsilon}_2 \\
\hline
{\begin{array}{c}\int p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) \\
p(\boldsymbol{x}_t|\boldsymbol{x}_0) d\boldsymbol{x}_t\end{array}} & & {\begin{aligned}\boldsymbol{x}_{t-1} =&\, \kappa_t \boldsymbol{x}_t + \lambda_t \boldsymbol{x}_0 + \sigma_t \boldsymbol{\varepsilon}_2 \\
=&\, \kappa_t (\bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon}_1) + \lambda_t \boldsymbol{x}_0 + \sigma_t \boldsymbol{\varepsilon}_2 \\
=&\, (\kappa_t \bar{\alpha}_t + \lambda_t) \boldsymbol{x}_0 + (\kappa_t\bar{\beta}_t \boldsymbol{\varepsilon}_1 + \sigma_t \boldsymbol{\varepsilon}_2) \\
\end{aligned}} \\
\hline
\end{array}
其中$\boldsymbol{\varepsilon},\boldsymbol{\varepsilon}_1,\boldsymbol{\varepsilon}_2\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I})$,并且由正态分布的叠加性我们知道$\kappa_t\bar{\beta}_t \boldsymbol{\varepsilon}_1 + \sigma_t \boldsymbol{\varepsilon}_2\sim \sqrt{\kappa_t^2\bar{\beta}_t^2 + \sigma_t^2} \boldsymbol{\varepsilon}$。对比$\boldsymbol{x}_{t-1}$的两个采样形式,我们发现要想$\eqref{eq:margin}$成立,只需要满足两个方程
\begin{equation}\bar{\alpha}_{t-1} = \kappa_t \bar{\alpha}_t + \lambda_t, \qquad\bar{\beta}_{t-1} = \sqrt{\kappa_t^2\bar{\beta}_t^2 + \sigma_t^2}\end{equation}
可以看到有三个未知数,但只有两个方程,这就是为什么说没有给定$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$时解空间反而更大了。将$\sigma_t$视为可变参数,可以解出
\begin{equation}\kappa_t = \frac{\sqrt{\bar{\beta}_{t-1}^2 - \sigma_t^2}}{\bar{\beta}_t},\qquad \lambda_t = \bar{\alpha}_{t-1} - \frac{\bar{\alpha}_t\sqrt{\bar{\beta}_{t-1}^2 - \sigma_t^2}}{\bar{\beta}_t}\end{equation}
或者写成
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) = \mathcal{N}\left(\boldsymbol{x}_{t-1}; \frac{\sqrt{\bar{\beta}_{t-1}^2 - \sigma_t^2}}{\bar{\beta}_t} \boldsymbol{x}_t + \left(\bar{\alpha}_{t-1} - \frac{\bar{\alpha}_t\sqrt{\bar{\beta}_{t-1}^2 - \sigma_t^2}}{\bar{\beta}_t}\right) \boldsymbol{x}_0, \sigma_t^2 \boldsymbol{I}\right)\label{eq:p-xt-x0}\end{equation}
方便起见,我们约定$\bar{\alpha}_0=1, \bar{\beta}_0=0$。特别地,这个结果并不需要限定$\bar{\alpha}_t^2 + \bar{\beta}_t^2 = 1$,不过为了简化参数设置,同时也为了跟以往的结果对齐,这里还是约定$\bar{\alpha}_t^2 + \bar{\beta}_t^2 = 1$。
一如既往 #
现在我们在只给定$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$、$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)$的情况下,通过待定系数法求解了$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$的一簇解,它带有一个自由参数$\sigma_t$。用《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼》中的“拆楼-建楼”类比来说,就是我们知道楼会被拆成什么样【$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$、$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)$】,但是不知道每一步怎么拆【$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$】,然后希望能够从中学会每一步怎么建【$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$】。当然,如果我们想看看每一步怎么拆的话,也可以反过来用贝叶斯公式
\begin{equation} p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1}, \boldsymbol{x}_0) = \frac{p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) p(\boldsymbol{x}_t|\boldsymbol{x}_0)}{p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)}\end{equation}
接下来的事情,就跟上一篇文章一模一样了:我们最终想要$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$而不是$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$,所以我们希望用
\begin{equation}\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t) = \frac{1}{\bar{\alpha}_t}\left(\boldsymbol{x}_t - \bar{\beta}_t \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right)\end{equation}
来估计$\boldsymbol{x}_0$,由于没有改动$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$,所以训练所用的目标函数依然是$\left\Vert\boldsymbol{\varepsilon} - \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon}, t)\right\Vert^2$(除去权重系数),也就是说训练过程没有改变,我们可以用回DDPM训练好的模型。而用$\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)$替换掉式$\eqref{eq:p-xt-x0}$中的$\boldsymbol{x}_0$后,得到
\begin{equation}\begin{aligned}
p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) \approx&\, p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0=\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)) \\
=&\, \mathcal{N}\left(\boldsymbol{x}_{t-1}; \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \left(\bar{\beta}_t - \alpha_t\sqrt{\bar{\beta}_{t-1}^2 - \sigma_t^2}\right) \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right), \sigma_t^2 \boldsymbol{I}\right)
\end{aligned}\label{eq:p-xt-x0-2}\end{equation}
这就求出了生成过程所需要的$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$,其中$\alpha_t=\frac{\bar{\alpha}_t}{\bar{\alpha}_{t-1}}$。它的特点是训练过程没有变化(也就是说最终保存下来的模型没有变化),但生成过程却有一个可变动的参数$\sigma_t$,就是这个参数给DDPM带来了新鲜的结果。
几个例子 #
原则上来说,我们对$\sigma_t$没有过多的约束,但是不同$\sigma_t$的采样过程会呈现出不同的特点,我们举几个例子进行分析。
第一个简单例子就是取$\sigma_t = \frac{\bar{\beta}_{t-1}\beta_t}{\bar{\beta}_t}$,其中$\beta_t = \sqrt{1 - \alpha_t^2}$,相应地有
\begin{equation}\small{p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) \approx p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0=\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)) = \mathcal{N}\left(\boldsymbol{x}_{t-1}; \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \frac{\beta_t^2}{\bar{\beta}_t}\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right),\frac{\bar{\beta}_{t-1}^2\beta_t^2}{\bar{\beta}_t^2} \boldsymbol{I}\right)}\label{eq:choice-1}\end{equation}
这就是上一篇文章所推导的DDPM。特别是,DDIM论文中还对$\sigma_t = \eta\frac{\bar{\beta}_{t-1}\beta_t}{\bar{\beta}_t}$做了对比实验,其中$\eta\in[0, 1]$。
第二个例子就是取$\sigma_t = \beta_t$,这也是前两篇文章所指出的$\sigma_t$的两个选择之一,在此选择下式$\eqref{eq:p-xt-x0-2}$未能做进一步的化简,但DDIM的实验结果显示此选择在DDPM的标准参数设置下表现还是很好的。
最特殊的一个例子是取$\sigma_t = 0$,此时从$\boldsymbol{x}_t$到$\boldsymbol{x}_{t-1}$是一个确定性变换
\begin{equation}\boldsymbol{x}_{t-1} = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \left(\bar{\beta}_t - \alpha_t \bar{\beta}_{t-1}\right) \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right)\label{eq:sigma=0}\end{equation}
这也是DDIM论文中特别关心的一个例子,准确来说,原论文的DDIM就是特指$\sigma_t=0$的情形,其中“I”的含义就是“Implicit”,意思这是一个隐式的概率模型,因为跟其他选择所不同的是,此时从给定的$\boldsymbol{x}_T = \boldsymbol{z}$出发,得到的生成结果$\boldsymbol{x}_0$是不带随机性的。后面我们将会看到,这在理论上和实用上都带来了一些好处。
加速生成 #
值得指出的是,在这篇文章中我们没有以$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$为出发点,所以前面的所有结果实际上全都是以$\bar{\alpha}_t,\bar{\beta}_t$相关记号给出的,而$\alpha_t,\beta_t$则是通过$\alpha_t=\frac{\bar{\alpha}_t}{\bar{\alpha}_{t-1}}$和$\beta_t = \sqrt{1 - \alpha_t^2}$派生出来的记号。从损失函数$\left\Vert\boldsymbol{\varepsilon} - \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon}, t)\right\Vert^2$可以看出,给定了各个$\bar{\alpha}_t$,训练过程也就确定了。
从这个过程中,DDIM进一步留意到了如下事实:
高观点2: DDPM的训练结果实质上包含了它的任意子序列参数的训练结果。
具体来说,设$\boldsymbol{\tau} = [\tau_1,\tau_2,\dots,\tau_{\dim(\boldsymbol{\tau})}]$是$[1,2,\cdots,T]$的任意子序列,那么我们以$\bar{\alpha}_{\tau_1},\bar{\alpha}_{\tau_2},\cdots,\bar{\alpha}_{\dim(\boldsymbol{\tau})}$为参数训练一个扩散步数为$\dim(\boldsymbol{\tau})$步的DDPM,其目标函数实际上是原来以$\bar{\alpha}_1,\bar{\alpha}_2,\cdots,\bar{\alpha}_T$的$T$步DDPM的目标函数的一个子集!所以在模型拟合能力足够好的情况下,它其实包含了任意子序列参数的训练结果。
那么反过来想,如果有一个训练好的$T$步DDPM模型,我们也可以将它当成是以$\bar{\alpha}_{\tau_1},\bar{\alpha}_{\tau_2},\cdots,\bar{\alpha}_{\dim(\boldsymbol{\tau})}$为参数训练出来的$\dim(\boldsymbol{\tau})$步模型,而既然是$\dim(\boldsymbol{\tau})$步的模型,生成过程也就只需要$\dim(\boldsymbol{\tau})$步了,根据式$\eqref{eq:p-xt-x0-2}$有:
\begin{equation}p(\boldsymbol{x}_{\tau_{i-1}}|\boldsymbol{x}_{\tau_i}) \approx \mathcal{N}\left(\boldsymbol{x}_{\tau_{i-1}}; \frac{\bar{\alpha}_{\tau_{i-1}}}{\bar{\alpha}_{\tau_i}}\left(\boldsymbol{x}_{\tau_i} - \left(\bar{\beta}_{\tau_i} - \frac{\bar{\alpha}_{\tau_i}}{\bar{\alpha}_{\tau_{i-1}}}\sqrt{\bar{\beta}_{\tau_{i-1}}^2 - \tilde{\sigma}_{\tau_i}^2}\right) \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_{\tau_i}, \tau_i)\right), \tilde{\sigma}_{\tau_i}^2 \boldsymbol{I}\right)\end{equation}
这就是加速采样的生成过程了,从原来的$T$步扩散生成变成了$\dim(\boldsymbol{\tau})$步。要注意不能直接将式$\eqref{eq:p-xt-x0-2}$的$\alpha_t$换成$\alpha_{\tau_i}$,因为我们说过$\alpha_t$是派生记号而已,它实际上等于$\frac{\bar{\alpha}_t}{\bar{\alpha}_{t-1}}$,因此$\alpha_t$要换成$\frac{\bar{\alpha}_{\tau_i}}{\bar{\alpha}_{\tau_{i-1}}}$才对。同理,$\tilde{\sigma}_{\tau_i}$也不是直接取$\sigma_{\tau_i}$,而是在将其定义全部转化为$\bar{\alpha},\bar{\beta}$符号后,将$t$替换为$\tau_i$、$t-1$替换为$\tau_{i-1}$,比如式$\eqref{eq:choice-1}$对应的$\tilde{\sigma}_{\tau_i}$为
\begin{equation}\sigma_t = \frac{\bar{\beta}_{t-1}\beta_t}{\bar{\beta}_t}=\frac{\bar{\beta}_{t-1}}{\bar{\beta}_t}\sqrt{1 - \frac{\bar{\alpha}_t^2}{\bar{\alpha}_{t-1}^2}}\quad\to\quad\frac{\bar{\beta}_{\tau_{i-1}}}{\bar{\beta}_{\tau_i}}\sqrt{1 - \frac{\bar{\alpha}_{\tau_i}^2}{\bar{\alpha}_{\tau_{i-1}}^2}}=\tilde{\sigma}_{\tau_i}\end{equation}
可能读者又想问,我们为什么干脆不直接训练一个$\dim(\boldsymbol{\tau})$步的扩散模型,而是要先训练$T > \dim(\boldsymbol{\tau})$步然后去做子序列采样?笔者认为可能有两方面的考虑:一方面从$\dim(\boldsymbol{\tau})$步生成来说,训练更多步数的模型也许能增强泛化能力;另一方面,通过子序列$\boldsymbol{\tau}$进行加速只是其中一种加速手段,训练更充分的$T$步允许我们尝试更多的其他加速手段,但并不会显著增加训练成本。
实验结果 #
原论文对不同的噪声强度和扩散步数$\dim(\boldsymbol{\tau})$做了组合对比,大致上的结果是“噪声越小,加速后的生成效果越好”,如下图
笔者的参考实现如下:
个人的实验结论是:
1、可能跟直觉相反,生成过程中的$\sigma_t$越小,最终生成图像的噪声和多样性反而相对来说越大;
2、扩散步数$\dim(\boldsymbol{\tau})$越少,生成的图片更加平滑,多样性也会有所降低;
3、结合1、2两点得知,在扩散步数$\dim(\boldsymbol{\tau})$减少时,可以适当缩小$\sigma_t$,以保持生成图片质量大致不变,这跟DDIM原论文的实验结论是一致的;
4、在$\sigma_t$较小时,相比可训练的Embedding层,用固定的Sinusoidal编码来表示$t$所生成图片的噪声要更小;
5、在$\sigma_t$较小时,原论文的U-Net架构(Github中的ddpm2.py)要比笔者自行构思的U-Net架构(Github中的ddpm.py)所生成图片的噪声要更小;
6、但个人感觉,总体来说不带噪声的生成过程的生成效果不如带噪声的生成过程,不带噪声时生成效果受模型架构影响较大。
此外,对于$\sigma_t=0$时的DDIM,它就是将任意正态噪声向量变换为图片的一个确定性变换,这已经跟GAN几乎一致了,所以跟GAN类似,我们可以对噪声向量进行插值,然后观察对应的生成效果。但要注意的是,DDPM或DDIM对噪声分布都比较敏感,所以我们不能用线性插值而要用球面插值,因为由正态分布的叠加性,如果$\boldsymbol{z}_1,\boldsymbol{z}_2\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$,$\lambda\boldsymbol{z}_1 + (1-\lambda)\boldsymbol{z}_2$一般就不服从$\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$,要改为
\begin{equation}\boldsymbol{z} = \boldsymbol{z}_1 \cos\frac{\lambda\pi}{2} + \boldsymbol{z}_2 \sin\frac{\lambda\pi}{2},\quad \lambda\in[0, 1]\end{equation}
插值效果演示(笔者自己训练的模型):
微分方程 #
最后,我们来重点分析一下$\sigma_t = 0$的情形。此时$\eqref{eq:sigma=0}$可以等价地改写成:
\begin{equation}\frac{\boldsymbol{x}_t}{\bar{\alpha}_t} - \frac{\boldsymbol{x}_{t-1}}{\bar{\alpha}_{t-1}} = \left(\frac{\bar{\beta}_t}{\bar{\alpha}_t} - \frac{\bar{\beta}_{t-1}}{\bar{\alpha}_{t-1}}\right) \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\end{equation}
当$T$足够大,或者说$\alpha_t$与$\alpha_{t-1}$足够小时,我们可以将上式视为某个常微分方程的差分形式。特别地,引入虚拟的时间参数$s$,我们得到
\begin{equation}\frac{d}{ds}\left(\frac{\boldsymbol{x}(s)}{\bar{\alpha}(s)}\right) = \boldsymbol{\epsilon}_{\boldsymbol{\theta}}\left(\boldsymbol{x}(s), t(s)\right)\frac{d}{ds}\left(\frac{\bar{\beta}(s)}{\bar{\alpha}(s)}\right)\label{eq:ode}\end{equation}
不失一般性,假设$s\in[0,1]$,其中$s=0$对应$t=0$、$s=1$对应$t=T$。注意DDIM原论文直接用$\frac{\bar{\beta}(s)}{\bar{\alpha}(s)}$作为虚拟时间参数,这原则上是不大适合的,因为它的范围是$[0,\infty)$,无界的区间不利于数值求解。
那么现在我们要做的事情就是在给定$\boldsymbol{x}(1)\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I})$的情况下,去求解出$\boldsymbol{x}(0)$。而DDPM或者DDIM的迭代过程,对应于该常微分方程的欧拉方法。众所周知欧拉法的效率相对来说是最慢的,如果要想加速求解,可以用Heun方法、R-K方法等。也就是说,将生成过程等同于求解常微分方程后,可以借助常微分方程的数值解法,为生成过程的加速提供更丰富多样的手段。
以DDPM的默认参数$T=1000$、$\alpha_t = \sqrt{1 - \frac{0.02t}{T}}$为例,我们重复《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼》所做的估计
\begin{equation}\log \bar{\alpha}_t = \sum_{i=k}^t \log\alpha_k = \frac{1}{2} \sum_{k=1}^t \log\left(1 - \frac{0.02k}{T}\right) < \frac{1}{2} \sum_{k=1}^t \left(- \frac{0.02k}{T}\right) = -\frac{0.005t(t+1)}{T}\end{equation}
事实上,由于每个$\alpha_k$都很接近于1,所以上述估计其实也是一个很好的近似。而我们说了本文的出发点是$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$,所以应该以$\bar{\alpha}_t$为起点,根据上述近似,我们可以直接简单地取
\begin{equation}\bar{\alpha}_t = \exp\left(-\frac{0.005t^2}{T}\right) = \exp\left(-\frac{5t^2}{T^2}\right)\end{equation}
如果取$s=t/T$为参数,那么正好$s\in[0,1]$,此时$\bar{\alpha}(s)=e^{-5s^2}$,代入到式$\eqref{eq:ode}$化简得
\begin{equation}\frac{d\boldsymbol{x}(s)}{ds} = 10s\left(\frac{\boldsymbol{\epsilon}_{\boldsymbol{\theta}}\left(\boldsymbol{x}(s), sT\right)}{\sqrt{1-e^{-10s^2}}} - \boldsymbol{x}(s)\right)\end{equation}
也可以取$s=t^2/T^2$为参数,此时也有$s\in[0,1]$,以及$\bar{\alpha}(s)=e^{-5s}$,代入到式$\eqref{eq:ode}$化简得
\begin{equation}\frac{d\boldsymbol{x}(s)}{ds} = 5\left(\frac{\boldsymbol{\epsilon}_{\boldsymbol{\theta}}\left(\boldsymbol{x}(s), \sqrt{s}T\right)}{\sqrt{1-e^{-10s}}} - \boldsymbol{x}(s)\right)\end{equation}
文章小结 #
本文接着上一篇DDPM的推导思路来介绍了DDIM,它重新审视了DDPM的出发点,去掉了推导过程中的$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$,从而获得了一簇更广泛的解和加速生成过程的思路,最后这簇新解还允许我们将生成过程跟常微分方程的求解联系起来,从而借助常微分方程的方法进一步对生成过程进行研究。
转载到请包括本文地址:https://kexue.fm/archives/9181
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Jul. 27, 2022). 《生成扩散模型漫谈(四):DDIM = 高观点DDPM 》[Blog post]. Retrieved from https://kexue.fm/archives/9181
@online{kexuefm-9181,
title={生成扩散模型漫谈(四):DDIM = 高观点DDPM},
author={苏剑林},
year={2022},
month={Jul},
url={\url{https://kexue.fm/archives/9181}},
}
February 23rd, 2024
苏神,微分方程这里没有看明白,需要先学习什么样的前置知识呢
看完数学分析,基本上就可以看常微分方程了吧
March 24th, 2024
Table.1中最后两行应该都是表示DDPM吧,为什么结果不一样呢?
对于采样方差,DDPM提供了两种选择,所以有两种不同的结果。
April 18th, 2024
苏神,我想请问一下在采样加速那一部分:$\tau$是T的一个子序列怎么去理解呢?如果将扩散步骤T作为一个超参数,可以直接理解成$\tau$ ≤ T么?
$\boldsymbol{\tau} = [\tau_1,\tau_2,\dots,\tau_{\dim(\boldsymbol{\tau})}]$是$[1,2,\cdots,T]$的子序列,不是$\tau$是$T$的子序列,怎么看的...
子序列就是子序列,[1,3,5]是[1,2,3,4,5]的子序列。
May 19th, 2024
苏神,我想请问一下,我可以这样理解吗,就是,DDPM的前向扩散对公式q(x1:T|x0)进行分解时利用贝叶斯后验可以转化为与p(xt−1|xt,x0)有关,然后DDIM就发现我们只需要重新对p(xt−1|xt,x0)进行求解就可以了。至于q(x1:T|x0)如何分解为与p(xt−1|xt,x0)有关的中间过程其实不用去关注,因为最后我们是要对p(xt−1|xt,x0)进行求解。是这样理解的吗?
是的。
苏神,我可以这样理解吗:就是说ddpm的x0到x1,这个步长是1。而ddim步长可以更大,当步长是1的时候就是ddpm了。ddpm的前向扩散是符合马尔科夫过程的;而ddim的前向扩散即可以是符合q(x10|x0)的这种马尔科夫过程,也可以是符合q(x10|x3,x0)的这种非马尔科夫过程。是的吗
July 14th, 2024
我自己写了一个DDPM做小实验,发现在一开始训练不太久的时候,如果取样的迭代等式用DDPM一开始那套,最终生成结果可以说是所有都几乎一模一样,但是一换成DDIM的0方差版本,多样性和效果好多了!我的不成熟的看法是,从本文中κλ的意义来看,前者可以看作x(t-1)生成时参考x(t)的比例,后者可以看作参考x(0)的比例,而当取样方差最小为0的时候,恰好对应这x(t-1)参考x(t)最多的时候,您前一篇推文里写到,x(0)的预测实际上时由预测神经网络来做的,所以不太精准,特别是训练不足的时候。因此方差为0的时候,效果更好?不知=知道这样看有没有道理
哦,不对,看上去λ是小于0的,这样看来,方差度量的是取样的时候参考噪声预测网络的大小,方差越小,反而噪声预测网络影响越大?这该怎么解释呢
刚刚试了一下,在每一步采取不同的方差,线性缩小,结果效果非常好
$\lambda$是大于0的。多样性方面,可能不大能从预测准确性来解释。我理解的话,大概是DDPM更容易生成比较平滑的结果吧,还没训练充分时,平滑一下就丧失多样性了。
ok,谢谢苏神
以下为个人见解,首先DDPM,DDIM这些工作已经有些考古的味道了。EDM,ReFlow,DPMsolver++这些重参数化工作加持下,各种高阶ODE采样技术大放异彩,过高的退火(SDE采样)会破坏轨迹的平滑性。然而适当退火是能提升采样质量的,这得益于Langevin采样的自修正特性,模型的拟合误差和采样的截断误差都能得到一定的修正。SA-solver这篇做了非常细致的实验和论述,总的来说越多NFE最优退火强度越高。
September 9th, 2024
苏神,我想问一下ddim中的implicit,即“隐式”如何体现
这个问题其实DDIM论文就有答案:
DDIM, on the other hand, is an implicit generative model (Mohamed & Lakshminarayanan, 2016) where samples are uniquely determined from the latent variables.
意思就是说,它将“采样一个随机变量,然后通过确定性变换得到样本”的生成模型都叫做implicit generative model,比如GAN。
那“隐”这个字我还是不明白体现在哪里。我个人理解是可以跃步采样,即x₄直接生成x₁,跳过了x₂与x₃,相当于隐藏了这些步骤。
我觉得它这里的implicit只是借用了GAN的概念。GAN是一个妥妥的隐式概率模型(它的训练形式根本没引入概率),注意原论文中的DDIM特指$\sigma_t=0$的case,也就是跟GAN一样是“采样一个随机变量然后通过确定性变换得到目标样本”的模型,所以也称为隐式概率模型了。
September 10th, 2024
∫p(xt−1|xt,x0)p(xt|x0)dxt的采样过程和p(xt−1|xt,x0)为什么是一样的
因为从$\boldsymbol{x}_0,\boldsymbol{x}_t$到$\boldsymbol{x}_{t-1}$自始至终就只有一个采样过程,所以它们的采样过程肯定是一样的。
$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t,\boldsymbol{x}_0)$与$\int p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t,\boldsymbol{x}_0)p(\boldsymbol{x}_t|\boldsymbol{x}_0)d\boldsymbol{x}_t$的区别是,前者是给定了$\boldsymbol{x}_t,\boldsymbol{x}_0$的前提下$\boldsymbol{x}_{t-1}$的分布,后者是给定$\boldsymbol{x}_0$的前提下$\boldsymbol{x}_{t-1}$的分布,后者相对于前者来说,只是遍历了$\boldsymbol{x}_t$来求期望(表格中的第2行将$\boldsymbol{x}_t$换成$\bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon}_1$,以及第3行将$\boldsymbol{\varepsilon}_1,\boldsymbol{\varepsilon}_2$合并成单个$\boldsymbol{\varepsilon}$),但本身从$\boldsymbol{x}_0,\boldsymbol{x}_t$到$\boldsymbol{x}_{t-1}$的采样是不变的。
这个解释有点像概念上的等效,有没有严谨的理论支撑呢
如果说理论支撑,按照我的观点的话,$\int p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) p(\boldsymbol{x}_t|\boldsymbol{x}_0) d\boldsymbol{x}_t$本身就已经揭示了它就应该是我说的那样采样,这个公式就是理论支撑。
嗯嗯,我主要的疑问是,公式(3)揭示了相等关系,但是∫p(xt−1|xt,x0)p(xt|x0)dxt是需要采样很多次xt并积分的,为何能给左右分别采样一次的结果划上等号呢呢?
$$\begin{aligned}\boldsymbol{x}_{t-1} =&\, \kappa_t \boldsymbol{x}_t + \lambda_t \boldsymbol{x}_0 + \sigma_t \boldsymbol{\varepsilon}_2 \\
=&\, \kappa_t (\bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon}_1) + \lambda_t \boldsymbol{x}_0 + \sigma_t \boldsymbol{\varepsilon}_2 \\
=&\, (\kappa_t \bar{\alpha}_t + \lambda_t) \boldsymbol{x}_0 + (\kappa_t\bar{\beta}_t \boldsymbol{\varepsilon}_1 + \sigma_t \boldsymbol{\varepsilon}_2) \\
\end{aligned}$$
当我们最后将$\kappa_t\bar{\beta}_t \boldsymbol{\varepsilon}_1 + \sigma_t \boldsymbol{\varepsilon}_2$视作单个高斯变量$\sqrt{\kappa_t^2\bar{\beta}_t^2 + \sigma_t^2} \boldsymbol{\varepsilon}$时,就相当于完成了积分。
不知道这样理解对不对:公式 (3) 揭示的相等关系应该是由公式(2)直接得到的;我们现在不知道 $p\left(\boldsymbol{x}_{t} \mid \boldsymbol{x}_{t-1}\right)$,所以(2)中 $p\left(\boldsymbol{x}_{t} \mid \boldsymbol{x}_{t-1}\right)$就变成了一个不确定的分布;但它无论如何得满足积分为 1,所以得到(3)。在这个方程成立的情况下,其实∫p(xt−1|xt,x0)p(xt|x0)dxt 就是 $p\left(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_0\right)$。但他揭示了另一种采样的路径(对应表格右下角的展开,能更好的利用已知条件)。而相同的分布肯定有相同的均值和方差,进而求解。另一方面,我们如果知道 $p\left(\boldsymbol{x}_{t} \mid \boldsymbol{x}_{t-1}\right)$,那我们同样可以根据其采样的形式,在表格中再添一行,得到新的方程,从而消除所有变量(例如DDPM的情况)。
----
话说文中有提到“∫p(xt−1|xt,x0)p(xt|x0)dxt的采样过程和p(xt−1|xt,x0)是一样的”吗?我好像只能推出“∫p(xt−1|xt,x0)p(xt|x0)dxt的采样过程和p(xt−1|x0)是一样的”,如果我看漏了还请见谅。
生成$\boldsymbol{x}_{t-1}$的方法就只有一个,所以$\int p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)p(\boldsymbol{x}_t|\boldsymbol{x}_0) d\boldsymbol{x}_t$、$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$、$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)$的采样过程都是一样的,只要是$p(\boldsymbol{x}_{t-1}|\text{some conds})$的采样过程都是一样的。
它们的区别只是在于你怎么处理conditions,比如是固定某些conditions,还是将conditions求期望,等等
October 12th, 2024
感谢苏老师的文章,有个问题想请教一下:
DDIM在不给定 $p(x_t|x_{t-1})$ 的情况下,推导出了包含可变参数 $\sigma_t$ 的 $p(x_{t-1}|x_t)$,即式(10)。
可否理解成此时设定不同的 $\sigma_t$,扩散过程 $p(x_t|x_{t-1})$ 将有确定的、但不同的表达式?比如若设 $\sigma_t=\frac{\overline\beta_{t-1}\beta_t}{\overline\beta_t}$,$p(x_t|x_{t-1})$ 将和DDPM一致;而若令 $\sigma_t=0$,则 $p(x_t|x_{t-1})$ 与DDPM不同?意味着DDIM和DDPM的 $\alpha_t$、$\beta_t$ 不同?
但这又与diffusers代码中的实现不一致,因为对比发现DDPMScheduler和DDIMScheduler有相同的alphas,不知道是哪里理解错了。
DDPM跟DDIM是有相同的$\bar{\alpha}_t,\bar{\beta}_t$,而不是相同的$\alpha_t,\beta_t$,用概率的话说就是$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$是相同的,$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$是不同的。
实际上DDIM没有简单的$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$,本文我们推出了$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t,\boldsymbol{x}_0)$,然后由贝叶斯公式可以得到$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1},\boldsymbol{x}_0)$,于是它的$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$只能通过积分
$$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1}) = \int p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1},\boldsymbol{x}_0) p(\boldsymbol{x}_0|\boldsymbol{x}_{t-1})d\boldsymbol{x}_0$$
来估计。
October 21st, 2024
苏老师您好,我对“高观点2”有些疑惑,我翻了DDIM论文中的附录C.1里面的公式(59)推导了加速时的目标函数,但他没有仔细说明只是说类似定理1可以证明和DDPM的目标函数等价。(59)中有一项$D_{KL}(q(x_t|x_0)||p(x_0|x_t))$我感觉有这项的存在好像不能说明他和DDPM的目标函数等价吧(因为1.这一项有需要训练的$\theta$不能忽略2.KL散度的俩分布描述的分别是$x_t$和$x_0$)
从我个人的观点看,“高观点2”对于一般人来说不容易观察到,但如果已经观察到了吧,它就是显然成立的,不需要证明的,我没有仔细阅读DDIM论文这部分内容,不大清楚它想证明什么。