白话扩散模型系列一:一文基本搞懂扩散模型DDIM

567 阅读2分钟

扩散模型系列:

(1) 白话扩散模型系列一:一文搞懂扩散模型DDPM

(2)白话扩散模型系列一:一文基本搞懂扩散模型DDIM

如感兴趣,可提前关注,后续待更新,谢谢...

0. DDIM的创新点

​ DDPM有一个很大的缺点就是其本身是一个马尔科夫链的过程,推理速度太慢,如果前向加噪过程是1000步,那么去噪过程就需要使用Unet生成噪声,然后去噪,这样进行1000步。这是一个及其缓慢的过程,DDIM原论文中举了一个生动的例子:

For example, it takes around 20 hours to sample 50k images of size 32 x 32 from a DDPM, but less than a minute to do so from a GAN on a Nvidia 2080 Ti GPU.

​ 基于DDPM,DDIM主要有两项改进:

​ (1)对于一个已经训练好的DDPM,只需要对采样公式做简单的修改,模型就能在去噪时「跳步骤」,在一步去噪迭代中直接预测若干次去噪后的结果。比如说,假设模型从时刻T=100开始去噪,新的模型可以在每步去噪迭代中预测10次去噪操作后的结果,也就是逐步预测时刻t=90,80,...,0的结果。这样,DDPM的采样速度就被加速了10倍。

​ (2)DDIM论文推广了DDPM的数学模型,打破了马尔科夫链的过程,从更高的视角定义了DDPM的反向过程(去噪过程)。在这个新数学模型下,我们可以自定义模型的噪声强度,让同一个训练好的DDPM有不同的采样效果。

1. 公式推导

​ DDPM的推导过程可以看《DDPM推导笔记》,这里假设P(xt1xt,x0)P(x_{t-1}|x_t, x_0)满足如下正态分布,即:

P(xt1xt,x0)N(kx0+mxt,σ2):xt1=kxo+mxt+σϵ其中有:ϵN(0,1)(1)P(x_{t-1}|x_t, x_0) \sim N(kx_0+mx_t, \sigma^2) \\ 即:x_{t-1} = kx_o+mx_t + \sigma \epsilon \tag{1} \\ 其中有: \epsilon \sim N(0, 1)

又因为前向的加噪过程满足:

xt=atˉx0+1atˉϵ其中ϵN(0,1)(2)x_t = \sqrt{\bar{a_t}} x_0 + \sqrt{1 - \bar{a_t}} \epsilon \\ 其中\epsilon \sim N(0,1) \tag{2}

合并(1)(2)上面两式,有:

xt1=kx0+m[aˉtx0+1aˉtϵ]+σϵ(3)x_{t-1} = kx_0 + m[\sqrt{\bar{a}_t}x_0 + \sqrt{1-\bar{a}_t} \epsilon] + \sigma \epsilon \tag{3}

再次合并有:

xt1=(k+maˉt)x0+ϵ其中:ϵM(0,m2(1aˉt)+σ2)(4)x_{t-1} = (k+m\sqrt{\bar{a}_t}) x_0 + \epsilon' \\ 其中: \epsilon’ \sim M(0, m^2(1-\bar{a}_t) + \sigma^2) \tag{4}

从DDPM中可以可知:

xt1=aˉt1x0+1aˉt1ϵ(5)x_{t-1} = \sqrt{\bar{a}_{t-1}} x_0 + \sqrt{1-\bar{a}_{t-1}} \epsilon \tag{5}

通过式(4)(5)的xt1x_{t-1}服从的概率分布可知:

k+maˉt=aˉt1m2(1aˉt)+σ2=1aˉt1(6)k + m\sqrt{\bar{a}_t} = \sqrt{\bar{a}_{t-1}} \\ m^2(1-\bar{a}_t) + \sigma^2 = 1-\bar{a}_{t-1} \tag{6}

由式(6)两个式子可解出:

<img src="DDIM学习笔记.assets/image-20240108201636057.png" alt="image-20240108201636057" style="zoom:80%;" />

将m,k带入到P(xt1xt,x0)P(x_{t-1}|x_t, x_0)中,可得:

在这里插入图片描述

依旧可以使用xt,x0x_t, x_0的关系式把x0x_0去掉:

xt=atˉx0+1atˉϵ这里为了防止ϵ和后面的ϵ搞混,这里记为ϵt,则上式变为:xt=atˉx0+1atˉϵt(8)x_t = \sqrt{\bar{a_t}} x_0 + \sqrt{1 - \bar{a_t}} \epsilon \\ 这里为了防止\epsilon和后面的\epsilon搞混,这里记为\epsilon_{t},则上式变为:\\ x_t = \sqrt{\bar{a_t}} x_0 + \sqrt{1 - \bar{a_t}} \epsilon_t \tag{8}

P(xt1xt,x0)P(x_{t-1}|x_t, x_0)的概率分布采样可得到: 在这里插入图片描述

其中,ϵ\epsilon是从标准正太分布中,随机采样得到;ϵt\epsilon_t是和DDPM一样,使用神经网络训练而来的;xtx_t是输入;aˉt1aˉt\bar{a}_{t-1}和\bar{a}_t是事先定义好的。至此,我们就只需要讨论σ\sigma这个参数了。

2. σ\sigma的讨论

​ 怎样选取σ\sigma才能获得最佳的加速效果呢?

​ 作者做了一些实验,作者原文中使用στi(η)\sigma_{\tau_i}{(\eta)}来表示的σ\sigma,其式子如下: 在这里插入图片描述

使用η\eta控制其大小。事实上,当η=1\eta = 1时就变成了DDPM的去噪过程了, 在这里插入图片描述

η=0\eta=0时,效果是最好的。所以DDIM令σ=0\sigma=0

3. xprevx_{prev}的推导

​ 从式9且σ=0\sigma=0,则式9中的所有都已知了!!!

​ 但是,即使这样,我们也还是由xt推导出xt1x_t推导出x_{t-1}呀,这样还是不能加快推理!

​ 不忙,我们回过头去思考,发现上面的推导过程中全程没有使用:

xt=atxt1+1atϵx_t= \sqrt{a_t}x_{t-1} + \sqrt{1-a_t} \epsilon

​ 也就可以不需要严格的由xt算到xt1x_t算到x_{t-1},则可以令xprev替代xt1x_{prev}替代x_{t-1},式(9)则可以变换为:

在这里插入图片描述

​ 至此,所有的参数要是实现定义好了,要么是需要训练的,这样xtxprevx_t和x_{prev}则可以相隔多个迭代步数。

4.疑难解答

Q1: 为什么式(11)可以简单的将xprev替代xt1x_{prev}替代x_{t-1},毕竟虽然反向过程没有使用到xt1算到xtx_{t-1}算到x_{t}的关系式,但前向过程是使用到的呀?

​ 目前我也没有答案!还在理解中,由大佬路过,请留言讨论!

​ Q2: 为什么在DDIM可以令方差σ=0\sigma=0 ?

​ 目前我也没有答案!还在理解中,由大佬路过,请留言讨论!