2-学习率调度与 Warmup

1. 学习率为什么是最关键的超参数

1.1 物理意义:参数更新的步长

参数更新公式为

学习率 直接决定了每一步参数更新的幅度。若 过小,参数在单位时间内走过的距离有限,收敛速度慢;若 过大,参数可能在损失曲面上 overshoot(越过极小值点),甚至发散。

1.2 学习率与损失曲面的交互

损失曲面(loss landscape)由模型结构、数据分布和初始化共同决定,包含平坦区域(flat)和尖锐区域(sharp)。三者的交互关系是理解学习率调度的基础:

  • 大学习率 → 有能力跳出 sharp 局部最优,但可能导致在平坦区域振荡而不收敛
  • 小学习率 → 在平坦区域稳定收敛,但在 sharp 区域可能被困住,无法探索更好的解
  • 学习率调度 → 在训练早期使用较大学习率探索,中期稳定在平坦区域,后期精细化

1.3 学习率与梯度噪声的关系

随机梯度 是真实梯度 的有偏估计,噪声强度与 batch size 成反比。梯度噪声方差约为 为 batch size。

噪声的作用是隐式正则化(参考 SGD 笔记)。大学习率 + 小 batch 的组合实际上引入了强噪声,帮助模型跳出 sharp 极小值。大 batch 训练(低噪声)若配合相同的学习率,会导致模型收敛到 sharp 极小值,泛化能力下降——这就是大 batch 训练中需要配合学习率缩放SGD 隐式正则化补偿的原因。


2. 学习率调度的基础

2.1 调度的统一框架

学习率调度将学习率从初始值 变为时间(step / epoch)的函数:

其中 是调度因子(scheduling factor),

2.2 调度的作用阶段划分

典型的神经网络训练( total steps)可分为三个阶段:

阶段步数范围目标适合的调度策略
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(阶梯衰减)

形式

其中 是衰减周期, 是衰减率。典型配置:每 30 个 epoch 乘以 ,即 epochs,

分析

Step decay 的优点是实现简单,效果稳定。缺点是衰减是非连续的跳变,在学习率切换的瞬间,参数可能受到冲击(loss 曲线出现尖峰)。

在优化器视角看:阶梯衰减相当于在训练中后期”收紧”了搜索步长,使参数稳定在当前极小值附近精细搜索。

为什么有效

直觉上,神经网络训练的不同阶段需要不同的探索强度:初期大步探索,中期小步收敛,后期微调。Step decay 通过分段实现这一目标,但衰减时机()需要人工设定,不够自适应。

实战经验

SGD + Momentum 的标准配置。每 30 epoch 乘以 ,共衰减 2~3 次(ImageNet 训练 90 epochs 通常衰减 3 次)。若 loss 在衰减点出现尖峰,是正常现象(参数在新学习率下重新调整方向)。


3.3 Exponential Decay(指数衰减)

形式

或等价的离散形式:

分析

与 Step decay 不同,Exponential decay 是连续、平滑的衰减。任意时刻的学习率为

指数衰减的特点是:每单位时间的衰减率相同,但绝对衰减量在前中期更快,后期变慢。这与很多实际训练的需求相反——通常需要前期慢衰减,后期快衰减以精细化。

适用场景

  • 长期稳态训练(如在线学习、持续学习)
  • 强化学习中 Q 函数收敛过程

实战经验

Exponential decay 在深度学习中不如 Step decay 和 Cosine decay 常见,主要因为衰减速度与训练阶段的需求不匹配。若需要平滑衰减,Cosine decay 是更好的选择。


3.4 Cosine Decay(余弦衰减)

形式(Loshchilov & Hutter, 2017)

其中 是总步数(total steps),

若使用 Warmup,则 步 warmup 后接 Cosine decay:

推导:为什么是余弦

