神经网络的优化器们

Contents

  1. 1. 优化方法总结比较
    1. 1.1. 一般的GD
      1. 1.1.1. SGD(mini-batch gradient descent)
      2. 1.1.2. BGD(batch gradient descent)
      3. 1.1.3. SGD(stochastic gradient descent)
    2. 1.2. 动量优化
      1. 1.2.1. momentum
      2. 1.2.2. NAG(Nesterov accelerated gradient)
    3. 1.3. 自适应学习率优化
      1. 1.3.1. AdaGrad算法
      2. 1.3.2. RMSProp(root mean square prop)算法
      3. 1.3.3. AdaDelta算法
      4. 1.3.4. Adam(adaptive moment estimation)算法
      5. 1.3.5. Adamax
      6. 1.3.6. Nadam
      7. 1.3.7. AdamW(2023新增)
    4. 1.4. 经验之谈(来自链接2)
    5. 1.5. 参考文献

这是一篇19年写过的一些优化器的总结,复习一下,然后添加了AdamW。

优化方法总结比较

常见优化算法的简单介绍和直观比较

2019/12/16

常见符号:

  1. 待更新的参数为,或单个参数
  2. 代价函数为
  3. 代价函数关于模型参数的偏导,即相关梯度为
  4. 学习率为
  5. 输入的数据为,输出的数据为
  6. 设每batch的样本总数为
  7. 为batch中随机选择的一个样本;
  8. 为历史积攒的动量。

一般的GD

SGD(mini-batch gradient descent)

使得模型可以沿着梯度方向更新参数,最小化代价函数

缺点:

  1. 训练速度慢,由于是mini-batch,每一步都要调整下一步的方向;
  2. 容易陷入局部最优解,由于是mini-batch,视距有限,比如梯度为零的情况;
  3. 难以选择合适的学习率。

BGD(batch gradient descent)

参数的更新和每一batch全部的样本有关,缓解了视距、学习慢的问题,但是学习率还是不好选择。

SGD(stochastic gradient descent)

从一个batch随机选择一个样本更新,但是期望仍是SGD一样;但是学习更快,引入噪声,其能够缓解视距的问题。

但是由于引入了噪声,使得正确的更新方向无法及时应用,使得更新方向不一定正确,局部最优解的问题无法解决。

动量优化

momentum

引入历史梯度信息动量来加速SGD。

一般取值为0.9。

随机梯度的方法引入了噪声;当前参数的更新会受以前所有参数更新的梯度的影响,就好像有惯性一样。

NAG(Nesterov accelerated gradient)

在原始momentum的基础上,权重首先减去过去的动量,就好像先知道了将要到达的位置,使用那个位置更新权重,有提前减速的意味。

自适应学习率优化

AdaGrad算法

独立适应所有模型参数的学习率,利用每个参数的梯度历史平均值来缩放每个参数。

其中,表示初时的学习率,一般为0.01,取值很小,为避免分母为零,一般取1e-8.

AdaGrad不需要人为调节学习率,但是其在迭代很多次之后学习率会趋于零。

RMSProp(root mean square prop)算法

是一种改进的AdaGrad,将梯度累计改为指数加权的移动平均。

其中,表示动力,一般取0.9,用以加权平均;而则表示前t次的梯度平方的均值。

RMSProp使用加权平均来避免学习率降低为零的问题,而且采用梯度平方,使得其在非凸的设定下效果更好。

AdaDelta算法

综合AdaGrad和RMSProp算法:

AdaDelta不需要指定一个默认的全局学习率;在中前期,训练速度快,但是在后期,模型会反复在局部最小值附近抖动(估计是后劲有点大)。

Adam(adaptive moment estimation)算法

本质是带有动量项的RMSProp,即momentum和RMSProp的结合。

使用梯度的一阶和二阶矩估计动态调整每个参数学习率,经过偏置校正,每次迭代学习率有个确定范围,使得参数比较平稳。

通过对一阶和二阶矩的修正,可以近似为对期望的无偏估计。

其优点:

  1. 结合了Adagrad善于处理稀疏梯度,即各参数单独按各自尺度更新,和RMSProp善于处理非平稳目标,即加权的移动平均,的特点;
  2. 对内存需求较小;
  3. 为不同的参数计算不同的自适应学习率;
  4. 适用于大多的非凸优化-适用于大数据集和高维空间。

Adamax

是Adam的一种变体,对学习率的上限提供了一个简单的范围,改变了

Nadam

带有类似Nesterov动量项的Adam,即NAG和RMSProp的结合:

$m_t=\mu_tm_{t-1}+(1-\mu_t)g_t$

$\hat{n}_t=\frac{n_t}{1-\nu^t}\hat{m}_t=(1-\mu_t)\hat{g}_t+\mu_{t+1}\hat{m}_t$

Nadam对学习率有了更强的约束,对梯度的更新也直接影响,一般在带动量的RMSProp、Adam的地方,Nadam可以得到更好的结果。

AdamW(2023新增)

名称中的W指的是Weight decay。

在神经网络训练时,常常会加一个L-2正则项,使得真实的loss函数如下:

其梯度为,对于经典的SGD算法而言,这等效于直接加一个权重衰减,也就是weight decay了,相当于:

这对于经典的SGD算法而言,时是等价的。

然而,在Adam中,并不是直接减去一个学习率梯度的,而是经过了缩放,也就是梯度越大的缩放系数越小,梯度更新越小;那么相应的L-2正则项更新也小,与正则化目的相反。

而直接用weight decay则不会有这个问题。

经验之谈(来自链接2)

  • 稀疏梯度,尽量使用自适应方法,采用默认值
  • SGD在好的初始化和学习率调度方案下,结果更可靠
  • 更快收敛,需要训练复杂网络是,推荐使用自适应方法
  • Adadelta、RMSProp、Adam比较相近,相似情况下表现相差无几
  • 在使用带动量的RMSProp、Adam的地方,使用Nadam一般可以取得更好的方法

参考文献

https://blog.csdn.net/weixin_40170902/article/details/80092628

https://zhuanlan.zhihu.com/p/22252270