神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化(optimization)。

为了找到最优参数,我们将参数的梯度(导数)作为了线索。使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠近最优参数,这个过程称为随机梯度下降法(stochastic gradient descent),简称SGD。

用数学式可以将SGD写成如下的式(6.1)。

如式(6.1)所示,SGD是朝着梯度方向只前进一定距离的简单方法。

SGD的缺点

虽然SGD简单,并且容易实现,但是在解决某些问题时可能没有效率。

SGD的缺点是,如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。SGD低效的根本原因是,梯度的方向并没有指向最小值的方向。

为了改正SGD的缺点,下面我们将介绍Momentum、AdaGrad、Adam这3种方法来取代SGD。

Momentum方法

用数学式表示Momentum方法,如下所示。

这里新出现了一个变量v,对应物理上的速度。式(6.3)表示了物体在梯度方向上受力,在这个力的作用下,物体的速度增加这一物理法则。

现在尝试使用Momentum解决式(6.2)的最优化问题,如图6-5所示。

更新路径就像小球在碗中滚动一样。和SGD相比,我们发现“之”字形的“程度”减轻了。这是因为虽然x轴方向上受到的力非常小,但是一直在同一方向上受力,所以朝同一个方向会有一定的加速。虽然y轴方向上受到的力很大,但是因为交互地受到正方向和反方向的力,它们会互相抵消,所以y轴方向上的速度不稳定。

所以和SGD时的情形相比,可以更快地朝x轴方向靠近,减弱“之”字形的变动程度。

AdaGrad方法

在神经网络的学习中,学习率(数学式中记为η)的值很重要。学习率过小,会导致学习花费过多时间;反过来,学习率过大,则会导致学习发散而不能正确进行。

在关于学习率的有效技巧中,有一种被称为学习率衰减(learning rate decay)的方法,即随着学习的进行,使学习率逐渐减小。

AdaGrad会为参数的每个元素适当地调整学习率,与此同时进行学习(Ada来自英文单词Adaptive)下面用数学式表示AdaGrad的更新方法。

这里新出现了变量h,如式(6.5)所示,它保存了以前的所有梯度值的平方和。可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小。

AdaGrad会记录过去所有梯度的平方和。因此,学习越深入,更新的幅度就越小。实际上,如果无止境地学习,更新量就会变为0,完全不再更新。为了改善这个问题,可以使用RMSProp方法。RMSProp方法并不是将过去所有的梯度一视同仁地相加,而是逐渐地遗忘过去的梯度,在做加法运算时将新梯度的信息更多地反映出来。这种操作从专业上讲,称为“指数移动平均”,呈指数函数式地减小过去的梯度的尺度。

我们试着使用AdaGrad解决式(6.2)的最优化问题,结果如图6-6所示。

函数的取值高效地向着最小值移动。由于y轴方向上的梯度较大,因此刚开始变动较大,但是后面会根据这个较大的变动按比例进行调整,减小更新的步伐。

Adam算法

Adam 方法的基本思路是融合Momentum算法和AdaGrad算法,通过组合前面两个方法的优点,有望实现参数空间的高效搜索。此外,进行超参数的“偏置校正”也是Adam的特征。

我们试着使用Adam解决式(6.2)的最优化问题,结果如图6-7所示。

Adam会设置3个超参数。一个是学习率(论文中以α出现),另外两个是一次momentum系数β1 和二次momentum系数β2 。根据论文,标准的设定值是β1 为0.9,β2 为0.999。设置了这些值后,大多数情况下都能顺利运行。