本博客是参照UFLDL教程的Self-Taught Learning to Deep Networds写的,也感谢tornadomeet,看了他的博客也对自己的理解帮助不小。
一、从自我学习到深层网络
在自我学习(参考本博客Self-Taught Learning)中,我们用未标注的数据来学习自编码器,然后用学到的特征表示对已标注数据学习特征,然后用该特征作为softmax回归的输入学习分类模型,这两个训练过程是分开的,如果把两个模型组合在一起,可以得到最终的分类器模型:
这是一个大的神经网络模型,我们用预训练(利用稀疏自编码器训练第一层,利用softmax或logistic回归训练第二层)获得模型的参数,模型组合在一起后还可以用BP算法进行微调(fine-tuning),微调使得已标注数据也能对自编码器的W1进行修正。因为无监督的特征学习已经能“代表”输入数据了,有监督的softmax或logistic对特征较好地拟合分类器,一定程度上看整体已经得到较好的参数来学习特征并分类了,但是如果我们继续使用BP算法来微调这些模型参数,通常能够得到更好的局部最优值。多层神经网络模型是高度非凸的优化问题,对初始参数很敏感,参数不好很容易达到效果不好的局部最优值,如果先使用预训练来得到模型的初始参数,然后微调效果会比较好。
但教程也说到通常要有大量的已标注数据才对无监督的特征学习进行微调,这种情况下能显著提高分类器性能,如果无监督学习的未标注数据很多,但只有相对较少的已标注数据,使用微调的作用有限。
二、深度网络小概览
上面的网络还是比较“浅”的网络,只有一个输入层、隐藏层、输出层的三层神经网络,隐藏层是对输入层学习到的特征,是对输入层的非线性表达,如果有多层这样的隐藏层,那么这样的深度网络就具有更优异的表达能力(更复杂的函数关系)。但是要注意隐藏层是要非线性变换,比如sigmoid函数,如果是线性变换,那么多层隐藏层学习到的还是线性变换,其实也就相当于单层隐藏层。
深度网络的优点如下:
- 深度网络能够学习到比浅层网络更复杂的函数关系。如果用k层的网络学习到的函数关系(中间隐藏层的单元数目与输入是多项式关系时),用k-1层的网络很难表达这些函数关系,除非使用指数级别的隐藏单元数目。
- 深度网络学习到的是“部分-整体”的关系,一个隐藏层接着一个隐藏层地学习,学习过程是慢慢上升的,越前面的隐藏层学习到的是越小“部分”、细节的东西,越后面的隐藏层学习到的是越“整体”、大局的东西,而整体是由局部组成的。比如在图像识别中,第一层可以学习到用图像像素组合在一起来检测边缘(例如之前做过的稀疏自编码),第二层可以学习到将边缘组合起来检测更长的轮廓或简单“目标的部件”,更深的层次学习到的是更为复杂、高阶、向目标靠拢的特征。
- 大脑皮层也是分多层进行计算的,所以深度网络符合大脑学习的过程,具有一定的生物学理论基础。
- 训练深度网络需要大量的已标注数据,但通常标注数据获取到的成本都是比较大的,很难用足够多的样本来拟合深度网络复杂的函数关系,这样就很容易导致过拟合问题了。
- 深度网络相比浅层网络是一个高度的非凸优化问题,参数的搜索区域充斥着很多“坏”的局部极值,所以参数优化是一个难题。
- 梯度弥散问题,训练神经网络的算法是BP算法,但BP的参数梯度从输出层到网络的最初几层会急剧地减少,所以前面几层的参数梯度会很小,所以在用随机参数初始化时,最初几层的变化很缓慢,以致它们不能进行很好地学习。