速度堪比Adam,准确率媲美SGD,还能稳定训练GAN
看到NeurIPS 2020那篇AdaBelief论文的时候,我第一反应是——又来了! “新优化器吊打Adam”的套路,我都快看吐了。你想想,这种标题每年少说有十几篇,最后要么没人用,要么只在某个玩具数据集上自嗨。但这篇……我承认,它把我脸打了。Spotlight论文,代码直接开源,没藏着掖着。我花了一晚上读完,又跑了两天实验,结果呢?心里就蹦出四个字:有点东西。
先说死局:SGD和Adam,两头都不痛快
从2015年我开始跑深度学习,那时候说起优化器,只有一个选项——带动量的SGD。后来DCGAN论文里写:用Adam,学习率0.0002,动量beta1设0.5。我一试,嘿,比SGD稳多了。但是吧,一做分类任务,Adam泛化能力就差SGD一截。你猜差多少? 同样的ResNet-50在ImageNet上,Adam快两到三倍收敛,最终top-1准确率却低了1.5到2个百分点。2018年上一堆人吵:自适应方法快但泛化差,SGD慢但效果好。那时候啊,没有银弹,只能靠手换——任务不同就换优化器,烦不烦?烦死了!
GAN训练更是典型。非平稳优化,2015年到2017年,大家默认用Adam(beta1=0.5),但也有人推RMSProp。我当时也纠结过,后来看到一篇博客(Jason Brownlee写的),说自适应学习率能处理不同尺度梯度,动量增强稳定性。我照着把beta1从0.9降到0.5,震荡确实少了。可即便如此,GAN训练还是说崩就崩,一夜白跑,心态崩盘。
所以,当AdaBelief跳出来说:“速度像Adam,泛化像SGD,还能稳如老狗地训GAN”,我脑袋里第一个词就是——“吹牛先打草稿行不行?”
2020年10月:打破不可能三角
耶鲁大学的团队,2020年10月把论文挂到arXiv,NeurIPS 2020收了。我当时注意到一个细节:论文没用“超越”,用的是“同时满足三个优点”。这措辞聪明啊——没吊打谁,只是把原本你看好的不可能三角,变成了可能。
算法差别?一句话解释:Adam的分母是梯度平方的指数移动平均(EMA),AdaBelief的分母是当前梯度减去一阶动量的平方的EMA。Adam看梯度大小,AdaBelief看梯度是否偏离了预期轨迹。
别晕,我打个比方。你下楼梯,梯子晃不晃。Adam看你步子迈得大不大——大就迈小点。AdaBelief呢?它看你这一步跟预判差多少——要是踩空了(突然出现意料之外的大梯度),赶紧收住脚。要是每一步都按预判走,那就大步流星往前走。相信则快,怀疑则慢——这就是“信念”机制。
论文作者画了个图:窄长山谷里,Adam在y方向来回震荡,因为梯度平方大导致步长变小,x方向也一起变慢了;AdaBelief在x方向大步走,y方向震荡被抑制。我拿手头的Cifar10分类模型一试,收敛曲线平滑得不像话,最终准确率比Adam高了0.3个点。差距不大,但至少人家没瞎说。
数据摆出来,我服了一半
论文实验部分是真结实。ImageNet上ResNet-34,AdaBelief top-1准确率73.51%,SGD是73.49%,Adam只有72.07%。关键是:SGD花了90个epoch,AdaBelief只用了60个epoch就达到这个水平。语言建模(Transformer在PTB上),AdaBelief困惑度比Adam低4个点,跟SGD持平。
GAN那边更明显。Cifar10上,AdaBelief的FID分数从Adam的19.06降到了15.07,而且训练过程中生成样本质量几乎没有剧烈波动。我拿DCGAN框架一跑,以前用Adam(beta1=0.5)大概40个epoch后就开始模式崩塌,换成AdaBelief,跑了80个epoch,还稳着! 注意啊,我用的就是默认超参数:beta1=0.9, beta2=0.999, lr=0.001,完全没有额外调参。这让我有点惊讶——Adam如果beta1=0.9用在GAN上,震荡到你怀疑人生,AdaBelief居然硬扛住了。
代码也漂亮,PyTorch版直接照搬torch.optim.Adam接口,显存占用一模一样。计算速度慢了不到5%,就多算个(g_t - m_t)的平方,几乎没成本。
行业的声音:有人欢呼,有人怀疑
上当时讨论挺热闹。有人从双层优化角度分析,说RMSProp适合非平稳优化,Adam加动量反而引入了不必要的历史影响。AdaBelief保留动量,同时让分母对突变更敏感。这点跟2018年一篇解读深度学习优化器的文章思路吻合:理想优化器应该考虑损失函数曲率,而不是只看梯度大小。AdaBelief的“信念”机制,本质上就是隐式估计曲率。
不过质疑声也不少——论文里没有大规模Transformer的实验(比如BERT或GPT),这类模型对优化器要求极高。我手头只有单卡,试不了。后来2021年有人把AdaBelief用在ViT上,效果跟AdamW差不多,没有明显优势。这可能解释了为什么到现在(2024年),大模型训练依然是AdamW的天下。
还有个实际坑:权重衰减(Weight Decay)。Adam有个已知bug——自适应学习率会按比例缩放权重衰减,导致正则化效果减弱。AdamW把这个问题解耦了。AdaBelief论文没有专门讨论权衰减,我直接用跟Adam一样的实现试,效果不稳定。后来有人改了方式,叫AdaBeliefW,但没有正式发布。如果你想试,建议把权重衰减单独实现,别混在梯度里——这是小坑,别踩。
四年过去了,AdaBelief怎么样了?
没有像一些人预期的那样取代Adam,但在特定场景稳稳站住了。图像分类,比SGD好调参,比Adam泛化强;GAN训练,免去一堆技巧(调beta1、梯度裁剪等)。当年DCGAN那套经验——beta1降到0.5——在AdaBelief这里不需要了,默认0.9就能跑。
我个人的习惯:新项目从AdaBelief开始试——如果收敛不理想再换回SGD或AdamW。它没有增加额外成本,却给了你一个“万一好用”的机会。你就想啊,万一呢?
不过也得承认,大模型领域它还没杀进去。AdamW配合余弦退火或者线性衰减已经是工程标准答案,没有动力去换。但如果你在做中小规模模型、GAN,或者自己搞个小项目,我建议你试试AdaBelief。我手头的ResNet、中等规模Transformer和GAN都受益了,没理由不推荐。
未来呢?我觉得优化器不会有颠覆性变革了。从SGD到Adam花了好多年,Adam到AdamW更像一个bug修复,AdaBelief是一次精巧的调整。但这个调整的角度——从怀疑到信念——挺有意思。也许下一个突破口不在数学形式,而是如何自动选优化器(比如谷歌大脑2022年那篇元学习选优化器的论文)。但那是另一个故事了。
最后说一句
你最近要是被GAN训练搞得想砸键盘,或者不想在分类任务上反复调SGD的学习率衰减策略,直接去GitHub把代码拉下来,改一行就行:
optimizer = AdaBelief(model.parameters(), lr=1e-3)剩下的,交给它。
反正我信了。你呢?
读者评论 5