上一篇说了一下改进梯度的最优化算法,下面说一下自适应学习率算法,以及两者的结合。自适应学习率算法主要是相对不同参数和训练的不同阶段有不同的学习率。
1.自适应学习率算法 —— AdaGrad
AdaGrad应该是Adaptive Gradient的缩写,是怎么个适应法呢,就是每个参数都有自己的学习率,这里的学习率是和每个参数的梯度相关的,而且是累积的;算出一个参数的梯度之后,会去计算累积的平方梯度,如果这个参数已经被更新了多次,二阶动量大,那么学习率就小;反之更新少的参数就会有一个比较大一些的学习率去更新
但是AdaGrad有两个小问题,第一个是一直累积动量累积太大后面就更新不动了,另一个是还是要依靠epsilon的设置,设置比较大的话还是会有影响.
2.自适应学习率算法 —— RMSprop
RMSprop是AdaGrad的一种变体,就是将动量累积和当前时刻的梯度做了一个加权求和(滑动平均),这么做的目的是为了让之前的梯度对当前影响变小
blog还贴了一个加上牛顿动量法的RMSprop,先迈出去一步算梯度,再走后面的RMSprop
3.自适应学习率算法 —— Adadelta
Adadelta是微信文章里介绍的,所以没有算法流程图了,但是其实也很好理解,和RMSprop一样就是做了一个加权求和(滑动平均),但是不一样的是用近段的一个时间窗口内的动量累积,而不是历史动量累积,这就更能避免AdaGrad的第一个问题,而对于第二个问题,文章里说也可以解决,不需要设置一个epsilon了,但我没有弄懂
4.自适应学习率算法 —— Adam(Adaptive Moment Estimation)
Adam其实就是Momentum + RMSprop;算完梯度后,更新一阶矩估计s和二阶矩估计r,s作为梯度动量累积(Momentum),r作为学习率的分母(RMSprop);最后的公式如果没有r那一坨就是Momentum了,如果把s换成g就是RMSprop。
这里还有一个修正,为什么要修正以及怎么修正的:https://www.zhihu.com/question/392235721 (一个de-bias的过程,修正成相应原参数的无偏估计,以免在前几次迭代中动量和RMS梯度还很小的时候误差太大)
Adam有没有什么缺点呢:也是有的,用的滑动平均可能会随着训练数据抖动,online场景下会波动较大。
基于Adam又有一些其他的自适应学习率算法:
5.Nadam
在Adam的基础上再加上牛顿动量,也就是先通过累积动量迈一步出来,再算梯度做后面的工作
6.AdamW
AdamW主要是考虑了目标函数里有正则项的情况,很多文章一上来就将weight decay啥的,其实weight decay就是希望模型的权重别搞得太复杂(简单就好,奥卡姆剃刀),正则化是实现这个weight decay的一种方式:越大的权重受到越大的惩罚;
但是呢,在Adam这种优化器下,正则化项也会去除以梯度的平方,并不能达到对大权重进行大惩罚的目的了,反而Adam不如Momentum;针对这个问题就提出了AdamW
这个就是把本来带L2的权重更新是紫色地方那样的,改成了只根据目标函数算梯度,做各种操作,然后再把L2对应那部分拿来更新,衰减就不让它衰减了。
后面三个来自于 https://zhuanlan.zhihu.com/p/166362509,都只是简述了一两句
7.AMSGrad
提出了一个新的指数移动平均的准则,通过单调地减小步长,解决了Adam的不收敛问题。
8.SWATS(Switches from Adam To SGD)
一个组合策略,前期采用 Adam 进行训练, 当满足触发条件,优化器就由 Adam 切换为 SGD。
9.Radam(Rectified Adam )
一种预热启发式算法