常见优化器
内容
一、基础梯度下降法
| 优化器 |
核心公式 |
特点 |
适用场景 |
| SGD |
θ = θ - η·∇θ J(θ) |
简单,但学习率固定,易陷入局部最优 |
小数据集、简单模型 |
| Batch GD |
同SGD,但使用全量数据计算梯度 |
梯度稳定,但计算开销大 |
小型数据集 |
| Mini-Batch GD |
同SGD,但基于小批量数据计算梯度 |
平衡计算效率与梯度稳定性 |
绝大多数场景( 默认选择 ) |
二、自适应学习率优化器
| 优化器 |
核心思想 |
关键改进点 |
优点 |
缺点 |
| Adagrad |
根据参数历史梯度调整学习率 |
η/(√(G_t) + ε) |
适合稀疏数据 |
学习率过早衰减 |
| RMSprop |
引入梯度平方的指数衰减平均 |
E[g²]_t = ρE[g²]_{t-1} + (1-ρ)g_t² |
缓解Adagrad学习率衰减问题 |
超参数敏感 |
| Adadelta |
取消全局学习率,使用参数变化量的均方根进行更新 |
自适应单位调整 |
无需手动设置学习率 |
初期收敛慢 |
三、动量类优化器
| 优化器 |
核心公式 |
核心思想 |
优势 |
典型场景 |
| Momentum |
v_t = γ·v_{t-1} + η·∇θ J(θ)
θ = θ - v_t |
引入动量加速收敛 |
逃离局部最优/鞍点 |
高曲率、小噪声梯度 |
| NAG (Nesterov) |
v_t = γ·v_{t-1} + η·∇θ J(θ - γ·v_{t-1}) |
前瞻性梯度计算 |
更精准的动量修正 |
复杂优化地形 |
四、综合型优化器
| 优化器 |
核心公式 |
核心创新点 |
优点 |
注意事项 |
| Adam |
结合动量+自适应学习率
m_t = β1·m_{t-1} + (1-β1)·g_t
v_t = β2·v_{t-1} + (1-β2)·g_t²
θ = θ - η·m̂_t/(√v̂_t + ε) |
动量的一阶矩估计 + 梯度平方的二阶矩估计 |
收敛快、适合大规模数据 |
需要偏差校正 |
| AdamW |
在Adam基础上解耦权重衰减项 |
区分梯度更新与正则化项 |
更稳定的超参数 |
推荐替代标准Adam |
| Nadam |
Adam + Nesterov动量 |
前瞻性动量估计 |
加速初期收敛 |
复杂模型训练 |
五、新型优化器
| 优化器 |
核心思想 |
优势 |
论文参考 |
| LAMB |
适用于大batch训练的Adam变体 |
加速大规模分布式训练 |
LAMB Optimizer |
| RAdam |
动态衰减动量项的Adam |
解决训练初期方差问题 |
RAdam |
六、选择策略
- 默认选择:优先尝试 AdamW 或 Adam( 80%场景适用 )
- 理论分析需求:使用 SGD + Momentum( 可解释性更强 )
- 稀疏数据:使用 Adagrad 或 FTRL
- 资源受限:使用 RMSprop( RNN类模型表现稳定 )
- 超大规模训练:使用 LAMB 或 Adafactor
七、代码示例( PyTorch )
# Adam 优化器
import torch.optim as optim
optimizer = optim.Adam(model.parameters(), lr=3e-4, weight_decay=1e-5)
# SGD with Momentum
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
# 带热重启的Adam (SGDR策略)
scheduler = optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=10)
关键参考资料
- Adam: A Method for Stochastic Optimization
- 为什么Adam常被吐槽?
- 优化器可视化比较
实际应用中需结合具体任务进行调参,通常学习率和权重衰减是最需要调整的超参数。