2020年的Denoising Diffusion Probabilistic Models论文
阅读本篇文章你可以学习到
文章目录
1 图像生成到扩散模型的思维转变
1.1 VAE和GAN
在认识扩散模型之前,我们先退一步,看看一般的神经网络模型是怎么生成图像的。显然,为了生成丰富的图像,一个图像生成程序要根据随机数来生成图像。通常,这种随机数是一个满足标准正态分布的随机向量。这样,每次要生成新图像时,只需要从标准正态分布里随机生成一个向量并输入给程序就行了。
而在AI绘画程序中,负责生成图像的是一个神经网络模型。神经网络需要从数据中学习。对于图像生成任务,神经网络的训练数据一般是一些同类型的图片。比如一个绘制人脸的神经网络会用人脸照片来训练。也就是说,神经网络会学习如何把一个向量映射成一张图片,并确保这个图片和训练集的图片是一类图片。
可是,相比其他AI任务,图像生成任务对神经网络来说更加困难一点——图像生成任务缺乏有效的指导。在其他AI任务中,训练集本身会给出一个「标准答案」,指导AI的输出向标准答案靠拢。比如对于图像分类任务,训练集会给出每一幅图像的类别;对于人脸验证任务,训练集会给出两张人脸照片是不是同一个人;对于目标检测任务,训练集会给出目标的具体位置。然而,图像生成任务是没有标准答案的。图像生成数据集里只有一些同类型图片,却没有指导AI如何画得更好的信息。
为了解决这一问题,人们专门设计了一些用于生成图像的神经网络架构。这些架构中比较出名的有生成对抗模型(GAN
)和变分自编码器(VAE
)。
GAN的想法是,既然不知道一幅图片好不好,就干脆再训练一个神经网络,用于辨别某图片是不是和训练集里的图片长得一样。生成图像的神经网络叫做生成器,鉴定图像的神经网络叫做判别器。两个网络互相对抗,共同进步。
VAE则使用了逆向思维:学习向量生成图像很困难,那就再同时学习怎么用图像生成向量。这样,把某图像变成向量,再用该向量生成图像,就应该得到一幅和原图像一模一样的图像。每一个向量的绘画结果有了一个标准答案,可以用一般的优化方法来指导网络的训练了。VAE中,把图像变成向量的网络叫做编码器,把向量转换回图像的网络叫做解码器。其中,解码器就是负责生成图像的模型。对VAE的更深入理解感兴趣可以阅读:《VQ-VAE》:Stable Diffusion设计的架构源泉
一直以来,GAN的生成效果较好,但训练起来比VAE麻烦很多。有没有和GAN一样强大,训练起来又方便的生成网络架构呢?扩散模型正是满足这些要求的生成网络架构。
1.2 扩散模型
扩散模型是一种特殊的VAE,其灵感来自于热力学:一个分布可以通过不断地添加噪声变成另一个分布。放到图像生成任务里,就是来自训练集的图像可以通过不断添加噪声变成符合标准正态分布的图像。 从这个角度出发,我们可以对VAE做以下修改:
- 1)不再训练一个可学习的编码器,而是把编码过程固定成不断添加噪声的过程;
- 2)不再把图像压缩成更短的向量,而是自始至终都对一个等大的图像做操作。解码器依然是一个可学习的神经网络,它的目的也同样是实现编码的逆操作。不过,既然现在编码过程变成了加噪,那么解码器就应该负责去噪。而对于神经网络来说,去噪任务学习起来会更加有效。
因此,扩散模型既不会涉及GAN中复杂的对抗训练,又比VAE更强大一点。
具体来说,扩散模型由正向过程和反向过程这两部分组成,对应VAE中的编码和解码。
- 1)在正向过程中,输入 X 0 X_0 X0会不断混入高斯噪声。经过 T T T次加噪声操作后,图像 X T X_T XT会变成一幅符合标准正态分布的纯噪声图像。
- 2)而在反向过程中,我们希望训练出一个神经网络,该网络能够学会 T T T个去噪声操作,把 X T X_T XT还原回 X 0 X_0 X0。网络的学习目标是让 T T T个去噪声操作正好能抵消掉对应的加噪声操作。
- 3)训练完毕后,只需要从标准正态分布里随机采样出一个噪声,再利用反向过程里的神经网络把该噪声恢复成一幅图像,就能够生成一幅图片了。
高斯噪声,就是每个像素值是从高斯分布中取样得来的。如果高斯分布的均值 μ 设为 128,标准差 σ 设为 25,那么大部分像素值会集中在 128 附近(可能在 100 到 156 之间),而远离 128 的像素值则会较少出现。即高斯噪声的像素值的分布呈现高斯分布钟形曲线。
2 扩散模型的两个过程
2.1 前向加噪过程
在前向过程中,来自训练集的图像 X 0 X_0 X0会被添加 T T T次噪声,使得 X T X_T XT为符合标准正态分布。准确来说,「加噪声」并不是给上一时刻的图像加上噪声值,而是从一个均值与上一时刻图像相关的正态分布里采样出一幅新图像。如下面的公式所示, X t − 1 X_{t-1} Xt−1是上一时刻的图像, X t X_{t} Xt是这一时刻生成的图像,该图像是从一个均值与 X t − 1 X_{t-1} Xt−1有关的正态分布里采样出来的。
X t ∼ N ( μ t ( X t − 1 ) , σ t 2 I ) X_t \sim \Nu(\mu_t(X_{t-1}),\sigma^2_tI) Xt∼N(μt(Xt−1),σt2I)
前向过程也是一个马尔可夫过程。马尔可夫过程的意思就是当前时刻的状态只由上一时刻的状态决定,而不由更早的状态决定。上面的公式表明,计算 X t X_t Xt,只需要用到,而不需要用到 X t − 1 X_{t-1} Xt−1,这符合马尔可夫过程的定义。
绝大多数扩散模型会把这个正态分布设置成这个形式:
X t ∼ N ( 1 − β t X t − 1 , β t I ) X_t \sim \Nu(\sqrt{\smash[b]{1-\beta_t}}X_{t-1},\beta_tI) Xt∼N(1−βtXt−1,βtI)
这个正态分布公式乍看起来很奇怪: 1 − β t \sqrt{\smash[b]{1-\beta_t}} 1−βt是哪里冒出来的?为什么会有这种奇怪的系数?别急,我们先来看另一个问题:假如给定 X 0 X_0 X0,也就是从训练集里采样出一幅图片,该怎么计算任意一个时刻 t t t的噪声图像 X t X_t Xt呢?
我们不妨按照公式,从 X t X_t Xt开始倒推。其实可以通过一个标准正态分布的样本 ϵ t − 1 \epsilon_{t-1} ϵt−1算出来
X t ∼ N ( 1 − β t X t − 1 , β t I ) X_t \sim \Nu(\sqrt{\smash[b]{1-\beta_t}}X_{t-1},\beta_tI) Xt∼N(1−βtXt−1,βtI)
⇒ \Rightarrow ⇒
X t = 1 − β t X t − 1 + β t ϵ t − 1 ; ϵ t − 1 ∼ N ( 0 , I ) X_t = \sqrt{\smash[b]{1-\beta_t}}X_{t-1} + \sqrt{\smash[b]{\beta_t}}\epsilon_{t-1};\epsilon_{t-1}\sim\Nu(0,I) Xt=1−βtXt−1+βtϵt−1;ϵt−1∼N(0,I)
再往前推几步:
X t = 1 − β t X t − 1 + β t ϵ t − 1 = 1 − β t ( 1 − β t − 1 X t − 2 + β t − 1 ϵ t − 2 ) + β t ϵ t − 1 = ( 1 − β t ) ( 1 − β t − 1 ) X t − 2 + ( 1 − β t ) β t − 1 ϵ t − 2 + β t ϵ t − 1 X_t = \sqrt{\smash[b]{1-\beta_t}}X_{t-1} + \sqrt{\smash[b]{\beta_t}}\epsilon_{t-1} \\ =\sqrt{\smash[b]{1-\beta_t}} ( \sqrt{\smash[b]{1-\beta_{t-1}}}X_{t-2} + \sqrt{\smash[b]{\beta_{t-1}}}\epsilon_{t-2} ) + \sqrt{\smash[b]{\beta_t}}\epsilon_{t-1} \\ = \sqrt{\smash[b]{(1-\beta_t)(1-\beta_{t-1})}}X_{t-2} + \sqrt{(1-\beta_t)\beta_{t-1}}\epsilon_{t-2} + \sqrt{\beta_t}\epsilon_{t-1} Xt=1−βtXt−1