常用优化器

优化器的作用是在深度学习反向传播的过程中,指引损失函数或者目标函数的各个参数往正确的方向更新合适的大小,使得更新后的参数让损失函数或目标函数的值不断逼近全局最小。

在微积分中,对多元函数的的参数$\theta$求偏导数,把求得的各个参数的导数以向量的形式写出来就是梯度。梯度是函数变化最快的方向。在求解机器学习算法的模型参数$\theta$时,即无约束问题时,梯度下降是最常采用的方法之一。

使用梯度下降进行优化,是几乎所有优化器的核心思想,有两个方面是这些优化器最关心的:

  • 优化方向
    优化方向决定了前进的方向是否正确,在优化器中反映为梯度或者动量
  • 步长
    步长决定了每一步迈多远,在优化器中反映为学习率

所有的优化器都会关注这两个方面,针对学习率和梯度分别衍生出自适应(Adaptive)学习率方法和动量(Momentum)方法。但是同时也有一些其它问题,如应该在哪里出发、路线错误如何处理等。

梯度下降

假设待优化的模型参数是$\theta$,目标函数为$J(\theta)$,学习率为$\eta$,迭代的轮次是$t$,那么损失函数$J(\theta)$关于当前参数$\theta$的梯度是:

梯度下降法参数更新:

梯度下降算法就是沿着梯度的方向,不断减小模型参数。不过标准的梯度下降有两个缺点:

  • 训练速度慢:每输入一个样本都需要更新一次参数,且每次迭代都要遍历所有样本,训练速度及其缓慢
  • 容易陷入局部最优解:由于是在有限视距内寻找下山方向,容易落入鞍点(梯度为0),使得模型参数不再继续更新

在真正使用时,主要是经过改进的以下三类方法,区别在于每次参数更新时计算的样本数量不同

  • 随机梯度下降法(SGD,Stochastic Gradient Descent)
  • 批量梯度下降法(BGD,Batch Gradient Descent)
  • 小批量梯度下降法(Mini-batch Gradient Descent)

SGD

SGD全称是Stochastic Gradient Descent,随机梯度下降法。

SGD每次更新参数时,仅仅选取一个样本$(x_i , y_i)$计算其梯度,参数更新公式为:

这里的样本是从所有样本中随机选取一个,由于每次参数更新只需要计算一个样本的梯度,训练速度很快。即使在样本量很大的情况下,可能只需要其中一部分样本就能迭代到最优解。由于每次迭代并不是都向着整体最优方向,这会导致梯度下降的波动非常大,容易从一个局部最优跳到另一个局部最优。

该优化器的优点:

  • 每次迭代只使用一个样本计算梯度,训练速度快,尤其是数据集很大的时候
  • 虽然包含一定随机性,但是大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛

该优化器的缺点:

  • 更新频繁,带有随机性,会造成损失函数在收敛过程中严重震荡
  • SGD不能单独克服局部最优解的问题
  • SGD在随机选择梯度的时候会引入噪声,使得权重更新的方向不一定正确

BGD

BGD全称是Batch Gradient Descent,批量梯度下降法。

BGD不像标准梯度下降一样对每个样本输入都进行参数更新,而是针对一批(或者一个子集)输入数据进行参数更新。假设所有的训练样本总数为$n$,样本为$\{ (x_1,y_1),…,(x_n,y_n) \}$,模型参数为$\theta$,在对第$i$个样本$(x_i,y_i)$上的损失函数关于参数的梯度为$\nabla _{\theta}J_i(\theta,x_i,y_i)$,则使用BGD更新参数的式子为:

该优化器的优点:

  • 由于每一步迭代都使用了训练集全部样本,每次下降的方向为总体的平均梯度,因此损失函数收敛过程比较稳定
  • 对凸函数可以收敛到全局最小值,对于非凸函数可以收敛到局部最小值

该优化器的缺点:

  • 每一步更新时需要利用训练集全部样本计算梯度,计算起来比较慢

MBGD

MBGD全称是Mini-batch Gradient Descent,小批量梯度下降法是对BGD和SGD的折中。对于含有$n$个训练样本的数据集,每次参数更新,选择一个大小为$m$的mini-batch数据样本计算其梯度$(m < n)$,其参数更新公式如下:

小批量梯度下降法既保证了训练的速度,又保证了最后收敛的准确率,目前的SGD默认是小批量梯度下降算法。

该优化器的优点:

  • 降低参数更新时的方差,收敛更稳定
  • 充分利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算

该优化器的缺点:

  • 不能保证很好的收敛性,学习率太小,收敛速度会很慢;学习率太大,损失函数会在极小值处不停震荡

Momentum

动量优化法引入了物理中的概念。动量$p=m*v$,当一个小球从山顶滚下,速度越来越快,动量越来越大,开始加速梯度下降;当跨越了山谷,滚到对面山坡时,速度减小,动量减小。带动量的小球不仅可以加速梯度,还可以借着积累的动量,冲过小的山坡,以避免落入局部最优点。

假设$m_t$表示$t$时刻的动量,$\gamma$表示动量因子,通常取0.9,在SGD的基础上增加动量,则参数更新公式为:

