Skip to content

学习率调度器

学习率调度器是深度学习训练的 “关键辅助”—— 核心是给登山者动态调整步长:前期大步快冲(快速逼近最优解),后期小步稳走(避免震荡过冲),还能解决固定学习率 “前期慢、后期乱、易过拟合” 的痛点,让模型收敛又快又稳。

一、核心逻辑:为啥需要 “智能控节奏”?(固定学习率的 3 大坑)

固定学习率就像登山只走一个步长,迟早掉坑:

  1. 步长太大:前期冲得快,但后期在山脚来回晃(参数不收敛),甚至冲过山崖(发散);

  2. 步长太小:全程慢走,不仅训练时间长,还可能卡在半山腰(次优解);

  3. 过拟合:后期步长不变,模型 “死记硬背” 训练数据,测试效果差。

而学习率调度器的作用是:按训练进度动态调步长—— 前期 “探索型大步”(快速找大致方向),后期 “收敛型小步”(精准逼近最优解),兼顾速度和稳定性,还能减轻过拟合。

二、5 种经典调度策略:登山的 “专属节奏”(通俗类比 + 实战)

所有策略都遵循 “先快后慢” 核心,PyTorch 均已封装,直接调用即可,关键选对 “节奏” 适配场景:

1. 平方根调度器(Square Root):“匀速减速”

  • 通俗类比:登山时体力逐渐消耗,步长随时间慢慢缩小,全程节奏平稳;

  • 核心原理:学习率 ,随迭代次数根号衰减,前期降得快,后期降得慢;

  • 适用场景:凸问题、简单模型(如线性回归),无需手动设减速节点;

  • PyTorch 自定义代码:

python
class SquareRootScheduler:
    def __init__(self, lr=0.1):
        self.lr = lr
    def __call__(self, num_update):
        return self.lr * pow(num_update + 1.0, -0.5)  # 初始学习率0.1
# 训练时传入调度器
net = net_fn()
trainer = torch.optim.SGD(net.parameters(), lr=0.1)
train(net, train_iter, test_iter, 30, loss, trainer, device, scheduler=SquareRootScheduler())
  • 效果:收敛曲线平滑,过拟合比固定学习率轻。

2. 单因子调度器(Factor):“按比例减速”

  • 通俗类比:登山时每走一步,步长就按固定比例缩小(如每次缩为原来的 0.9),直到步长不小于最小值;

  • 核心原理: 是衰减因子(常用 0.9), 避免步长为 0;

  • 适用场景:通用简单模型,想简单减速又不想复杂配置;

  • 关键参数: (衰减比例)、 (最小步长)。

3. 多因子调度器(Multi-Factor):“到点减速”(实战首选)

  • 通俗类比:登山前定好 “减速节点”(如爬到 1500 米、3000 米),到点就把步长减半,精准把控节奏;

  • 核心原理:预设里程碑(milestones),比如 [15, 30](第 15、30 轮),到节点就按因子 (常用 0.5)降学习率;

  • 适用场景:深度学习主流场景(CNN、Transformer),效果稳、易调参;

  • PyTorch 内置代码:

python
net = net_fn()
trainer = torch.optim.SGD(net.parameters(), lr=0.5)
# 第15、30轮时学习率减半
scheduler = torch.optim.lr_scheduler.MultiStepLR(trainer, milestones=[15, 30], gamma=0.5)
train(net, train_iter, test_iter, 30, loss, trainer, device, scheduler=scheduler)
  • 核心优势:测试准确率比固定学习率高 2%~5%,过拟合明显减轻。

4. 余弦调度器(Cosine):“先缓后快再稳”

  • 通俗类比:登山步长先慢慢减,中期降速加快,后期又慢慢减,像余弦曲线,避免后期 “急刹”;

  • 核心原理: 是最大迭代轮数(如 20);

  • 适用场景:计算机视觉(CV)任务(ResNet、YOLO),适配视觉模型的收敛特性;

  • 关键参数: (降速周期)、 (最终步长,避免为 0);

  • PyTorch 自定义代码:

python
import math
class CosineScheduler:
    def __init__(self, max_update, base_lr=0.3, final_lr=0.01):
        self.max_update = max_update
        self.base_lr = base_lr
        self.final_lr = final_lr
    def __call__(self, epoch):
        if epoch <= self.max_update:
            return self.final_lr + (self.base_lr - self.final_lr) * (1+math.cos(math.pi*epoch/self.max_update))/2
        return self.final_lr

5. 预热(Warmup):“先热身再冲刺”

  • 通俗类比:登山初期先慢走热身(步长线性递增),避免一开始冲太快摔倒,热身结束后按其他策略减速;

  • 核心原理:前 轮(如 5 轮)学习率从 0 线性涨到 ,再按余弦 / 多因子调度减速;

  • 适用场景:深层网络(Transformer、深层 CNN)、参数随机初始化波动大的模型;

  • 核心作用:防止模型初期发散,深层网络测试准确率可提升 3% 左右;

  • 关键参数:warmup_steps=5(预热轮数,不宜过长,否则拖慢训练)。

三、实战技巧:调度器的 “最佳搭配”(避坑 + 增效)

1. 优化器 + 调度器黄金组合

  • 通用场景:Adam + 多因子调度器(lr=0.01,milestones=[20,40],gamma=0.5);

  • CV 场景:SGD + 余弦调度器(warmup_steps=5);

  • NLP 场景:AdamW + 余弦调度器(适配 Transformer 特性);

2. 步长调整原则

  • 初始步长:SGD 可设 0.1\0.5,Adam 需设 0.001\0.01(自适应优化器对步长更敏感);

  • 后期步长:不小于 1e-6,避免模型停止更新;

3. 避坑指南

  • 不要频繁降步长:比如每 5 轮降一次,会导致前期收敛不足;

  • 自适应优化器(Adam/AdaGrad)也需要调度器:自带步长调整,但后期加调度器能进一步提升稳定性;

  • 过拟合缓解:调度器通过后期减小步长,让参数更接近 “简单模型”,自然减轻过拟合。

四、核心总结

  1. 学习率调度器的本质:动态平衡 “探索速度” 和 “收敛精度”,是深度学习训练的 “必备工具”;

  2. 策略选型口诀:通用选多因子,CV 选余弦,深网加预热,简单模型用平方根 / 单因子;

  3. 关键认知:调度器不能替代优化器,但能让优化器 “如虎添翼”—— 相同优化器下,用调度器的模型收敛更快、泛化更好。

记住:登山的关键不是全程快,而是 “该快时快,该稳时稳”,调度器就是帮你精准把控这个节奏的 “智能向导”,用好它能让模型训练少走很多弯路~

(注:文档部分内容可能由 AI 生成)

京ICP备2024093538号-1