📚推荐阅读
面试官:“你觉得 Adam 为什么比 SGD 收敛更快?那为什么 Adam 泛化性往往不如 SGD?有没有改进方法?”
这问题听着简单,但要答得漂亮得兼顾数学理解 + 经验分析 + 改进思路。今天我们就系统地讲一讲这个问题,从原理到改进,把话说透。
所有相关源码示例、流程图、模型配置与知识库构建技巧,我也将持续更新在Github:AIHub,欢迎关注收藏!
一、引言
SGD(随机梯度下降)
SGD 是最传统也最稳定的优化算法:
它每次根据当前的梯度方向,迈出固定步长去更新参数。虽然看似“笨”,但它有个隐藏优点——噪声反而有助于泛化。因为在训练后期,梯度震荡能让模型跳出局部最优,找到更“平滑”的解。
Adam(Adaptive Moment Estimation)
Adam 在 SGD 的基础上引入了“动量 + 自适应学习率”机制:
m_t是一阶动量(类似带方向的平均梯度);v_t是二阶动量(记录梯度的方差);- 每个参数都有自己的“自适应步长”。
Adam初期收敛非常快,不太敏感于学习率,对稀疏梯度任务(如 NLP、推荐系统)效果极好。但是容易陷入“平滑但不泛化”的最优点,后期震荡少,不容易走出局部最优,泛化性能普遍不如 SGD。
二、为什么 Adam 收敛快但泛化差?
这个问题的本质,其实是两者在优化轨迹上的差异。
收敛快:Adam 会自动调节学习率
在训练初期,Adam 会给梯度大的维度小学习率,梯度小的维度大学习率。这样可以迅速降低损失,让模型“看起来”很快收敛。但问题是这种自适应调整抹平了梯度噪声,也让模型失去了探索能力。
泛化差:Adam 收敛到“陡峭的最优点”
SGD 在收敛过程中因为梯度震荡大,容易走向平坦(flat)最优解,而 Adam 的自适应机制会“稳稳地”收敛到陡峭(sharp)最优解。
我们知道,平坦的最优解往往泛化更好,因为对输入扰动更不敏感。这也解释了为什么在 CV 等任务上,SGD 通常比 Adam 泛化更强。
三、从几何视角理解两者差异
我们可以这么想象:
- SGD:像是“带点晃动的山地车”,边跑边微调方向,最后停在一个平缓的山谷。
- Adam:像是“精准制导导弹”,沿着最快下降的路径直奔低点,但可能撞进一个又窄又深的坑。
这也是为什么很多论文说SGD 收敛慢,但到达的解更平滑、更具泛化性。
四、如何改进 Adam?
既然 Adam 收敛快、SGD 泛化好,那能不能两者取长补短?
当然可以!这也是很多论文努力的方向。
下面列几个主流改进思路
1. AdamW:加权衰减版 Adam
AdamW 是现在最常用的改进版本。它把 “权重衰减(weight decay)” 从梯度更新中分离出来:
区别在于AdamW 不再用 L2 正则项影响梯度,而是直接对权重衰减。
AdamW更稳定,泛化性能大幅提升,已成为 Transformer、ViT 等模型的默认选择。
2. AMSGrad:防止学习率过大
AMSGrad 通过限制二阶动量的增长,防止学习率不稳定。它修正了 Adam 在理论上可能不收敛的问题。虽然在实践中效果差异不大,但对理解优化原理很有帮助。
3. From Adam to SGD:后期切换策略
还有一种工程上非常实用的策略:“前期用 Adam 加速收敛,后期切换到 SGD 提升泛化。”
这种策略常用于预训练 + 微调阶段,比如:
- 预训练用 Adam;
- 微调阶段改用 SGD with momentum。
这样既能保留 Adam 的高效率,又能继承 SGD 的好泛化。
4. LAMB / LARS:大模型训练友好
在训练大模型(如 BERT、ViT)时,Adam 的自适应性会导致不同层更新不平衡。LAMB(Layer-wise Adaptive Moments)和 LARS(Layer-wise Adaptive Rate Scaling)通过对每层的学习率做归一化,让不同层更新更协调。这两种优化器可以说是 “Adam 的分层进化版”。
以上的内容搞懂了之后你就可以很好的回答开头的问题了!
关于深度学习和大模型相关的知识和前沿技术更新,请关注公众号 coting!