优化器全指南:从原理到调优实战
本文将带你轻松理解深度学习中的“导航系统”——优化器。我们会避开复杂的数学公式,用大量的比喻和图示,让你彻底明白 Adam、AdamW、LAMB 是怎么回事,并学会如何调节它们的关键参数。
第一部分:核心概念:优化器是什么?
一个简单的比喻:
想象你在一座大雾弥漫的山里(损失函数),你的目标是找到最低的山谷(模型的最优解)。
- 你 = 模型参数
- 你所在的高度 = 当前的损失值(Loss)
- 你的每一步 = 一次参数更新
优化器(Optimizer) 就是你的 智能导航仪。它负责:
- 感知坡度:计算梯度(Gradient),告诉你哪个方向最陡、下山最快。
- 决定步幅:结合学习率(Learning Rate)和之前的历史,决定你这一步迈多大。
第二部分:主流优化器原理
我们先通过一个图表快速把握它们的演进关系:
下面我们逐一解读。
1. SGD (随机梯度下降):基础步行者
- 原理:只看脚下最陡的方向,然后用学习率这个固定步长迈出一步。
- 缺点:步伐呆板,容易在山谷两侧震荡,下山慢,容易掉进小坑(局部最优)。
- 代码:
torch.optim.SGD(model.parameters(), lr=0.1)
2. Adam (Adaptive Moment Estimation):全能型跑车
Adam 引入了两个强大概念:动量和自适应学习率。
- 一阶动量(Momentum):类似惯性。下坡时不仅看当前坡度,还会让你越走越快,能冲出小坑。
- 二阶动量(Adaptivity):类似智能刹车。对于陡坡(历史梯度大),刹车减速(减小学习率);对于缓坡(历史梯度小),加油门加速(增大学习率)。
Adam 如何工作?
- 计算当前梯度(看脚下)。
- 更新一阶动量(计算惯性速度)。
- 更新二阶动量(计算刹车力度)。
- 结合两者,走出一步。
代码:
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3, # 最重要的超参数!betas=(0.9, 0.999), # 通常不用动eps=1e-8, # 通常不用动weight_decay=0) # 权重衰减,此时未解耦
3. AdamW:修正版跑车 (Adam with Weight Decay)
- 问题:Adam 把权重衰减(L2正则化) 和梯度计算混在一起,影响了“刹车系统”的判断。
- 解决方案:解耦!将权重衰减从梯度中分离出来,在最后更新参数时直接施加。
- Adam:
新权重 = 旧权重 - 学习率 * (梯度 + weight_decay * 旧权重)
- AdamW:
新权重 = 旧权重 - 学习率 * 梯度 - 学习率 * weight_decay * 旧权重
- Adam:
AdamW 通常比 Adam 泛化能力更好,是现代Transformer模型(如ViT, GPT)的默认选择。
代码:
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3,weight_decay=0.01) # 这个参数变得很重要!
4. LAMB (Layer-wise Adaptive Moments for Batch training):大型工程卡车
- 要解决的问题:训练超大规模模型(如BERT)时,无法使用大批量(Batch Size)训练,否则会不稳定。
- 核心创新:分层自适应。它为网络每一层的参数计算一个信任比(Trust Ratio),动态调整该层的更新幅度。
- 效果:使得训练极其稳定,允许使用极大的Batch Size来大幅缩短训练时间。
代码(需第三方实现):
# 示例:使用Hugging Face Transformers库中的LAMB
from transformers.optimization import LambOptimizer
optimizer = LambOptimizer(model.parameters(), lr=1e-3, weight_decay=0.01)
第三部分:超参数调优实战
超参数是训练前设置的 knob(旋钮),调优就是找到最适合你任务的旋钮组合。
1. 学习率 (lr) - 最重要的旋钮!
- 作用:控制每一步的步长。
- 太大:Loss爆炸或震荡(NaN)。
- 太小:训练慢,可能卡住。
- 常用值:
3e-4
,1e-3
(Adam/AdamW的黄金起点),1e-1
(SGD)。
2. 权重衰减 (weight_decay) - 正则化旋钮
- 作用:防止模型过拟合,让权重值不要太大。
- 太大:模型变得“简单”,导致欠拟合。
- 太小:可能过拟合。
- 常用值:
0.01
,0.1
,0.05
(对于AdamW非常好用)。
3. 批量大小 (Batch Size)
- 作用:一次看多少样本再做决策。
- 大:训练稳定、速度快。
- 小:噪声大,可能有助于泛化。
- 设定:通常设为GPU能承受的最大值(32, 64, 128, 256…)。
第四部分:总结与选择指南
优化器 | 核心思想 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
SGD | 基础梯度下降 | 简单,理论清晰 | 易震荡,收敛慢 | 简单任务,理论分析 |
Adam | 动量 + 自适应 | 快!省心!通用性强 | 可能泛化不如SGD | 快速原型,大多数CNN |
AdamW | Adam + 解耦权重衰减 | 泛化性更好 | - | 现代主流,Transformer, ViT, GPT |
LAMB | 分层自适应 | 训练稳定,支持超大Batch | 实现较复杂 | 超大规模模型训练 (BERT) |
✨ 给初学者的万能配方 ✨
- 无脑首选:从 AdamW 开始。
- 超参数:
lr=3e-4
,weight_decay=0.01
。 - Batch Size:设为你的GPU能跑的最大值(如64)。
- 跑一个epoch:用 LR Finder 验证你的学习率是否在最佳区间(下降最陡处)。
- 观察损失曲线:根据上面的诊断指南微调
lr
和weight_decay
。
最后记住: 没有放之四海而皆准的优化器。大胆实验,细心观察,根据你的任务和模型找到最适合的那一个!