学习率调度:warmup 与衰减
学习率决定了参数每次沿梯度方向更新的步长。固定学习率常难两全:太大易震荡不收敛,太小则训练缓慢。学习率调度器在训练过程中按规则改变学习率,是训练 Transformer、卷积网络等模型的常规配置。
warmup:先小步热身
训练初期参数随机、梯度噪声大,若一上来就用大学习率容易不稳定。warmup 在前若干步(或若干 epoch)把学习率从接近 0 线性或余弦升到目标值,让优化先进入较平稳的区域,再转入正常调度。这在 Transformer 与大规模训练中尤为重要。
import torch
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4)
scheduler = torch.optim.lr_scheduler.LinearLR(
optimizer, start_factor=0.01, total_iters=1000) # 前 1000 步 warmup
衰减:后期收窄步长
warmup 之后常用衰减策略逐步减小学习率,让参数在盆地附近精细收敛。常见策略有:阶梯衰减(StepLR,按周期折半)、指数衰减、余弦退火(CosineAnnealing,平滑下降到接近 0)。余弦退火因收敛平滑、无需手调阈值而被广泛采用。
怎么选
小数据集与简单模型用固定或阶梯学习率往往足够;大模型与 Transformer 通常需要 warmup 配合余弦退火。调度参数(峰值、warmup 步数、最小学习率)需结合 batch size 与总步数一起调,batch 越大常可配更大峰值学习率。
小结
学习率调度通过 warmup 热身稳定早期训练、再用衰减在后期精细收敛,是控制优化节奏的核心手段。warmup 加余弦退火在大模型训练中已成为主流组合,但具体参数应随数据规模与 batch 大小一起实验确定。
参考与延伸阅读
- PyTorch 学习率调度器官方文档(含 LinearLR、CosineAnnealingLR)。已核验。https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate
- 论文「Attention Is All You Need」所用 Noam 调度(warmup 步数公式)。已核验。https://arxiv.org/abs/1706.03762
- Hugging Face 文档「Transformer 训练技巧中的学习率调度」。已核验。https://huggingface.co/docs/transformers/training
本文累计阅读 — 次