神经网络(下):反向传播算法的说明和深度学习

开启深度学习的大门

Posted by Xiaosheng on May 6, 2017

在上一篇《神经网络(中):多层前馈神经网络与反向传播算法》中,我们介绍了反向传播算法,知道了如何学习到神经网络中的权值。本文我们将进一步探讨反向传播算法中的一些细节问题,并且简略地介绍一下深度学习的概念。

1. 反向传播算法的说明

局部极小值

反向传播算法实现了一种可能的网络权值空间的梯度下降搜索,它迭代地减小训练样例的目标值和网络输出间的误差。因为对于多层网络,误差曲面可能含有多个不同的局部极小值,而梯度下降可能陷入这些局部极小值中的任何一个。因此,对于多层网络,反向传播算法仅能保证收敛到误差 $E$ 的某个局部极小值,不一定收敛到全局最小误差。

不过在实际应用中,局部极小值的问题没有想象的那么严重。考虑含有大量权值的网络,它对应着维数非常高的空间中的误差曲面(每个权值一维)。当梯度下降陷入相对某个权的局部极小值时,相对其他的权,这里未必是局部极小值。事实上,网络的权越多,误差曲面的维数越多,也就越可能为梯度下降提供更多的“逃逸路线”,让梯度下降离开相对该单个权值的局部极小值。

对局部极小值的第二种观点是需考虑随着训练中迭代次数的增加,网络权值的演化方式。如果把权值初始化为接近于 $0$ 的值,那么在早期的梯度下降步骤中,网络将表现为一个非常平滑的函数,近似为输入的线性函数(sigmoid 函数在权值靠近 $0$ 时接近线性)。仅当权值已经增长了一定时间之后,它们才会到达可以表示高度非线性网络函数的程度。可以预期在这个能表示更复杂函数的权空间区域存在更多的局部极小值,但希望当权到达这一点时它们已经足够靠近全局最小值,即便它是这个区域的局部极小值也是可接受的。

尽管有上面的评论,人们对神经网络表示的复杂误差曲面的梯度下降理解得还是不够,还不知道有何方法能确切地预测局部极小值什么时候会导致困难。

用来缓解局部极小值问题的一些常见的启发式规则包括:

  • 像之前增加冲量项中介绍的那样,为梯度更新法则加一个冲量项。冲量项有时可以带动梯度下降过程,冲过狭窄的局部极小值(然而,它也可以带动梯度下降过程冲过狭窄的全局最小值到其他局部极小值)。
  • 使用随机梯度下降而不是真正的梯度下降,随机梯度下降对于每个训练样例沿一个不同的误差曲面有效下降,它依靠这些梯度的平均来近似对于整个训练集合的梯度。这些不同的误差曲面通常有不同的局部极小值,这使得下降过程不太可能陷入任意一个局部极小值。
  • 使用同样的数据训练多个网络,但用不同的随机权值初始化每个网络。如果不同的训练产生不同的局部极小值,那么对分离的验证集性能最好的那个网络将被选中。或者保留所有网络,并且把它们当作一个网络“委员会”,它们的输出是每个网络输出的平均值(可能加权)。
  • 使用“模拟退火”(simulated annealing)技术,在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定。

此外,遗传算法(genetic algorithms)也常用来训练神经网络以更好地逼近全局最小。

前馈网络的表征能力

什么类型的函数可以使用前馈网络来表示呢?有三个一般性的结论:

  • 布尔函数:任何布尔函数可以被具有两层单元的网络准确表示,尽管在最坏的情况下所需隐藏单元的数量随着网络输入数量的增加成指数级增长。
  • 连续函数:每个有界的连续函数可以由一个两层的网络以任意小的误差逼近。这个理论适用于在隐藏层使用 sigmoid 单元、在输出层使用(非阈值的)线性单元的网络。所需的隐藏单元数量依赖于要逼近的函数。
  • 任意函数:任意函数可以被一个有三层单元的网络以任意精度逼近。输出层使用线性单元,两个隐藏层使用 sigmoid 单元,每一层所需要的单元数量一般不确定。

这些结论表明有限深度的前馈网络为反向传播算法提供了非常有表征力的假设空间。需要注意的是,梯度下降是从一个初始的权值开始的,因此搜索范围里的网络权值向量可能不包含所有的权向量。

泛化、过拟合和停止判据

在反向传播算法中,没有指定算法的终止条件。很明显,一种选择是继续训练直到对训练样例的误差 $E$ 降低到某个预先定义的阈值之下。事实上,这不是一个好的策略,因为反向传播算法容易过度拟合训练样例,降低对于其他未见过实例的泛化精度。

