Deep Learning 学习笔记(中):神经网络

如何训练深度网络

Posted by Zouxy on August 4, 2017

本文转载自《Deep Learning(深度学习)学习笔记整理系列》,作者 Zouxy。版权归原作者所有,部分内容有修改。

1. 深度学习与神经网络

深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。深度学习是无监督学习的一种。

深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

深度学习本身算是机器学习的一个分支,简单可以理解为人工神经网络的发展。大约二三十年前,人工神经网络曾经是机器学习领域特别火热的一个方向,但是后来确慢慢淡出了,原因包括以下几个方面:

  1. 比较容易过拟合,参数比较难调整,而且需要不少技巧。
  2. 训练速度比较慢,在层次比较少(小于等于 3)的情况下效果并不比其它方法更优;

所以中间有大约 20 多年的时间,神经网络被关注很少,这段时间基本上是 SVM 和 boosting 算法的天下。但是,一个痴心的老先生 Hinton,他坚持了下来,并最终(和其它人一起 Bengio、Yann.lecun 等)提成了一个实际可行的深度学习框架。

深度学习与传统的神经网络之间有相同的地方也有很多不同。

二者的相同在于深度学习采用了神经网络相似的分层结构,系统是由包括输入层、隐层(多层)、输出层组成的多层网络,只有相邻层节点之间有连接,同一层以及跨层节点之间相互无连接,每一层可以看作是一个 logistic regression 模型;这种分层结构,是比较接近人类大脑的结构的。

1

而为了克服神经网络训练中的问题,深度学习采用了与神经网络很不同的训练机制。传统神经网络中,采用的是误差反向传播的方式进行,简单来讲就是采用迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和标签之间的差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。而深度学习整体上是一个逐层初始化的训练机制。这样做的原因是因为,如果采用反向传播的机制,对于一个深度网络(7 层以上),残差传播到最前面的层已经变得太小,出现所谓的梯度消失(gradient diffusion)。这个问题我们接下来讨论。

2. Deep learning 的训练过程

2.1 传统神经网络的训练方法为什么不能用在深度神经网络

BP 算法作为传统训练多层网络的典型算法,实际上对仅含几层网络,该训练方法就已经很不理想。深度结构(涉及多个非线性处理单元层)非凸目标代价函数中普遍存在的局部最小是训练困难的主要来源。

BP算法存在的问题:

  • 梯度越来越稀疏:从顶层越往下,误差校正信号越来越小
  • 收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生)
  • 一般,我们只能用有标签的数据来训练:但大部分的数据是没标签的,而大脑可以从没有标签的的数据中学习

2.2 deep learning 训练过程

如果对所有层同时训练,时间复杂度会太高;如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合(因为深度网络的神经元和参数太多了)。

2006 年,hinton 提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优,使原始表示 $x$ 向上生成的高级表示 $r$ 和该高级表示 $r$ 向下生成的 $x’$ 尽可能一致。方法是:

  1. 首先逐层构建单层神经元,这样每次都是训练一个单层网络。
  2. 当所有层训练完后,Hinton 使用 wake-sleep 算法进行调优。

将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于“认知”,向下的权重用于“生成”。然后使用 Wake-Sleep 算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep 算法分为醒(wake)和睡(sleep)两个部分。

  • wake 阶段:认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想象的不一样,改变我的权重使得我想象的东西就是这样的”。
  • sleep 阶段:生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念”。

deep learning训练过程具体如下:

  1. 使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):

    采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程可以看作是特征学习过程)。

    具体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层),由于模型容量的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到第 $n-1$ 层后,将 $n-1$ 层的输出作为第 $n$ 层的输入,训练第 $n$ 层,由此分别得到各层的参数;

  2. 自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):

    基于第一步得到的各层参数进一步微调(fine-tune)整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于深度学习的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以深度学习效果好很大程度上归功于第一步的特征学习过程。

本文转载自《Deep Learning(深度学习)学习笔记整理系列》,作者 Zouxy。版权归原作者所有,部分内容有修改。