优化算法的目的:1. 跳出局部极值点或鞍点,寻找全局最小值;2.使训练过程更加稳定,更加容易收敛。
优化算法的改进无非两方面:1.方向--加动量,2.学习速率--加衰减
1.SGD
2.[Momentum](https://zh.d2l.ai/chapter_optimization/momentum.html)
常取
0.9
. 从学习率的角度理解动量法:指数加权移动平均,也可以理解为滑动窗口。在动量法中,自变量在各个方向上的移动幅度不仅取决于当前梯度,还取决于过去的各个梯度在各个方向上是否一致。也就是说,若某个纬度的历史梯度震荡比较大,则在该维度上学习会更加慎重。
3.[Nesterov(NAG)](https://blog.csdn.net/tsyccnh/article/details/76673073)
这个想法太巧妙了,动量法可以重写为:
而
是与当前时刻
无关的,所以不管
方向为何,
都一定会在
的方向上走上一段距离的。那为何不先在
方向上走一步后,再算梯度呢。
蓝线为动量法,棕线为t-1时刻的动量方向,红线为
方向上走一步后梯度,绿线为两者之和。
4.Adagrad
为所有纬度设置相同的学习率是训练更加容易震荡。AdaGrad算法,它根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。
这里说一下
的计算 :
是
对应元素相乘,是一个和
相同尺寸的向量, 所以Adagrad不同维度的学习率是不一样的。
5.Adadelta
Adagrad有个明显的缺点,没有对过往的
进行衰减,导致迭代一定次数后,
必然趋近于0。
Adadelta就是为了解决 Adagrad 学习率急剧下降问题的。
他们管在
前面乘一个
1-v
叫
指数加权平均。
Adadelta会对过去的
有个
v
的指数倍的衰减,有了这个衰减,就可以把Adadelta算法理解为一个
滑动的窗,对窗内的
进行指数加权平均。
(为什么要在
前面乘个
1-v
的系数?归一化就这么重要么?)
6.Adam
Adadelta+动量
他们管
叫
偏差修正。因为
u, v
一般取0.9以上,且
一般初始化为0,所以在t较小时,
只有
,所以引入偏差修正。随着t的增大,
越来越接近
。