
3.7 优化函数
模型的优化对于传统机器学习和深度学习都是很重要的,尤其是深度学习,在训练过程中很可能需要解决一些更加困难的挑战。目前来说,流行且使用较广泛的优化算法有随机梯度下降优化算法、基于冲量优化算法、Adadelta优化算法和Adam优化算法等,下面对这几个优化算法进行介绍。
3.7.1 随机梯度下降优化算法
普通的随机梯度下降优化算法存在以下不足。
·很难选择一个适当的学习率。选择的学习率太小,收敛速度慢;选择的学习率太大,参数波动太大,无法进入效果相对最优的优化点。
·可以采用满足某些条件时调整学习率的方法,如迭代n次将学习率减半,或在训练集准确率到某值时调整学习率。这些人工的调整必须事先定义好,虽然有所改进但是依然无法适应数据集的特征。
·有相同的学习率适用于所有参数更新。如果数据稀疏而且特征又区别很大,可能训练到某个阶段时,部分参数需要采用较小的学习率来调整,另外一部分参数需要较大的学习率来调整。如果都采用相同的学习率,可能最终无法收敛比较好的结果。
·除了局部最小值,普通的随机梯度下降优化容易陷入“鞍点”,即梯度在所有方向上是零,但是这并不是一个最小点,甚至也不是一个局部最小点。“鞍点”示意图如图3-14所示,中间的亮点在两个方向上的梯度都是零,但却在一个“高坡”上。

图3-14 “鞍点”示意图
那么,怎么避免上述不足呢?可参照各种优化算法。
3.7.2 基于冲量优化算法
基于冲量优化算法(Monentum优化算法),其思想很简单,相当于在原来更新参数的基础上增加了“加速度”的概念。用山坡上的球作为例子,小球在往山谷的最低点滚动时,当前时间点的下降距离会积累前面时间点下降的距离,并在路上越来越快。参数的更新亦是如此:冲量在梯度连续指向同一个方向上时会增加,而在梯度方向变化时会减小。这样,就可以更快收敛,并可以减小震荡。
用公式表示为(γ为冲量更新值,一般取0.9)

从公式中可以看出,每次参数的更新会累积上一个时间点的冲量,所以在连续同一个方向更新梯度时,会加速收敛。
普通的随机梯度下降优化算法在最小区域周围的下降图如图3-15所示,基于冲量优化算法在最小区域周围的下降图如图3-16所示。从图3-15和图3-16中可以看出,普通的随机梯度下降优化算法始终是一个速度收敛,而基于冲量优化算法则会更加快速地收敛,并且在遇到一些局部最小点时,基于冲量优化算法会“冲”过这些比较小的“坑”,在某些程度上减少陷入局部最小优化点的概率。

图3-15 普通的随机梯度下降优化算法在最小区域周围的下降图

图3-16 基于冲量优化算法在最小区域周围的下降图
3.7.3 Adadelta优化算法
Adagrad算法存在三个问题:
·其学习率是单调递减的,训练后期学习率非常小;
·其需要手工设置一个全局的初始学习率;
·更新xt时,左右两边的单位不同。
Adadelta优化算法针对上述三个问题提出了更优的解决方案。
针对第一个问题,我们可以只使用Adagrad分母中的累计离当前时间点比较近的项,如下式:

式中,ρ为衰减系数,通过这个衰减系数,令每一个时刻的gt随时间按照ρ指数衰减,这样就相当于仅使用离当前时刻比较近的gt信息,从而使得还有很长时间时,参数仍然可以得到更新。
针对第三个问题,其实momentum系列的方法也有单位不统一的问题。momentum系列方法中:

类似的,在Adagrad中,用于更新Δx的单位也不是x的单位,而是1。
对于牛顿迭代法:

式中,H为Hessian矩阵,由于其计算量巨大,因而在实际中不常被使用。其单位为

注意,此处f 无单位。因而,牛顿迭代法的单位是正确的。
所以,可以模拟牛顿迭代法来得到正确的单位。注意到:

这里,在解决学习率单调递减问题的方案中,分母已经是的一个近似了。这里我们可以构造Δx的近似,来模拟得到H-1的近似,从而得到近似的牛顿迭代法。具体做法如下:

可以看到,如此一来Adagrad中分子部分需要人工设置的初始学习率也消失了,从而顺带解决了上述的第二个问题。
3.7.4 Adam优化算法
自适应矩估计(Adaptive Moment Estimation,Adam)是另一个计算各个参数的自适应学习率的方法。除了像 Adadelta 优化算法那样存储过去梯度平方vt的指数移动平均值,Adam优化算法还保留了过去梯度mt的指数平均值(这个点类似冲量):

mt和vt是对应梯度的一阶方矩(平均)和二阶力矩(偏方差),它们通过计算偏差来修正一阶方矩和二阶力矩,并减小这些偏差:

式中,β1的默认值为0.9,β2的默认值为0.999。接着,就像Adadelta优化算法那样,它们使用这些值来更新参数,由此得到Adam优化算法的更新规则:

式中,ε的默认值为10-8,η为自适应学习率。
前面介绍了几种优化算法,下面直接通过一个例子比较几种算法的效果。
【例3-14】下面使用TensorFlow来比较一下这些算法的效果。


运行程序,输出原始带噪声散点图,如图3-17所示,得到几种优化算法的比较效果如图3-18所示。

图3-17 带噪声散点图

图3-18 几种优化算法的比较效果
当设置batch_size=30时,得到如图3-19所示的效果图。

图3-19 batch_size=30时的几种优化算法比较效果
由图3-18和图3-19可以看出,Adam优化算法收敛速度最快,并且波动最小。