SGD
- 每次向负梯度方向前进(负梯度是下降速度最快的方向),因为梯度增加的方向就是损失函数L增加的方向。
SGDM(SGD of momentum)
- 相比与SGD增加了momentum项,前进的方向,不仅取决于梯度的方向,还取决于之前的前进方向
- 每步都增加λvi,是因为若求出一个地方梯度为0,SGD就无法继续前进,而SGDM则由于收到之前移动的影响,会继续前进。
Adagrad
- 相比于SGD,增加了关于gi的分母,即过去所有梯度的和。(过去的梯度大说明过去的曲线比较陡,此时就会令学习率变小,避免一下走太快)
RMSProp
- 按照 Adagrad 的方法,若曲线一直很陡,由于一直累加之前的梯度,分母会越来越大,可能还没有到最优点,就会卡住不动。
- 因此,RMSProp 的 vt 采用下面更合理的累加方式。
Adam
- 由于 RMSProp 算法仍无法解决SGD遇到梯度为0的问题,提出 Adam 将 SGD 与 RMSProp 结合。
- mt 和 vt 分别增加了分母,使其不会随着时间的增大而无限增大。
总结:
- 后三个方法都在计算过程中增加了分母,我们称为 adaptive learning rate(自适应学习率)。
优化器的应用
- BERT、Transformer、Tacotran 等知名语义方面的模型都是用 ADAM 训练出来的。
- big-GAN、MEMO等知名的生成网络的模型都是用ADAM训练出来的。
- YOLO、Mask-RCNN、ResNet 等知名检测方面的模型都是用 SGDM 训练出来的。
优化器对比
- 可以看到 Adam 训练很快,而 SGDM 虽然慢,但训练更稳定
- 为解决这一问题,2017年提出了 SWATS ,开始使用Adam,结束时使用SGDM,但变相增加了一些超参数,所以实际使用有待商榷。
- RAdam则刚好相反,先使用 SGDM ,后使用 Adam ,下图中在求 rt 时,由于 ρt 开始小于4,无法计算,因此采用这种方案,先采用 SGDM 过渡。
有助于优化的方法一
- Shuffling(训练前对数据清洗,进行旋转、模糊等操作)
- Dropout (增加随机性的方法)
- Gradient noise(每次迭代的时候添加一个高斯分布的随机误差)
- 上面三种方法都让我们增加随机性,鼓励我们多做探索。
有助于优化的方法二
- Warm-up(先使用较小的学习率,在训练一段时间,有一定先验知识后,采取较大的学习率来加速模型收敛)
- Curriculum learning (先通过简单的数据训练)
- Fine-tuning(用训练好的参数(可以从已训练好的模型中获得)初始化自己的网络,然后用自己的数据接着训练)
- 以上三种方法鼓励我们从简单的方面开始进行,再深入到复杂。
一些主流的优化方法
- lookAhead 准备了两套权重, 即两个一模一样的模型,A和B。先训练一个模型,看训练的效果再进行下一步的训练,与传统 SGD 相比, 确实获得了更好的收敛效果。
- 所有方法都可以与最后的 Lookahead 作结合。
常用优化器分类
- 最常用的来说,CV 方向我们常用 SGDM ,而NLP,GAN等方面,我们一般使用 Adam