1、自编码器(Auto encoders)
自编码器是一个3层或大于3层的神经网络,将输入表达式x编码为一个新的表达式y,然后再将y解码回x。这是一个非监督学习算法,使用反向传播算法来训练网络使输出等于输入。
图中,虚线蓝色框内就是一个自编码器模型,它由编码器(Encoder)和解码器(Decoder)两部分组成,本质上都是对输入信号做某种变换。编码器将输入信号x变换成编码信号y,而解码器将编码y转换成输出信号x‘。即
y = f(x)
x' = g(y) = g(f(x))
自编码器的目的是,让输出x’尽可能复现输入x。
如果f和g都是恒等映射,那不就恒有x'=x?不错,但是这样的变换没啥作用。因此,我们对中间信号y做一定的约束,这样,系统往往能学出很有趣的编码变换f和编码y。
对于自编码器,我们需要强调一点是,我们往往并不关心输出是啥(反正只是复现输入),我们关心的是中间层的编码,或者说是从输入到编码的映射。
可以这么理解,我们在强迫编码y和输入x不同的情况下,系统还能复原原始信号x,那么说明编码y已经承载了原始数据的所有信息,但以另一种形式表现。这就是特征提取,而且是主动学出来的。实际上,自动学习原始数据的特征表达也是神经网络和深度学习的核心目的之一。
2、自编码网络
自编码网络是非监督学习领域的一种,可以自动从无标注的数据中学习特征,是一种以重构输入信息为目标的神经网络,它可以给出比原始数据更好的特征描述,具有较强的特征学习能力,在深度学习中常用自编码网络生成的特征来取代原始数据,已取得更好效果。
自编码器通过隐藏层对输入进行压缩,并在输出层中解压缩,整个过程肯定会丢失信息,但是通过训练我们能够使丢失的信息尽量减少,最大化的保留其主要特征。
y = f(x) = s(wx+b)
x' = g(y) = s(w'y+b')
L(x,x') = L(x,g(f(x)))
其中L表示损失函数,结合数据的不同形式,可以是二次误差(squared error loss)或交叉熵误差(cross entropy loss)。
如果w' = wT,一般称为tied weights。
为了尽量学到有意义的表达,我们会给隐层加入一定的约束。从数据维度来看,常见以下两种情况:
n > p,即隐层维度小于输入数据维度。也就是说从x->y的变化是一种降维操作,网络试图以更小的维度去描述原始数据而尽量不损失数据信息。实际上,当每两层之间的变换均为线性,且监督训练的误差是二次型误差时,该网络等价于PCA。
n < p ,即隐层维度大于输入数据维度。这里有一种情况,我们约束y的表达尽量稀疏(有大量维度为0,未被激活),此时的编码器便是“稀疏自编码器”。从特征的角度来看,稀疏的表达意味着系统在尝试特征选择,找出大量维度中真正重要的若干维。
3、常见的自编码网络
稀疏自编码网络(Sparse Autoencoders)
稀疏自编码器的隐藏层神经元大于输入层神经元
图中隐藏中灰色的圆圈表示没有被激活的神经元。
当神经元的输出接近于1时认为其被激活,输出接近0时则认为被抑制,那么使得神经元大部分时间都是被抑制的现在被称为稀疏性抑制。
为了满足隐藏神经元的活跃度,将在优化目标中加入一个额外的惩罚因子,即正则项。
降噪自编码网络(Denoising Autoencoders)
因为输入和目标输出不相同,模型不能简单用一个映射来记忆训练数据,模型学习出一个重建函数,可将输入数据映射到一个低维的流行,如果流行能正确描述原始数据,便可降噪。
收缩自编码网络(Contractive Autoencoders)
降噪自编码网络利用重构函数抵抗输入的微扰;
收缩自编码网络使用特征抽取函数来抵抗输入的微扰
堆叠自编码网络(Stacked Autoencoders)
有一层以上隐层的autoencoders
深度自编码网络(Deep Autoencoders)
使用预先训练好的层堆栈而成的限制波兹曼机(Restricted Boltzmann machines)