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 加入 的变形
- 将 展开有
- 引入
- 参数更新