http://deeplearning.stanford.edu/wiki/index.php/%E6%A0%88%E5%BC%8F%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE%97%E6%B3%95php
逐层贪婪训练法依次训练网络的每一层,进而预训练整个深度神经网络。在本节中,咱们将会学习如何将自编码器“栈化”到逐层贪婪训练法中,从而预训练(或者说初始化)深度神经网络的权重。算法
栈式自编码神经网络是一个由多层稀疏自编码器组成的神经网络,其前一层自编码器的输出做为其后一层自编码器的输入。对于一个 层栈式自编码神经网络,咱们沿用自编码器一章的各类符号,假定用
表示第
个自编码器对应的
参数,那么该栈式自编码神经网络的编码过程就是,按照从前向后的顺序执行每一层自编码器的编码步骤:网络
同理,栈式神经网络的解码过程就是,按照从后向前的顺序执行每一层自编码器的解码步骤:学习
其中, 是最深层隐藏单元的激活值,其包含了咱们感兴趣的信息,这个向量也是对输入值的更高阶的表示。编码
经过将 做为softmax分类器的输入特征,能够将栈式自编码神经网络中学到的特征用于分类问题。spa
一种比较好的获取栈式自编码神经网络参数的方法是采用逐层贪婪训练法进行训练。即先利用原始输入来训练网络的第一层,获得其参数 ;而后网络第一层将原始输入转化成为由隐藏单元激活值组成的向量(假设该向量为A),接着把A做为第二层的输入,继续训练获得第二层的参数
;最后,对后面的各层一样采用的策略,即将前层的输出做为下一层输入的方式依次训练。3d
对于上述训练方式,在训练每一层参数的时候,会固定其它各层参数保持不变。因此,若是想获得更好的结果,在上述预训练过程完成以后,能够经过反向传播算法同时调整全部层的参数以改善结果,这个过程通常被称做“微调(fine-tuning)”。code
实际上,使用逐层贪婪训练方法将参数训练到快要收敛时,应该使用微调。反之,若是直接在随机化的初始权重上使用微调,那么会获得很差的结果,由于参数会收敛到局部最优。blog
若是你只对以分类为目的的微调感兴趣,那么惯用的作法是丢掉栈式自编码网络的“解码”层,直接把最后一个隐藏层的 做为特征输入到softmax分类器进行分类,这样,分类器(softmax)的分类错误的梯度值就能够直接反向传播给编码层了。图片
让咱们来看个具体的例子,假设你想要训练一个包含两个隐含层的栈式自编码网络,用来进行MNIST手写数字分类(这将会是你的下一个练习)。 首先,你须要用原始输入 训练第一个自编码器,它可以学习获得原始输入的一阶特征表示
(以下图所示)。
接着,你须要把原始数据输入到上述训练好的稀疏自编码器中,对于每个输入,均可以获得它对应的一阶特征表示
。而后你再用这些一阶特征做为另外一个稀疏自编码器的输入,使用它们来学习二阶特征
。(以下图所示)
一样,再把一阶特征输入到刚训练好的第二层稀疏自编码器中,获得每一个 对应的二阶特征激活值
。接下来,你能够把这些二阶特征做为softmax分类器的输入,训练获得一个能将二阶特征映射到数字标签的模型。
以下图所示,最终,你能够将这三层结合起来构建一个包含两个隐藏层和一个最终softmax分类器层的栈式自编码网络,这个网络可以如你所愿地对MNIST数字进行分类。
栈式自编码神经网络具备强大的表达能力及深度神经网络的全部优势。
更进一步,它一般可以获取到输入的“层次型分组”或者“部分-总体分解”结构。为了弄清这一点,回顾一下,自编码器倾向于学习获得能更好地表示输入数据的特征。所以,栈式自编码神经网络的第一层会学习获得原始输入的一阶特征(好比图片里的边缘),第二层会学习获得二阶特征,该特征对应一阶特征里包含的一些模式(好比在构成轮廓或者角点时,什么样的边缘会共现)。栈式自编码神经网络的更高层还会学到更高阶的特征。
举个例子,若是网络的输入数据是图像,网络的第一层会学习如何去识别边,第二层通常会学习如何去组合边,从而构成轮廓、角等。更高层会学习如何去组合更形象且有意义的特征。例如,若是输入数据集包含人脸图像,更高层会学习如何识别或组合眼睛、鼻子、嘴等人脸器官。
张天雷(ztl2004@gmail.com), 邓亚峰(dengyafeng@gmail.com), 许利杰(csxulijie@gmail.com)