Variational Auto-Encoder(变分自编码)
记录一下从苏大神那里学习到的笔记,自己做一个概要
https://spaces.ac.cn/archives/5253
首先,VAE是一个生成模型,这似乎和我们最初见到的Auto-Encoder的直观理解是矛盾的,Auto-Encoder是利用神经网络来做特征提取或者特征降维的,可以将encoder的结果用于后续的其他任务。但是,VAE是一个生成模型,它的目的希望拟合一个映射,从一个latent space,拟合真实的样本空间,它学习的是一个分布之间的变化。
如果用Z表示隐空间,我们希望decoder学系到一个分布的映射,即
假设Z服从正态分布,这样我们既可以从
中采样一个
,来生成对应的
,即对应了VAE是一个生成模型。
那么如何得到
呢?神经网络的时代,就是直接用神经网络来拟合,具体就是通过神经网络来计算出Z分布的均值和方差。
其实如果按照下图理解是很不科学的
我们通过一个encoder计算得到了一系列样本均值和方差,得到一个正态分布,然后从正态分布中采样,计算它decoder和原始样本的重构误差,这样合理吗?如何知道我们采样的
就是和原来的
是对应的呢?不能!!!那么这样优化显然是不合理的。
文中指出,我们其实并没有使用
是正态分布的假设,而是使用
是正态分布的假设(后验分布)。具体地,就是假设每一个样本都存在一个专属的正态分布
,注意这里所说的是后验分布,即对应的是已知
之后,Z的分布,不是每一个
都存才在一个分布。我们希望decoder能够从Z中采样,然后还原
,因为前面提到我们学习的
是专属
的分布,那么我们既可以确定这个分布采样出的
是要还原到
中去的。
如果按照下图的理解,就可以说通,每次采样得到的
可以放心和它自己专属的X求重构损失了。
有了上面的理解,我们再来看损失函数,首先真是样本
和生成样本
的MSE不予讨论。既然我们使用神经网络拟合了
分布的均值和方差,那么就需要引入这两个损失。来看看VAE是如何保证Z是一个正态分布的,那就是让它向标准正态分布看齐,根据定义
这里即假设了
服从正态分布,同时推到出$Z$服从正态分布的。然后,就可以放心地从
中采样来生成图像了。
如果要让生成的
服从正态分布,那么计算
的KL散度,可以的到
这样就得到了两部分的损失函数。
关于重采样:在生成模型中,我们需要从正态分布Z中采样做一个采样来恢复X,但是这个Z分布的均值和方差都是通过模型计算出来的,我们需要靠这个过程来反向优化均值和方差的模型,这个“采样操作”不可导,但是其结果可导。
那么从
中采样一个Z,相当于从
中采样一个
,然后令
,这样我们相当于从一个正态分布中进行采样,实际采样的操作就不参与到梯度下降的过程了,改为采样的结果直接参与,这样就可以进行训练了。
关于变分:因为这里应用了KL散度,所以其实在推导过程中用到了变分的思想。
总结:VAE使用神经网络来拟合latent space的均值和方差,给encoder部分计算均值的部分添加了噪声(方差部分),使decoder能够对噪声鲁棒,而KL散度则是给encoder添加一个正则项,是encoder能够拟合出的东西具有零均值,同时保持一定的方差,符合正态分布。encoder计算方差的部分,相当于动态地调节噪声强度,即当重构误差大于kl loss时,会减小噪声强度,使拟合变得容易(kl loss增加),当重构误差小与kl loss,就会增大噪声,使拟合困难(kl loss减小),这时decoder就得想办法提升生成能力。 重构过程是希望没有噪声的,而kl loss,希望有高斯噪声的(迫使Z符合高斯分布),这两者是相互对立的,这就和GAN中的生成对抗很相似了,只不过这个过程更加高明,是混合进行的。效果另说,但是模型很漂亮。