购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4.5 最优化方法

最优化方法是深度学习中一个非常重要的话题,最常见的情形是利用目标函数的导数通过多次迭代来求解无约束最优化问题。

深度学习模型的优化是一个非凸优化问题,这与凸优化问题有很大的不同。对于凸优化问题来说,任何局部最优解即全局最优解,用贪婪算法或梯度下降法都能收敛到全局最优解。而非凸优化问题则可能存在无数个局部最优点,有极大值也有极小值。

除了极大值、极小值,还有一类值,即“鞍点”。简单来说,它就是在某一些方向梯度下降,而在另一些方向梯度上升的点,该点附近的曲面形状似马鞍。对于深度学习模型的优化来说,鞍点比局部极大值点或极小值点带来的问题更加严重。

目前常用的优化方法分为一阶和二阶两类,一阶方法只需要求解一阶导数,包括随机梯度下降(Stochastic Gradient Descent,SGD)法及其各类变种,二阶方法则需要求解二阶导数,包括牛顿法等。

随机梯度下降法有许多变种,如Adam、RMSProp、AdaGrad等,这些算法都需要预先设置学习率。学习率决定了在一个小批量(Mini-batch)中权重在梯度方向的移动步长,能够直接影响模型收敛到局部最小值(也就是达到最好的精度)的速度。如果学习率很低,训练过程会更加细致,结果会更加可靠,但优化过程会耗费较长的时间,因为逼近损失函数最小值的每个步长都很小。如果学习率过高,训练可能发散,不会收敛,权重的改变量可能非常大,使得优化在最小值附近振荡。

一般来说,学习率太小,网络很可能会陷入局部最优。学习率越大,神经网络的学习速度越快,但如果太大,超过了极值,损失就会停止下降,在某一位置反复振荡。也就是说,当选择了一个合适的学习率时,不仅可以在更短的时间内训练好模型,还可以节省各种损耗。一般而言,当已经设定好学习率并训练模型时,只有让学习率随时间的推移下降,模型才能最终收敛。

下面详细介绍深度学习中常用的优化方法。

1.梯度下降法与动量法

梯度下降法是最广泛使用的优化方法,其在目标函数是凸函数时可以得到全局解。

我们知道,对于一个函数 f x ),记 f′ x )为它的梯度,对于足够小的 ε f x-ε sign( f′ x )))是小于 f x )的,所以从 x 的反方向进行搜索,就能够减小 f x ),而且这个方向还是减小 f(x) 最快的方向,这就是所谓的梯度下降法,也被称为最速下降法。

梯度下降法在越接近目标值的时候,需要的步长越小,前进越慢,否则就会越过最优点。通常在机器学习优化任务中,有两种常用的梯度下降法,分别是随机梯度下降法和批量梯度下降法。

所谓批量梯度下降(Batch Gradient Descent)法,就是使用所有的训练样本计算梯度,用这种方法,梯度计算稳定,可以求得全局最优解,但计算非常慢,往往因为资源问题不可能实现。

所谓随机梯度下降(Stochastic Gradient Descent)法,就是每次只取一个样本进行梯度的计算,它的问题是梯度计算相对不稳定,容易振荡,不过整体上还是趋近于全局最优解的,所以最终的结果往往是在全局最优解附近。

通常我们训练时会进行折中,即从训练集中取一部分样本进行迭代,这就是常说的Mini-batch训练。

为解决随机梯度下降有时会很慢的问题,Polyak在1964年提出了动量项(Momentum)方法(动量法)。为了表示动量,首先引入一个新的变量 v (velocity), v 是之前梯度计算量的累加,但每回合都有一定的衰减。

动量法的思想是将历史步长更新向量的一个分量 γ 增加到当前的更新向量中,其具体实现为在每次迭代过程中,计算梯度和误差,更新速度 v 和参数 θ

式中, v n 表示之前所有步骤累积的动量和。加入动量项更新与普通SGD法效果对比如图2.15所示。图中幅值较小较集中的前进线为SGD法+动量法的计算方向,幅值较大的为普通SGD法的计算方向。可以看到,幅值较大,前进线大幅度徘徊着向最低点前进,优化效率较低,过程振荡。对SGD法+动量法,由于动量积攒了历史的梯度,如果前一时刻的梯度与当前的梯度方向几乎相反,则因为受前一时刻的影响,当前时刻的梯度幅度会减小;反之,则会加强。

图2.15 基于动量项的SGD示意

形象地看,动量法就像我们从山上推下一个球,球在滚落过程中累积动量,速度越来越快,直到达到终极速度。在梯度更新过程中,可对在梯度点处具有相同方向的维度,增大其动量项,而对在梯度点处改变方向的维度,减小其动量项。

Nesterov加速梯度下降(Nesterov Accelerated Gradient,NAG)法是动量法的一个变种,同样是一阶优化算法,但在梯度评估方面有所不同。NAG法能给动量项一个预知的能力,并且收敛速度更快。其更新算法如下。

我们利用动量项 γv n 更新参数 θ ,通过计算( θ-γv n )得到参数未来位置的一个近似值。计算关于参数未来的近似位置的梯度,而不是计算关于当前参数 θ 的梯度,这样NAG法可以高效求解。

