如何选择合适的学习率和调度器
选择合适的学习率和调度器(Learning Rate Scheduler)是深度学习训练中最重要的超参数调优环节之一。选得好,模型收敛快、精度高;选不好,模型可能原地踏步甚至直接发散。
以下是关于如何选择学习率与调度器的系统化指南。
一、初始学习率的选择策略
初始学习率是优化的起点。设置得太大会导致损失爆炸(NaN),设置得太小会导致收敛极其缓慢。
1. 学习率范围测试
这是目前最科学、最常用的方法。它的目的是通过一次简短的训练,找到损失下降最快的区间。
- 操作步骤:
- 从一个极小的学习率开始(如 $10^{-8}$ 或 $10^{-7}$)。
- 每个 mini-batch(或每几个 batch)后,将学习率线性增加(或指数增加)。
- 记录下每个学习率对应的 loss 值。
- 画出"学习率 vs Loss"的曲线。
- 如何选值:
- 最佳初始学习率:通常选择 Loss 下降最快的那个区间的学习率,再稍微保守一点(比如取该值的十分之一,或者取曲线下降最陡峭段的中点)。
- 最大学习率:通常选择 Loss 开始急剧上升或变得不稳定(震荡)之前的那个学习率。这常用于配合循环学习率。
2. 经验法则(粗调)
如果没有时间做上述测试,可以根据模型和优化器使用经验值:
- Adam/AdamW:对学习率相对不敏感,默认值通常在 $1\times10^{-3}$ 到 $1\times10^{-4}$ 之间。Transformer 类模型常用 $1\times10^{-4}$ 或 $3\times10^{-4}$。
- SGD + Momentum:对学习率比较敏感,通常需要比 Adam 更大的学习率,常见范围在 $0.1$ 到 $0.01$ 之间,配合 Batch Normalization 时甚至可以用到 $0.1$ 或 $1.0$(配合 Warmup)。
3. 观察法
- 如果训练刚开始几步 Loss 就变成
NaN 或 Inf,说明学习率太大。
- 如果训练了十几个 epoch,Loss 下降极慢或几乎不变,且梯度范数一直很小,说明学习率太小。
二、主流学习率调度器及其选择
调度器的核心作用是在训练的不同阶段动态调整学习率,帮助模型跳出局部最优、稳定收敛。通常,我们更关心学习率随训练进程的变化曲线。
1. Step Decay(阶梯式衰减)
- 原理:每隔固定的 epoch 数,将学习率乘以一个衰减因子(如 0.1)。
$$lr = lr_0 \times \gamma^{\lfloor \frac{epoch}{step_size} \rfloor}$$
- 适用场景:经典的 CNN 分类任务(如 ResNet 在 ImageNet 上)。适合对训练周期有明确规划的场景。
- 参数:需要设置
step_size(多少个 epoch 降一次)和 gamma(通常为 0.1 或 0.5)。
2. Cosine Annealing(余弦退火)
- 原理:学习率按余弦函数从初始值平滑衰减到接近 0。
$$\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})(1 + \cos(\frac{T_{cur}}{T_{max}}\pi))$$
- 适用场景:目前非常主流的调度器,尤其适用于 Transformer 架构、对比学习(CLIP、SimCLR)以及现代 CNN 架构(EfficientNet、ConvNeXt)。它能让模型在后期进行细致的探索。
- 优势:相比 Step Decay 的突然下降,Cosine 的平滑衰减通常能带来更好的最终精度。
3. Linear Decay(线性衰减)
- 原理:学习率线性减小到 0。
- 适用场景:大语言模型(如 GPT、BERT)的预训练微调中非常常见。通常与 Warmup 配合使用。
4. Warmup(预热)
- 注意:Warmup 严格来说是一种策略,通常与上述调度器组合使用。
- 原理:在训练开始的前几百步或几个 epoch,让学习率从 0(或极小值)线性增加到预设的初始学习率。
- 为什么要用:模型初始参数是随机的,如果一开始就用大学习率,模型容易震荡甚至发散(尤其在 Transformer 和 大批量训练中)。Warmup 能让模型先稳定下来。
- 选择:对于 Transformer 模型,Warmup 几乎是必须的。对于 CNN,如果 Batch Size 很大(如超过 1024),通常也需要 Warmup。
5. Cyclic LR / One Cycle Policy(循环学习率)
- 原理:让学习率在设定的上下界之间周期性循环(先升后降)。
- 适用场景:追求快速收敛、或者希望模型在多个局部最优之间震荡以期找到更平坦最小值的情况。One Cycle 策略常用于图像分类的快速训练。
三、不同场景下的推荐组合
| 模型/任务类型 |
推荐优化器 |
推荐初始学习率 |
推荐调度器 |
备注 |
| CNN 图像分类(ResNet 等) |
SGD + Momentum (0.9) |
0.1 或 0.01 |
Step Decay 或 Cosine |
如果用 SGD,通常配合大 Batch,初始 LR 可设 0.1。 |
| Transformer(BERT/GPT/ViT) |
AdamW |
1e-4 到 3e-4 |
Warmup + Cosine/Linear Decay |
这是 NLP 和 现代 CV 的标配,效果非常稳定。 |
| GAN / 对抗生成网络 |
Adam |
1e-4 到 2e-4 |
保持恒定 或 缓慢线性衰减 |
GAN 对 LR 比较敏感,通常不采用剧烈的 Step 下降。 |
| 目标检测/分割(Detectron 系) |
SGD 或 AdamW |
0.02 (SGD) 或 1e-4 (AdamW) |
Warmup + Step Decay/Cosine |
通常会在训练到 2/3 和 8/9 处降 LR。 |
| 大批量训练(Batch > 4096) |
SGD 或 LAMB |
随 Batch 线性增加 |
Warmup + 长 Cosine |
通常遵循"线性缩放原则":Batch 翻倍,LR 翻倍。 |
四、实操检查清单
- 第一步:设定初始 LR
- 用 Transformer:直接选
AdamW + 1e-4,或者跑一下 LR Range Test。
-
用 CNN + SGD:试试 0.1。
-
第二步:确定是否用 Warmup
- 如果是 Transformer:必须用(通常 Warmup 500-4000 步,或前 1-2 个 epoch)。
- 如果是 CNN 且 Batch Size 很大:建议用。
-
如果是简单任务(如 MLP 或 小 CNN + 小 Batch):可以不用,直接开始。
-
第三步:选择主调度器
- 不想调太多参数,想稳一点:选 Cosine Annealing,把迭代总次数 $T_{max}$ 设为总的 epoch 数。
- 复现经典论文基线:查原论文,通常用的是 Step Decay。
-
训练大模型(LLM):选 Warmup + Linear Decay。
-
第四步:监控曲线
- Loss 曲线剧烈震荡:学习率太大,降低一个数量级。
- Loss 曲线下降极度缓慢:学习率太小,或者 Warmup 时间太长。
- 验证集精度在后期波动大:说明学习率在该阶段依然太大,可以提前衰减,或者降低最终的最小学习率。
评论专区
评论加载中...登录后即可发表评论