学习率预热是什么?
学习率预热(Learning Rate Warmup) 是一种在深度学习训练初期逐渐增加学习率的策略。其核心思想是:在训练开始时使用较小的学习率,逐步增加到目标学习率,以避免模型参数在初始阶段因学习率过大而剧烈波动,导致训练不稳定。
数学公式(线性预热)
假设目标学习率为 lrtargetlr_{target}lrtarget,预热总步数为 TwarmupT_{warmup}Twarmup,当前步数为 t(0≤t<Twarmup)t(0≤t<T_{warmup})t(0≤t<Twarmup),则预热阶段的学习率 lrtlrt 可表示为:
lrt=lrtarget⋅tTwarmuplr_t=lr_{target}⋅\frac{t}{T_{warmup}}lrt=lrtarget⋅Twarmupt
如果预热阶段结束后,学习率会保持lrtargetlr_{target}lrtarget 或根据其他策略(如衰减)调整。
学习率预热的作用
-
缓解模型初始不稳定
模型参数在训练初期是随机初始化的,若直接使用大学习率更新参数,可能导致梯度爆炸或震荡。预热阶段通过小学习率逐步调整参数,使模型逐渐稳定。 -
加速收敛
预热后,学习率达到目标值,模型可以更快地收敛。例如,在Transformer模型中,预热策略能显著提升训练效率。 -
防止过拟合
初始阶段的小学习率有助于模型在数据分布上“探索”,避免过早过拟合到局部特征。
图示说明(文字描述)
假设预热总步数为 100,目标学习率为 0.001,则学习率变化如下:
学习率变化曲线:
|
| /\
| / \
| / \
| / \
| / \
| / \
| / \
| / \
| / \
|/__________________\______> 步数0 50 100
- 前 100 步(预热阶段):学习率从 0 线性增加到 0.001。
- 第 100 步后:学习率保持 0.001 或按衰减策略调整。
生活中的例子
-
开车起步
想象你驾驶一辆新车,如果直接猛踩油门,车可能会突然加速导致失控。相反,缓慢踩下油门(预热阶段),让车速逐渐提升到目标速度(目标学习率),能更安全地行驶。 -
健身锻炼
刚开始跑步时,如果直接全力冲刺,容易肌肉拉伤或疲劳。通常会先慢走或慢跑热身(预热阶段),再逐渐加速到正常强度。
实现代码(PyTorch 示例)
from torch.optim.lr_scheduler import LambdaLR
import torch.optim as optim# 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)# 预热总步数
T_warmup = 100# 定义学习率调度器
scheduler = LambdaLR(optimizer, lr_lambda=lambda t: t / T_warmup if t < T_warmup else 1.0)# 训练循环
for step in range(total_steps):# 训练代码...optimizer.step()scheduler.step()
学习率预热策略数学公式及说明
1. 线性预热 (Linear Warmup)
lrt=lrtarget⋅tTwarmuplr_t=lr_{target}⋅\frac{t}{T_{warmup}}lrt=lrtarget⋅Twarmupt
原理:学习率随时间线性增长
场景:最基础常用的预热方式,适用于大多数深度学习任务,BERT/GPT常用
2. 余弦预热 (Cosine Warmup)
lrt=lrmax⋅1−cos(π⋅tTwarmup)2lr_t=lr_{max}⋅\frac{1−cos(π⋅\frac{t}{T_{warmup}})}{2}lrt=lrmax⋅21−cos(π⋅Twarmupt)
原理:平滑的余弦曲线增长
场景:需要更平缓过渡的视觉任务(如CNN、ResNet)
3. 指数预热 (Exponential Warmup)
lrt=lrmax⋅(1−e−αt/Twarmup)lr_t=lr_{max}⋅(1−e^{−αt/T_{warmup}})lrt=lrmax⋅(1−e−αt/Twarmup)
原理:指数趋近目标学习率(α控制增长速率)
场景:对初始学习率敏感的模型,需要平滑过渡的场景
4. 平方根预热 (Sqrt Warmup)
lrt=lrmax⋅tTwarmuplr_t=lr_{max}⋅\sqrt{\frac{t}{T_{warmup}}}lrt=lrmax⋅Twarmupt
原理:初期增长快,后期趋缓
场景:配合自适应优化器使用
5. 阶梯预热 (Step Warmup)
lrt=lrmax⋅⌊t/s⌋Nlr_t = lr_{max} \cdot \frac{\lfloor t/s \rfloor}{N}lrt=lrmax⋅N⌊t/s⌋
原理:分阶段跳跃式增长
场景:分布式训练等特殊需求
其中:
-
ttt:当前训练步数
-
TwarmupT_{warmup}Twarmup:预热总步数
-
lrmaxlr_{max}lrmax:目标学习率
-
sss:阶梯步长(仅阶梯预热)
-
NNN:阶梯数(仅阶梯预热)
-
ααα:指数系数(通常取5)
总结
学习率预热通过渐进式调整学习率,解决了训练初期的三大问题:参数震荡、梯度统计量不准确和优化器偏差。其核心价值在于:
-
稳定训练:避免初期高学习率导致的发散。
-
提升收敛:帮助模型找到更优的优化路径。
-
适配大模型:尤其对Transformer、LLM等架构至关重要26。
实践建议:
-
预热步数:通常设为总训练步数的5%~20%(如BERT用10%)。
-
峰值学习率:根据任务调整(大模型常用1e−41e-41e−4~5e−45e-45e−4)。
-
结合衰减策略:如“预热+余弦退火”效果更佳。