最近开始学习深度学习,希望记录下学习的过程
通过稀疏自编码器的方法,可以得到一组原始数据的特征值,但是这种特征属于比较浅的特征,由于它只使用了一层隐藏层计算得到的。
对于更为复杂的特征,需要引入深度学习,即含有多个隐藏层的神经网络。这种网络的两层之间存在非线性关系,因此可以用来表示更为复杂的函数关系。
注意,每一层的激活函数必须是非线性的,因为多层的线性函数组合起来本质上只能表达线性函数。
大脑皮层同样是分多层进行计算的。例如视觉图像在人脑中是分多个阶段进行处理的。
深度网络的困难:
1.数据获取很困难,如果用少量的数据去拟合一个复杂的模型,容易出现过拟合。
2.局部极值问题,使用监督学习方法对浅层网络进行训练通常能够得到合理的结果。但是用到深度网络的时候,效果并不好。
3.梯度弥散问题,梯度下降法在使用随机初始或权重的深度网络上效果不好的技术原因是:梯度会变得非常小。具体而言,当使用反向传播方法计算导数的时候,随着网络的深度的增加,反向传播的梯度(从输出层到网络的最初几层)的幅度值会急剧地减小。结果就造成了整体的损失函数相对于最初几层的权重的导数非常小。这样,当使用梯度下降法的时候,最初几层的权重变化非常缓慢,以至于它们不能够从样本中进行有效的学习。这种问题通常被称为“梯度的弥散”.
下面介绍一种效果较好的编码方法:栈式自编码算法
逐层贪婪训练法依次训练网络的每一层,先训练一个只含一个隐藏层的网络,仅当这层网络训练结束后才开始训练一个有两个隐藏层的网络。在每次训练中,我们把训练好的k-1层固定,然后增加第k层。注意,每一层的训练,可以是有监督的(例如将每一步的分类误差作为目标函数),但更常用的是无监督方式(例如自编码器)。这些各层单独训练所得到的的权重被用来初始或最终的深度神经网络的权重,然后对整个网络进行微调。
下面讨论展示自编码算法。
栈式自编码神经网络是一个由多层稀疏自编码器组成的神经网络,其前一层自编码器的输出作为后一层自编码器的输入。
例如:训练一个包含两个隐含层的栈式自编码器
首先输入原始数据,它学习得到一个原始输入的一阶特征表示
然后将原始数据输入到上述训练好的稀疏自编码器中,对于每一个输入,都可以得到特征表示。
将特征一作为输入数据,继续训练第二层稀疏自编码器。得到二阶特征。将二阶特征作为softmax分类器的输入,训练得到一个能将二姐特征映射到数字标签的模型。
最终,将三层结合起来,构建一个包含两个隐层和一个最终softmax分类器层的栈式自编码网络。
微调多层自编码方法
微调是深度学习中的常用策略,可以大幅度提升一个栈式自编码神经万罗的性能表现。微调是将栈式自编码神经网络看成一个整体
在每次迭代中,网络中的所有权重值都可以被优化。
使用反向传播算法进行微调。