new optimizer for deep learning
1、SGD
2、SGD with momentum
前一步的累积会移动到下一步当中,就算达到鞍点和局部最低点,带有动量的SGD还是会继续前行,下一步的movement等于: -u*梯度+v*动量
3、Adagrad
即在梯度方向乘了一个数,如果过去的梯度很大,就要降低学习率,因为梯度很大,说明在一个很崎岖的路上寻找全局最低,比如上面图的绿色方向,梯度比较大,所以需要用一个比较小的学习率
4、RMSProp
原理和Adagrad很像,同时借用了Momentum的思想;Adagrad的分母是不断累加的,加入一开始就很大,导致后面学习率特别小,而RMSprop在时间上有缓冲,上式中的vt表示的就是EMA (exponential moving average)of gradient is not monotonically increasing 不会永无止尽的增加。
5、Adam
之前的算法无法解决初始化的梯度就为0 的情况
example:BERT\ Transformer
Adam:在训练集上达到很好成绩,SGD+momentum在验证集有很好的成绩
原因:其中一个原因是Adam能够在比较sharp 的地方找到minimum,相反SGDM在flat的地方找到
ADAM因为能够动态地调整学习率,所以收敛速度很快,而SGDM没有这样的效果
SWATS:先使用Adam(比较快),再使用SGDM
问题1:什么时候切换
问题2:学习率怎么改变
Adam有个trouble,当训练的开始阶段,梯度会很小而且没有什么信息,这时候梯度就是漫无目的的走,但是当梯度很大的时候,因为有之前的影响,导致movement不会很大,最大也只会是,作者的改进方法是AMSGrad,AMSGrad中的V在现在的V和上一次的V中选最大值,减小了无意义的梯度(Adam梯度小,但是学习率大)影响。
AdaBound是对学习率设置边界,有 上界和下界,相比较于AMSGrad,即能处理很大的学习率,又能处理小学习率
ADAM:因为能够动态地调整学习率,所以收敛速度很快,而SGDM没有这样的效果,因此可以从SGDM进行调整
LR range:不断调整学习率来寻找最好的学习率
不断地调大调小学习率,另外两种方法: