变分自编码器(VAE)

自编码器

自编码器,可以看作是一个图压缩器,输入是一张图片,将这张图片通过编码器得到这张图片的中间向量,然后再通过解码器还原出原来的图片,这个中间向量就可以看作是对图片的一个压缩。自编码器可以起到去噪的效果,将输入图片加上一定的噪声,然后输出图片还原出原图片,这样训练出来的自编码器可以起到去噪效果。自编码器还可以起到超分辨率重建的效果,输入是一张低分辨率的图片,输出是高分辨率的图片,这样训练出来的自编码器可以起到超分辨率重建的效果。自编码器的计算过程一般是这样的:

变分自编码器

变分自编码器的目的和自编码器是完全不同的。变分自编码器想要得到这样一个结果:随机生成一个隐向量,将这个隐向量送入解码器,可以得到一张有效图片。在使用自编码器时,我们可以根据图片编码得到图片的有效隐向量,但是当我们不从图片编码而是随机得到一个隐向量时,解码器往往会生成一张无意义的图片。分析原因我们会发现这是因为在使用自编码器时,我们认为图片与隐向量是一一对应的关系,这种一一对应关系造成了过拟合的现象,导致只要隐变量发生一点点变化,通过解码器得到的图像会发生较大变化。我们可以认为在隐向量的邻域范围内其对应的图片也应该是“相邻”的。如果我们从生成图片的角度,我们可以认为图片的生成过程的抽象是这样的:
(1) 从输入数据分布中随机选择一类数据$x$
(2) 从这类数据对应的隐向量分布$p(z|x)$中随机选择一个隐向量$z$
(3) 使用这个隐向量通过解码器$E[y\cdot p(y|z)]$得到这类数据的期望样本$\hat{y}$
第一步可以看作是从数据集中采样一张图片;第二步可以看作是每一张图片对应一个隐向量分布,即每一张图片的隐向量不是固定的而是一个分布,从这个分布中采样一个隐向量;第三步可以看作是从隐向量通过解码器还原出这张图片的期望形式。变分自编码器的目标有两个:
(1) 学习到的编码器可以计算出每张图片的隐向量分布$p(z|x)$
(2) 学习到的解码器可以求出每个隐向量对应的期望输出图片$E[y\cdot p(y|z)]$
因为我们将图片与隐向量的关系不再看作是一一对应,而是看作图片的隐向量满足一个分布,每一处隐向量都或多或少会受到一些样本的影响,所以解码器的输出图片有意义的概率也会相应增大。前面提到,编码器的目的是输出图片对应隐向量分布中的一个隐向量,所以同一张图片两次输入编码器应该可以得到不一样的结果,所以编码器需要引入一些不确定性。在变分自编码器的模型中,编码器会得到两个输出,一个是隐向量的均值$m$,另一个是隐向量的标准差$e^{\sigma}$,之所以使用$e^{\sigma}$表示标准差是为了保证标准差大于等于0。我们假设隐向量是满足均值为$m$标准差为$e^{\sigma}$的高斯分布,则可以这样采样得到一个隐向量:

其中$r$是从标准正态分布中采样得到的向量。注意到如果每一张图片隐向量分布的方差都很大,则解码器的输出会受到非常大的影响;而每一张图片隐向量分布的方差都很小,则解码器的输出又会容易过拟合,退化成自编码器。变分自编码器认为每一张图片隐向量分布的标准差都应该接近于1,最终的目标函数如下:

上面目标函数右边的第二项是要求每个样本的隐向量分布的标准差接近于1,第三项是正则项。为什么不直接要求$\sigma$接近0而是要求$e^{\sigma}-(1+\sigma)$接近0,首先这两者有着相同的极小值,其次后者有着更大的梯度学习起来更快,再者后者对非0值有着更大的惩罚,所用后者可以有更大概率使得$\sigma$等于0。

现在总结一下变分自编码器的前向过程:
(1) 输入x,通过编码器得到$m$,$\sigma$
(2) 从标准正态分布中采样$r$,得到隐向量$h=m+e^{\sigma}\cdot r$
(3) 将$h$输入解码器,得到输出$y$