学习率调度器
按 epoch、实际参数更新或验证指标改变学习率。
学习目标
- 四步余弦调度的端点与中点
- 平台调度器应监控训练还是验证损失?
- 说明:调度曲线不是收敛证明;总预算改变后必须重新核对进度单位。
为什么需要这个概念
学习率调度将训练进度或验证反馈映射为学习率。固定阶梯、余弦、热身、单周期和平台衰减分别表达不同的时间或反馈假设。
学习前需要掌握
背景与问题
训练初期大步探索、后期小步调整是常见策略,但学习率不能只凭曲线名称设置。总更新数、热身长度和调用位置都决定真正执行的序列。
概念定义
学习率调度将训练进度或验证反馈映射为学习率。固定阶梯、余弦、热身、单周期和平台衰减分别表达不同的时间或反馈假设。
直观理解
调度表像按里程安排速度。如果把每个数据批当作里程,而实际两批才更新一次,速度表会提前走完。
核心原理
余弦衰减在指定区间把学习率从最大值平滑降到最小值。公式中的 t 与 T 必须是同一单位;若 T=1000 个更新,不能把 t 当 epoch。热身常用于逐渐放大学习率,长度也要记录单位。
StepLR、CosineAnnealingLR 等通常在优化器更新后调用,是否按批或按轮取决于配置。ReduceLROnPlateau 则需要验证指标,并在持续不改善时降低学习率,不能把它按普通无参数 step 使用。
断点恢复必须保留调度器计数与优化器当前学习率。改变 batch 大小、梯度累积或剩余预算后,还要决定延续原计划还是重定计划,避免日志看似连续、数值已经重启。
数学表达
核心公式
学习率调度将训练进度或验证反馈映射为学习率。固定阶梯、余弦、热身、单周期和平台衰减分别表达不同的时间或反馈假设。
变量含义
T调度总调用次数t当前调度步
计算步骤
- 1t=0 时使用 0.1。
- 2t=2 时余弦项为 0,学习率为 0.05。
- 3t=4 时达到 0。
代码对应位置
示例 1四步余弦调度的端点与中点的最小验证:使用完整构造输入核对四步余弦调度的端点与中点,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
T | 调度总调用次数 |
t | 当前调度步 |
完整数值示例
四步余弦调度的端点与中点
已知条件
- 初始学习率 0.1,eta_min=0,T_max=4
- 每个参数更新后推进一次
计算步骤
- t=0 时使用 0.1。
- t=2 时余弦项为 0,学习率为 0.05。
- t=4 时达到 0。
计算结果
更新后的调度值依次约为 0.085355、0.05、0.014645、0。
处理前后对比
- 调度曲线不是收敛证明;总预算改变后必须重新核对进度单位。
四步余弦调度的端点与中点
这里 T_max 指四次调度调用。代码同时打印起点,再逐次更新并打印下一步学习率,便于对应公式端点。
若训练只做两次更新,却每批调用四次,学习率会过早降到底。反之不推进则始终停留在初始值;两者都不能仅凭选择了 Cosine 名称保证正确。
计算与实现步骤
- t=0 时使用 0.1。
- t=2 时余弦项为 0,学习率为 0.05。
- t=4 时达到 0。
代码实现
示例 1
四步余弦调度的端点与中点的最小验证
example_01.py用途:使用完整构造输入核对四步余弦调度的端点与中点,输出只表示本例计算。
import torch
p = torch.nn.Parameter(torch.tensor(0.))
opt = torch.optim.SGD([p], lr=0.1)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=4)
print(f"t=0 lr={opt.param_groups[0]['lr']:.6f}")
for t in range(1, 5):
p.grad = torch.zeros_like(p)
opt.step()
scheduler.step()
print(f"t={t} lr={opt.param_groups[0]['lr']:.6f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对四步余弦调度的端点与中点,输出只表示本例计算。
Step 1 · 1–10 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
p = torch.nn.Parameter(torch.tensor(0.))
opt = torch.optim.SGD([p], lr=0.1)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=4)
print(f"t=0 lr={opt.param_groups[0]['lr']:.6f}")
for t in range(1, 5):
p.grad = torch.zeros_like(p)
opt.step()
scheduler.step()
print(f"t={t} lr={opt.param_groups[0]['lr']:.6f}")预期输出或运行结果
t=0 lr=0.100000 t=1 lr=0.085355 t=2 lr=0.050000 t=3 lr=0.014645 t=4 lr=0.000000
常见错误 · 4 条
- step 顺序反
- 所有 scheduler 放 epoch 末
- Plateau 不传指标
- 累积每微批推进
实际应用
- 训练后期逐步减小更新
- 按验证停滞触发学习率下降
常见错误
- step 顺序反
- 所有 scheduler 放 epoch 末
- Plateau 不传指标
- 累积每微批推进
常见问题
平台调度器应监控训练还是验证损失?
通常根据要优化的验证指标设置方向与耐心值;训练损失下降不能代表泛化改善。指标、mode 和评估频率必须一起记录。
这个示例能说明什么边界?
调度曲线不是收敛证明;总预算改变后必须重新核对进度单位。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。