autoencoders and variational autoencoders (变分自动编码器)
一、AE
https://medium.com/@jain.yasha/generative-models-an-overview-5079a1e9226a
https://zhuanlan.zhihu.com/p/58111908
1.在制作AE时,我们需要考虑的关键因素是,决定潜在空间向量的维度。因为空间的维数越小,计算速度越快,但生成的图像质量越差。
2.autoencoder=encoder+decoder
3.在人脸识别领域,经常将人脸图片编码成向量,这样便于进行相似度计算。这种图片到向量的转换过程就叫做编码,反过来也可以说这个向量是图片的一种表示(representation)。
4.Input经过Encoder后变成了编码h(x),h(x)经过Decoder又能再重新变回来。至于Encoder和Decoder的具体结构,可以使用全连接层,也可以使用其他经典,
或者自己构造也可以,总而言之,维度对的上的话,怎么弄都行。
5.https://github.com/udacity/deep-learning/blob/master/autoencoder/Convolutional_Autoencoder_Solution.ipynb
这个代码是一个简单的convolutional AE,数据集为MNIST,用了几个卷积和池化层,把28×28×1的图片压缩成了4×4×8,然后又用了与Encoder完全对称的Decoder将其还原
-
AutoEncoder的几个问题
在我看来,AutoEncoder是一个想法很独特,很有意思,但是用起来很烂的模型。这个锅有很大一部分要分给损失函数(通常使用MSE)上,还有一部分要分给神经网络。
(1)MSE和真实感知情况不符,差距很大。MSE小了不意味着图片看起来质量高,这是因为MSE认为每个像素点具有同样重要的作用,但是对于真实的感知来讲,图片的前景和边缘显然具有更大的权重。
MSE对偏离更大的值更敏感,因此更倾向于生产靠近整体平均值的值,导致的结果是Decoder出来的图很模糊。可以这样形象的理解,MSE很优柔寡断,既然下判断出错的代价很大,不如就和稀泥,平均值上下浮动,虽然loss不会降的很低,但也不会升的很离谱,这个现象在使用其他比MNIST复杂很多的数据集时会变的更加明显。
MSE让训练变的更为困难,比如MSE现在是9,但是有非常非常多的可能会让MSE等于9,有一个像素点差了3是9,有9个像素点差了1也是9,图像这么大,排列组合有很多很多的可能,这就导致待优化的loss函数很平坦,可能更新了很多个步长,但loss还是下不去。
(2)再说一下神经网络的问题,神经网络非常擅长归纳,但是几乎没有演绎的能力。MNIST上训练的AE无法运用到其他数据集上,想找到一个能够对所有图片都成功运行的AE需要构造一个足够强大的数据集,这个数据集是所有图片分布相同。否则AE只能在一部分图片上运行,想象一下,一个编码器只能作用在一部分图片上,这可太难受了。
总结:AE的设计思路很有意思,将一些经典结构理解成一个工作模块,通过不同模块之间的交互实现一些看起来很不错的功能,这个思路也是网络设计的另一个比较关键的想法。而且从这个角度上来看,GAN和AE就有了某种程度的相似。个人而言,我对AE是毫无好感的(不好用),但对AE的解读可以帮助我们更好的理解深度学习里的一些基本问题,比如表示,MSE等,还挺不错的。
二、VAE.
https://blog.csdn.net/dhaiuda/article/details/105626535?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=1
https://zhuanlan.zhihu.com/p/88750084
1.变分自编码器(VAE)是一个生成模型,我们希望它生成能够以假乱真,看起来像我们训练集的假样本。在MNIST数据的情况下,这些假样本将是的合成手写数字图像。
2.我们的VAE将为我们生成一个隐空间(latent space),从中可以对点进行采样。这些点中的任何一个都可以解码为看起来合理的手写数字图像。
3.如果你的目标只是重构输入,则标准自动编码器已经可以满足你的需求,但它不能作为生成模型使用,如果为解码器选择随机输入V’,V’可能与解码器以前见过的任何输入都很不一样(此处的输入不是原始输入图像,而是由编码器产生的对原始图像的编码,即隐空间),解码器不一定能产生合理的图像。
4.我们需要某种方式来确保解码器准备好将我们提供的所有输入解码为合理的数字图像。为此,我们需要预先定义解码器应该看到的输入分布。我们将使用标准正态分布来定义解码器将接收的输入分布。
5.现在我们需要一个编码器。在传统的自编码器中,编码器从数据中获取一个样本,并返回隐空间中的单个点,然后将其传递到解码器中。在变分自编码器中,编码器会在隐空间中产生概率分布!(注意这个区别)。它输出的隐分布是与隐空间维数相同的高斯分布。编码器产生这些高斯分布的参数(均值,方差)。事实上,vae是为每个样本构造专属的正态分布,然后采样来重构
6.更准确地讲,它们是假设了服从某些常见的分布(比如正态分布或均匀分布),然后希望训练一个模型 X=g(Z),这个模型能够将原来的概率分布映射到训练集的概率分布,也就是说,它们的目的都是进行分布之间的变换。