学习率是什么?太大太小分别有什么问题?怎么调?
简化版
学习率(Learning Rate) 控制每次参数更新的步子大小(w ← w - η·梯度),通常是深度学习最敏感的超参数之一。太大:步子迈过头,在最优点附近来回震荡甚至发散、损失变 NaN;太小:走得太慢,收敛极慢、容易卡在局部极小/鞍点。理想的学习率能又快又稳地下降。实践中常用学习率调度(scheduling)——训练中动态调整:先大后小(前期大步快速逼近、后期小步精细收敛),常见有阶梯衰减、余弦退火、指数衰减;深层网络/Transformer 常配 warmup(预热)——训练最开始用很小的学习率逐渐升到目标值,避免初期不稳定。
详细版
学习率的作用:
w ← w - η · ∂L/∂w η = 学习率 = 更新步长
太大 vs 太小:
| 太大 | 太小 | |
|---|---|---|
| 现象 | 震荡、发散、loss 变 NaN | 收敛极慢、卡局部极小/鞍点 |
| 损失曲线 | 上下剧烈波动/上升 | 缓慢下降、长期不收敛 |
学习率调度(先大后小):
| 方法 | 做法 |
|---|---|
| 阶梯衰减 StepLR | 每隔若干轮学习率乘一个系数 |
| 指数衰减 | 按指数持续减小 |
| 余弦退火 Cosine | 按余弦曲线平滑降到很小 |
| ReduceLROnPlateau | 验证指标不再改善就降 |
| Warmup | 训练初期从很小逐渐升到目标值 |
为什么先大后小: 前期大步快速接近最优区域,后期小步精细收敛不越过最优点。
完整版教学
一、学习率是什么——步子大小
梯度下降更新参数的公式是 w ← w - η·梯度。梯度告诉你往哪个方向走(下降最快的反方向),而学习率 η 决定每一步走多远——它是「步长」。
学习率是深度学习里最敏感、最需要调的超参数之一。同一个模型,学习率合适能顺利收敛到好解,学习率不当则可能训不动或直接崩掉。所以理解「太大太小各有什么问题、怎么调」是基本功。
二、学习率太大:震荡与发散
学习率太大,每一步迈得太远,会越过最优点:
损失曲面(碗形):
太大 → 在碗壁两侧来回横跳,越跳越高 → 震荡甚至发散
损失曲线上下剧烈波动,甚至一路上升、变成 NaN/Inf
- 在最优点附近反复横跳、不收敛。
- 严重时发散——损失越来越大,数值溢出成 NaN,训练崩溃。
看到 loss 剧烈震荡或突然变 NaN,首先怀疑学习率太大。
三、学习率太小:慢与卡住
学习率太小,每一步挪一点点:
- 收敛极慢:要跑非常多轮才能到最优,浪费大量时间和算力。
- 有限预算内进展太慢:小步长会让穿过平坦区或受噪声帮助逃离鞍点的过程变慢,但不等于数学上必然卡住,在那里停滞不前。
看到 loss 下降极其缓慢、长期不动,怀疑学习率太小(或已陷入鞍点)。
学习率太小时,单步参数变化可能远小于在有限训练预算内需要跨越的距离,因此 loss 看起来长期不动。它也会降低随机梯度噪声帮助离开鞍点或平坦区的速度,但不能据此断言模型数学上必然困在某个局部极小值。判断时应同时检查梯度范数、参数更新比和学习率调度,避免把数据或实现错误误诊为步长问题。
四、理想学习率与「先大后小」的思想
理想的学习率能又快又稳地下降:前期快速接近最优区域,后期稳稳收敛。但固定一个学习率很难同时满足前后期需求——前期想大(快速逼近),后期想小(精细收敛、不越过最优点)。
于是有了学习率调度(Learning Rate Scheduling):训练过程中动态调整学习率,通常是「先大后小」。
学习率
│ ̄ ̄\____
│ \____
│ \____ 逐渐减小
└──────────────────→ 训练进程
前期大步快速逼近 后期小步精细收敛
- 前期大学习率:快速从初始点走向最优区域。
- 后期小学习率:在最优点附近精细微调,避免大步越过、稳定收敛到更好的解。
五、常见的学习率调度方法
- 阶梯衰减(StepLR):每隔固定轮数,把学习率乘以一个系数(如每 30 轮乘 0.1)。简单常用。
- 指数衰减:学习率按指数持续平滑减小。
- 余弦退火(Cosine Annealing):学习率沿余弦曲线从大平滑降到很小,末端很平缓——现在很流行,常配合重启(warm restarts)。
- ReduceLROnPlateau:监控验证指标,当它不再改善时才把学习率下调——自适应、按需衰减。
- 多项式衰减、线性衰减等。
六、Warmup(预热)——大模型的标配
深层网络、尤其 Transformer,训练最开始权重是随机的、梯度可能很不稳定,一上来就用大学习率容易震荡崩溃。Warmup(预热) 的做法是:训练最初的若干步,学习率从一个很小的值线性(或平滑)地逐渐升到目标学习率,之后再按正常调度衰减。
学习率
│ / ̄\___
│ / \___ warmup 后正常衰减
│ / warmup 上升
└──────────────→ 步数
- 好处:让训练初期平稳,避免随机初始化 + 大学习率导致的早期发散,尤其配合 Adam/大 batch 时。
- Warmup + 余弦衰减 是现代大模型训练的常见组合。
七、怎么找合适学习率
- 从经验值起步:可从框架或论文基线起步,但最佳量级会随模型、归一化、batch 和调度变化,按任务/模型调。
- 学习率范围测试(LR range test):从很小到很大逐步增大学习率,看 loss 曲线,选 loss 下降最快、还没发散的区间。
- 网格/随机搜索:在对数尺度上搜(如 1e-4、1e-3、1e-2)。
- 配合优化器:Adam 有逐参数缩放但仍可能对基础学习率敏感;SGD 更依赖学习率和调度。
- 观察 loss 曲线:震荡/NaN → 调小;下降太慢 → 调大或检查是否卡鞍点。
八、用一维二次函数看清稳定学习率区间
令 L(w)=0.5w²,梯度为 w,固定学习率更新为 w_{t+1}=(1-η)w_t。当 0<η<2 时绝对收缩因子小于 1,迭代收敛;η=2 时在正负之间等幅振荡;η>2 时振幅越来越大并发散。
| η | 更新因子 1-η | 从 w₀=4 的前几步 | 结论 |
|---|---|---|---|
| 0.1 | 0.9 | 4→3.6→3.24 | 稳但慢 |
| 1.0 | 0 | 4→0 | 该二次例中一步到达 |
| 1.5 | -0.5 | 4→-2→1 | 交替收敛 |
| 2.1 | -1.1 | 4→-4.4→4.84 | 发散 |
真实网络各方向曲率不同,不存在一个学习率同时对所有方向最理想;动量、自适应缩放和调度都在处理这个困难。范围测试也只能提供候选区间,最终应在固定训练预算和验证协议下比较。
记忆钩子:学习率的稳定上限与损失曲率有关,不是 Adam=0.001、SGD=0.1 这样的永久常数。
九、常见误区与追问
- 误区:学习率越小最终结果一定越好。 过小会在有限预算内几乎不动,也可能因调度结束得不到充分训练。
- 误区:看到 NaN 就一定只是学习率过大。 还可能是数据异常、除零、混合精度溢出或损失实现错误。
- 追问:为什么 warmup 常与大 batch 或 Adam 配合? 初期统计和矩估计尚不稳定,逐步升高步长可降低早期破坏性更新。
- 追问:ReduceLROnPlateau 应监控训练还是验证指标? 通常监控与泛化目标一致的验证指标,并设置耐心值防止被噪声触发。
- 追问:改变 batch size 后学习率怎么调? 线性或平方根缩放只是起点,还要重新验证临界 batch、warmup 和总更新次数。
十、加强记忆
学习率 η 控制参数更新的步长(w←w-η·梯度),是最重要的超参数。太大→步子越过最优点、震荡甚至发散、loss 变 NaN;太小→有限训练预算内进展极慢、在平坦区看似停滞。理想是又快又稳,但固定学习率难兼顾,故用学习率调度「先大后小」(前期大步快速逼近、后期小步精细收敛):阶梯衰减、指数衰减、余弦退火、ReduceLROnPlateau。深层网络/Transformer 还用 Warmup(预热)——初期学习率从很小逐渐升到目标值,避免随机初始化+大学习率的早期发散,warmup+余弦衰减是大模型标配。调法:经验值起步(Adam 1e-3、SGD 1e-2)、LR range test、对数尺度搜索、看 loss 曲线(震荡调小、太慢调大)。