Learning Rate
学习率控制训练期间每次权重更新的幅度。内容涵盖学习率过高为何会导致发散、过低为何会导致停滞,以及预热、衰减计划和调优。
学习率是决定每个训练步骤中模型权重更新幅度的超参数。梯度下降会计算损失函数的梯度;梯度指向损失增长最快的方向,并据此按 w ← w − η × gradient 更新每个权重,其中 η(eta)是学习率。步长是它的同义词,代码中通常将其称为 lr。合适的学习率能让神经网络快速收敛到较好的解;不合适的学习率则会导致训练发散或进展缓慢。因此,Leslie Smith 的周期性学习率论文将其称为最值得调优的超参数,尤其适用于深度网络。
过高、过低与恰到好处#
学习率需要在速度和稳定性之间权衡:
- 过高:每一步都会越过最小值。损失会振荡、跳变或不断增长,最终变成 NaN,训练也会发散。
- 过低:每一步对权重的改动都很小。损失下降缓慢,训练需要更多轮次才能收敛;如果训练预算固定,训练结束时模型会欠拟合。
- 设置合适:损失稳定下降,并最终在最小值附近趋于平稳。
下面的 PyTorch 脚本从相同的初始点出发,使用四种学习率来最小化损失 w²:
import torch
# Minimize loss = w**2 (lowest at w = 0) from the same start with four learning rates
for lr in (0.01, 0.1, 0.9, 1.1):
w = torch.tensor(5.0, requires_grad=True)
optimizer = torch.optim.SGD([w], lr=lr)
path = []
for step in range(20):
optimizer.zero_grad()
loss = w**2
loss.backward()
optimizer.step() # w = w - lr * gradient
path.append(w.item())
print(f"lr={lr}: first steps {[round(v, 2) for v in path[:3]]}, after 20 steps w={path[-1]:.3f}")学习率为 0.01 时,20 步后权重仅从 5 缓慢降至 3.338;学习率为 0.1 时,权重降至 0.058。学习率为 0.9 时,权重每一步都会改变符号(−4.0、3.2、−2.56),但仍会收敛至 0.058;学习率为 1.1 时,每一步的越界幅度都会增大,权重最终升至 191.688。对于二次函数,只有当学习率小于 2 除以损失函数的曲率(即二阶导数)时,梯度下降才保持稳定。w² 的曲率为 2,因此这里的上限恰好为 1.0,而学习率为 0.5 时一步就能到达最小值。对于真实网络,损失最陡方向决定的也是这类上限,因此适用于某个模型或批次大小的学习率,可能会导致另一个模型发散。
学习率调度策略#
训练过程中很少会从头到尾使用同一个学习率。调度策略会随时间改变学习率:
- 预热:从较小的学习率开始,在最初几个轮次或迭代中逐步提高,从而防止最初几次迭代中幅度较大且不稳定的梯度破坏训练稳定性。
- 阶梯衰减:在指定轮次或验证损失进入平台期时,将学习率除以一个固定系数,通常为 10。
- 线性衰减与余弦衰减:平滑地将学习率降至较小的最终值。余弦退火沿半个余弦波变化,而带有热重启的变体会在每个新周期开始时将学习率跳回较高值。
- 周期策略和单周期策略:训练期间在较低值和较高值之间调整学习率。
较大的前期步长能让权重快速接近较好的区域,较小的后期步长则使权重稳定在某个最小值附近,而不是来回振荡。YOLO26 在 Ultralytics 中训练 从 lr0 开始,在 warmup_epochs(默认值为 3)期间预热,然后线性衰减至 lr0 * lrf,或按照余弦曲线衰减至 cos_lr=True。使用默认的 optimizer="auto" 时,训练器会自行选择优化器和初始学习率:迭代次数超过 10,000 次时使用学习率为 0.01 的 MuSGD,否则使用学习率根据类别数量调整的 AdamW,因此只有在明确设置优化器时,lr0 才适用:
from ultralytics import YOLO
# 加载预训练的 YOLO26 nano 模型
model = YOLO("yolo26n.pt")
# 显式指定优化器后 lr0 才会生效;学习率沿余弦曲线衰减至 lr0 * lrf
results = model.train(data="coco8.yaml", epochs=10, optimizer="SGD", lr0=0.01, lrf=0.01, cos_lr=True)选择初始值#
常见的初始学习率是:随机梯度下降(SGD)搭配动量时为 0.01 到 0.1,Adam 优化器为 0.001,这是 Adam 论文推荐的默认值。微调预训练模型时,学习率要比从头开始训练时更小,因为较大的步长会覆盖使迁移学习奏效的特征。
同一篇周期学习率论文中的学习率范围测试,在 fastai 中封装为学习率查找器,可以通过一次短暂运行找到合适的值。它会在记录损失的同时,在每个小批次后提高学习率;有效范围是损失下降最快、但尚未开始爆炸的区间。










