Denoising Diffusion Probabilistic Model
直观
从直观的视角看,引用苏剑林大佬的描述[1],DDPM所做的就是将高楼大厦拆成原材料,然后从原材料再重建成高楼大厦。让模型学习拆楼的过程,知道某一时刻的状态是初始大楼经过一定步之后怎么拆出来的,这样模型就能知道每一步大概是怎么拆的,反过来也能知道该怎么建回去。
看意思很简单,难点在于,拆大楼的时候可能是这里拆一块砖,那里拆一块砖,随机性很强,并非是确定的过程,所以逆向重建几乎成了不可能的事。
因此,需要将问题建模,利用数学工具求解这一问题。
原理
借鉴Lil大佬的分享[2],我也来试图拆解一下Diffusion Model
首先定义一下问题,设 x i ∼ q ( x i ) , i = 0 , 1 , . . . , T x_i \sim q(x_i), i=0,1,...,T x i ∼ q ( x i ) , i = 0 , 1 , . . . , T ,其中 x 0 x_0 x 0 是初始状态,通过前向扩散过程得到 x 1 , x 2 , . . . , x T x_1, x_2, ... , x_T x 1 , x 2 , . . . , x T ,已知扩散过程为
x t = a t x t − 1 + b t ϵ t , ϵ t ∼ N ( 0 , I ) x_t = a_t x_{t-1}+b_t \epsilon_{t},\ \epsilon_t \sim \mathcal{N}(\mathbf{0},\mathbf{I}) x t = a t x t − 1 + b t ϵ t , ϵ t ∼ N ( 0 , I )
其中 ϵ t \epsilon_t ϵ t 代表t时刻加入的噪声。展开后可以得到:
除第一项以外,后面是多个独立同分布的正态噪声之和,利用
z ∼ N ( 0 , I ) , ( A z + B z + C ) ∼ N ( C , A 2 + B 2 I ) z\sim\mathcal{N}(0,I), \ (Az+Bz+C)\sim\mathcal{N}(C, \sqrt{A^2+B^2}\mathbf{I}) z ∼ N ( 0 , I ) , ( A z + B z + C ) ∼ N ( C , A 2 + B 2 I )
上式可改写为
x t = ( a t ⋯ a 1 ) x 0 + ( a t ⋯ a 2 ) 2 b 1 2 + ⋯ + a t 2 b t − 1 2 + b t 2 ϵ ˉ t , ϵ ˉ t ∼ N ( 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}) x t = ( a t ⋯ a 1 ) x 0 + ( a t ⋯ a 2 ) 2 b 1 2 + ⋯ + a t 2 b t − 1 2 + b t 2 ϵ ˉ t , ϵ ˉ t ∼ N ( 0 , I )
而这其实也是一个正态分布,而且如果我们将系数的平方加起来的话可以得到:
如果令 a i 2 + b i 2 = 1 a_i^2+b_i^2=1 a i 2 + b i 2 = 1 的话,就可以简化上面的平方和为1,因此所有的表达式都可以被简化
这就是原论文中设定 x t = 1 − β t x t − 1 + β t ϵ t x_t = \sqrt{1-\beta_t}x_{t-1}+\sqrt{\beta_t}\epsilon_t x t = 1 − β t x t − 1 + β t ϵ t 的原因
为了与原论文统一起来,下面也用原论文的设定。
令 α t = 1 − β t , α ˉ t = ∏ i t α i \alpha_t = 1-\beta_t,\ \bar\alpha_t=\prod_i^t{\alpha_i} α t = 1 − β t , α ˉ t = ∏ i t α i ,则 x t = α t x t − 1 + 1 − α t ϵ t = α ˉ t x 0 + 1 − α ˉ t ϵ ˉ t x_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 x t = α t x t − 1 + 1 − α t ϵ t = α ˉ t x 0 + 1 − α ˉ t ϵ ˉ t
上述过程也可以看作从一个高斯分布中采样,即
整个前向过程是一个后验估计,可以表示为:
q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(x_{1:T}|x_0)=\prod_{t=1}^T{q(x_t|x_{t-1})} q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 )
逆向过程就是将原材料再组合成初始的大楼,我们没办法一下子做到,但是如果知道每一步应该怎么做,那给足时间,我们就能充分还原。
所以建模每一步逆向过程为 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) p θ ( x t − 1 ∣ x t ) , 由于扩散的每一步我们都建模成高斯分布,那不妨逆向也设成高斯分布(事实上,文献《On the theory of stochastic processes, with particular reference to applications》证明了如果 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q ( x t ∣ x t − 1 ) 满足高斯分布且 β t \beta_t β t 足够小的话,q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q ( x t − 1 ∣ x t ) 仍然是一个高斯分布),只不过前面的参数是确定的,而后面的参数不确定。我们先记作 p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_t-1;\mu_\theta(x_t,t),\Sigma_\theta(x_t, t)) p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) ,整个逆向过程则可以表示成一个联合概率分布 p θ ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) p_\theta(x_{0:T})=p(x_T)\prod_{t=1}^T{p_\theta(x_{t-1}|x_t)} p θ ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t )
值得注意的是,我们无法直接估计 q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q ( x t − 1 ∣ x t ) ,因为这是个先验概率,需要用到整个数据集,但是在知道初始状态 x 0 x_0 x 0 的情况下,我们可以计算这个条件概率:
根据 z ∝ exp ( − 1 2 ( x − μ ) 2 σ 2 ) , z ∼ N ( 0 , I ) z \varpropto \exp(-\dfrac{1}{2}\dfrac{(x-\mu)^2}{\sigma^2}),\ z \sim \mathcal{N}(\mathbf{0},\mathbf{I}) z ∝ exp ( − 2 1 σ 2 ( x − μ ) 2 ) , z ∼ N ( 0 , I ) ,假设 q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ ( x t , x 0 ) , β ~ t I ) q(x_{t-1}|x_t,x_0)=\mathcal{N}(x_{t-1};\tilde\mu(x_t,x_0),\tilde\beta_t\mathbf{I}) q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ ( x t , x 0 ) , β ~ t I ) ,则可以求得
现在,我们知道给定前向过程的时候怎么求逆向了,那我们的目标就是使 p θ ( x 0 ) p_\theta(x_0) p θ ( x 0 ) 尽可能和 q ( x 0 ) q(x_0) q ( x 0 ) 一致,自然想到了交叉熵
L = E q ( x 0 ) [ − log p θ ( x 0 ) ] \mathcal{L} = \mathbb{E}_{q(x_0)}[-\log{p_\theta(x_0)}] L = E q ( x 0 ) [ − log p θ ( x 0 ) ]
= − E q ( x 0 ) [ log ( p θ ( x 0 ) ⋅ ∫ p θ ( x 1 : T ) d x 1 : T ) ] =-\mathbb{E}_{q(x_0)}[\log({p_\theta(x_0)} \cdot \int{p_\theta(x_{1:T})dx_{1:T}})] = − E q ( x 0 ) [ log ( p θ ( x 0 ) ⋅ ∫ p θ ( x 1 : T ) d x 1 : T ) ]
= − E q ( x 0 ) [ log ( ∫ p θ ( x 0 : T ) d x 1 : T ) ] =-\mathbb{E}_{q(x_0)}[\log(\int{p_\theta(x_{0:T})dx_{1:T}})] = − E q ( x 0 ) [ log ( ∫ p θ ( x 0 : T ) d x 1 : T ) ]
= − E q ( x 0 ) [ log ( ∫ q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) q ( x 1 : T ∣ x 0 ) d x 1 : 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}})] = − E q ( x 0 ) [ log ( ∫ q ( x 1 : T ∣ x 0 ) q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) d x 1 : T ) ]
= − E q ( x 0 ) log ( E q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) q ( x 1 : T ∣ x 0 ) ) =-\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)}}) = − E q ( x 0 ) log ( E q ( x 1 : T ∣ x 0 ) q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) )
≤ − E q ( x 0 : T ∣ x 0 ) [ log p θ ( x 0 : T ) q ( x 1 : T ∣ x 0 ) ] \le-\mathbb{E}_{q(x_{0:T}|x_0)}[\log{\dfrac{p_\theta(x_{0:T})}{q(x_{1:T}|x_0)}}] ≤ − E q ( x 0 : T ∣ x 0 ) [ log q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) ]
= E q ( x 0 : T ∣ x 0 ) [ log q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) ] =\mathbb{E}_{q(x_{0:T}|x_0)}[\log{\dfrac{q(x_{1:T}|x_0)}{p_\theta(x_{0:T})}}] = E q ( x 0 : T ∣ x 0 ) [ log p θ ( x 0 : T ) q ( x 1 : T ∣ x 0 ) ]
= V L B =VLB = V L B
= E q [ log ∏ t = 1 T q ( x t ∣ x t − 1 ) p θ ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) ] =\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)}}] = E q [ log p θ ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) ∏ t = 1 T q ( x t ∣ x t − 1 ) ]
= E q [ − log p θ ( x T ) + ∑ t = 1 T log q ( x t ∣ x t − 1 ) p θ ( x t − 1 ∣ x t ) ] =\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)}}}] = E q [ − log p θ ( x T ) + t = 1 ∑ T log p θ ( x t − 1 ∣ x t ) q ( x t ∣ x t − 1 ) ]
= E q [ − log p θ ( x T ) + ∑ t = 2 T log ( q ( x t − 1 ∣ x t , x 0 ) p θ ( x t − 1 ∣ x t ) ⋅ q ( x t ∣ x 0 ) p θ ( x t − 1 ∣ x 0 ) ) + log q ( x 1 ∣ x 0 ) p θ ( x 0 ∣ x 1 ) ] =\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)}}}] = E q [ − log p θ ( x T ) + t = 2 ∑ T log ( p θ ( x t − 1 ∣ x t ) q ( x t − 1 ∣ x t , x 0 ) ⋅ p θ ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) ) + log p θ ( x 0 ∣ x 1 ) q ( x 1 ∣ x 0 ) ]
= E q [ log q ( x T ∣ x 0 ) p θ ( x T ) + ∑ t = 2 T log q ( x t − 1 ∣ x t , x 0 ) p θ ( x t − 1 ∣ x t ) − log p θ ( x 0 ∣ x 1 ) ] =\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)}] = E q [ log p θ ( x T ) q ( x T ∣ x 0 ) + t = 2 ∑ T log p θ ( x t − 1 ∣ x t ) q ( x t − 1 ∣ x t , x 0 ) − log p θ ( x 0 ∣ x 1 ) ]
= E q [ D K L ( q ( x T ∣ x 0 ) ∥ p θ ( x T ) ) + ∑ t = 2 T D K L ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) − log p θ ( x 0 ∣ x 1 ) ] =\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)] = E q [ D K L ( q ( x T ∣ x 0 ) ∥ p θ ( x T ) ) + t = 2 ∑ T D K L ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) − log p θ ( x 0 ∣ x 1 ) ]
第一步,交叉熵定义;第二步,边际概率之和为1;第三步,合并;第四步,凑;第五步,期望的定义;第六步,Jensen不等式;第七、八步,改写;第九步,带入定义;第十步,log运算;第十一步,前向转换成逆向;第十二步,约分;第十三步,KL散度定义
最后得到三项,第一项是常数,两个分布都是已知量,第二项是两个高斯分布的KL散度,第三项是重建系数,DDPM专门为此构建了一个离散化的分段积分累乘,在此不需要特别关注。
其实可以看出,第二项就是希望重建的每一步和逆扩散的每一步尽可能相似
第二项的解为
L t = E x 0 , ϵ [ 1 2 ∥ Σ θ ∥ 2 2 ∥ μ ~ t ( x t , x 0 ) − μ θ ( x t , 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] L t = E x 0 , ϵ [ 2 ∥ Σ θ ∥ 2 2 1 ∥ μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) ∥ 2 ]
= E x 0 , ϵ [ C t ∥ ϵ t − ϵ θ ( α ˉ t x 0 + 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] = E x 0 , ϵ [ C t ∥ ϵ t − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ ˉ t , t ) ∥ 2 ]
所以,模型最后学习的其实就是给定t时刻后的噪声,因此,有了以下的算法流程
细节点
为什么已经知道了前向过程,不能用 x t x_t x t 直接求 x 0 x_0 x 0 呢
第一,这样做并没有意义,第二,仅仅通过公式求 x 0 x_0 x 0 需要记住所有的随机噪声,如果仅利用最后的表达式,噪声的权重相当大,无法恢复原图
重参数的作用
一个符合高斯分布的随机变量,是无法直接求导的,但是如果将它分解成 z = μ θ + σ θ ϵ , ϵ ∼ N ( 0 , I ) z=\mu_\theta+\sigma_\theta\epsilon,\ \epsilon\sim\mathcal{N}(\mathbf{0},\mathbf{I}) z = μ θ + σ θ ϵ , ϵ ∼ N ( 0 , I ) 的形式,就可以求导了
VLB是什么
对于 p θ ( x 0 ) p_\theta(x_0) p θ ( x 0 ) ,我们求解他的极大似然估计来最大化逆向回 x 0 x_0 x 0 的概率,这个问题等价于求极小负对数似然,即
Variational Lower Bound,变分下界,我们自然希望它越小越好,这与上面是一致的
为什么 p ( x t − 1 ∣ x t ) p(x_{t-1}|x_t) p ( x t − 1 ∣ x t ) 不能直接求
因为这是个先验,需要遍历所有数据才能求到这个概率分布。举个直白的例子,我知道你30岁的样子,我想知道你20岁长啥样,我没法直接看出来,但是如果我知道了所有人30岁到20岁的变化,我就可以总结出规律,然后推导你20岁的样子,这个规律就是这里的先验。DDPM说,我不需要知道所有人的规律,我只要知道你10岁长啥样我就可以大概推测你20岁长啥样。
明明是求 x 0 x_0 x 0 ,为什么又用 x t x_t x t 和 x 0 x_0 x 0 的关系去代入 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q ( x t − 1 ∣ x t , x 0 ) 的计算
这里其实是一个大致的估计,因为这里的 x 0 x_0 x 0 并不一定是我们最终要求的那个,我们真正要求的可能是更前面或者更后面的结果。因为每一步我们都将重新估计,所以这个 x 0 x_0 x 0 其实是会被不断修正的,而且随着权重的逐渐降低,最终的预测会更加精细。
DDIM
仔细分析DDPM的优化目标会发现,DDPM其实仅仅依赖边缘分布 q ( x t ∣ x 0 ) q(x_t|x_0) q ( x t ∣ x 0 ) ,而不是直接作用在联合分布 q ( x 1 : T ∣ x 0 ) q(x_{1:T}|x_0) q ( x 1 : T ∣ x 0 ) ,这带来的一个启示是:DDPM这个隐变量模型可以有很多推理分布来选择,只要推理分布满足边缘分布条件(扩散过程的特性)即可,而且这些推理过程并不一定要是马尔卡夫链。
但值得注意的一个点是,我们要得到DDPM的优化目标,还需要知道分布 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q ( x t − 1 ∣ x t , x 0 ) ,之前我们在根据贝叶斯公式推导这个分布时是知道分布 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q ( x t ∣ x t − 1 ) 的,而且依赖了前向过程的马尔卡夫链特性。如果要解除对前向过程的依赖,那么我们就需要直接定义这个分步 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q ( x t − 1 ∣ x t , x 0 ) 。
基于上述分析,DDIM论文中将推理分布定义为:
q σ ( x 1 : T ∣ x 0 ) = q σ ( x T ∣ x 0 ) ∏ t = 2 T q σ ( x t − 1 ∣ x t , x 0 ) 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 σ ( x 1 : T ∣ x 0 ) = q σ ( x T ∣ x 0 ) ∏ t = 2 T q σ ( x t − 1 ∣ x t , x 0 )
这里要同时满足 q σ ( x T ∣ x 0 ) = N ( α T x 0 , ( 1 − α T ) I ) q_\sigma(x_{T}|x_0) = \mathcal{N}(\sqrt{\alpha_T}x_0, (1-\alpha_T)\mathbf{I}) q σ ( x T ∣ x 0 ) = N ( α T x 0 , ( 1 − α T ) I ) 以及对于所有的 t ≥ 2 t \ge 2 t ≥ 2 有:
q σ ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; α t − 1 x 0 + 1 − α t − 1 − σ t 2 x t − α t x 0 1 − α t , σ t 2 I ) 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}) q σ ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; α t − 1 x 0 + 1 − α t − 1 − σ t 2 1 − α t x t − α t x 0 , σ t 2 I )
这里的方差 σ t 2 \sigma_t^2 σ t 2 是一个实数,不同的设置就是不一样的分布,所以 q σ ( x 1 : T ∣ x 0 ) q_\sigma(x_{1:T}|x_0) q σ ( x 1 : T ∣ x 0 ) 其实是一系列的推理分布。可以看到这里分布 q σ ( x t − 1 ∣ x t , x 0 ) q_\sigma(x_{t-1}|x_t, x_0) q σ ( x t − 1 ∣ x t , x 0 ) 的均值也定义为一个依赖与 x 0 x_0 x 0 和 x t x_t x t 的组合函数,之所以定义为这样的形式,是因为根据 q σ ( x T ∣ x 0 ) q_\sigma(x_{T}|x_0) q σ ( x T ∣ x 0 ) ,我们可以通过数学归纳法证明,对于所有的 t t t 均满足:
q σ ( x t ∣ x 0 ) = N ( α t x 0 , ( 1 − α t ) I ) q_\sigma(x_{t}|x_0) = \mathcal{N}(\sqrt{\alpha_t}x_0, (1-\alpha_t)\mathbf{I}) q σ ( x t ∣ x 0 ) = N ( α t x 0 , ( 1 − α t ) I )
这部分的证明见DDIM论文【6】的附录部分
可以看到这里定义的推理分布 q σ ( x 1 : T ∣ x 0 ) q_\sigma(x_{1:T}|x_0) q σ ( x 1 : T ∣ x 0 ) 并没有直接定义前向过程,但这里满足了我们前面要讨论的两个条件:边缘分布 q σ ( x t ∣ x 0 ) q_\sigma(x_{t}|x_0) q σ ( x t ∣ x 0 ) 和后验分布 q σ ( x t − 1 ∣ x t , x 0 ) q_\sigma(x_{t-1}|x_t, x_0) q σ ( x t − 1 ∣ x t , x 0 ) 。同样地,我们可以按照和DDPM的一样的方式去推导优化目标,最终也会得到同样的损失函数。论文也给出了一个前向过程是非马尔可夫链的示例,但实际上我们上述定义的推理分布并不需要前向过程就可以得到和DDPM一样的优化目标。
与DDPM一样,这里也是用神经网络 s θ s_\theta s θ 来预测噪音:
x t − 1 = α t − 1 ( x t − 1 − α t s θ ( x t , t ) α t ) + 1 − α t − 1 − σ t 2 s θ ( x t , t ) + σ t ϵ t x_{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 x t − 1 = α t − 1 ( α t x t − 1 − α t s θ ( x t , t ) ) + 1 − α t − 1 − σ t 2 s θ ( x t , t ) + σ t ϵ t
这里将生成过程分成三个部分:一是由预测的 x 0 x_0 x 0 来产生的,二是指向 x t x_t x t 的部分,三是随机噪声。
论文中将方差进一步定义为
σ t 2 = η ⋅ β ~ t = η ⋅ ( 1 − α t − 1 ) / ( 1 − α t ) ( 1 − α t ) / α t − 1 \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}} σ t 2 = η ⋅ β ~ t = η ⋅ ( 1 − α t − 1 ) / ( 1 − α t ) ( 1 − α t ) / α t − 1
考虑两种情况,一是 η = 1 \eta=1 η = 1 ,此时 σ t 2 = β ~ t \sigma_t^2=\tilde\beta_t σ t 2 = β ~ t ,此时生成过程就和DDPM一样了。
另外一种情况是 η = 0 \eta=0 η = 0 ,这个时候生成过程就没有随机噪音了,是一个确定性的过程,论文将这种情况下的模型称为DDIM (denoising diffusion implicit model) ,一旦最初的随机噪音 x T x_T x T 确定了,那么DDIM的样本生成就变成了确定的过程。
那么这个模型是怎么加速生成过程的呢?
受限,DDIM和DDPM的训练过程是一样的,但是DDIM并没有明确前向过程,这意味着我们可以定义一个更短步数的前向过程。具体地说,从原始的序列 [ 1 , 2 , . . . T ] [1,2,...T] [ 1 , 2 , . . . T ] 中采样一个长度为 S S S 的子序列 [ τ 1 , τ 2 , . . . , τ S ] [\tau_1, \tau_2,...,\tau_S] [ τ 1 , τ 2 , . . . , τ S ] ,我们将 x τ 1 → x τ S x_{\tau_1} \rightarrow x_{\tau_S} x τ 1 → x τ S 的前向过程定义为一个马尔科夫链,并且他们满足上面的边缘分布,那么生成过程也可以用这个子序列的反向马尔卡夫链来替代,由于 S S S 可以设置比原来的步数 T T T 要小,那么就可以加速生成过程。
论文共设计了两种方法来采样这个子序列,分别是
Linear:线性采样 τ i = ⌊ c i ⌋ \tau_i=\lfloor c_i \rfloor τ i = ⌊ c i ⌋
Quadratic:二次方采样 τ i = ⌊ c i 2 ⌋ \tau_i=\lfloor c_i^2 \rfloor τ i = ⌊ c i 2 ⌋
这里的 c i c_i c 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)