
9.1 梯度下降陷阱
接下来我们来看梯度下降过程中有可能导致的各种问题:
第一种问题,如图9-5所示,变化率可能一开始太陡峭了,导致调整的时候从左侧一下跳到了右侧,又从右侧一下跳到了左侧,然后又从左侧跳到了右侧,始终不能趋近底部,这是很可能发生的情况。即使有更多的训练数据,也无法达到变化率为0的点,这是比较糟糕的状况。尤其变化率非常陡峭时,一下从最左侧跳到最右侧,又一下从最右侧跳到最左侧……,结果是离底部越来越远,这是个悲剧,花了很大的精力且用了很多的数据,训练出来的偏差实质上越来越大,这不是我们希望看见的。对于这种情况,我们要怎么处理?这是神经元网络必须解决的最基本的问题。按照我们最原始的算法,要调整的时候可以想到很多办法,如果梯度步伐太大,容易出一些问题,将步伐调小一点就行了。例如,在每次调整权重的时候要减去变化率,那么将变化率乘以一个系数α,系数α为0~1,就可以有效解决面临的问题。
图9-6是优化以后的状态。我们将变化率乘以一个系数α,α一般设置为0.1、0.01等,就能有效避免步伐过大的问题。首先计算当前状态的变化率,然后使用当前的权重减去变化率与系数α的乘积,x=x–(α*slope),一直训练到变化率等于0。
在梯度下降过程中,第一种问题是步伐过大,步伐不合适会导致圆点永远不能到达底部。第二种问题是局部最小值,图9-6所示的梯度下降过程非常单纯,只有一个最低点,但生产环境中数据的维度可能很多,在进行收敛的时候可能会到达一个局部的最小值,如图9-7所示,这种情况处理起来较麻烦。

图9-5 变化率陡峭

图9-6 用变化率乘以系数来优化
如图9-8所示,我们要克服将局部的最低点误认为是全局的最低点问题。将收敛的空间划分成5个部分,找出每个部分的局部最低点,也就是变化率为0的状态。找到5个部分中每一个变化率为0的状态以后,进行比较,找到全局最低点,这是比较朴素的思路。

图9-7 局部最小值

图9-8 多个局部最低点
第三个问题,在梯度下降过程中,步伐可能太小,步伐如果太小,就像人走路,每步本来可以移动50cm,但是如果担心下一步掉到悬崖,就小心翼翼,每步只移动1mm,这就太夸张了。图9-9描述了这种情况,这也是很不好的一种情况,因为资源是很昂贵的,计算时间特别长,训练结果又不太好,步伐太大时在更新权重的时候,是每次乘以一个系数α(α为0~1),这里做优化时也要乘以一个α,不过这里的α值不是0~1,而是要大于1。

图9-9 步伐过小的问题
以上是梯度下降可能出现问题的三种情况,我们提出相应的解决方案,一般是由算法来支撑解决。