之前的章节,我们利用一个仅包含一层隐藏层的简单神经网络就在MNIST识别问题上获得了98%左右的准确率。我们于是本能会想到用更多的隐藏层,构建更复杂的神经网络将会为我们带来更好的结果。
就如同在进行图像模式识别的时候
,第一层的神经层可以学到边缘特征
,第二层的可以学到更复杂的图形特征,例如三角形,长方形等,第三层又会识别更加复杂的图案。
这样看来,多层的结构就会带来更强大的模型,进行更复杂的识别。
那么在这一章,就试着训练这样的神经网络来看看对结果有没有什么提升。不过我们发现,训练的过程将会出现问题,我们的神经网络的效果并没有什么提升。
为什么会出现这样的情况呢,这一章就是主要围绕着这个问题展开的。
我们将会发现,不同层的学习速率是不一样的。
例如,在后面的网络层训练正在顺利学习的时候,前面网络层的学习却卡住几乎不动了。
而且我们会发现这并不是偶然的,
而是在理论上由梯度下降算法导致的。随着我们对问题的深入了解,我们会发现相反的情况也是可能发生的,就是前面网络层学习正常,而后面网络层学习停止。
这虽然看上去都是坏消息,不过深入探索这些问题也是帮助我们设计更好的更高效的深度神经网络的训练方法。
一. 梯度消失问题
先回到之前的程序上,当我们选择一个隐藏层的时候得到准确率为96.48%。
接着增加一个隐藏层得到96.90%的结果。
看上去结果不错,毕竟提升了。接着再加上一个隐藏层,却只得到了96.57%的结果。这个结果虽说下降了没多少,
但是我们模型变复杂了,我们期望得到一个更好的结果,但是却事与愿违了。
这个结果看上去是奇怪的,而外的隐藏层理应使得模型可以处理更复杂的分类函数,不说结果提升多少,但是至少不能下降吧。为了搞清楚这期间到底是出了什么问题,我们回到两个隐藏层的情况,下面的图中,神经元上的柱形的长度表现的是其参数的更新速率,是当参数初始化完成后得到的结果:
大致看上去,
第二层整体的更新速率要比第一层的快很多
。但是由于权重的初始化也是随机的,我们很难判断这是不是一种巧合。
为了验证这是巧合还是事实,我们先定义,
然后可以看作是一个向量,其中每个分量表示第层中该神经元上参数更新的速率。
于是就可以将看作是层整体的学习速率,利用该速率的大小就可以比较不同层学习速率间的差别。
根据这些定义,我