SGD只使用了当前步的梯度,随机性较大,momentum在SGD的基础上增加动量,将历次迭代的梯度按比例融合,可能更加稳定,更有利于跳出局部最优。

由于动量因子$\gamma$的经验值是0.9,这意味着下降方向主要是此前累积的下降方向,并略微偏向当前时刻的下降方向。在梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡;在梯度方向相同时,momentum可以加速参数更新,从而加速收敛。

该优化器的优点:

  • 前后梯度一致时能够加速收敛速度
  • 前后梯度不一致时能够抑制震荡,越过局部极小值

该优化器的缺点:

  • 增加了一个超参数

Adaptive

传统的优化算法要么将学习率设置为常数,要么根据训练次数调节学习率,往往忽视了学习率其它变化的可能性。
使用统一的全局学习率的缺点:

  • 对于某些参数,通过算法已经优化到极小值附近,但是另外一些参数仍然有很大梯度
  • 学习率太小,则梯度很大的参数收敛速度很慢;学习率太大,已经优化差不多的参数会出现不稳定的情况

自适应学习率优化算法对每个参与训练的参数设置不同的学习率,在学习过程中如果损失与某一指定参数的偏导符号相同,那么学习率应该增加;如果损失与该参数的偏导符号不同,那么学习率应该减小。
自适应学习率算法主要有:AdaGrad算法,RMSProp,Adam和AdaDelta等。

AdaGrad

AdaGrad的梯度更新公式是:

其中,$g_{t,i}$是$t$时刻参数$\theta _{i}$的梯度:$g_{t,i}=\nabla _{\theta _{t}}J(\theta _{t,i})$。相比于SGD,AdaGrad的更新公式中矫正学习率$\frac{\eta}{\sqrt{G_{t,ii}+\epsilon}}$随着$t$和$i$而变化,也就是所谓的自适应。
上式中的$G_t$是对角矩阵,$G_{t,ii}$是到$t$时刻为止参数$\theta _{i}$的累积梯度平方和,也就是“二阶动量”。参数更新越频繁,二阶动量就越大,学习率$\frac{\eta}{\sqrt{G_{t,ii}+\epsilon}}$就越小,所以在稀疏的数据场景下表现比较好。

该优化器的优点:

  • 自适应学习率,无需人工调节

该优化器的缺点:

  • 仍然手工设置一个全局学习率$\eta$,如果该超参数设置过大,会使得对梯度的调节太大
  • 中后期梯度累加的平方和会越来越大,使得参数更新量趋于0,迫使训练提前结束

Adadelta

Adadelta不累积全部历史梯度,而是只关注过去一段时间窗口的下降梯度,即Adadelta只累加固定大小的项,也不直接存储这些项,仅是近似计算对应的平均值(指数移动平均值),从而避免AdaGrad二阶动量持续累积、训练过程提前结束的问题。
更新公式:

与AdaGrad相比就是分母的$G$变成了过去的梯度平方的衰减平均值。$E$的计算如下:

这个分母相当于梯度的均方根(root mean squared,RMS),可以用RMS简写成

该优化器的优点:

  • 不依赖全局的学习率
  • 训练初中期,训练速度很快

该优化器的缺点:

  • 训练后期,反复在局部最小值附近抖动

RMSprop

RMSprop和Adadelta都是为了解决Adagrad学习率急剧下降问题的,但是RMSprop算法修改了AdaGrad的梯度平方和累加为指数加权的平均移动,旨在消除梯度下降中的摆动,使得其在非凸设定下效果更好。

更新方式如下:

其中$\alpha$是衰减率,常设为0.9。

该优化器的优点:

  • RMSprop是Adagrad的一种发展,Adadelta的变体,效果趋于两者之间
  • 适合处理非平稳目标,对于RNN效果很好

该优化器的缺点:

  • RMSProp依然依赖于全局学习率$\eta$

Momentum + Adaptive

Adam

Adam全称Adaptive Moment Estimation,该优化器结合了动量(momentum)和自适应学习率(AdaGrad),既存储了过去梯度的平方$v_t$的指数衰减平均值,也保持了过去梯度$m_t$的指数衰减平均值:

如果$m_t$和$v_t$被初始化为0,那么它们就会向0偏置,通过计算偏差校正之后的$m_t$和$v_t$来抵消这些偏差:

最终的更新公式为:

该优化器的优点:

  • Adam梯度经过偏置校正之后,每一次迭代学习率都有一个固定范围,使得参数比较平稳
  • 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
  • 为不同参数计算不同的自适应学习率
  • 也适用于大多数非凸优化问题

该优化器的缺点:

  • Adam使用动量的滑动平均,可能会随着训练数据变化而抖动剧烈,在线场景可能波动比较大

AdamW

L2正则和Weight Decay在Adam这种自适应学习率算法中并不等价,AdamW使用了严谨的Weight Decay(非L2正则),即权重衰减不参与动量计算,只是在最后更新的公式中使用。

【参考资料】

  1. 优化器-Optimizer
  2. 机器学习优化器Optimizer的总结
  3. 史上最全机器学习优化器Optimizer汇总
  4. An overview of gradient descent optimization algorithms