为什么大模型训练选择 Adam 而非 SGD?
一、Adam与SGD核心区别
1. 学习率是否自适应
|
优化器 |
学习率机制 |
说明 |
|
SGD |
全局固定学习率(或手动调度) |
所有参数共享一个学习率α,对不同尺度或频率的参数“一视同仁” |
|
Adam |
每个参数独立自适应学习率 |
基于历史梯度的二阶矩(方差)动态缩放学习率:梯度大则步长短,梯度小则步长长 |
✅ 关键区别:Adam 能自动处理 embedding 层(稀疏)与 MLP 层(密集)的更新差异,SGD 不能。
2. 是否引入动量与历史信息
|
优化器 |
动量机制 |
数学形式 |
|
SGD |
可选(SGD+Momentum) |
|
|
Adam |
强制引入一阶矩(动量)+ 二阶矩(RMS) |
同时维护 |
✅关键区别: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)压缩优化器状态 |
四、结论:
-
大模型 = 高维 + 稀疏 + 非凸 + 训练昂贵 → 需要:自适应、鲁棒、少调参、快收敛
更多推荐
所有评论(0)