亚当避坑:别把Adam当万能钥匙
亚当避坑的核心,不是记住几个参数名,而是理解Adam为什么收敛快、为什么有时泛化差、为什么学习率一高就发飘。很多训练问题表面看是模型不行,实际是优化器、权重衰减和调度策略混在一起出了偏差。
先给结论:Adam强在启动,不强在收尾
Adam优化器的优势来自两件事:一是给每个参数单独估计梯度的一阶动量,二是用二阶矩估计把步长缩放到相对稳定的范围。简单说,频繁震荡的参数会被压住,梯度稀疏的参数也不会完全走不动。这让它在Transformer、推荐模型、NLP微调里很常见。
但亚当避坑要抓住一个事实:快收敛不等于最后效果最好。Adam常常能让训练损失很快下降,却可能在验证集上输给SGD或AdamW调好的方案。它像一辆起步很猛的车,弯道和终点前的速度控制更考验调参。
坑一:默认学习率不是通用答案
很多框架把Adam默认学习率设为0.001,这个数在小型MLP、早期CNN实验里还算顺手,但迁移到大模型微调、扩散模型、检测模型时,经常偏大。微调BERT类模型时,常见学习率反而在1e-5到5e-5之间;训练小网络时,1e-3又可能合理。
判断学习率是否过大,不要只看loss是否下降。更可靠的信号是:训练前几百步loss突然尖峰、验证指标来回跳、梯度裁剪频繁触发、同一配置换随机种子差异很大。遇到这些现象,先降学习率,再看warmup和batch size。
坑二:把Adam的weight_decay当L2正则
普通Adam里直接加weight_decay,很多实现等价于把L2项混进梯度,再被自适应缩放处理。结果是正则强度不再干净,参数越稀疏、梯度尺度越特殊,影响越难预测。AdamW把权重衰减从梯度更新里解耦出来,逻辑更直,也更适合现代深度学习训练。
实战里,如果模型是Transformer、ViT、ConvNeXt这类架构,优先试AdamW,而不是Adam加一个随手写的L2。偏置项、LayerNorm或BatchNorm的权重通常不做weight_decay,这条小规则经常比盲目加大正则更有用。
坑三:忽略beta参数和小批量噪声
Adam默认beta1=0.9、beta2=0.999。beta1控制动量记忆,beta2控制平方梯度的平滑程度。batch size很小、梯度噪声很大时,beta2太高会让二阶估计反应慢,模型像踩着旧路况开车;训练极不稳定时,适当把beta2降到0.98或0.99,有时比继续调学习率更直接。
不过beta不是越低越好。beta2低了会让步长对局部噪声过敏,loss曲线看起来更毛。靠谱做法是一次只动一个参数,先固定学习率范围,再比较0.999、0.99、0.98,别把调参变成随机抽奖。
收尾:用三张表判断是否踩坑
亚当避坑可以落到三张表:训练loss和验证指标曲线、不同学习率的短跑结果、Adam与AdamW的同设置对比。只看单次最优值很危险,因为Adam对随机种子、warmup、权重衰减都敏感。
我的经验是,先用Adam或AdamW快速验证模型能不能学,再用学习率调度、权重衰减分组和早停控制泛化。Adam不是不能用,而是不能懒用。把它当诊断工具和高效起点,往往比把它当最终答案更稳。
常见问题
Adam优化器一定比SGD好吗?
不一定。Adam通常前期收敛更快,但在图像分类等任务中,调好的SGD有时验证集表现更好。要看任务、模型、数据规模和调度策略。
Adam学习率一般设多少?
从1e-3、3e-4、1e-4做粗搜比较稳。大模型微调常用1e-5到5e-5,小模型从1e-3开始更常见。
Adam和AdamW该选哪个?
现代深度学习项目优先试AdamW,尤其是Transformer和视觉大模型。它的权重衰减更清晰,调参解释性更好。