优化算法的发展:
SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam
既然Adam这么厉害,为什么还要使用SGD呢?
一、Adam(自适应学习率)可能不收敛
SGD:没有用到二阶动量,因此学习率是恒定的(实际使用过程中,会采用学习率衰减策略);
AdaGrad:学习率不断递减,最终收敛到0,模型也得以收敛。
Adam:二阶动量是固定时间窗口内的累积,随着时间窗口的变化,遇到的数据可能发生巨变,使得学习率可能时大时小,不是单调变化,这就可能在训练后期引起学习率的震荡,导致模型无法收敛。
二、可能错过全局最优解
对于非凸的目标函数往往起起伏伏,拥有无数的高地和洼地。有的是高峰,通过引入动量可能很容易越过;但有些是高原,可能探索很多次都出不来,于是停止了训练。
Adam v.s. SGD: Adam的收敛速度比SGD要快,但最终收敛结果不如SGD好 。
见论文《Improving Generalization Performance by Switching from Adam to SGD 》
文章给出的建议是:前期用Adam,享受Adam快速收敛的优势;后期用SGD,慢慢寻找最优解,具体的切换策略参见博客原文。
三、实际应用中该用SGD还是用Adam?
Adam等自适应学习率算法:对于稀疏数据具有优势,且收敛速度很快;
SGD:虽然收敛速度不及Adam快,但是精调参数的SGD往往能取得更好的最终结果;
四、优化算法常用tricks
- 充分了解数据
如果数据非常稀疏,那么优先考虑自适应学习率算法 - 调节策略
如果想要快速验证模型性能,在模型训练初期可以选用Adam算法,后期再用SGD寻找最优解。 - 数据集一定要打散(shuffle)
这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。 - 训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练——下降方向正确,且学习率足够高;对验证数据的监控是为了避免出现过拟合。