月小白
Denoising Diffusion Probabilistic Model

Denoising Diffusion Probabilistic Model

直观

从直观的视角看,引用苏剑林大佬的描述[1],DDPM所做的就是将高楼大厦拆成原材料,然后从原材料再重建成高楼大厦。让模型学习拆楼的过程,知道某一时刻的状态是初始大楼经过一定步之后怎么拆出来的,这样模型就能知道每一步大概是怎么拆的,反过来也能知道该怎么建回去。

看意思很简单,难点在于,拆大楼的时候可能是这里拆一块砖,那里拆一块砖,随机性很强,并非是确定的过程,所以逆向重建几乎成了不可能的事。

因此,需要将问题建模,利用数学工具求解这一问题。

原理

借鉴Lil大佬的分享[2],我也来试图拆解一下Diffusion Model

首先定义一下问题,设 xiq(xi),i=0,1,...,Tx_i \sim q(x_i), i=0,1,...,T ,其中 x0x_0 是初始状态,通过前向扩散过程得到 x1,x2,...,xTx_1, x_2, ... , x_T,已知扩散过程为

xt=atxt1+btϵt, ϵtN(0,I)x_t = a_t x_{t-1}+b_t \epsilon_{t},\ \epsilon_t \sim \mathcal{N}(\mathbf{0},\mathbf{I})

其中 ϵt\epsilon_t 代表t时刻加入的噪声。展开后可以得到:

除第一项以外,后面是多个独立同分布的正态噪声之和,利用

zN(0,I), (Az+Bz+C)N(C,A2+B2I)z\sim\mathcal{N}(0,I), \ (Az+Bz+C)\sim\mathcal{N}(C, \sqrt{A^2+B^2}\mathbf{I})

上式可改写为

xt=(ata1)x0+(ata2)2b12++at2bt12+bt2ϵˉt, ϵˉtN(0,I)x_t=(a_t\cdots a_1)x_0 +\sqrt{(a_t\cdots a_2)^2b_1^2+\cdots+a_t^2b_{t-1}^2+b_t^2}\bar\epsilon_t,\ \bar\epsilon_t\sim\mathcal{N}(\mathbf{0},\mathbf{I})

而这其实也是一个正态分布,而且如果我们将系数的平方加起来的话可以得到:

如果令 ai2+bi2=1a_i^2+b_i^2=1 的话,就可以简化上面的平方和为1,因此所有的表达式都可以被简化

这就是原论文中设定 xt=1βtxt1+βtϵtx_t = \sqrt{1-\beta_t}x_{t-1}+\sqrt{\beta_t}\epsilon_t 的原因

为了与原论文统一起来,下面也用原论文的设定。

αt=1βt, αˉt=itαi\alpha_t = 1-\beta_t,\ \bar\alpha_t=\prod_i^t{\alpha_i} ,则 xt=αtxt1+1αtϵt=αˉtx0+1αˉtϵˉtx_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}\epsilon_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\bar\epsilon_t

上述过程也可以看作从一个高斯分布中采样,即

整个前向过程是一个后验估计,可以表示为:

q(x1:Tx0)=t=1Tq(xtxt1)q(x_{1:T}|x_0)=\prod_{t=1}^T{q(x_t|x_{t-1})}


逆向过程就是将原材料再组合成初始的大楼,我们没办法一下子做到,但是如果知道每一步应该怎么做,那给足时间,我们就能充分还原。

所以建模每一步逆向过程为 pθ(xt1xt)p_\theta(x_{t-1}|x_t), 由于扩散的每一步我们都建模成高斯分布,那不妨逆向也设成高斯分布(事实上,文献《On the theory of stochastic processes, with particular reference to applications》证明了如果 q(xtxt1)q(x_t|x_{t-1}) 满足高斯分布且 βt\beta_t 足够小的话,q(xt1xt)q(x_{t-1}|x_t) 仍然是一个高斯分布),只不过前面的参数是确定的,而后面的参数不确定。我们先记作 pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_t-1;\mu_\theta(x_t,t),\Sigma_\theta(x_t, t)) ,整个逆向过程则可以表示成一个联合概率分布 pθ(x0:T)=p(xT)t=1Tpθ(xt1xt)p_\theta(x_{0:T})=p(x_T)\prod_{t=1}^T{p_\theta(x_{t-1}|x_t)}

值得注意的是,我们无法直接估计 q(xt1xt)q(x_{t-1}|x_t) ,因为这是个先验概率,需要用到整个数据集,但是在知道初始状态 x0x_0 的情况下,我们可以计算这个条件概率:

根据 zexp(12(xμ)2σ2), zN(0,I)z \varpropto \exp(-\dfrac{1}{2}\dfrac{(x-\mu)^2}{\sigma^2}),\ z \sim \mathcal{N}(\mathbf{0},\mathbf{I}) ,假设 q(xt1xt,x0)=N(xt1;μ~(xt,x0),β~tI)q(x_{t-1}|x_t,x_0)=\mathcal{N}(x_{t-1};\tilde\mu(x_t,x_0),\tilde\beta_t\mathbf{I}) ,则可以求得

现在,我们知道给定前向过程的时候怎么求逆向了,那我们的目标就是使 pθ(x0)p_\theta(x_0) 尽可能和 q(x0)q(x_0) 一致,自然想到了交叉熵

L=Eq(x0)[logpθ(x0)]\mathcal{L} = \mathbb{E}_{q(x_0)}[-\log{p_\theta(x_0)}]

=Eq(x0)[log(pθ(x0)pθ(x1:T)dx1:T)]=-\mathbb{E}_{q(x_0)}[\log({p_\theta(x_0)} \cdot \int{p_\theta(x_{1:T})dx_{1:T}})]

=Eq(x0)[log(pθ(x0:T)dx1:T)]=-\mathbb{E}_{q(x_0)}[\log(\int{p_\theta(x_{0:T})dx_{1:T}})]

=Eq(x0)[log(q(x1:Tx0)pθ(x0:T)q(x1:Tx0)dx1:T)]=-\mathbb{E}_{q(x_0)}[\log(\int{q(x_{1:T}|x_0)\dfrac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}dx_{1:T}})]

=Eq(x0)log(Eq(x1:Tx0)pθ(x0:T)q(x1:Tx0))=-\mathbb{E}_{q(x_0)}\log(\mathbb{E}_{q(x_{1:T}|x_0)}{\dfrac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}})

Eq(x0:Tx0)[logpθ(x0:T)q(x1:Tx0)]\le-\mathbb{E}_{q(x_{0:T}|x_0)}[\log{\dfrac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}}]

=Eq(x0:Tx0)[logq(x1:Tx0)pθ(x0:T)]=\mathbb{E}_{q(x_{0:T}|x_0)}[\log{\dfrac{q(x_{1:T}|x_0)}{p_\theta(x_{0:T})}}]

=VLB=VLB

=Eq[logt=1Tq(xtxt1)pθ(xT)t=1Tpθ(xt1xt)]=\mathbb{E}_q[\log{\dfrac{\prod_{t=1}^{T}q(x_t|x_{t-1})}{p_\theta(x_T)\prod_{t=1}^{T}p_\theta(x_{t-1}|x_t)}}]

=Eq[logpθ(xT)+t=1Tlogq(xtxt1)pθ(xt1xt)]=\mathbb{E}_q[-\log{p_\theta(x_T)}+\sum\limits_{t=1}^T{\log{\dfrac{q(x_t|x_{t-1})}{p_\theta(x_{t-1}|x_t)}}}]

=Eq[logpθ(xT)+t=2Tlog(q(xt1xt,x0)pθ(xt1xt)q(xtx0)pθ(xt1x0))+logq(x1x0)pθ(x0x1)]=\mathbb{E}_q[-\log{p_\theta(x_T)}+\sum\limits_{t=2}^T{\log{(\dfrac{q(x_{t-1}|x_t, x_0)}{p_\theta(x_{t-1}|x_t)}\cdot\dfrac{q(x_t|x_0)}{p_\theta(x_{t-1}|x_0)})+\log\dfrac{q(x_1|x_0)}{p_\theta(x_0|x_1)}}}]

