Skip to content
字数
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-55e-4 (即 0.000010.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-41e-2

场景三:结合学习率调度器(Learning Rate Scheduler)

在现代深度学习训练中,很少会使用一个固定的学习率从头跑到尾。通常会结合一个学习率调度器来动态调整学习率。

  • 策略: 选择一个较高的初始学习率(例如 1e-35e-4),然后让调度器在训练过程中逐渐降低它。
  • 常见调度器:
    1. 余弦退火 (Cosine Annealing): 学习率会像余弦函数一样平滑地下降到接近零。这是一种非常流行且效果很好的策略。初始学习率可以设为 1e-31e-4
    2. 阶梯式下降 (StepLR): 每隔一定的 epoch 数,将学习率乘以一个衰减因子(如 0.1)。例如,初始学习率 1e-3,每 30 个 epoch 衰减 10 倍。
    3. 学习率预热 (Warmup): 在训练的最开始几个 epoch,将学习率从一个非常小的值(如 0)线性增加到你设定的初始学习率(如 1e-3)。这有助于在训练初期模型参数还不稳定时,避免过大的更新,让训练过程更稳定。Warmup + Cosine Annealing 是训练大型模型(如 Transformers)的标配组合。

总结与表格

场景推荐初始学习率策略与说明
通用/不确定情况0.001 ()最安全、最常见的默认值。你的第一选择。
微调预训练模型1e-5 ~ 5e-4需要小步微调,保护预训练权重。3e-5 是一个很典型的值。
从零开始训练1e-4 ~ 1e-31e-3 开始,根据损失曲线变化进行调整。
训练不稳定/损失爆炸调低 5-10 倍当前学习率过高,需要降低。例如从 1e-3 降到 1e-4
训练过于缓慢/停滞调高 3-5 倍当前学习率可能过低。例如从 1e-4 升到 3e-4
追求最佳性能1e-31e-4强烈推荐结合学习率预热 (Warmup)调度器 (Scheduler)

核心思想: Adam 的自适应性给了你一个很好的起点 (0.001),让你不必像调整 SGD 那样大海捞针。你的工作是从这个优秀的起点出发,根据具体任务(微调还是从头训练)和训练过程中的反馈(损失曲线),进行小范围的调整,并最好配合学习率调度策略,以达到最佳效果。

贡献者

页面历史