其实通常情况下,Autoencoder做数据压缩,性能并不怎么样。以图片压缩为例,想要训练一个能和JPEG性能相提并论的自编码器非常困难,并且要达到这个性能,你还必须要把图片的类型限定在很小的一个范围内(例如JPEG不怎么行的某类图片)。自编码器依赖于数据的特性使得它在面对真实数据的压缩上并不可行,你只能在指定类型的数据上获得还可以的效果,但谁知道未来会有啥新需求?在实际应用中用的很少,2012年人们发现在卷积神经网络中使用自编码器做逐层预训练可以训练深度网络,但很快人们发现良好的初始化策略在训练深度网络上要比费劲的逐层预训练有效得多,2014年出现的Batch Normalization技术使得更深的网络也可以被有效训练,到了2015年底,通过使用残差学习(ResNet)我们基本上可以训练任意深度的神经网络。
变分自编码器(Variational autoencoder,VAE)
VAE是更年轻也更有趣的一种Autoencoder,它为码字施加约束,使得编码器学习到输入数据的隐变量模型。在章末的Reference部分有VAE的ArXiv原文,有兴趣的同学可以去了解一下,不过论文这种东西面向对象毕竟不是所有人,使得有些同学读起来有点累,虽然VAE的文章很多,我在这里简单介绍一下我的理解。
VAE和GAN同是生成模型(Generative Models)。而所有的生成模型都是定义在一些潜藏高位空间数据点X的概率分布,而生成模型(Generative Models)就是在X附近产生一个差不多接近X的值。如果你想装逼的话,可以这么念:“一个向量在其高维空间内有一个潜变量,这个能够让我们依据概率密度函数(PDF)(他真的叫PDF)来定义”——总之就是很不像人话。GAN源于博弈论(Game Theory),是为了找到生成网络和对抗网络之间的纳什均衡(Nash Equilibrium),意思就是同一时间内每个参与人的策略是对其他参与人策略的最优反应,你们可以理解成一个聪明的好人和一个聪明的坏人单挑,他们最坏的就是“鱼死网破”,而纳什均衡是能让他们双方收益最高的一个反应或者说决策。比如说坏人好人打架,有一个和事佬说,“你们不要打架不要打架”毕竟如果实力差不多的话,两方打起来的结果哪一方都不会讨好,在这里,不打架似乎损失是0,而各种打之类的都会造成损失,因此此时不打架就是好的,就是双方收益最高,就是纳什均衡了。GAN在Training部分与VAE有比较大的区别,毕竟VAE源于贝叶斯推理,对数据的概率分布进行建模,然后从这个分布中获得新的数据。
在这里不给大家引入大量的数学公式和证明,就给大家说一个小故事,来理解。
我先举一个例子:首先让你猜一个东西(data),比如说我让你猜一个动物,这个动物有四只脚,会游泳——刷刷刷的啥河马啥鸭嘴兽都出来了。
在我们猜这个动物是啥玩意的过程呢,我们的想象的对象比如河马啦鸭嘴兽啦,就是一个Latent Variable(实在不知道该如何翻译。。。)
首先我为了猜到河马或者鸭嘴兽这个答案,我们首先要缩小范围,我们不能瞎猜猜什么飞机大炮的,而是动物,然后我们的大脑就去思考动物了,但是问题是,假如你不知道是动物呢?在VAE中,我们用贝叶斯推理常用到的变分推理(Variational Inference),VI的先进性比MCMC(Markov Chain Monte Carol)是好很多。用KL divergence来判定一个分布与另一个分布的差异性,也就是说,KL Divergence可以判定人与人的差异和人与狗的差异。在我们不知道那个结果是什么的时候,在这里,也就是我们不知道那是动物这个集合的时候,我们可以用植物、无机物这些集合去和我们的目标进行比较。在真实世界,这个比较的动作其实很快,电光火石之间对比完事儿,Cell的那篇著名的Paper告诉我们人脸识别只有200多个细胞,而我们的算法。。。别提了。。。也算是真实世界与数学的逻辑世界的一点小小的不同吧。这一点我可能解释的不太好,还请有关大佬能告知我的错误。通过这种方式我们能够。。又好又快的得到我们想要的集合?
对,VAE玩了一个“大概”,要不怎么我猜猜猜,猜到最后可以出犀牛和鸭嘴兽呢?但是这并没有影响VAE在一个高水平、高容量的model里面表现出色。
VAE当然难度与Autoencoder相比更大了许多,如果只用Tensorflow的话,洋洋洒洒写了一百来行(主要是自身水平有限),放在这里就有一种水文的感觉,有兴趣的童鞋可以来Github上看一看。