=Eq[logq(xTx0)pθ(xT)+t=2Tlogq(xt1xt,x0)pθ(xt1xt)logpθ(x0x1)]=\mathbb{E}_q[\log\dfrac{q(x_T|x_0)}{p_\theta(x_T)}+\sum\limits_{t=2}^T{\log\dfrac{q(x_{t-1}|x_t,x_0)}{p_\theta(x_{t-1}|x_t)} - \log p_\theta(x_0|x_1)}]

=Eq[DKL(q(xTx0)pθ(xT))+t=2TDKL(q(xt1xt,x0)pθ(xt1xt))logpθ(x0x1)]=\mathbb{E}_q[D_{KL}(q(x_T|x_0)\parallel p_\theta(x_T))+\sum\limits_{t=2}^T{D_{KL}(q(x_{t-1}|x_t,x_0)\parallel p_\theta(x_{t-1}|x_t))}-\log p_\theta(x_0|x_1)]

第一步,交叉熵定义;第二步,边际概率之和为1;第三步,合并;第四步,凑;第五步,期望的定义;第六步,Jensen不等式;第七、八步,改写;第九步,带入定义;第十步,log运算;第十一步,前向转换成逆向;第十二步,约分;第十三步,KL散度定义

最后得到三项,第一项是常数,两个分布都是已知量,第二项是两个高斯分布的KL散度,第三项是重建系数,DDPM专门为此构建了一个离散化的分段积分累乘,在此不需要特别关注。

其实可以看出,第二项就是希望重建的每一步和逆扩散的每一步尽可能相似

第二项的解为

Lt=Ex0,ϵ[12Σθ22μ~t(xt,x0)μθ(xt,t)2]\mathcal{L}_t=\mathbb{E}_{x_0,\epsilon}[\dfrac{1}{2\Vert\Sigma_\theta \Vert^2_2}\Vert \tilde\mu_t(x_t, x_0) - \mu_\theta(x_t,t) \Vert^2]

=Ex0,ϵ[Ctϵtϵθ(αˉtx0+1αˉtϵˉt,t)2]=\mathbb{E}_{x_0,\epsilon}[C_{t}\Vert \epsilon_t - \epsilon_\theta(\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\bar\epsilon_t,t) \Vert^2]

所以,模型最后学习的其实就是给定t时刻后的噪声,因此,有了以下的算法流程

DDPM-algo.png

细节点

  1. 为什么已经知道了前向过程,不能用 xtx_t 直接求 x0x_0

​ 第一,这样做并没有意义,第二,仅仅通过公式求 x0x_0 需要记住所有的随机噪声,如果仅利用最后的表达式,噪声的权重相当大,无法恢复原图

  1. 重参数的作用

​ 一个符合高斯分布的随机变量,是无法直接求导的,但是如果将它分解成 z=μθ+σθϵ, ϵN(0,I)z=\mu_\theta+\sigma_\theta\epsilon,\ \epsilon\sim\mathcal{N}(\mathbf{0},\mathbf{I}) 的形式,就可以求导了

  1. VLB是什么

​ 对于 pθ(x0)p_\theta(x_0) ,我们求解他的极大似然估计来最大化逆向回 x0x_0 的概率,这个问题等价于求极小负对数似然,即

​ Variational Lower Bound,变分下界,我们自然希望它越小越好,这与上面是一致的

  1. 为什么 p(xt1xt)p(x_{t-1}|x_t) 不能直接求

​ 因为这是个先验,需要遍历所有数据才能求到这个概率分布。举个直白的例子,我知道你30岁的样子,我想知道你20岁长啥样,我没法直接看出来,但是如果我知道了所有人30岁到20岁的变化,我就可以总结出规律,然后推导你20岁的样子,这个规律就是这里的先验。DDPM说,我不需要知道所有人的规律,我只要知道你10岁长啥样我就可以大概推测你20岁长啥样。

  1. 明明是求 x0x_0 ,为什么又用 xtx_tx0x_0 的关系去代入 q(xt1xt,x0)q(x_{t-1}|x_t,x_0) 的计算

