qinghuan
← 模型训练与评估契约目录

MODEL TRAINING / 补充讲义 6 / 7

学习率调度的调用顺序与步进单位

把实际更新使用的学习率与调度后的值分开,核对梯度累积下的两套计数。

学会累积梯度后,还要检查什么时候改变学习率。学习率调度器改变后续更新的步长;它不会自动识别一轮训练已经结束,调用位置由训练循环决定。

先固定顺序,再固定计数单位

在本节的 StepLR 用法中,先执行优化器更新,再推进调度器。把 scheduler.step() 放到优化器更新之前,可能跳过计划中的第一个学习率值。PyTorch optim 顺序说明

StepLR 的官方示例在轮末调用,每隔 step_size 轮按 gamma 衰减。这里的“轮”依赖调用约定:把同一调用移到每个微批次后,就改变了实际衰减速度。不能由 StepLR 推断所有调度器都按轮调用。StepLR API 与示例

练习一 记录实际更新用到的学习率

用 CPU 单参数、无动量 SGD,初始学习率 0.1;设置 StepLR(step_size=2, gamma=0.5)。连续三轮,每轮执行一次优化器更新,轮末再调用调度器。

记录两个时点:optimizer.step() 之前的参数组学习率,以及轮末 scheduler.get_last_lr()。按这份契约推导:

轮次本轮更新使用的学习率轮末调度后的学习率
10.10.1
20.10.05
30.050.05

用浮点容差断言这份序列。再将调度器移到轮首作为故障对照,记录警告和实际使用的步长,不只看最终损失。表中是限定设置下的预期值,尚未运行验证。

练习二 将调度次数与梯度累积分开

沿用梯度累积的归一化约定,每轮 4 个微批次,每 2 个微批次更新一次参数,共 3 轮;StepLR 仍只在每轮结束推进一次。

日志应包含 6 次优化器更新和 3 次显式调度器调用,且能关联每一次参数更新真正使用的学习率。故意改成每个微批次调用调度器,验收应识别调用次数与计划不符。调度器内部初始化的状态不应误计为训练循环显式调用。

交付记录与边界

提交微批编号、优化器更新编号、轮次、每次实际使用的学习率,以及每次调度后的学习率。把记录放在实际调用附近,比仅打印 epoch 更容易定位提前衰减问题。

两项练习均未运行。混合精度跳过更新、分布式训练、断点恢复、多调度器叠加和依赖验证指标的调度方式不在本节范围内;加入这些机制后,需要重新定义计数与恢复检查。本节也不替代梯度累积的归一化验收。

来源与版本

来源为 PyTorch 2.14 optim 与 StepLR。原资料在 2026-10-26 18:12 JST 核查,记录 optim 页面创建于 2025-06-13、更新于 2026-05-10;StepLR 单页独立发布日期未核实。本次于 2026-10-30 复核调用顺序、衰减周期和示例;未核查用户安装版本。