DDPM(Denoising Diffusion Probabilistic Models)扩散模型简述
引言
扩散模型最早是在2015年的文章中提出的,但当时扩散模型并不work,所以并没有被广泛应用。在2020年,(简称为DDPM)的出现,将扩散模型带到了一个新高度。并且在其之前主流的生成网络GAN,还存在一些缺点,因为其要训练两个网络,难度较大,容易不收敛,多样性较差,并且模型在训练过程中不稳定,只要骗过判别器即可。而生成模型用一种更简单的方法诠释了生成模型应该如何学习和生成,感觉更简单,之后扩散模型可能会替代GAN成为主流的生成模型。
以上是扩散模型的图示,可以看到扩散模型分为两个阶段,分为前向过程和逆向过程。
-
前向过程即上图中 x 0 mathbf{x}_0 x0到 x T mathbf{x}_T xT的过程,我们向原始图像中逐步添加高斯噪声,并且后一时刻都是由前一时刻添加噪声得到的,这样我们就得到 x 1 mathbf{x}_1 x1, x 2 mathbf{x}_2 x2,…, x T mathbf{x}_T xT, x T mathbf{x}_T xT是完全的高斯噪声。前向过程存在的意义就是帮助神经网络去训练逆向过程,也即前向过程中得到的噪声就是一系列标签,根据这些标签,逆向过程在去噪的时候就知道噪音是怎么加进去的,进而进行训练。正向过程对应网络的训练过程 逆向过程即上图中 x T mathbf{x}_T xT到 x 0 mathbf{x}_0 x0的过程。我们从标准正态分布采样的高斯噪声 x T mathbf{x}_T xT,逐步对其去噪,得到 x T − 1 mathbf{x}_{T-1} xT−1, x T − 2 mathbf{x}_{T-2} xT−2,…, x 0 mathbf{x}_0 x0, x 0 mathbf{x}_0 x0是没有噪声的的图像。逆向过程对应网络的推理过程。
前向过程Forward Process
前向过程又称扩散过程,其是一个马尔科夫过程(即当前状态只和前一个状态有关)。我们向原始图像 x 0 mathbf{x}_0 x0中逐步添加高斯噪声,噪声的标准差是固定值 β t eta_t βt来确定的,均值是固定值 β t eta_t βt和和 t − 1 t-1 t−1时刻的数据 x t − 1 mathbf{x}_{t-1} xt−1确定的。随着 t t t不断增大,最终分布 x T mathbf{x}_T xT服从于各向同性的高斯分布了。那么我们要加多少次噪声呢,也即 T T T取多大好呢?论文中将 T T T看做成一个超参数, T = 1000 T=1000 T=1000,即加1000次噪声后, x T mathbf{x}_T xT会变成各向同性的高斯分布。下方是论文中给出的扩散过程 x t mathbf{x}_t xt的分布。 q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(mathbf{x}_{t}midmathbf{x}_{t-1})=mathcal{N}(mathbf{x}_{t};sqrt{1-eta_{t}}mathbf{x}_{t-1},eta_{t}mathbf{I}) q(xt∣xt−1)=N(xt;1−βt xt−1,βtI) 我们可以利用重参数化技巧,将其改写成下面的式子 x t = 1 − β t x t − 1 + β t z t − 1 mathbf{x}_t=sqrt{1-eta_{t}}mathbf{x}_{t-1}+sqrt{eta_{t}}mathbf{z}_{t-1} xt=1−βt xt−1+βt zt−1 通过这个式子,我们就可以很直观的看到这个噪声是怎么加的,即 a × I m a g e + b × N o i s e a ×Image + b ×Noise a×Image+b×Noise, I m a g e Image Image是前一时刻生成的图像,即上式中的 x t − 1 mathbf{x}_{t-1} xt−1; N o i s e Noise Noise是标准正态分布,即上式中 z t − 1 ∼ N ( 0 , I ) mathbf{z}_{t-1}simmathcal{N}(0,mathbf{I}) zt−1∼N(0,I)。并且这里图像和噪音的权重是不断变化的,也即上式中的 β t eta_t βt,论文中将其称作扩散率,也是按照超参数处理, β eta β的范围从0.0001逐步增大到0.02。为什么扩散率是逐渐增大的呢,也即为什么噪音所占的比例越来越大呢?可以反过来理解,在加噪声的过程中,扩散率逐渐增大,对应着在去噪声的过程中,扩散率逐渐减小,也就是说,去噪的过程是先把"明显"的噪声给去除,对应着较大的扩散率;当去到一定程度,逐渐逼近真实真实图像的时候,去噪速率逐渐减慢,开始微调,也就是对应着较小的扩散率。
重参数化技巧
如果我们要对高斯分布 N ( μ , σ 2 ) mathcal{N}(mu, sigma^2) N(μ,σ2)进行采样一个噪声 ϵ epsilon ϵ,等价于先从标准正态分布 N ( 0 , 1 ) mathcal{N}(0,1) N(0,1)中采样的到一个噪声 z mathbf{z} z,然后对其乘上标准差 σ sigma σ,加上均值 μ mu μ,即 ϵ = μ + σ ⋅ z epsilon=mu+sigmacdotmathbf{z} ϵ=μ+σ⋅z。举个例子,上面我们已经得到了 x t mathbf{x}_t xt是从高斯分布 N ( 1 − β t x t − 1 , β t I ) mathcal{N}(sqrt{1-eta_{t}}mathbf{x}_{t-1},eta_{t}mathbf{I}) N(1−βt xt−1,βtI)采样出来的噪声,该高斯分布的均值为 1 − β t x t − 1 sqrt{1-eta_{t}}mathbf{x}_{t-1} 1−βt xt−1,标准差为 β t sqrt{eta_{t}} βt ,所以 x t = 1 − β t x t − 1 + β t z mathbf{x}_t=sqrt{1-eta_{t}}mathbf{x}_{t-1}+sqrt{eta_{t}}mathbf{z} xt=1−βt xt−1+βt z。
解释结束
对于 ∗ * ∗处运算的解释
对于任意两个正态分布 x ∼ N ( μ 1 , σ 1 2 ) mathbf{x}simmathcal{N}(mu_1,sigma_1^2) x∼N(μ1,σ12)和 y ∼ N ( μ 2 , σ 2 2 ) mathbf{y}simmathcal{N}(mu_2,sigma_2^2) y∼N(μ2,σ22),其和的分布 x + y ∼ N ( μ 1 + μ 2 , σ 1 2 + σ 2 2 ) mathbf{x}+mathbf{y}simmathcal{N}(mu_1+mu_2,sigma_1^2+sigma_2^2) x+y∼N(μ1+μ2,σ12+σ22)
因此对于两个标准正态分布 z t − 2 mathbf{z}_{t-2} zt−2和 z t − 1 mathbf{z}_{t-1} zt−1,将其前面乘上一个系数, α t − α t α t − 1 z t − 2 ∼ N ( 0 , α t − α t α t − 1 ) sqrt{alpha_{t}-alpha_{t}alpha_{t-1}}mathbf{z}_{t-2}simmathcal{N}(0,alpha_{t}-alpha_{t}alpha_{t-1}) αt−αtαt−1 zt−2∼N(0,αt−αtαt−1), 1 − α t z t − 1 ∼ N ( 0 , 1 − α t ) sqrt{1-alpha_{t}}mathbf{z}_{t-1}simmathcal{N}(0,1-alpha_{t}) 1−αt zt−1∼N(0,1−αt),因此 α t − α t α t − 1 z t − 2 + 1 − α t z t − 1 ∼ N ( 0 , 1 − α t α t − 1 ) sqrt{alpha_{t}-alpha_{t}alpha_{t-1}}mathbf{z}_{t-2}+sqrt{1-alpha_{t}}mathbf{z}_{t-1}simmathcal{N}(0,1-alpha_{t}alpha_{t-1}) αt−αtαt−1 zt−2+1−αt zt−1∼N(0,1−αtαt−1),也即 1 − α t α t − 1 z ˉ t − 2 sqrt{1-alpha_{t}alpha_{t-1}}ar{mathbf{z}}_{t-2} 1−αtαt−1 zˉt−2。这里不同形式 z mathbf{z} z单纯起区分作用,本质上都属于标准正态分布 N ( 0 , I ) mathcal{N}(0,mathbf{I}) N(0,I)的不同采样。
解释结束
以上就是前向过程大概内容,我们从前向过程得到的 x t mathbf{x}_t xt将会作为标签,帮助网络学习如何从 x T mathbf{x}_T xT中一步步去噪,最终得到 x 0 mathbf{x}_0 x0。
后向过程Reverse Process
后向过程又称逆扩散过程。我们希望能够从一个噪声分布 x T mathbf{x}_T xT中逐步去预测出来目标分布 x 0 mathbf{x}_0 x0。后向过程仍然是一个马尔科夫链过程。根据我们输入的 x t mathbf{x}_{t} xt去求 x t − 1 mathbf{x}_{t-1} xt−1的分布,即求 q ( x t − 1 ∣ x t ) q(mathbf{x}_{t-1}midmathbf{x}_{t}) q(xt−1∣xt),直接对该公式求解比较困难,可以使用贝叶斯公式将其转化为我们已知的量 q ( x t − 1 ∣ x t ) = q ( x t ∣ x t − 1 ) q ( x t − 1 ) q ( x t ) q(mathbf{x}_{t-1}midmathbf{x}_{t})=q(mathbf{x}_{t}midmathbf{x}_{t-1})frac{q(mathbf{x}_{t-1})}{q(mathbf{x}_{t})} q(xt−1∣xt)=q(xt∣xt−1)q(xt)q(xt−1) 由前向过程, q ( x t ∣ x t − 1 ) q(mathbf{x}_{t}midmathbf{x}_{t-1}) q(xt∣xt−1)已知,但是 q ( x t − 1 ) q(mathbf{x}_{t-1}) q(xt−1)和 q ( x t ) q(mathbf{x}_{t}) q(xt)未知,但是如果我们给其加上一个先决条件 q ( x 0 ) q(mathbf{x}_0) q(x0),也即 q ( x t − 1 ∣ x 0 ) q(mathbf{x}_{t-1}midmathbf{x}_0) q(xt−1∣x0)和 q ( x t ∣ x 0 ) q(mathbf{x}_{t}midmathbf{x}_0) q(xt∣x0),这两个分布由前向过程我们是已知的,所以对 q ( x t − 1 ∣ x t ) q(mathbf{x}_{t-1}midmathbf{x}_{t}) q(xt−1∣xt)加上一个条件 x 0 mathbf{x}_0 x0,得到一个多元条件分布 q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) q(mathbf{x}_{t-1}midmathbf{x}_{t},mathbf{x}_0)=q(mathbf{x}_{t}midmathbf{x}_{t-1},mathbf{x}_0)frac{q(mathbf{x}_{t-1}midmathbf{x}_0)}{q(mathbf{x}_{t}midmathbf{x}_0)} q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0) 由于扩散过程是马尔科夫过程,所以 q ( x t ∣ x t − 1 , x 0 ) = q ( x t ∣ x t − 1 ) q(mathbf{x}_{t}midmathbf{x}_{t-1},mathbf{x}_0)=q(mathbf{x}_{t}midmathbf{x}_{t-1}) q(xt∣xt−1,x0)=q(xt∣xt−1) 至此,所有分布我们都已知了,由于正态分布 N ( μ , σ 2 ) mathcal{N}(mu,sigma^2) N(μ,σ2)的概率密度函数 p ( x ) = 1 2 π σ e − 1 2 ( x − μ σ ) 2 ∝ e x p ( − 1 2 ( x − μ σ ) 2 ) = e x p ( − 1 2 ( 1 σ 2 x 2 − 2 μ σ 2 x + μ 2 σ 2 ) ) p(x)=frac{1}{sqrt{2pi}sigma}e^{-frac{1}{2}(frac{x-mu}{sigma})^2}propto exp({-frac{1}{2}(frac{x-mu}{sigma})^2})=exp(-frac{1}{2}(frac{1}{sigma^2}x^2-frac{2mu}{sigma^2}x+frac{mu^2}{sigma^2})) p(x)=2π σ1e−21(σx−μ)2∝exp(−21(σx−μ)2)=exp(−21(σ21x2−σ22μx+σ2μ2)),故
-
q ( x t ∣ x t − 1 ) = N ( x t ; α t x t − 1 , ( 1 − α t ) I ) ∝ e x p ( − 1 2 ( x t − α t x t − 1 ) 2 1 − α t ) q(mathbf{x}_{t}midmathbf{x}_{t-1})=mathcal{N}(mathbf{x}_{t};sqrt{alpha_{t}}mathbf{x}_{t-1},(1-alpha_{t})mathbf{I})propto exp(-frac{1}{2}frac{(mathbf{x}_{t}-sqrt{alpha_{t}}mathbf{x}_{t-1})^2}{1-alpha_{t}}) q(xt∣xt−1)=N(xt;αt xt−1,(1−αt)I)∝exp(−211−αt(xt−αt xt−1)2) x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 z ~ t − 1 mathbf{x}_{t-1}=sqrt{ar{alpha}_{t-1}}mathbf{x}_0+sqrt{1-ar{alpha}_{t-1}} ilde{mathbf{z}}_{t-1} xt−1=αˉt−1 x0+1−αˉt−1 z~t−1,利用重参数技巧,则 q ( x t − 1 ∣ x 0 ) = N ( x t − 1 ; α ˉ t − 1 x 0 , ( 1 − α ˉ t − 1 ) I ) ∝ e x p ( − 1 2 ( x t − 1 − α ˉ t − 1 x 0 ) 2 1 − α ˉ t − 1 ) q(mathbf{x}_{t-1}midmathbf{x}_{0})=mathcal{N}(mathbf{x}_{t-1};sqrt{ar{alpha}_{t-1}}mathbf{x}_0,(1-ar{alpha}_{t-1})mathbf{I})propto exp(-frac{1}{2}frac{(mathbf{x}_{t-1}-sqrt{ar{alpha}_{t-1}}mathbf{x}_0)^2}{1-ar{alpha}_{t-1}}) q(xt−1∣x0)=N(xt−1;αˉt−1 x0,(1−αˉt−1)I)∝exp(−211−αˉt−1(xt−1−αˉt−1 x0)2) x t = α ˉ t x 0 + 1 − α ˉ t z ~ t mathbf{x}_{t}=sqrt{ar{alpha}_{t}}mathbf{x}_0+sqrt{1-ar{alpha}_{t}} ilde{mathbf{z}}_{t} xt=αˉt x0+1−αˉt z~t,同样利用重参数技巧,则 q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) ∝ e x p ( − 1 2 ( x t − α ˉ t x 0 ) 2 1 − α ˉ t ) q(mathbf{x}_{t}midmathbf{x}_{0})=mathcal{N}(mathbf{x}_{t};sqrt{ar{alpha}_{t}}mathbf{x}_0,(1-ar{alpha}_{t})mathbf{I})propto exp(-frac{1}{2}frac{(mathbf{x}_{t}-sqrt{ar{alpha}_{t}}mathbf{x}_0)^2}{1-ar{alpha}_{t}}) q(xt∣x0)=N(xt;αˉt x0,(1−αˉt)I)∝exp(−211−αˉt(xt−αˉt x0)2)
这样一来我们对概率分布的运算就可以转化为指数运算。由于对指数进行乘除运算相当于对其系数的加减运算,故 q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) ∝ e x p ( − 1 2 [ ( x t − α t x t − 1 ) 2 1 − α t + ( x t − 1 − α ˉ t − 1 x 0 ) 2 1 − α ˉ t − 1 − ( x t − α ˉ t x 0 ) 2 1 − α ˉ t ] ) q(mathbf{x}_{t-1}midmathbf{x}_{t},mathbf{x}_0)=q(mathbf{x}_{t}midmathbf{x}_{t-1})frac{q(mathbf{x}_{t-1}midmathbf{x}_0)}{q(mathbf{x}_{t}midmathbf{x}_0)}propto exp(-frac{1}{2}[frac{(mathbf{x}_{t}-sqrt{alpha_{t}}mathbf{x}_{t-1})^2}{1-alpha_{t}}+frac{(mathbf{x}_{t-1}-sqrt{ar{alpha}_{t-1}}mathbf{x}_0)^2}{1-ar{alpha}_{t-1}}-frac{(mathbf{x}_{t}-sqrt{ar{alpha}_{t}}mathbf{x}_0)^2}{1-ar{alpha}_{t}}]) q(xt−1∣xt,x0)=q(xt∣xt−1)q(xt∣x0)q(xt−1∣x0)∝exp(−21[1−αt(xt−αt xt−1)2+1−αˉt−1(xt−1−αˉt−1 x0)2−1−αˉt(xt−αˉt x0)2]) 由于我们目标是求与 x t − 1 mathbf{x}_{t-1} xt−1有关的条件分布,所以将平方项进一步展开化简为关于 x t − 1 mathbf{x}_{t-1} xt−1的二次函数 q ( x t − 1 ∣ x t , x 0 ) ∝ e x p ( − 1 2 [ ( α t β t + 1 1 − α ˉ t − 1 ) x t − 1 2 − ( 2 α t β t x t + 2 α ˉ t − 1 1 − α ˉ t − 1 x 0 ) x t − 1 − C ( x t , x 0 ) ] ) q(mathbf{x}_{t-1}midmathbf{x}_{t},mathbf{x}_0)propto exp(-frac{1}{2}[(frac{alpha_{t}}{eta_{t}}+frac{1}{1-ar{alpha}_{t-1}})mathbf{x}_{t-1}^2-(frac{2sqrt{alpha_{t}}}{eta_t}mathbf{x}_t+frac{2sqrt{ar{alpha}_{t-1}}}{1-ar{alpha}_{t-1}}mathbf{x}_0)mathbf{x}_{t-1}-C(mathbf{x}_t,mathbf{x}_0)]) q(xt−1∣xt,x0)∝exp(−21[(βtαt+1−αˉt−11)xt−12−(βt2αt xt+1−αˉt−12αˉt−1 x0)xt−1−C(xt,x0)]) 这里 C ( x t , x 0 ) C(mathbf{x}_t,mathbf{x}_0) C(xt,x0)为 ( x t − α ˉ t x 0 ) 2 1 − α ˉ t frac{(mathbf{x}_{t}-sqrt{ar{alpha}_{t}}mathbf{x}_0)^2}{1-ar{alpha}_{t}} 1−αˉt(xt−αˉt x0)2,也即 q ( x t ∣ x 0 ) q(mathbf{x}_tmidmathbf{x}_0) q(xt∣x0)。由于上式是关于 x t − 1 mathbf{x}_{t-1} xt−1的函数,由于 q ( x t ∣ x 0 ) q(mathbf{x}_tmidmathbf{x}_0) q(xt∣x0)不含 x t − 1 mathbf{x}_{t-1} xt−1,故将其视为常数 C C C。由于 q ( x t − 1 ∣ x t , x 0 ) q(mathbf{x}_{t-1}midmathbf{x}_{t},mathbf{x}_0) q(xt−1∣xt,x0)服从于正态分布,所以我们只需要找到其均值和方差就能求出其分布。怎么求? 现在我们考虑正态分布 N ( μ , σ 2 ) mathcal{N}(mu,sigma^2) N(μ,σ2)的概率密度函数 p ( x ) = 1 2 π σ e − 1 2 ( x − μ σ ) 2 ∝ e x p ( − 1 2 ( x − μ σ ) 2 ) = e x p ( − 1 2 ( 1 σ 2 x 2 − 2 μ σ 2 x + μ 2 σ 2 ) ) p(x)=frac{1}{sqrt{2pi}sigma}e^{-frac{1}{2}(frac{x-mu}{sigma})^2}propto exp({-frac{1}{2}(frac{x-mu}{sigma})^2})=exp(-frac{1}{2}(frac{1}{sigma^2}x^2-frac{2mu}{sigma^2}x+frac{mu^2}{sigma^2})) p(x)=2π σ1e−21(σx−μ)2∝exp(−21(σx−μ)2)=exp(−21(σ21x2−σ22μx+σ2μ2)),所以我们可以找出分布 q ( x t − 1 ∣ x t , x 0 ) q(mathbf{x}_{t-1}midmathbf{x}_{t},mathbf{x}_0) q(xt−1∣xt,x0)的均值和方差。由于方差 σ 2 sigma^2 σ2是 x 2 x^2 x2系数的倒数,而 x t − 1 2 mathbf{x}_{t-1}^2 xt−12的系数为 ( α t β t + 1 1 − α ˉ t − 1 ) (frac{alpha_{t}}{eta_{t}}+frac{1}{1-ar{alpha}_{t-1}}) (βtαt+1−αˉt−11),其只由人为设置的超参数 β eta β确定,故方差是已知的。 x x x的系数为 − 2 μ σ 2 -frac{2mu}{sigma^2} −σ22μ,则我们可以根据方差来间接求出均值, x t − 1 mathbf{x}_{t-1} xt−1的系数为 ( 2 α t β t x t + 2 α ˉ t − 1 1 − α ˉ t − 1 x 0 ) (frac{2sqrt{alpha_{t}}}{eta_t}mathbf{x}_t+frac{2sqrt{ar{alpha}_{t-1}}}{1-ar{alpha}_{t-1}}mathbf{x}_0) (βt2αt xt+1−αˉt−12αˉt−1 x0)。可以发现,系数中共有四个变量 α alpha α, β eta β, x t mathbf{x}_t xt和 x 0 mathbf{x}_0 x0,其中 α alpha α, β eta β, x t mathbf{x}_t xt都是已知的,但是对于 x 0 mathbf{x}_0 x0,由于我们现在是处于后向过程, x 0 mathbf{x}_0 x0是未知的,现在我们要想办法将 x 0 mathbf{x}_0 x0用已知量进行替换。我们先将 x t − 1 mathbf{x}_{t-1} xt−1的均值记为一个关于 x t mathbf{x}_t xt和 x 0 mathbf{x}_0 x0的函数 μ ~ t ( x t , x 0 ) ilde{mu}_t(mathbf{x}_t,mathbf{x}_0) μ~t(xt,x0)。将 1 σ 2 = ( α t β t + 1 1 − α ˉ t − 1 ) frac{1}{sigma^2}=(frac{alpha_{t}}{eta_{t}}+frac{1}{1-ar{alpha}_{t-1}}) σ21=(βtαt+1−αˉt−11)代入 2 μ σ 2 = ( 2 α t β t x t + 2 α ˉ t − 1 1 − α ˉ t − 1 x 0 ) frac{2mu}{sigma^2}=(frac{2sqrt{alpha_{t}}}{eta_t}mathbf{x}_t+frac{2sqrt{ar{alpha}_{t-1}}}{1-ar{alpha}_{t-1}}mathbf{x}_0) σ22μ=(βt2αt xt+1−αˉt−12αˉt−1 x0)求解可得 μ ~ t ( x t , x 0 ) = α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t + α ˉ t − 1 β t 1 − α ˉ t x 0 ilde{mu}_t(mathbf{x}_t,mathbf{x}_0)=frac{sqrt{alpha_t}(1-ar{alpha}_{t-1})}{1-ar{alpha}_t}mathbf{x}_t+frac{sqrt{ar{alpha}_{t-1}}eta_t}{1-ar{alpha}_t}mathbf{x}_0 μ~t(xt,x0)=1−αˉtαt (1−αˉt−1)xt+1−αˉtαˉt−1 βtx0 现在回想一下,我们已经在前向过程中已经得到了 x 0 mathbf{x}_0 x0和 x t mathbf{x}_t xt的关系 x t = α ˉ t x 0 + 1 − α ˉ t z ~ t mathbf{x}_{t}=sqrt{ar{alpha}_{t}}mathbf{x_{0}}+sqrt{1-ar{alpha}_{t}} ilde{mathbf{z}}_{t} xt=αˉt x0+1−αˉt z~t 现在我们用 x t mathbf{x}_t xt来表示 x 0 mathbf{x}_0 x0 x 0 = 1 α ˉ t ( x t − 1 − α ˉ t z ~ t ) mathbf{x}_0=frac{1}{sqrt{ar{alpha}_t}}(mathbf{x}_t-sqrt{1-ar{alpha}_t} ilde{mathbf{z}}_t) x0=αˉt 1(xt−1−αˉt z~t)然后将其代入 μ ~ t ( x t ) = 1 α t ( x t − 1 − α t 1 − α ˉ t z ~ t ) ilde{mu}_t(mathbf{x}_t)=frac{1}{sqrt{alpha_t}}(mathbf{x}_t-frac{1-alpha_t}{sqrt{1-ar{alpha}_t}} ilde{mathbf{z}}_t) μ~t(xt)=αt 1(xt−1−αˉt 1−αtz~t) 这样我们就把 x 0 mathbf{x}_0 x0消掉了,现在我们只要知道了 z ~ t ilde{mathbf{z}}_t z~t,就能将 μ ~ t ilde{mu}_t μ~t表示出来,进而得到 q ( x t − 1 ∣ x t , x 0 ) q(mathbf{x}_{t-1}midmathbf{x}_{t},mathbf{x}_0) q(xt−1∣xt,x0)的分布,将 x t − 1 mathbf{x}_{t-1} xt−1采样出来,完成一次去噪过程。那么 z ~ t ilde{mathbf{z}}_t z~t怎么求呢? 这就要请出深度学习了,我们可以设计一个网络去预测在 x t mathbf{x}_t xt时刻的噪音 z ~ t ilde{mathbf{z}}_t z~t。网络的输入是 x t mathbf{x}_t xt,网络的输出是 z ~ t ilde{mathbf{z}}_t z~t,这是一个预测值,那么真实值在哪呢?我们只有得到真实值,我们才能计算预测值和真值之间的损失,从而训练网络。这时我们考虑前向过程,前向过程中,后一时刻等于前一时刻加上一个噪音 z mathbf{z} z, z mathbf{z} z是我们采样得来的,是已知的,也就是之前我们所谓的标签。假设我们前向过程由 x t − 1 mathbf{x}_{t-1} xt−1到 x t mathbf{x}_t xt加的噪音为 z mathbf{z} z,那么 z ~ t ilde{mathbf{z}}_t z~t的真值就是 z mathbf{z} z,所以我们这个网络训练的 z ~ t ilde{mathbf{z}}_t z~t就去不断拟合噪声 z mathbf{z} z。 至此前向过程和后向过程已经介绍结束了,如果读者想了解论文中交叉熵loss的推导,可以看这篇文章的解释(由于篇幅限制,我只好把它放到另一篇文章),这部分公式比较复杂,如果不感兴趣,直接跳过即可,不影响最后算法理解。
DDPM算法代码
训练部分
-
首先在真实图像分布 q ( x 0 ) q(mathbf{x}_0) q(x0)中采样出 x 0 mathbf{x}_0 x0,也即我们的训练图像 在区间 1 , . . . , T {1,...,T} 1,...,T中随机生成生成一个 t t t,代表扩散(加噪)次数 从标准正态分布中采样一个随机噪声 ϵ epsilon ϵ 计算损失函数,其中的真值是我们刚刚采样得到的噪声 ϵ epsilon ϵ,网络预测值是 ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) epsilon_{ heta}(sqrt{ar{alpha}_t}mathbf{x}_0+sqrt{1-ar{alpha}_t}epsilon,t) ϵθ(αˉt x0+1−αˉt ϵ,t),而 α ˉ t x 0 + 1 − α ˉ t ϵ sqrt{ar{alpha}_t}mathbf{x}_0+sqrt{1-ar{alpha}_t}epsilon αˉt x0+1−αˉt ϵ是我们在前向过程中求得的 x t mathbf{x}_t xt,这其实可以改写为 ϵ θ ( x t , t ) epsilon_{ heta}(mathbf{x}_t,t) ϵθ(xt,t),这里的 t t t做一个时间编码喂入网络中,因为在后向过程中,每一次迭代的网络都是相同的,即参数共享,那怎么让网络知道现在迭代到哪一步呢,那么我们就将 t t t一同传进去参与训练,用 t t t来告诉网络我现在进行到第几次迭代了。时间编码和transformer中的位置编码类似。
总结一下,训练过程就是给定 x 0 mathbf{x}_0 x0和随机噪声 ϵ epsilon ϵ,然后生成一个扩散(加噪)次数 t t t,进行 t t t次扩散过程得到 x t mathbf{x}_t xt,然后通过一个网络 ϵ θ epsilon_{ heta} ϵθ来预测一个合适的噪声,也就是 z ~ t ilde{mathbf{z}}_t z~t
采样部分
-
首先从标准正态分布中采样一个随机噪声 x T mathbf{x}_T xT。因为我们在前向过程中认为在原图扩散 T T T次之后,原图服从于一个各相同性的高斯分布。 然后进行 T T T次迭代,对于每一次迭代,首先采样一个标准高斯噪声,但是最后一步就不采样了。然后通过公式计算去噪一次的结果,公式中的 ϵ θ epsilon_{ heta} ϵθ就是我们在训练过程得到的结果。
总结
DDPM对Deep Unsupervised Learning using Nonequilibrium Thermodynamics文中提出的模型(下文称扩散模型)改进了两点
-
第一点,扩散模型在后向过程中,是由 x t mathbf{x}_t xt预测 x t − 1 mathbf{x}_{t-1} xt−1,也即直接预测图像,而DDPM是预测在前向过程中,我们从 x t − 1 mathbf{x}_{t-1} xt−1扩散到 x t mathbf{x}_t xt所加的噪声,有点类似Resnet,即如何将噪声从噪声-图像混合物中分离出来,从而将问题简化。 第二点,如果我们要预测一个正态分布,我们只需要学它的均值和方差即可,而DDPM将方差视作常数,只需学习均值就能得到分布,最后的效果也不错,并且降低了模型优化的难度
之后有关DDPM的改进,比如IDDPM,DM beats gan等等,读者可自行了解。