​ 这里其实是一个大致的估计,因为这里的 x0x_0 并不一定是我们最终要求的那个,我们真正要求的可能是更前面或者更后面的结果。因为每一步我们都将重新估计,所以这个 x0x_0 其实是会被不断修正的,而且随着权重的逐渐降低,最终的预测会更加精细。

DDIM

仔细分析DDPM的优化目标会发现,DDPM其实仅仅依赖边缘分布 q(xtx0)q(x_t|x_0) ,而不是直接作用在联合分布 q(x1:Tx0)q(x_{1:T}|x_0) ,这带来的一个启示是:DDPM这个隐变量模型可以有很多推理分布来选择,只要推理分布满足边缘分布条件(扩散过程的特性)即可,而且这些推理过程并不一定要是马尔卡夫链。

但值得注意的一个点是,我们要得到DDPM的优化目标,还需要知道分布 q(xt1xt,x0)q(x_{t-1}|x_t,x_0) ,之前我们在根据贝叶斯公式推导这个分布时是知道分布 q(xtxt1)q(x_t|x_{t-1}) 的,而且依赖了前向过程的马尔卡夫链特性。如果要解除对前向过程的依赖,那么我们就需要直接定义这个分步 q(xt1xt,x0)q(x_{t-1}|x_t,x_0)

基于上述分析,DDIM论文中将推理分布定义为:

qσ(x1:Tx0)=qσ(xTx0)t=2Tqσ(xt1xt,x0)q_\sigma(x_{1:T}|x_0) = q_\sigma(x_{T}|x_0) \prod_{t=2}^T q_\sigma(x_{t-1}|x_t, x_0)

这里要同时满足 qσ(xTx0)=N(αTx0,(1αT)I)q_\sigma(x_{T}|x_0) = \mathcal{N}(\sqrt{\alpha_T}x_0, (1-\alpha_T)\mathbf{I}) 以及对于所有的 t2t \ge 2 有:

qσ(xt1xt,x0)=N(xt1;αt1x0+1αt1σt2xtαtx01αt,σt2I)q_\sigma(x_{t-1}|x_t, x_0) = \mathcal{N}(x_{t-1};\sqrt{\alpha_{t-1}}x_0+\sqrt{1-\alpha_{t-1}-\sigma_t^2}\dfrac{x_t-\sqrt{\alpha_t}x_0}{\sqrt{1-\alpha_t}}, \sigma_t^2\mathbf{I})

这里的方差 σt2\sigma_t^2 是一个实数,不同的设置就是不一样的分布,所以 qσ(x1:Tx0)q_\sigma(x_{1:T}|x_0) 其实是一系列的推理分布。可以看到这里分布 qσ(xt1xt,x0)q_\sigma(x_{t-1}|x_t, x_0) 的均值也定义为一个依赖与 x0x_0xtx_t 的组合函数,之所以定义为这样的形式,是因为根据 qσ(xTx0)q_\sigma(x_{T}|x_0) ,我们可以通过数学归纳法证明,对于所有的 tt 均满足:

qσ(xtx0)=N(αtx0,(1αt)I)q_\sigma(x_{t}|x_0) = \mathcal{N}(\sqrt{\alpha_t}x_0, (1-\alpha_t)\mathbf{I})

这部分的证明见DDIM论文【6】的附录部分

可以看到这里定义的推理分布 qσ(x1:Tx0)q_\sigma(x_{1:T}|x_0) 并没有直接定义前向过程,但这里满足了我们前面要讨论的两个条件:边缘分布 qσ(xtx0)q_\sigma(x_{t}|x_0) 和后验分布 qσ(xt1xt,x0)q_\sigma(x_{t-1}|x_t, x_0) 。同样地,我们可以按照和DDPM的一样的方式去推导优化目标,最终也会得到同样的损失函数。论文也给出了一个前向过程是非马尔可夫链的示例,但实际上我们上述定义的推理分布并不需要前向过程就可以得到和DDPM一样的优化目标。

与DDPM一样,这里也是用神经网络 sθs_\theta 来预测噪音:

xt1=αt1(xt1αtsθ(xt,t)αt)+1αt1σt2sθ(xt,t)+σtϵtx_{t-1} = \sqrt{\alpha_{t-1}} (\dfrac{x_t-\sqrt{1-\alpha_t}s_\theta(x_t,t)}{\sqrt{\alpha_t}})+\sqrt{1-\alpha_{t-1}-\sigma_t^2}s_\theta(x_t,t)+\sigma_t\epsilon_t

这里将生成过程分成三个部分:一是由预测的 x0x_0 来产生的,二是指向 xtx_t 的部分,三是随机噪声。

论文中将方差进一步定义为

σt2=ηβ~t=η(1αt1)/(1αt)(1αt)/αt1\sigma_t^2=\eta\cdot \tilde\beta_t = \eta \cdot \sqrt{(1-\alpha_{t-1})/(1-\alpha_t)} \sqrt{(1-\alpha_t)/\alpha_{t-1}}

考虑两种情况,一是 η=1\eta=1 ,此时 σt2=β~t\sigma_t^2=\tilde\beta_t ,此时生成过程就和DDPM一样了。

另外一种情况是 η=0\eta=0 ,这个时候生成过程就没有随机噪音了,是一个确定性的过程,论文将这种情况下的模型称为DDIMdenoising diffusion implicit model),一旦最初的随机噪音 xTx_T 确定了,那么DDIM的样本生成就变成了确定的过程。

那么这个模型是怎么加速生成过程的呢?

受限,DDIM和DDPM的训练过程是一样的,但是DDIM并没有明确前向过程,这意味着我们可以定义一个更短步数的前向过程。具体地说,从原始的序列 [1,2,...T][1,2,...T] 中采样一个长度为 SS 的子序列 [τ1,τ2,...,τS][\tau_1, \tau_2,...,\tau_S] ,我们将 xτ1xτSx_{\tau_1} \rightarrow x_{\tau_S} 的前向过程定义为一个马尔科夫链,并且他们满足上面的边缘分布,那么生成过程也可以用这个子序列的反向马尔卡夫链来替代,由于 SS 可以设置比原来的步数 TT 要小,那么就可以加速生成过程。

论文共设计了两种方法来采样这个子序列,分别是

  • Linear:线性采样 τi=ci\tau_i=\lfloor c_i \rfloor
  • Quadratic:二次方采样 τi=ci2\tau_i=\lfloor c_i^2 \rfloor

这里的 cic_i 是一个实数定值。论文中只对CIFAR10数据集采用Quadratic序列,其它数据集均采用Linear序列。

实验结果表明,DDIM训练时间更短,可以加速20倍,且在更短的步数下训练效果比DDPM更好,完整训练上效果更优一些。

总得来说,用我自己的理解讲,DDIM是更泛化的DDPM,如果说原来的DDPM是一步一步扩散、采样,那DDIM就是将DDPM压缩了,从原来的序列中抽出一个满足条件的子序列,对这个子序列进行扩散、采样,因此时间上可以大大缩短。

参考文献

[0] Denoising Diffusion Probabilistic Models

[1] 生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼 - 科学空间|Scientific Spaces

[2] [What are Diffusion Models? | Lil'Log (lilianweng.github.io)](https://lilianweng.github.io/posts/2021-07-11-diffusion-models/#:~:text=Diffusion models are inspired by,data samples from the noise)

[3] 扩散模型 Diffusion Models - 原理篇 - 知乎 (zhihu.com)

[4] 一文解释 Diffusion Model (一) DDPM 理论推导 - 知乎 (zhihu.com)

[5] 由浅入深了解Diffusion Model - 知乎 (zhihu.com)

[6] How to train your energy-based models

[7] Denoising Diffusion Implicit Models

[8] 扩散模型之DDIM - 知乎 (zhihu.com)

[9] 生成扩散模型漫谈(四):DDIM = 高观点DDPM - 科学空间|Scientific Spaces (kexue.fm)

本文作者:月小白
本文链接:http://example.com/2023/05/04/DDPM/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可