2-学习率调度与 Warmup
1. 学习率为什么是最关键的超参数
1.1 物理意义:参数更新的步长
参数更新公式为
学习率
1.2 学习率与损失曲面的交互
损失曲面(loss landscape)由模型结构、数据分布和初始化共同决定,包含平坦区域(flat)和尖锐区域(sharp)。三者的交互关系是理解学习率调度的基础:
- 大学习率 → 有能力跳出 sharp 局部最优,但可能导致在平坦区域振荡而不收敛
- 小学习率 → 在平坦区域稳定收敛,但在 sharp 区域可能被困住,无法探索更好的解
- 学习率调度 → 在训练早期使用较大学习率探索,中期稳定在平坦区域,后期精细化
1.3 学习率与梯度噪声的关系
随机梯度
噪声的作用是隐式正则化(参考 SGD 笔记)。大学习率 + 小 batch 的组合实际上引入了强噪声,帮助模型跳出 sharp 极小值。大 batch 训练(低噪声)若配合相同的学习率,会导致模型收敛到 sharp 极小值,泛化能力下降——这就是大 batch 训练中需要配合学习率缩放或SGD 隐式正则化补偿的原因。
2. 学习率调度的基础
2.1 调度的统一框架
学习率调度将学习率从初始值
其中
2.2 调度的作用阶段划分
典型的神经网络训练(
| 阶段 | 步数范围 | 目标 | 适合的调度策略 |
|---|---|---|---|
| Warmup 期 | 稳定参数,避免大幅跳动 | Warmup(线性/常数) | |
| 主训练期 | 快速收敛,逼近最优 | Constant / Cosine / Linear | |
| 衰减期 | 精细化,稳定收敛 | Cosine / Step / Exponential |
3. 各调度策略详解
3.1 固定学习率(Constant LR)
形式
分析
固定学习率是最简单的策略,但实践中几乎不可能是最优的。原因:
- 训练初期参数离最优远,需要较大学习率快速逼近
- 训练后期参数已在极小值附近,大学习率会导致振荡而不收敛
- 若
设置过小,训练前期收敛极慢;若设置过大,训练后期无法稳定
适用场景
- 训练步数极短(如 few-shot fine-tune 的前几步)
- 配合 early stopping 使用
- 某些强化学习场景(奖励信号不断变化,不适合衰减)
实战经验
固定学习率是 Adam 的”半默认”配置——Adam 的自适应学习率在一定程度上替代了人工学习率调度。但若训练后期出现 loss 平台,切换到 cosine decay 通常能带来额外收益。
3.2 Step Decay(阶梯衰减)
形式
其中
分析
Step decay 的优点是实现简单,效果稳定。缺点是衰减是非连续的跳变,在学习率切换的瞬间,参数可能受到冲击(loss 曲线出现尖峰)。
在优化器视角看:阶梯衰减相当于在训练中后期”收紧”了搜索步长,使参数稳定在当前极小值附近精细搜索。
为什么有效
直觉上,神经网络训练的不同阶段需要不同的探索强度:初期大步探索,中期小步收敛,后期微调。Step decay 通过分段实现这一目标,但衰减时机(
实战经验
SGD + Momentum 的标准配置。每 30 epoch 乘以
3.3 Exponential Decay(指数衰减)
形式
或等价的离散形式:
分析
与 Step decay 不同,Exponential decay 是连续、平滑的衰减。任意时刻的学习率为
指数衰减的特点是:每单位时间的衰减率相同,但绝对衰减量在前中期更快,后期变慢。这与很多实际训练的需求相反——通常需要前期慢衰减,后期快衰减以精细化。
适用场景
- 长期稳态训练(如在线学习、持续学习)
- 强化学习中 Q 函数收敛过程
实战经验
Exponential decay 在深度学习中不如 Step decay 和 Cosine decay 常见,主要因为衰减速度与训练阶段的需求不匹配。若需要平滑衰减,Cosine decay 是更好的选择。
3.4 Cosine Decay(余弦衰减)
形式(Loshchilov & Hutter, 2017)
其中
若使用 Warmup,则
推导:为什么是余弦
余弦函数在
- 前期(warmup 结束后):学习率保持相对平稳,避免骤降
- 中后期(
):学习率快速衰减,参数迅速稳定在极小值附近
若使用线性衰减(linear decay),则衰减速度均匀,无法体现”前期不需快衰减”的需求——这就是 Cosine 取代 Linear 成为 Transformer 标准衰减的原因。
Cosine vs Step decay 的对比
| 维度 | Cosine Decay | Step Decay |
|---|---|---|
| 衰减平滑度 | 连续、平滑 | 非连续跳变 |
| 中后期衰减速度 | 快(更符合精细化需求) | 均匀 |
| 收敛稳定性 | 更好(无跳变冲击) | 可能有尖峰 |
| 实现复杂度 | 略高(需计算 cos) | 极低 |
| 典型应用 | Transformer、LLM 训练 | 视觉分类 ResNet |
实战经验
Cosine decay 是 Transformer 训练的标准衰减方式。BERT、GPT、LLaMA 均使用 Cosine decay + linear warmup 组合。学习率曲线在 warmup 结束后先平缓(约 60%~80% 的 torch.optim.lr_scheduler.CosineAnnealingLR。
3.5 Linear Decay(线性衰减)
形式
从
分析
Linear decay 的衰减速度恒定,前期衰减慢但后期衰减快。与 Cosine decay 相反——Linear 在前期提供更长时间的高学习率,在后期快速衰减。这对于训练步数
但对于 Transformer,Linear decay 的效果不如 Cosine decay。原因是 Cosine 在
实战经验
Linear decay 主要用于 LSTM 语言模型的传统配置(Hochreiter & Schmidhuber 时代)。在现代 Transformer 训练中几乎被 Cosine 取代。
3.6 Warmup(学习率预热)
为什么初始阶段需要 Warmup
神经网络训练初期存在两个不稳定因素:
- 参数分布未稳定:初始参数(尤其是 BatchNorm 的移动均值/方差和 LayerNorm 的参数)在训练初期会快速变化,直接使用大学习率可能导致参数大幅跳动
- 残差连接信号放大:在 Transformer 中,残差路径使得每一层的信号方差在层间累积。若初始阶段所有层的梯度同向叠加,可能导致信号爆炸(尤其在 pre-norm 架构中)
Warmup 在前
这让参数在训练初期以小步长缓慢调整,逐渐建立稳定的梯度流。
Warmup 的数学推导
考虑 Transformer 的残差路径:第
Warmup 的作用是:在参数方差仍在调整的阶段,将学习率限制在较小值,从而限制每个 step 的参数更新幅度,使各层信号方差逐渐稳定到合理量级。
Warmup 步数如何确定
主流配置(经验上常见):
| 模型规模 | Warmup 步数 | 占总步数比例 |
|---|---|---|
| 小模型(< 100M 参数) | 1000 ~ 5000 | 1% ~ 5% |
| 中等模型(100M ~ 1B) | 5000 ~ 10000 | 1% ~ 3% |
| 大模型(> 1B,如 LLaMA) | 2000 ~ 20000 | < 1%(总步数巨大) |
关键原则:总步数越多,warmup 占比越小。LLaMA 的 1.4T token 预训练使用约 2000 warmup steps,但总步数在百万量级,warmup 占比不到 0.2%。
Warmup 的类型
| 类型 | 形式 | 适用场景 |
|---|---|---|
| Linear warmup | 通用,Transformer 标准 | |
| Constant warmup | 极少用(过于激进) | |
| Cosine warmup | 极少数自定义实现 | |
| Exponential warmup | 不推荐,前几步增长太快 |
Linear warmup 是事实标准。Constant warmup 在某些实现中出现,但效果不如 linear。
3.7 Cyclical / OneCycle(周期学习率)
OneCycle 的形式(Smith, 2018)
OneCycle 将学习率分为三个阶段:
- Warmup 阶段:从
线性增长到 - Annealing 阶段:从
余弦衰减到 - Supermaximum 阶段(可选):短期使用超过
的学习率
典型配置:
为什么有效
OneCycle 的核心思想是:训练初期用较小学习率建立稳定路径,中期用较大学习率快速探索,最后余弦衰减精细化。“Supermaximum” 阶段利用”大学习率可能跳出更好的极小值”的直觉,在收敛末期再做一次强化探索。
局限性
OneCycle 需要 batch size 固定且较大(否则学习率缩放不成立),且
实战经验
OneCycle 在小数据集(ImageNet 子集)、分类任务上效果良好,可以节省训练时间(通常比 standard schedule 快 2~3 倍达到相同准确率)。但对于 Transformer 预训练,standard cosine + warmup 是更稳健的选择。
4. 大 Batch 训练中的学习率缩放
4.1 为什么大 Batch 需要调整学习率
设 batch size 从
若学习率保持不变,等价于降低了有效正则化强度,模型可能收敛到 sharp 极小值。解决方案有两种:
方案 1:线性缩放(Linear Scaling)
Goyal et al. (2018) 的经验规则:在 sgd + momentum 下,batch size 增大
方案 2:平方根缩放(Sqrt Scaling)
对于 Adam,线性缩放过于激进,平方根缩放更合适(因为 Adam 的自适应学习率已经部分补偿了噪声变化)。
4.2 梯度累积与学习率
梯度累积(gradient accumulation)用于在有限显存下模拟大 batch:累积
关键点:梯度累积不影响学习率设置——因为有效 batch size 就是
5. 预训练、微调、从头训练的区别与调度策略
5.1 从头训练(Training from Scratch)
从头训练时,所有参数都是随机初始化的,参数分布随训练逐步稳定。此时需要完整的 warmup + 主训练 + 衰减周期。
典型配置(以 ResNet-50 / ImageNet 为例):
- Warmup: 5 epochs(linear)
- 主训练: 85 epochs(COSINE decay from
) - 总学习率曲线:从 0 线性 warmup 到 0.1,余弦衰减到 ~0(最后 5 epochs 学习率约
)
5.2 预训练(Pre-training)
预训练(如语言模型在海量无标注语料上的训练)具有以下特点:
- 数据量极大(token 量级
~ ) - 训练步数极多
- 学习率通常按绝对步数(而非 epochs)设置
典型配置(以 LLaMA / GPT 为例):
(小模型)或 (大模型)- Linear warmup: 前 2000 steps
- Cosine decay: 从
到 ,衰减至 - 不掉到零:训练末期学习率通常设为
(而非完全 0),避免末端过于保守
5.3 微调(Fine-tuning)
预训练模型在不同任务上的微调需要不同的学习率调度策略:
| 微调场景 | 特点 | 学习率配置 |
|---|---|---|
| 任务适配器微调(Adapter-tuning) | 只更新少量参数(adapter 层),其余冻结 | 冻结层学习率 = 0,新增 adapter 层 |
| 全参数微调(Full fine-tune) | 所有参数都更新 | |
| LLM 中的微调(如 LoRA) | 低秩适配,更新量小 | |
| BERT 微调(分类头) | backbone 预训练,分类头随机初始化 | backbone: |
为什么微调学习率要小
预训练的 backbone 已经”学会了有用的特征”,大学习率会破坏这些特征,导致灾难性遗忘(catastrophic forgetting)。微调阶段使用小学习率,在预训练知识的基础上做轻微调整。
微调是否需要 warmup
通常不需要。预训练模型已经过了初始不稳定阶段,微调时直接使用目标学习率即可。但若微调数据集很小(< 10K 样本),warmup(200~500 steps)可以帮助稳定训练,防止少样本过拟合。
6. 训练后期为什么常常降学习率
6.1 直观解释
训练后期,参数已在某个极小值附近。大的学习率会使参数在这个极小值附近振荡,无法精细化。降低学习率后,参数振荡幅度减小,可以更精确地收敛到极小值点。
6.2 从收敛率理论理解
在凸优化中,使用恒定学习率
6.3 经验现象:后期降 LR 后 loss 突然下降
这是常见的正常现象。原因是:训练中期由于学习率相对较大,参数在某个较浅的极小值点附近振荡,降低学习率后,参数才有机会越过当前极小值,找到更深(更平坦)的极小值点。这一现象说明:后期降 LR 不是”修复”错误,而是训练的自然过程。
7. 学习率与优化器、Batch Size、梯度累积的联动
7.1 联动公式
综合来看,影响有效学习率的因素有:
其中
Adam 的二阶矩修正因子
7.2 一个联动配置示例
假设训练 LLaMA-7B(batch size per device = 16, 梯度累积 = 8, 8 GPU):
- 相对于
,缩放因子 - 若 base
,则有效 初值 - 配合 warmup(前 2000 steps,linear)+ cosine decay
8. 工程实践
8.1 如何设置 Warmup Steps
步骤 1:估算总步数
步骤 2:按比例设定 warmup 占比
- 常规深度网络(ResNet 等):
- Transformer(NLP/视觉):
- 超大规模预训练(> 1B 参数,> 100B tokens):
步骤 3:选择 warmup 类型
Linear warmup 是几乎通用的选择(PyTorch: lr_scheduler.LinearLR(start_factor=0.0, end_factor=1.0, ...))。
8.2 如何记录和可视化学习率曲线
# 记录每一步的学习率
lr_history = []
for step in range(T):
lr = optimizer.param_groups[0]['lr']
lr_history.append(lr)
# ... 训练逻辑 ...可视化要点:
- 绘制
vs step:检验 warmup 是否线性、decay 是否符合预期曲线 - 与 loss 曲线叠加:若 loss 在学习率切换后出现尖峰,说明调度可能过激
- 与梯度范数叠加:检验梯度是否在学习率变化后稳定
关键监控指标:每 100 步记录一次当前学习率,每 epoch 记录一次验证集指标。若 loss 在训练末期仍缓慢下降,可考虑继续训练(而非停止)——说明学习率尚未衰减到过低。
8.3 如何根据 Loss/Val 指标判断是否该调学习率
| 现象 | 判断 | 处理 |
|---|---|---|
| Loss 在前 100 步不下降 | 学习率过低或初始化问题 | 增大学习率 5~10 倍 |
| Loss 振荡剧烈(不收敛但不 NaN) | 学习率过高 | 降低学习率,或启用梯度裁剪 |
| Train loss 下降但 Val loss 不变或上升 | 过拟合或学习率衰减过慢 | 增大学习率衰减速度;提前开始衰减 |
| Loss 在衰减点后突然下降 | 正常现象(精细化效应) | 无需处理;若下降后反弹则说明衰减过早 |
| Loss 在训练末期趋于平台但指标仍有上升空间 | 学习率过低 | 增大末期学习率(如 Cosine 的 |
9. 实战中的默认推荐
9.1 视觉分类(从头训练)
| 阶段 | 策略 | 参数 |
|---|---|---|
| Warmup | Linear warmup | 5 epochs, from |
| 主训练 | Cosine decay | |
| 优化器 | SGD + Momentum |
9.2 Transformer 预训练(大模型)
| 阶段 | 策略 | 参数 |
|---|---|---|
| Warmup | Linear warmup | 2000 steps(不按 epoch),from |
| 主训练 | Cosine decay | |
| 优化器 | AdamW | |
| 按模型规模 | < 1B: |
9.3 BERT 微调(分类任务)
| 阶段 | 策略 | 参数 |
|---|---|---|
| Warmup | 通常不需要 | 若需要:200~500 steps linear |
| 主训练 | Constant(恒定) | |
| 分类头 | 独立学习率 | backbone: |
| 优化器 | AdamW |
10. 大模型训练常见学习率配置模板
10.1 模板 1:SGD 视觉分类(ResNet 等)
学习率: 0.1 (base)
优化器: SGD + Momentum(0.9) + Weight Decay(1e-4)
Batch Size: 256 (per node)
Epochs: 90
Schedule:
- Epoch 0~5: Linear Warmup (to 0.1)
- Epoch 5~85: Cosine Annealing (to 1e-6)
- Epoch 30, 60: Step Decay (×0.1) — 备选方案
10.2 模板 2:Transformer 预训练(GPT / LLaMA)
学习率: 3e-4 (base, 7B及以下) / 1e-4 (7B以上)
优化器: AdamW (beta1=0.9, beta2=0.95, eps=1e-8, weight_decay=0.1)
Batch Size: 4M tokens per batch (global)
Tokens: 1~1.4T tokens total
Schedule:
- Steps 0~2000: Linear Warmup (to base_lr)
- Steps 2000~T: Cosine Decay (to 0.1×base_lr, 不衰减到零)
- 注意: 若 T 极大,末期学习率通常设为 base_lr / 10,而非更小
10.3 模板 3:BERT Fine-tune(分类)
学习率: 2e-5 (backbone) / 3e-5 (classification head)
优化器: AdamW (beta1=0.9, beta2=0.999, eps=1e-8, weight_decay=0.01)
Batch Size: 16~32
Epochs: 3~5
Schedule:
- 前 10% steps: Linear Warmup (可选)
- 剩余 steps: Constant (恒定)
- 无需衰减: fine-tune 通常不超过 5 epochs,数据量有限
10.4 模板 4:少样本微调(Adapter / LoRA)
学习率: 1e-4 (adapter/lora params) / 0 (frozen backbone)
优化器: AdamW
Batch Size: 8~16
Epochs: 5~20
Schedule:
- 前 200 steps: Linear Warmup
- 剩余 steps: Cosine Decay (to 1e-5)
- 注意: backbone 完全冻结,无需调度
10.5 模板 5:RL PPO(强化学习)
学习率: 3e-4 (PPO) / 1e-4 (A3C)
优化器: Adam
Batch Size: PPO: 4096~8192 (experience buffer size)
Schedule:
- 全程 Constant (无衰减)
- 原因: RL 的目标函数非平稳,奖励分布在训练中不断变化,衰减学习率会使策略更新过于保守
- 若训练不稳定: 启用 KL penalty 替代学习率衰减