Auto-Encoder 相比较于其他的有监督学习不同,本质上AE是一个无监督学习的过程。那么首先回顾和区分一下有监督学习和无监督学习的不同
这里将有监督学习大致可以分为回归和分类两个大类,虽然回归和分类两者不同,但是他们共同的一点就是数据集都是有类别和有具体的一个数值作为其真实值的,也就是标签。但是我们现实中遇到的问题会有很多未标记数据,那么这些为标记的数据如何来做有监督学习呢?
不得不说其实要么我们得花高昂的成本去对数据进行标记,要么我们就需要另寻他法了。话不多说其实最常见的方法了是采用unsupervised learning,也就是predictive learning无监督学习,这个理念我记得在上个世纪90年代就有提出。这里通过一个樱桃水果蛋糕来解释其各自的情况,樱桃那一小部分可以说就是我们纯粹的强化学习,虽然没有接触这里仅作了解;蛋糕外面裹得那一层巧克力味的脆皮就是我们的有监督学习啦,可以说还是相当大的一部分,但是相比起无监督学习(占据除了外壳外的所有内部蛋糕)也只是冰山一角了。那么问题来了既然无监督学习占据主导地位我们该如何去理解他呢,不得不提得的就是目前可能用的比较少但是作为曾经很辉煌的AutoEncoder来进行了解了。
![](https://i-blog.csdnimg.cn/blog_migrate/22a5b74079c2a67ca10f73432138ce8b.png)
首先了解一下他的实用意义,无监督学习解决的当时因为算力有限出现的维数爆炸的问题,那个时候针对224*224的图像数据进行训练,维度过高训练起来十分困难,急需降维技术实现问题在低维上的映射。在大量无监督数据集上我们需要对这些高维数据进行降维从而提取出一些我们想要的信息,类似于数据的分布这些我们需要的内容来帮助我们进一步的实现一些操作,诸如压缩、去噪声和超分辨率等等。
好的我们简单了解了AE的使用意义。那么AE构建的是一个什么样的网络了,他又是如何训练的呢?首先看下其网络流程,我们输入的是一张图片,那么同我们一个encoder将原本28*28的图像数据升维成1000然后在传递给一个latent code 俗称为颈层。在经过解码decoder升维成1000维,最后降维成原始的维度28*28,又回到图像数据的模样。这里可以使用降维,但是常用的一般是升维。这样可以看到其中关键的就是我们颈层,这里示例中是维度为2,我们将784的一个数据居然可以用2维就能表达,而且重构之后能与其输入相差无几。这就是我们模型训练优化的目标,使得输入与输出的误差,可以理解为矩阵化中每个像素块进行RMSE操作最后求均方根误差。使其最小从而输入与输出尽可能一致就是无监督的训练部目标,其逼近的label就是他自己本身。
问题来了怎么定义损失函数咧,这里针对二分类问题(分类问题也属于此)和回归问题给出了两个损失函数分辨是Cross-Entropy和误差平方和。
解决了两个大问题,那么我们比较下PCA和AE的区别。PCA是一种线性的降维方法注定有很多非线性问题他适应不了,而AE恰恰解决了他的短板,利用非线性映射的激活函数解决了这一困难。
PCA识别数值和AE数字识别我们可以看到,PCA勉强能看清,但是相当的模糊,其线性降维可以说丢失了很多特征,但是AE明显清晰度分辨率高很多。在比较下人脸,第二行是AE还可以勉强看到鼻子,眼睛这一些五官特征。但是PCA已经糊成一团根本难以分辨了,甚至透露出一丝丝恐怖气息,可以说在图像问题上PCA完败于AE。
现在为了验证这个降维的效果,我们常常会在2维或者三维上去看特征的分布以校验其降维对特征提取的效果,左边是PCA右边是AE很显然AE能够很好地区分这几类类别的特征,而PCA则很逊色。所以暂时的结论是我们要坚定地使用AE。
既然选择了AE那么我们就AE的变种进行阐述,首先Denosing Auto-Encoder,通过对原始输入图像的数据加入噪声,也就是一些杂乱无章的数字加到这个28*28的矩阵里面,可以看到因为有些不相关的数据输入第二层变得有些模糊不清楚了,但是输出的图像还是基本保留了原始输入4的一个特征,能够隐约看出来,效果有所衰减但是仍然具有辨识度,说明通过Encoder和Decoder我们的网络中低维颈层已经学习到了高维特征中的一些关键信息,从而最后通过decoder也能很好地反应原始信息。
第二个边总就是Dropout了,为啥引入他,我们可以看到Dropout的参数从0-1,从完全保留到全部去掉,loss其实一直在上升,但是准确率并不是与LOSS呈线性相关,可以看到0.5左右准确率相对较高,loss也上升的不多,网络参数也大幅度减少了,训练难度很好地降低了。所以一般会加一个Dropout层并设置参数值为0.5.
第三个变种Adversarial AutoEncoders这个结合GAN的AE,Gan我们会在后面一个章节回顾,这里暂且不表。其核心思想见下图:
我们AE的流程可以大致描述为输入X=> h =>X(hat)不会打符号见谅,那么这个中间层h的分布往往就是和第一张图差不多,很难实现属于均值为0标准差为σ2的标准正态分布。那么如何将这个分布变化成我们想要的分布咧,那就需要用到GAN。
既然暂且不表,那么我们讲讲另一个解决方案VAE,使得我们的q(z)分布能够逼近我们理想的分布p(z),那就是要回顾的KL散度,也就是kl divergence。其公式如上图,是一个对概率比值求对数然后积分的函数,放在损失函数里面与CrossEntropy交叉熵放在一起取最小值。那么具体的这个KL散度怎么计算呢我们看下图:
KL散度如上图所示可以说是红色和蓝色两台曲线所代表的分布相交的面积。具体计算公司如下图:
KL散度反映的是P(Z)和Q(Z)两个概率分布的不同程度,当KL散度为0时表明两个分布完全相同。所以 通过公式也可以理解为,q(x)能在多大成都山表达p(x)所包含的信息。KL越大那么表达的效果越差。通过不去上就得公式推导的我们可以看到KL散度得化简形式如下:
但是我们这样去定义KL散度得话就会有一个问题,因为众所周知,我们网络训练的过程是反向对损失函数对参数求导,计算梯度进行迭代,但是我们知道由q(z)到z再到p(z)这样一个过程,而z到p(z)其实是一个sample采样的过程,这个随机采样的过程明显是不可导的那如何解决呢,参考下图。
这里我们看到z分布如果我们表达成第三块的形式加入一个ε属于(0,1)之间的一个随机数,这样构建z的一个关于均值和标准差的函数,就可以对其进行求到了,虽然ε依然没办法求导,但是我们需要用的均值和标准差这两个需要优化从而逼近q分布的参数可以进行求导梯度下降也就可行那就OK
最后我们将思路整理一下,我们之前回顾的VAE其实也是一个神经网络,怎么去理解呢,中间的均值方差还有Z如果我们看做一个颈层那么和AE也就是一样的架构了,其也满足神经网络反向求导梯度下降的形式。后面是关于VAE与AE的性能比较的,可以毫无例外的发现,VAE是比AE要优秀的
不论是在fashion mnist上面还是手写数字和情感识别:
但是人外有人山外有山,为了引出下一章,比较下GAN和VAE
显然上图中GAN的能力要比VAE强太多了。