前言
本文我们对之前介绍的优化器进行简单实验。
实验设置与说明
在之前的文章中我们介绍了很多很多优化器,但都没有做比较详细的实验。那么在本文中我们集中进行一下实验。
目前任务在CV中选择了MNIST,NLP中选择了GLUE,都是分类任务..后续可能会添加更多的任务。CV模型为一个CNN架构:ResNet和一个Transformer架构:ViT(Vision Transformer);NLP选择了LSTM和BERT。
优化器主要有:Vanilla SGD、HB、NAG、AdaGrad、RMSPop、AdaDelta、Adam、AdaMax。
此外值得一提的是学习率。在之前的理论分析中我们会令学习率为定值$\eta^{(\tau)}\equiv \eta$或多项式衰减:$\eta^{(\tau)}=\eta/\tau^p$,但在实践中如果采用这种衰减方式衰减太快,实验中的多项式衰减为:
$$ \eta^{(\tau)}=\eta\cdot\left(1-\frac{\tau}{total\_steps}\right)^p\tag{1} $$
其中$p=0$即学习率为常数;$p=1$即为常用的linear decay。
在训练完一个epoch后测试一下指标,最终指标表示最优值。$^+$表示欠拟合;$^-$表示已过拟合;-表示未拟合。接下来开始我们的排列组合吧!
CV
首先来看CV任务。MNIST任务上模型选择的是ResNet34、ViT-Base(patch16-224)。batch size统一为256,无dropout、正则与weight decay,5个epoch,初始学习率均为0.005。指标为测试集ACC。表现如下:
ResNet34:
SGD | HB | NAG | AdaGrad | RMSProp | AdaDelta | Adam | AdaMax | |
---|---|---|---|---|---|---|---|---|
$p=0$ | 97.29$^+$ | 99.08 | 99.02$^-$ | 99.1 | 98.83 | 93.99$^+$ | 98.92$^+$ | 98.97$^-$ |
$p=1$ | 96.36$^+$ | 99.14$^-$ | 99.09$^-$ | 99.52 | 99.58 | 79.79$^+$ | 99.45 | 99.29 |
Avg Time | 0:59:18 | 0:58:46 | 0:54:33 | 0:48:38 | 0:54:27 | 1:05:57 | 1:01:25 | 1:05:19 |
ViT-Base: (硬件原因这里bs=128,8个epoch)
SGD | HB | NAG | AdaGrad | RMSProp | AdaDelta | Adam | AdaMax | |
---|---|---|---|---|---|---|---|---|
$p=0$ | 92.35$^+$ | 94.62 | 95.25 | 90.12$^+$ | - | - | 96.17$^+$ | 93.31$^+$ |
$p=1$ | 93.84$^+$ | 95.31 | 95.17 | 91.36$^+$ | - | - | 97.38$^+$ | 93.03 |
Avg Time | 1:34:13 | 1:24:03 | 1:33:07 | 1:12:39 | - | - | 1:34:10 | 1:45:38 |
NLP
接下来是NLP任务。
1.Language Model
对于LSTM,让它在GLUE上进行测试有点牵强了,我们这里测试LSTM做语言模型的表现。数据集为Penn TreeBank(PTB),指标为测试集困惑度(perplexity,PPL,越低越好)。数据的获取与处理主要参考:AdaBelief。batch size统一为32,无dropout、正则与weight decay,200个epoch,初始学习率均为0.01。
SGD | HB | NAG | AdaGrad | RMSProp | AdaDelta | Adam | AdaMax | |
---|---|---|---|---|---|---|---|---|
$p=0$ | 650.9 | 219.9 | 222.6 | 350 | - | - | 487.9 | - |
$p=1$ | 651 | 237.9 | 241.8 | 326.1 | - | - | 469.4 | - |
Avg Time | 2:29:56 | 2:32:35 | 2:34:15 | 2:34:54 | - | - | 2:41:09 | - |
2.GLUE
对于BERT,我们测试其在GLUE上的表现。由于GLUE任务比较多,我们先来看SST-2。指标为验证集ACC。batch size统一为8,无dropout、正则与weight decay,5个epoch,初始学习率均为2e-5。
SGD | HB | NAG | AdaGrad | RMSProp | AdaDelta | Adam | AdaMax | |
---|---|---|---|---|---|---|---|---|
$p=0$ | ||||||||
$p=1$ | ||||||||
Avg Time |
结论
接下来我们结合上述实验结果以及一些paper看能得出哪些结论。首先我们从一些浅显的结论开始。
1.不同优化器在不同任务、不同模型上的性能差异很大
实验表明,不同的优化器在不同的任务上具有显著差异的表现;其中有一些优化器如Adam与SGD+动量在所有任务上都具有不错的表现,而像RMSProp与AdaDelta则在有些任务上可能不收敛。参考资料1也证明了这一点:
具体而言,对于非Transformer架构(CNN、LSTM)SGD可能有更好表现;而Transformer架构上可能自适应方法(特别是Adam)可能表现更好。关于这一点的原因涉及比较复杂的loss landscape analysis,这里先不展开了。
2.调节超参数与LR scheduler很有必要
参考资料1同时指出,对于超参数与LR scheduler如果应用论文默认值(如Adam中的$\eta^{(0)}= 10^{-3},\beta_1=0.9,\beta_2=0.999$) 对于部分优化器(如Adam)可能效果不错,这说明这些优化器已经足够好;而对于部分优化器(如RMSProp、AdaDelta)则表现不佳,这说明它们对于超参数与LR scheduler很敏感,而且其默认设置并不是很合适。
其中Small budget表示在一个小范围内搜索超参数。下表也说明了进行超参数搜素与调节LR scheduler可以有效改进性能:
而本文的实验也证明了学习率采用一定的衰减策略有助于提高指标,这与我们的理论分析是相符的。
3.自适应方法收敛更快而SGD泛化更好
在训练早期自适应方法拥有出色的收敛速度,但其在测试集的表现往往不如SGD。这其实是一个相当普遍的结论了,参考资料2、3都说明了这一点,见下图:
至于其背后的理论原因,我们同样需要对loss landscape进行分析,我们之后再介绍。这条结论对于我们设计新的优化器是有启发意义的:我们能不能在前期使用自适应方法来获得较快的收敛速度;而在后期使用SGD来获得更好的泛化性?接下来我们将介绍这个思路下几篇比较优秀的工作:SWATS、AdaBound、RAdam。
References
- Descending through a crowded valley-benchmarking deep learning optimizers,Robin M. Schmidt, Frank Schneider, Philipp Hennig,PMLR,2021
- The marginal value of adaptive gradient methods in machine learning,Ashia C. Wilson, Rebecca Roelofs, Mitchell Stern, Nathan Srebro, Benjamin Recht,NIPS,2017
- Improving Generalization Performance by Switching from Adam to SGD,Nitish Shirish Keskar, Richard Socher,arXiv preprint arXiv:1712.07628,2017