【Interview】Optimization

Reference

https://zhuanlan.zhihu.com/p/32626442
https://zhuanlan.zhihu.com/p/21360434?refer=intelligentunit

深度学习优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 这样的发展历程

推荐的两个更新方法是SGD+Nesterov动量方法,或者Adam方法


  • 不同算法在损失面等高线图中的学习过程

    • Adagrad、Adadelta、RMSprop 从最开始就找到了正确的方向并快速收敛
    • SGD 找到了正确方向但收敛速度很慢
    • SGD-M 和 NAG 最初偏离航道,最终纠正到正确方向
      SGD-M 偏离的惯性比 NAG 更大。
  • 不同算法在鞍点处的表现

    • Adagrad、RMSprop、Adadelta 都很快找到了正确的方向并快速收敛
    • SGD、SGD-M、NAG 都受到了鞍点的严重影响
      SGD-M、NAG 最终还是逃离了鞍点
      SGD 没有逃离靶点

Gradient Descent

  • 学习率

  • 梯度
  • 根据历史梯度计算的一阶动量
  • 根据历史梯度计算的二阶动量
  • 模型参数

Vanilla SGD

朴素 SGD (Stochastic Gradient Descent) 最为简单,没有动量的概念

SGD 的缺点在于收敛速度慢,可能在鞍点处震荡,停留在一个局部最优点


SGDM (SGD with Momentum)

解决SGD遇到沟壑时陷入震荡问题,引入动量momentum

SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum ,加速 SGD 在正确方向的下降并抑制震荡。

SGD-M 在原步长之上,增加了与上一时刻步长相关的 <img src="https://leanote.com/api/file/getImage?fileId=5dc0da82ab6441425d000103) ,

  • γ γ γ 通常取 0.9 [0.5,0.9,0.95,0.99]
    和学习率随着时间退火类似,动量随时间变化的设置有时能略微改善最优化的效果,其中动量在学习过程的后阶段会上升。一个典型的设置是刚开始将动量设为0.5而在后面的多个周期(epoch)中慢慢提升到0.99。

好处

  • 参数更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。

  • 使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛减小震荡的效果。


NAG (Nesterov Accelerated Gradient">

SGD-M 基础上改进梯度计算公式(利用未来位置计算)

算法能够在目标函数有增高趋势之前,减缓更新速率

SGD-M 的基础上进一步改进了步骤 1 中的梯度计算公式:

  • SGD-M 的步长计算了当前梯度(短蓝向量)和动量项 (长蓝向量)
  • 既然已经利用了动量项来更新 ,那不妨先计算出下一时刻 θ θ θ 的近似位置 (棕向量)
  • 并根据该未来位置 计算梯度(红向量)
  • 然后使用和 SGD-M 中相同的方式计算步长(绿向量)
    这种计算梯度的方式可以使算法更好的「预测未来」,提前调整更新速率。
  • 既然我们知道动量将会把我们带到绿色箭头指向的点,我们就不要在原点(红色点)那里计算梯度了
  • 使用Nesterov动量,我们就在这个“lookahead”的地方计算梯度。

好处

  • 在理论上对于凸函数它能得到更好的收敛,在实践中也确实比标准动量表现更好一些

Adagrad

改进 SGD、SGD-M 和 NAG ,使不同参数的更新频率不同,引入了二阶动量

SGD、SGD-M 和 NAG 均是以相同的学习率去更新 的各个分量

而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别。

Adagrad 可以做到不同参数的更新频率不同 ,引入了二阶动量:

  • 是对角矩阵
  • 二阶动量 为 参数 i i i初始时刻到时刻 t t t梯度平方和

可以这样理解:

  • 学习率等效为
  • 对于此前频繁更新过的参数,其二阶动量的对应分量较大,学习率就较小
  • 这一方法在稀疏数据的场景下表现很好

缺点:

  • 二阶动量持续累积导致学习率逐渐为0的问题

Adadelta

采用指数移动平均公式计算,解決Adagrad 中二阶动量持续累积导致学习率逐渐为0的问题

不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度


RMSprop

采用指数移动平均公式计算,解決Adagrad 中二阶动量持续累积导致学习率逐渐为0的问题

在 Adagrad 中,

  • 是单调递增的
    ( 二阶动量 参数第 i i i 维从初始时刻到时刻 t t t 的梯度平方和 )
  • 使得学习率逐渐递减至 0,可能导致训练过程提前结束
    (学习率等效为 )

为了改进这一缺点,可以考虑在计算二阶动量时不累积全部历史梯度,而只关注最近某一时间窗口内的下降梯度

  • 采用指数移动平均公式计算,这样即可避免二阶动量持续累积的问题

  • 和 SGD-M 中的参数类似,通常取 0.9 左右


Adam

SGD-M 和 RMSprop 的结合,把一阶动量和二阶动量都用起来(Adaptive + SGD-M) ,一阶二阶动量用指数移动平均计算,并做偏置校正

  • SGD-M

  • 和 RMSprop 对二阶动量使用指数移动平均类似,Adam 中对一阶动量也是用指数移动平均计算

优化算法里最常见的两个超参数 就都在这里了,前者控制一阶动量,后者控制二阶动量。

  • 注意到,在迭代初始阶段, 有一个向初值的偏移(过多的偏向了 0)
    因此,可以对一阶和二阶动量做偏置校正 (bias correction")

NAdam

在 Adam 之上融合了 NAG 的思想

  • NAG

核心在于,计算梯度时使用了「未来位置」

NAdam

  • 提出了一种 公式变形的思路 ,大意可以这样理解:

    • 只要能在梯度计算中考虑到「未来因素」,即能达到 Nesterov 的效果;既然如此,那么在计算梯度时,可以仍然使用原始公式
    • 但在前一次迭代计算 时,就使用了未来时刻的动量
      那么理论上所达到的效果是类似的
  • 公式修改为

    理论上

    • 下一刻的动量为

    • 在假定连续两次的梯度变化不大的情况下,即

    • 此时,即可用 近似表示未来动量加入到 的迭代式中。

  • 在 Adam 加入 的变形

    • 展开有
    • 引入
    • 参数更新

猜你喜欢

转载自blog.csdn.net/qq_31622015/article/details/102963761