字数
1466 字
阅读时间
6 分钟
没错,你提出的这一点非常关键:“学习率的选取在 Adam 中不像在 SGD 中那么敏感”。但这并不意味着学习率不重要,而是说 Adam 的有效学习率范围更宽,且有一个相当不错的“万金油”初始值。
那么,到底该取多少呢?下面是一个详细的实践指南。
1. “万金油”默认值:0.001
如果你不知道该设置多少,就从 0.001
() 开始。
这个值是 Adam 论文中推荐的,并且在绝大多数深度学习框架(如 PyTorch, TensorFlow/Keras)中都是 Adam
优化器的默认学习率。
为什么这个值如此有效? 因为 Adam 内部的自适应机制(通过二阶矩 来归一化梯度)在很大程度上缓解了梯度大小不一的问题。0.001
这个值作为一个全局缩放因子,对于大多数常见模型和任务来说,都能让模型在一个合理的速度上开始收敛,既不太可能导致损失爆炸,也不会让训练停滞不前。
2. 实践中的调整策略
虽然 0.001
是一个很好的起点,但在特定场景下,调整它可以获得更好的性能。以下是一些常见场景和对应的策略:
场景一:微调(Fine-tuning)预训练模型
当你在一个已经在大数据集上预训练好的模型(例如 BERT, ResNet-50)上进行微调时,模型的参数已经处于一个相当好的位置了。此时,你需要的是“小心翼翼”地进行微调,而不是大刀阔斧地更新。
- 推荐学习率范围:
1e-5
到5e-4
(即0.00001
到0.0005
) - 常用值:
1e-4
,5e-5
,3e-5
- 原因: 过大的学习率可能会破坏预训练学到的精细特征,导致“灾难性遗忘”(Catastrophic Forgetting)。使用较小的学习率可以确保模型在保留原有知识的基础上,去适应新的任务。
场景二:从零开始训练一个新模型
当你自己设计了一个新的网络结构,并从随机初始化的参数开始训练时:
- 推荐起点:
1e-3
(即0.001
) - 调整策略:
- 如果训练初期损失就爆炸 (变成
NaN
) 或剧烈震荡:这说明学习率太高了。尝试降低一个数量级,比如设置为1e-4
(0.0001
)。 - 如果损失下降得极其缓慢,几乎没有变化:这可能意味着学习率太低了。可以尝试调高一些,比如
5e-3
(0.005
) 甚至1e-2
(0.01
),但要小心观察。通常高于1e-2
的学习率对 Adam 来说已经非常大了。
- 如果训练初期损失就爆炸 (变成
- 常用搜索范围:
1e-4
到1e-2
场景三:结合学习率调度器(Learning Rate Scheduler)
在现代深度学习训练中,很少会使用一个固定的学习率从头跑到尾。通常会结合一个学习率调度器来动态调整学习率。
- 策略: 选择一个较高的初始学习率(例如
1e-3
或5e-4
),然后让调度器在训练过程中逐渐降低它。 - 常见调度器:
- 余弦退火 (Cosine Annealing): 学习率会像余弦函数一样平滑地下降到接近零。这是一种非常流行且效果很好的策略。初始学习率可以设为
1e-3
或1e-4
。 - 阶梯式下降 (StepLR): 每隔一定的
epoch
数,将学习率乘以一个衰减因子(如 0.1)。例如,初始学习率1e-3
,每 30 个 epoch 衰减 10 倍。 - 学习率预热 (Warmup): 在训练的最开始几个 epoch,将学习率从一个非常小的值(如 0)线性增加到你设定的初始学习率(如
1e-3
)。这有助于在训练初期模型参数还不稳定时,避免过大的更新,让训练过程更稳定。Warmup + Cosine Annealing 是训练大型模型(如 Transformers)的标配组合。
- 余弦退火 (Cosine Annealing): 学习率会像余弦函数一样平滑地下降到接近零。这是一种非常流行且效果很好的策略。初始学习率可以设为
总结与表格
场景 | 推荐初始学习率 | 策略与说明 |
---|---|---|
通用/不确定情况 | 0.001 () | 最安全、最常见的默认值。你的第一选择。 |
微调预训练模型 | 1e-5 ~ 5e-4 | 需要小步微调,保护预训练权重。3e-5 是一个很典型的值。 |
从零开始训练 | 1e-4 ~ 1e-3 | 从 1e-3 开始,根据损失曲线变化进行调整。 |
训练不稳定/损失爆炸 | 调低 5-10 倍 | 当前学习率过高,需要降低。例如从 1e-3 降到 1e-4 。 |
训练过于缓慢/停滞 | 调高 3-5 倍 | 当前学习率可能过低。例如从 1e-4 升到 3e-4 。 |
追求最佳性能 | 1e-3 或 1e-4 | 强烈推荐结合学习率预热 (Warmup) 和调度器 (Scheduler)。 |
核心思想: Adam 的自适应性给了你一个很好的起点 (0.001
),让你不必像调整 SGD 那样大海捞针。你的工作是从这个优秀的起点出发,根据具体任务(微调还是从头训练)和训练过程中的反馈(损失曲线),进行小范围的调整,并最好配合学习率调度策略,以达到最佳效果。