一、Adam与SGD核心区别

1. 学习率是否自适应

优化器

学习率机制

说明

SGD

全局固定学习率(或手动调度)

所有参数共享一个学习率α,对不同尺度或频率的参数“一视同仁”

Adam

每个参数独立自适应学习率

基于历史梯度的二阶矩(方差)动态缩放学习率:梯度大则步长短,梯度小则步长长

✅ 关键区别:Adam 能自动处理 embedding 层(稀疏)与 MLP 层(密集)的更新差异,SGD 不能。

2. 是否引入动量与历史信息

优化器

动量机制

数学形式

SGD

可选(SGD+Momentum)

\nu_t= \nu _{t-1}+g_t,

\theta_t = \theta_{t-1}-\alpha \nu_t

Adam

强制引入一阶矩(动量)+ 二阶矩(RMS)

同时维护m_t(梯度均值)和\nu_t(梯度平方均值)

✅关键区别:Adam 同时利用方向平滑(动量)和尺度自适应(RMS),而 SGD 仅靠动量平滑方向。

3. 对梯度噪声的鲁棒性

  • SGD:对噪声敏感,尤其在大模型中,稀疏梯度易导致更新不稳定。

  • Adam:通过指数移动平均(EMA)平滑梯度,抑制高频噪声,训练曲线更平稳。

4. 收敛速度与调参难度

指标

SGD

Adam

初期收敛速度

超参敏感度

高(lr、momentum 需精细调)

低(默认β1=0.9,β2=0.999即可)

适用场景

小模型、CV(有时泛化更好)

大模型、NLP、高维稀疏问题

二、为什么大模型训练偏好 Adam?

1. 高维稀疏梯度下的稳定性

  • 大模型参数量巨大(如 LLaMA-7B 有 70 亿参数),且 NLP 任务中 embedding 层梯度极度稀疏(仅少数 token 被激活)。

  • SGD 对所有参数使用相同学习率,稀疏维度更新慢,密集维度易震荡。

  • Adam 为每个参数维护自适应学习率,根据历史梯度方差动态缩放,有效缓解稀疏性问题。

2. 无需精细调参

  • SGD 对学习率极其敏感,需配合复杂学习率调度(如 warmup + decay)。

  • Adam 内置动量(momentum) + 自适应学习率,对初始学习率不敏感,开箱即用,大幅降低调参成本。

3. 更快的初期收敛

  • Adam 结合了一阶动量(类似 SGD with momentum)和二阶动量(类似 RMSProp),在训练初期能快速穿越平坦区域,加速收敛。

  • 对大模型这种训练成本极高的场景,早停或快速验证至关重要。

4. 对非平稳目标函数更鲁棒

  • 大模型 loss landscape 高度非凸、噪声大。

  • Adam 的梯度平滑机制(指数移动平均)能抑制噪声,避免 SGD 在局部剧烈震荡。

三、Adam的局限与大模型中的应对

尽管Adam是主流,但他也有缺点,大模型训练中常做改进:

问题

解决方案

泛化性略差于 SGD(在 CV 中常见)

NLP 大模型中影响较小;可通过weight decay 解耦(AdamW)改善

后期收敛不稳定

配合学习率 warmup + cosine decay

内存开销大(需存 m, v)

使用8-bit Adam(如 bitsandbytes)压缩优化器状态

四、结论:

  • 大模型 = 高维 + 稀疏 + 非凸 + 训练昂贵 → 需要:自适应、鲁棒、少调参、快收敛

更多推荐