SGD、Adam 和 AdamW
一、SGD(Stochastic Gradient Descent)
1. 基本原理
SGD(随机梯度下降)是最基础的优化算法,参数更新公式为:
θt+1=θt−η⋅gt \theta_{t+1} = \theta_t - \eta \cdot g_t θt+1=θt−η⋅gt
其中:
- θt\theta_tθt:第 ttt 步的模型参数;
- η\etaη:学习率;
- gt=∇θL(θt)g_t = \nabla_\theta L(\theta_t)gt=∇θL(θt):当前 batch 的梯度。
常见变体:SGD with Momentum
引入动量机制,减少震荡,加速收敛:
vt+1=μvt+gtθt+1=θt−η⋅vt+1 v_{t+1} = \mu v_t + g_t \\ \theta_{t+1} = \theta_t - \eta \cdot v_{t+1} vt+1=μvt+gtθt+1=θt−η⋅vt+1
通常取 μ=0.9\mu = 0.9μ=0.9。
2. 优点
- 结构简单,计算开销小;
- 泛化性能好,常用于最终微调;
- 理论分析清晰,适合教学。
3. 缺点
- 收敛速度慢;
- 对学习率敏感,需精细调参;
- 容易陷入局部最优或鞍点。
4. 使用建议
- 适用于小模型、图像分类任务(如 ResNet);
- 常用于实验对比或后期微调阶段。
二、Adam(Adaptive Moment Estimation)
1. 原理简介
Adam 结合了 动量(Momentum) 和 自适应学习率(RMSProp) 的思想,维护两个滑动平均:
- 一阶矩(均值):mt=β1mt−1+(1−β1)gtm_t = \beta_1 m_{t-1} + (1 - \beta_1) g_tmt=β1mt−1+(1−β1)gt
- 二阶矩(方差):vt=β2vt−1+(1−β2)gt2v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2vt=β2vt−1+(1−β2)gt2
由于初始偏置,需进行偏差校正:
m^t=mt1−β1t,v^t=vt1−β2t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} m^t=1−β1tmt,v^t=1−β2tvt
参数更新:
θt+1=θt−η⋅m^tv^t+ϵ \theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−η⋅v^t+ϵm^t
常用默认参数:
- β1=0.9\beta_1 = 0.9β1=0.9
- β2=0.999\beta_2 = 0.999β2=0.999
- ϵ=1e−8\epsilon = 1e^{-8}ϵ=1e−8
2. 优点
- 自适应学习率,不同参数独立调整步长;
- 收敛速度快,适合大多数任务;
- 对学习率不敏感,鲁棒性强;
- 广泛应用于 NLP、CV 领域(如 BERT 初始训练)。
3. 缺点
- 可能收敛到“尖锐极小值”,泛化性不如 SGD;
- 权重衰减(weight decay)与 L2 正则混淆(关键问题!);
- 后期可能出现震荡,影响测试性能。
三、AdamW(Decoupled Weight Decay Regularization)
1. 背景:Adam 的 weight decay 误区
在标准 Adam 中,若使用 weight_decay
参数,实际上是将其作为 L2 正则项加入损失函数,导致其梯度被自适应缩放机制扭曲。
这意味着:Adam 中的 weight decay ≠ 真实的权重衰减。
2. AdamW 的改进
AdamW 明确将权重衰减从梯度中解耦,在更新时单独施加:
θt+1=θt−η⋅(m^tv^t+ϵ+λθt) \theta_{t+1} = \theta_t - \eta \cdot \left( \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} + \lambda \theta_t \right) θt+1=θt−η⋅(v^t+ϵm^t+λθt)
其中 λ\lambdaλ 是真实的权重衰减值,与梯度无关。
这就是所谓的“解耦权重衰减(Decoupled Weight Decay)”。
3. 优点
- 权重衰减作用更准确、可控;
- 提升模型泛化能力;
- 已成为 Transformer、ViT 等大模型的标准配置;
- 实验表现普遍优于 Adam。
4. 缺点
- 多一个超参数需要调节;
- 效果依赖于合理的 λ\lambdaλ 设置。
四、三者对比总结
特性 | SGD | Adam | AdamW |
---|---|---|---|
自适应学习率 | ❌ | ✅ | ✅ |
内置动量 | 可选(+momentum) | ✅ | ✅ |
权重衰减准确性 | ✅ | ❌(与L2混淆) | ✅(解耦) |
收敛速度 | 慢 | 快 | 快 |
泛化性能 | 好 | 一般 | 更好 |
调参难度 | 高(lr敏感) | 中等 | 中等 |
典型应用场景 | 小模型、微调 | 快速实验 | 大模型(BERT/ViT) |
五、使用建议
场景 | 推荐优化器 |
---|---|
学习/调试/小型网络 | SGD + Momentum |
快速原型开发 | Adam 或 AdamW |
大模型训练(Transformer、ViT等) | ✅ AdamW(首选) |
追求最佳泛化 | 先用 AdamW 训练,后期可切换 SGD 微调 |
注意事项 | 不要同时开启 weight_decay 和额外 L2 loss,避免重复惩罚 |