越难懂的东西是不是越有动力搞懂自编码器实现原理

  • 行业资讯
  • 2024年11月07日
  • 导语: 自编码器,就是一个程序,目的是让它的输出值等于输入值(trytocopyitsinputtoitsoutput),但是要经过函数变化生成一个中间值,使这个中间值不等于输入值。 自编码器 ,就是一个程序,目的是让它的输出值等于输入值(trytocopyitsinputtoitsoutput),但是要经过函数变化生成一个中间值,使这个中间值不等于输入值。例如x—y—z,x为输入值

越难懂的东西是不是越有动力搞懂自编码器实现原理

导语:自编码器,就是一个程序,目的是让它的输出值等于输入值(trytocopyitsinputtoitsoutput),但是要经过函数变化生成一个中间值,使这个中间值不等于输入值。

自编码器,就是一个程序,目的是让它的输出值等于输入值(trytocopyitsinputtoitsoutput),但是要经过函数变化生成一个中间值,使这个中间值不等于输入值。例如x—y—z,x为输入值,y为经过函数变换后的一个中间值,z是y经过变换后的一个输出值,自编码器的目的是为了让z等于x,同时y不等于x。这样的一个变换中,y就承载了x的全部信息,是极其有意义的。具体有怎样的意义?提高数据分类效率!

在深入了解自编码器实现原理之前,首先要明白一个前提,我们利用的是人工神经网络。那什么是神经网络呢?简单来讲,神经网络就是在对原始信号逐层地做非线性变换,如下图所示。

神经网络往往用于分类,其目的是去逼近从输入层x到输出层y的变换函数,h为多层的隐藏层。因此,我们会定义一个目标函数来衡量当前的输出和真实结果的差异,利用该函数去逐步调整(如梯度下降)系统的参数,以使得整个网络尽可能去拟合训练数据。如果有正则约束的话,还同时要求模型尽量简单(防止过拟合)。

自编码器实现原理

如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重。自然地,我们就得到了输入的几种不同表示(每一层代表一种表示),这些表示就是特征。自动编码器就是一种尽可能复现输入信号的神经网络。为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素,找到可以代表原信息的主要成分。

1)给定无标签数据,用无监督学习去学习特征:

如上图,我们将input输入一个encoder编码器,就会得到一个code,这个code也就是输入的一个表示,那么我们怎么知道这个code表示的就是input呢?我们加一个decoder,这时候decoder就会输出一个信息,那么如果输出的这个信息和一开始的输入信号input是很像的(理想情况下就是一样的),那很明显,我们就有理由相信这个code是可靠的。所以,我们就通过调整encoder和decoder的参数,使得输出和输入之间的误差(重构误差)最小,这时候我们就得到了输入input信号的第一个表示,就是编码code了。而此时,输出的就已经不重要了,因为code已经表示了input的所有信息,即code已经代表了input。

2)通过编码器产生特征,然后训练下一层。这样逐层训练:

然后第二层的训练就以第一层的code作为第二层的input,然后同样使其输出等于输入,获得code2表示code,第三层code3表示code2……直至多层。我们通常所说的深度学习之中,深度一词就源于此神经网络的多层,层数越多,学习深度也就越深。

3)有监督微调:

经过上面的方法,我们就可以得到很多层了。至于需要多少层(或者深度需要多少,这个目前本身就没有一个科学的评价方法)需要自己试验调了。每一层都会得到原始输入的不同的表达。当然了,我们觉得它是越抽象越好了,就像人的视觉系统一样。

到这里,这个自编码器还不能用来分类数据,因为它还没有学习如何去连结一个输入和一个类。它只是学会了如何去重构或者复现它的输入而已。或者说,它只是学习获得了一个可以良好代表输入的特征,这个特征可以最大程度上代表原输入信号。那么,为了实现分类,我们就可以在自编码器的最顶的编码层添加一个分类器(例如逻辑回归、SVM等),然后通过标准的多层神经网络的监督训练方法(梯度下降法)去训练。

也就是说,这时候,我们需要将最后层的特征code输入到最后的分类器,通过有标签样本,通过监督学习进行微调,这也分两种,一个是只调整分类器(黑色部分):

另一种:通过有标签样本,微调整个系统:(如果有足够多的数据,这个是最好的。即端对端学习)

一旦最后的监督训练完成,这个系统就可以用来分类了。神经网络的最顶层可以作为一个线性分类器,然后我们加上自编码器,做成性能更优的分类器去取代它。