在之前的GAN的时候,有一个非常大的问题,那就是GAN生成的图像缺乏多样性,它是以生成器生成的图像能骗过判别器为目标的,而不是以生成丰富的图像为目标的。有关GAN的理论部分可以参考Tensorflow深度学习算法整理(三) 中的对抗神经网络。
而在Diffusion扩散模型中却并非如此,它没有一个所谓的判别器,而是有两个过程,一个是前向过程,一个是逆向过程。前向过程是将图像不断的加噪音,最后变成一个人看上去就是一个纯噪音的图像。而逆向过程则是将纯噪音图像不断还原成真实图像的过程,但是这个还原可能是对很多训练过的图像进行的还原,所以它并不是以还原出一副图像为目的的过程。
我们先看第一步,前向过程:
上图中的每一时刻都要添加高斯噪声,后一时刻都是由前一刻增加噪声得到。
第一个重要公式
β要越来越大,论文中0.0001到0.002,从而α也就要越来越小。这个可以使用一个衰减函数在代码中完成。
上式表示(x_t)时刻的图像和(x_{t-1})时刻图像的关系。(\sqrt {α_t})和(\sqrt {1-α_t})都是权重,(z_1)是满足高斯分布的噪声。越往后,(α_t)越小,噪声所占的比例越来越大;而越靠前,加一点点噪声就有效果,而越往后得加噪越多才有效果。
现在我们知道后一时刻分布是由前一时刻加噪得到,但是整个序列的步骤非常多,如果一步步计算则会非常慢,这里使用的是一步计算得到的,也就是(x_t)时刻是由(x_0)时刻通过一个公式直接算出来的。
(\sqrt {\prod_{i=0}^tα_i}x_0+\sqrt {1-\prod_{i=0}^tα_i}z)