优化器 (Optimizers)
📌 核心定义 (What)
Section titled “📌 核心定义 (What)”一句话定义:优化器是控制如何更新神经网络参数的算法。它决定了梯度下降的”步伐”——往哪个方向走、步子迈多大。
不同的优化器有不同的策略:有的步子固定(SGD),有的会根据历史调整步伐(Momentum),有的会为每个参数定制步长(Adam)。
🏠 生活类比 (Analogy)
Section titled “🏠 生活类比 (Analogy)”🎿 “滑雪下山”
Section titled “🎿 “滑雪下山””- SGD(基础滑雪):每次看一眼脚下的坡度,直接往下滑。可能被小坑绊住,也可能在平缓处卡住。
- Momentum(带惯性滑雪):利用之前的速度,即使遇到小坑也能冲过去。
- Adam(智能滑雪板):自动分析地形,在陡坡减速、在缓坡加速,还能记住哪些方向经常变化。
🎿 交互演示:优化器对比 (Interactive)
Section titled “🎿 交互演示:优化器对比 (Interactive)”观察 SGD、Momentum、Adam 三种优化器到达最优点的路径和速度差异。
🎿优化器对比可视化
SGD Loss
53.0000
Momentum Loss
53.0000
Adam Loss
53.0000
💡 观察不同优化器到达最优点的路径和速度 | 绿点为最优点
📊 常见优化器 (Math)
Section titled “📊 常见优化器 (Math)”1. SGD (Stochastic Gradient Descent)
Section titled “1. SGD (Stochastic Gradient Descent)”最基础的优化器,直接沿梯度方向更新。
SGD 公式
- : 学习率 (Learning Rate)
- : 损失函数的梯度
- 优点: 简单、内存占用小
- 缺点: 容易震荡、对学习率敏感
2. SGD + Momentum
Section titled “2. SGD + Momentum”引入”动量”,利用历史梯度加速收敛。
Momentum 公式
- : 速度(累积的梯度方向)
- : 动量系数,通常 0.9
- 优点: 加速收敛、减少震荡
- 缺点: 新增超参数
3. RMSProp
Section titled “3. RMSProp”自适应学习率,对每个参数使用不同的步长。
RMSProp 公式
- : 梯度平方的指数移动平均
- 核心思想: 梯度大的参数用小步长,梯度小的参数用大步长
- 优点: 自适应、适合非平稳问题
4. Adam (Adaptive Moment Estimation) ⭐
Section titled “4. Adam (Adaptive Moment Estimation) ⭐”结合 Momentum 和 RMSProp 的优点,现代深度学习的默认选择。
Adam 公式
- : 一阶矩估计(梯度的均值)
- : 二阶矩估计(梯度的方差)
- : 偏差修正项
- 默认超参数: , ,
- 论文: Kingma & Ba, ICLR 2015 (arXiv:1412.6980)
5. AdamW (Adam with Weight Decay)
Section titled “5. AdamW (Adam with Weight Decay)”Adam 的改进版,正确实现 L2 正则化,LLM 训练的标准选择。
AdamW 公式
- : 权重衰减系数
- 区别: 将权重衰减从梯度中解耦
- 优点: 泛化能力更强,Transformer 标准配置
- 论文: Loshchilov & Hutter, ICLR 2019
📈 对比总结
Section titled “📈 对比总结”| 优化器 | 自适应学习率 | 动量 | 内存开销 | 典型应用 |
|---|---|---|---|---|
| SGD | ❌ | ❌ | 低 | 简单任务、调参基准 |
| SGD+Momentum | ❌ | ✅ | 低 | CNN 图像分类 |
| RMSProp | ✅ | ❌ | 中 | RNN |
| Adam | ✅ | ✅ | 中 | 通用默认选择 |
| AdamW | ✅ | ✅ | 中 | Transformer/LLM ⭐ |
💻 代码实现 (Code)
Section titled “💻 代码实现 (Code)”import torchimport torch.nn as nnimport torch.optim as optim
model = nn.Linear(10, 1)
# SGDoptimizer_sgd = optim.SGD(model.parameters(), lr=0.01)
# SGD + Momentumoptimizer_momentum = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# RMSPropoptimizer_rmsprop = optim.RMSprop(model.parameters(), lr=0.01)
# Adam (通用默认)optimizer_adam = optim.Adam(model.parameters(), lr=0.001)
# AdamW (Transformer 标准)optimizer_adamw = optim.AdamW( model.parameters(), lr=1e-4, # 学习率 betas=(0.9, 0.999), # 默认值 weight_decay=0.01 # 权重衰减)
# 训练循环示例for epoch in range(100): optimizer_adam.zero_grad() # 清空梯度 output = model(torch.randn(32, 10)) loss = output.mean() loss.backward() # 计算梯度 optimizer_adam.step() # 更新参数🎯 如何选择? (When to Use)
Section titled “🎯 如何选择? (When to Use)”| 场景 | 推荐优化器 | 推荐学习率 |
|---|---|---|
| 初学者 / 调参基准 | SGD | 0.01 - 0.1 |
| CNN 图像分类 | SGD + Momentum | 0.01 - 0.1 |
| 通用深度学习 | Adam | 0.001 (1e-3) |
| Transformer / LLM | AdamW | 1e-4 ~ 3e-4 |
| 微调预训练模型 | AdamW | 1e-5 ~ 5e-5 |
⚠️ 常见误区 (Pitfalls)
Section titled “⚠️ 常见误区 (Pitfalls)”📚 参考论文
Section titled “📚 参考论文”| 论文 | 优化器 | 链接 |
|---|---|---|
| Kingma & Ba, 2015 | Adam | arXiv:1412.6980 |
| Loshchilov & Hutter, 2019 | AdamW | arXiv:1711.05101 |
| Sutskever et al., 2013 | Momentum | ICML 2013 |
| Hinton (Lecture) | RMSProp | Coursera Neural Networks |