事实上,随着权值迭代次数的增加,训练误差持续降低,但是测试误差却可能上升。这是因为这些权值拟合了训练样例的”特异性“(idiosyncrasy),而这个”特异性“对于样例的一般分布没有代表性,神经网络中大量的权值参数为拟合这样的”特异性“提供了很大的自由度。

有两种策略常用来缓解反向传播网络的过拟合:

  • 第一种策略是”早停“(early stopping):将数据分为训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。
  • 第二种策略是”正则化“(regularization),其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和 $(1-\lambda)\sum_iw_i^2$,其中 $\lambda\in (0,1)$ 用于对误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。增加这一项后,训练过程将会偏好比较小的连接权和阈值,使网络输出更加”光滑“,从而对过拟合有所缓解。

2. 深度学习

理论上说,参数越多的模型复杂度越高、”容量“(capacity)越大,这意味着它能完成更复杂的学习任务。但一般情形下,复杂模型的训练效率低,易陷入过拟合,因此难以受到人们青睐。随着云计算、大数据时代的到来,计算能力的大幅提高可缓解训练低效性,训练数据的大幅增加则可降低过拟合风险,因此,以”深度学习“(deep learning)为代表的复杂模型开始受到人们的关注。

典型的深度学习模型就是很深层的神经网络。显然,对神经网络模型,提高容量的一个简单办法是增加隐层数目。隐层多了,相应的神经元连接权、阈值等参数就会更多。模型复杂度也可通过单纯增加隐层神经元的数目来实现,前面我们谈过,单隐层的多层前馈网络已具有很强大的学习能力;但从增加模型复杂度的角度来看,增加隐层的数目显然比增加隐层神经元的数目更有效,因为增加隐层数不仅增加了拥有激活函数的神经元数目,还增加了激活函数嵌套的层数。

权共享策略

反向传播算法需要不断地计算网络中所有功能神经元的误差,如果网络结构非常复杂有大量的权值,那么计算量还是非常巨大的。”权共享“(weight sharing)是一种节省训练开销的策略,即让一组神经元使用相同的连接权。这个策略在卷积神经网络(Convolutional Neural Network, CNN)中发挥了重要作用。

1

以 CNN 进行手写数字识别任务为例,如上图所示,网络输入是一个 32×32 的手写数字图像,输出是其识别结果,CNN 复合多个”卷积层“和”采样层“对输入信号进行加工,然后在连接层实现与输出目标之间的映射。

每个卷积层都包含多个特征映射(feature map),每个特征映射是一个由多个神经元构成的”平面“,通过一种卷积滤波器提取输入的一种特征。例如上图中第一个卷积层由 6 个特征映射构成,每个特征映射是一个 28×28 的神经元阵列,其中每个神经元负责从 5×5 的区域通过卷积滤波器提取局部特征。

采样层亦称”池化“(pooling)层,其作用是基于局部相关性原理进行亚采样(常采用”最大“或”平均“),从而在减少数据量的同时保留有用信息。例如上图中第一个采样层有 6 个 14×14 的特征映射,其中每个神经元与上一层中对应特征映射的 2×2 领域相连,并据此计算输出。

近来人们在使用 CNN 时常将 Sigmoid 激活函数替换为修正线性函数 这样的神经元称为 ReLU(Rectified Linear Unit)。

通过复合卷积层和采样层,CNN 将原始图像映射成 120 维特征向量,最后通过一个由 84 个神经元构成的连接层和输出层连接完成识别任务。CNN 可用反向传播算法进行训练,但在训练中,无论是卷积层还是采样层,其每一组神经元(即上图中每一个平面)都是用相同的连接权,从而大幅减少了需要训练的参数数目。

特征学习

我们可以从另一角度来理解深度学习,例如 CNN,其多隐层堆叠、每层对上一层的输出进行处理的机制,可看做是在对输入信号进行逐层加工,从而把初始的、与输出目标之间联系不太密切的输入表示,转化成与输出目标联系更密切的表示,使得原来仅基于最后一层输出映射难以完成的任务成为可能。换言之,通过多层处理,逐渐将初始的”低层“特征表示转化为”高层“特征表示后,用”简单模型“即可完成复杂的分类等学习任务。由此可将深度学习理解为进行”特征学习“(feature learning)或”表示学习“(representation learning)。

若将网络中前若干层处理都看作是在进行特征表示,只把最后一层处理看作是在进行”分类“,则分类使用的就是一个简单模型。

以往在机器学习用于现实任务时,描述样本的特征通常需由人类专家来设计,这称为”特征工程“(feature engineering)。众所周知,特征的好坏对泛化性能有至关重要的影响,人类专家设计出好特征也并非易事;特征学习则通过机器学习技术自身来产生好特征,这使机器学习向”全自动数据分析“有前进了一步。

参考

周志华《机器学习》
Tom M. Mitchell《机器学习》