余弦函数在 区间内从 缓慢下降( 处切线斜率接近 0),在 处开始加速下降,在 处迅速趋近 。这恰好对应训练的需求:

  • 前期(warmup 结束后):学习率保持相对平稳,避免骤降
  • 中后期(:学习率快速衰减,参数迅速稳定在极小值附近

若使用线性衰减(linear decay),则衰减速度均匀,无法体现”前期不需快衰减”的需求——这就是 Cosine 取代 Linear 成为 Transformer 标准衰减的原因。

Cosine vs Step decay 的对比

维度Cosine DecayStep Decay
衰减平滑度连续、平滑非连续跳变
中后期衰减速度快(更符合精细化需求)均匀
收敛稳定性更好(无跳变冲击)可能有尖峰
实现复杂度略高(需计算 cos)极低
典型应用Transformer、LLM 训练视觉分类 ResNet

实战经验

Cosine decay 是 Transformer 训练的标准衰减方式。BERT、GPT、LLaMA 均使用 Cosine decay + linear warmup 组合。学习率曲线在 warmup 结束后先平缓(约 60%~80% 的 )约 的时间,然后持续下降至接近 0。PyTorch 实现: 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

神经网络训练初期存在两个不稳定因素:

  1. 参数分布未稳定:初始参数(尤其是 BatchNorm 的移动均值/方差和 LayerNorm 的参数)在训练初期会快速变化,直接使用大学习率可能导致参数大幅跳动
  2. 残差连接信号放大:在 Transformer 中,残差路径使得每一层的信号方差在层间累积。若初始阶段所有层的梯度同向叠加,可能导致信号爆炸(尤其在 pre-norm 架构中)

Warmup 在前 步使用线性增长的(或常数)学习率:

这让参数在训练初期以小步长缓慢调整,逐渐建立稳定的梯度流。

Warmup 的数学推导

考虑 Transformer 的残差路径:第 层的输出 。设 SubLayer 初始输出方差为 ,则 层后的信号方差为 。若 很大(如 12 层、24 层),初始信号方差可能爆炸。

Warmup 的作用是:在参数方差仍在调整的阶段,将学习率限制在较小值,从而限制每个 step 的参数更新幅度,使各层信号方差逐渐稳定到合理量级。

Warmup 步数如何确定

主流配置(经验上常见):

模型规模Warmup 步数占总步数比例
小模型(< 100M 参数)1000 ~ 50001% ~ 5%
中等模型(100M ~ 1B)5000 ~ 100001% ~ 3%
大模型(> 1B,如 LLaMA)2000 ~ 20000< 1%(总步数巨大)

关键原则:总步数越多,warmup 占比越小。LLaMA 的 1.4T token 预训练使用约 2000 warmup steps,但总步数在百万量级,warmup 占比不到 0.2%。

Warmup 的类型

类型形式适用场景
Linear warmup通用,Transformer 标准
Constant warmup for 极少用(过于激进)
Cosine warmup 或分阶段 cos极少数自定义实现
Exponential warmup不推荐,前几步增长太快

Linear warmup 是事实标准。Constant warmup 在某些实现中出现,但效果不如 linear。


3.7 Cyclical / OneCycle(周期学习率)

OneCycle 的形式(Smith, 2018)

OneCycle 将学习率分为三个阶段:

  1. Warmup 阶段:从 线性增长到
  2. Annealing 阶段:从 余弦衰减到
  3. Supermaximum 阶段(可选):短期使用超过 的学习率

典型配置:

为什么有效

OneCycle 的核心思想是:训练初期用较小学习率建立稳定路径,中期用较大学习率快速探索,最后余弦衰减精细化。“Supermaximum” 阶段利用”大学习率可能跳出更好的极小值”的直觉,在收敛末期再做一次强化探索。

局限性

OneCycle 需要 batch size 固定且较大(否则学习率缩放不成立),且 需要精心设置。在大模型训练(需要 warmup + 长步数)中,OneCycle 不如 standard cosine decay 常用。

实战经验

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 增大 倍,学习率也增大 倍,可维持同样的训练动态。但此规则仅适用于 SGD,Momentum 的噪声特性使其对 batch size 变化有更好的容错性

方案 2:平方根缩放(Sqrt Scaling)

对于 Adam,线性缩放过于激进,平方根缩放更合适(因为 Adam 的自适应学习率已经部分补偿了噪声变化)。

4.2 梯度累积与学习率

梯度累积(gradient accumulation)用于在有限显存下模拟大 batch:累积 个 mini-batch 的梯度后执行一次参数更新,总 batch size =

关键点:梯度累积不影响学习率设置——因为有效 batch size 就是 ,学习率应按有效 batch size 缩放。例如,若单个 batch ,累积 4 步,则有效 ,学习率应按 设置(而非按单步 )。


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)低秩适配,更新量小 通常设为 ~ (按 rank 缩放)
BERT 微调(分类头)backbone 预训练,分类头随机初始化backbone: ;分类头: ~

为什么微调学习率要小

预训练的 backbone 已经”学会了有用的特征”,大学习率会破坏这些特征,导致灾难性遗忘(catastrophic forgetting)。微调阶段使用小学习率,在预训练知识的基础上做轻微调整。

微调是否需要 warmup

通常不需要。预训练模型已经过了初始不稳定阶段,微调时直接使用目标学习率即可。但若微调数据集很小(< 10K 样本),warmup(200~500 steps)可以帮助稳定训练,防止少样本过拟合。


6. 训练后期为什么常常降学习率

6.1 直观解释

训练后期,参数已在某个极小值附近。大的学习率会使参数在这个极小值附近振荡,无法精细化。降低学习率后,参数振荡幅度减小,可以更精确地收敛到极小值点。

6.2 从收敛率理论理解

在凸优化中,使用恒定学习率 的 SGD 收敛到 -最优解需要 步;若学习率按 衰减,则收敛率可提升至 。这是因为衰减的学习率在后期提供更精细的搜索。

6.3 经验现象:后期降 LR 后 loss 突然下降

这是常见的正常现象。原因是:训练中期由于学习率相对较大,参数在某个较浅的极小值点附近振荡,降低学习率后,参数才有机会越过当前极小值,找到更深(更平坦)的极小值点。这一现象说明:后期降 LR 不是”修复”错误,而是训练的自然过程


7. 学习率与优化器、Batch Size、梯度累积的联动

7.1 联动公式

综合来看,影响有效学习率的因素有:

其中 是参考 batch size(如 256)。

Adam 的二阶矩修正因子 在训练初期( 小)接近 ,会放大有效学习率——这正是为什么 Adam 在训练初期需要 warmup 的另一个原因。

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 的 不设为 0)

9. 实战中的默认推荐

9.1 视觉分类(从头训练)

阶段策略参数
WarmupLinear warmup5 epochs, from to
主训练Cosine decay epochs,
优化器SGD + Momentum, weight decay =

9.2 Transformer 预训练(大模型)

阶段策略参数
WarmupLinear warmup2000 steps(不按 epoch),from to
主训练Cosine decay(不衰减到零)
优化器AdamW, ,
按模型规模< 1B: ;1B~7B: ;> 7B:

9.3 BERT 微调(分类任务)

阶段策略参数
Warmup通常不需要若需要:200~500 steps linear
主训练Constant(恒定)(经验最优)
分类头独立学习率backbone: ;head: ~
优化器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 替代学习率衰减