我们可以将其做以下形象的描述:当球滚落时,其一般是盲目地沿着某个斜率方向下落的,结果并不一定令人满意,于是我们希望有一个较为智能的球,它能够自己判断下落的方向,这样在途中遇到斜率上升时,能够减速。该思想对于提升RNN性能有重要的意义。

2.AdaGrad、Adadelta与RMSProp算法

上述方法中对所有参数使用了同一个更新速率,但同一个更新速率不一定适合所有参数。例如,有的参数可能已经到了仅需要微调的阶段,而有些参数由于对应样本少等原因,还需要较大幅度的调整。AdaGrad算法 [21] 就是针对这一问题提出的,其自适应地为各个参数分配不同的学习率。其计算公式如下。

式中, g t 是当前的梯度; η 是初始学习率; 是一个比较小的数,用来保证分母非0。该算法的含义是,对于每个参数,随着其更新的总距离增大,其学习率也随之变慢。前期 g t 较小时,正则化项较大,能够放大梯度;后期 g t 较大时,正则化项较小,能够约束梯度,因此,该算法适合处理稀疏梯度。但该算法同样依赖人工设置一个全局学习率 η ,如果这个值设置过大,会使正则化项过于敏感,对梯度的调节过大。

AdaGrad算法存在以下问题:其学习率是单调递减的,训练后期学习率非常小,而且其需要手工设置一个全局的初始学习率。

Adadelta算法 [22] 的出现可较好地解决上述问题,其本质是对AdaGrad算法的扩展,其同样是对学习率进行自适应约束,但在计算时进行了简化。AdaGrad算法会累加之前所有的梯度平方,而Adadelta算法只累加固定大小的项,并且仅存储这些项近似计算对应的平均值。其计算公式如下。

Adadelta算法不依赖全局学习率,训练初、中期加速效果理想,训练后期反复在局部最小值附近抖动。

RMSProp算法可以算作Adadelta算法的一个特例,依然依赖全局学习率。RMSProp算法效果位于AdaGrad算法和Adadelta算法之间,适合处理非平稳目标,适用于RNN的优化。

3.Adam算法及其改进

Adam(Adaptive Moment Estimation)算法 [23] 本质上是带有动量项的RMSProp算法,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。其计算公式如下。

式中, m t n t 分别是对梯度的一阶矩估计和二阶矩估计,即对期望 E | g t |、 的估计; 是对 m t n t 的校正,近似为对期望的无偏估计。由计算公式可知,Adam算法可以根据梯度进行动态调整,从而对学习率有动态约束。

Adam算法的优点主要在于经过偏置校正后,每次迭代学习率都有一个确定的范围,使得参数比较平稳,对内存需求较小,适用于大多数非凸优化问题,尤其适合处理大数据集和高维空间问题。

Adamax算法是Adam算法的一种变形,其对学习率的上限提供了一个更简单的范围,计算公式如下。

Nadam算法类似于带有Nesterov动量项的Adam算法,对学习率有更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在使用带动量项的RMSProp算法或Adam算法的情况下,大多可以使用Nadam算法取得更好的效果。

研究人员观察到,Adam系列方法之所以不能收敛到好的结果,是因为在优化算法中广泛使用的指数衰减方法会使得梯度的记忆时间太短。

在深度学习中,每个Mini-batch对结果的优化贡献是不一样的,有的产生的梯度特别有效,但也一视同仁地被时间所遗忘。基于此,ICLR2018最佳论文提出了AMSgrad算法 [24] ,它使用过去平方梯度的最大值来更新参数。

相关研究表明,Adam算法的二阶矩平滑系数 ν 对收敛结果有影响,如果较低,动量衰减太大,模型容易不收敛;反之,模型的收敛容易不稳定。Adafactor [25] 通过给 μ v 本身增加一个衰减来缓解该问题。

Adam算法迭代到后期时,学习率不稳定,可能过大或过小,Adebound算法 [26] 通过设置上下界来约束学习率的大小,从而对Adam算法进行改进。

4.牛顿法、拟牛顿法与共轭梯度法

梯度下降法是基于一阶梯度进行优化的方法,牛顿法则是基于二阶梯度进行优化的方法,通常有更快的收敛速度。牛顿法利用局部一阶和二阶的偏导信息,推测整个函数的形状,进而求得近似函数的全局最小值,然后将当前最小值设定成近似函数的最小值。

不过牛顿法作为一种迭代算法,每步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。当Hesseian矩阵不可逆时,牛顿法不可计算;当问题规模比较大时,牛顿法计算量很大。

拟牛顿法用正定矩阵来近似Hessian矩阵的逆,不需要二阶导数的信息,简化了运算的复杂度。

共轭梯度法是一种通过迭代下降的共轭方向来避免Hessian矩阵求逆计算的方法,感兴趣的读者可以自行阅读更多的资料。 vPEtyrR0WeKHCne+hDSVzBfwTgqG0LX7yEBy+kC7CshpwfkkxgLQtIGW1HWKHjaX

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开