PyTorch-学习率调度器(Learning Rate Scheduler)

PyTorch 学习率调度器(Learning Rate Scheduler)技术指南

目录

  1. 学习率调度器概念
  2. 常用学习率调度器
  3. 使用示例
  4. 选择合适的调度器

1. 学习率调度器概念

学习率(Learning Rate)是深度学习训练中最重要的超参数之一,它决定了模型参数更新的步长。设置合适的学习率对模型的训练效果和收敛速度至关重要。

学习率调度器(Learning Rate Scheduler)是PyTorch中用于在训练过程中自动调整学习率的工具。它允许我们根据训练的进度动态地改变学习率,从而实现更高效的训练过程。通常在训练初期使用较大的学习率以快速收敛,在训练后期降低学习率以精细调优。

在PyTorch中,学习率调度器位于torch.optim.lr_scheduler模块中,需要与优化器(Optimizer)配合使用。

2. 常用学习率调度器

2.1 StepLR

StepLR是最基础的学习率调度器之一,它每隔固定的epoch数将学习率乘以一个衰减因子。

参数

  • step_size:学习率衰减的间隔epoch数
  • gamma:衰减因子,默认为0.1
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于训练过程中定期衰减学习率的场景。

2.2 MultiStepLR

MultiStepLR是StepLR的扩展,允许在指定的epoch点进行学习率衰减。

参数

  • milestones:进行学习率衰减的epoch点列表
  • gamma:衰减因子,默认为0.1
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要在特定训练阶段调整学习率的场景。

2.3 ExponentialLR

ExponentialLR在每个epoch将学习率按指数函数进行衰减。

参数

  • gamma:指数衰减因子
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要平滑指数衰减学习率的场景。

2.4 CosineAnnealingLR

CosineAnnealingLR使用余弦函数将学习率从初始值调整到最小值,变化过程平滑。

参数

  • T_max:余弦函数的周期
  • eta_min:学习率的最小值,默认为0
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要周期性调整学习率的场景,如SGDR(随机梯度下降退火)。

2.5 ReduceLROnPlateau

ReduceLROnPlateau根据某个指标(如验证集损失)是否停止改善来调整学习率,是唯一一个需要传入指标值的调度器。

参数

  • mode:比较模式,'min'表示最小化指标,'max'表示最大化指标
  • factor:学习率衰减因子
  • patience:容忍指标没有改善的epoch数
  • threshold:衡量新最优值的阈值
  • threshold_mode:阈值模式,'rel'表示相对值,'abs'表示绝对值
  • cooldown:学习率降低后恢复正常操作前等待的epoch数
  • min_lr:学习率的下限
  • eps:学习率衰减的最小值
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要根据模型性能动态调整学习率的场景。

2.6 OneCycleLR

OneCycleLR实现了一种称为"1周期"的学习率策略,在一个训练周期内先增加后减少学习率。

参数

  • max_lr:学习率的上限
  • total_steps:总步数
  • epochs:训练总epoch数
  • steps_per_epoch:每个epoch的步数
  • pct_start:学习率增加阶段所占的百分比
  • anneal_strategy:退火策略,'cos'或'linear'
  • cycle_momentum:是否同时调整动量
  • base_momentum:动量下限
  • max_momentum:动量上限
  • div_factor:初始学习率因子
  • final_div_factor:最终学习率因子
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于快速训练场景,可以显著加快收敛速度。

2.7 LambdaLR

LambdaLR允许用户通过自定义函数来设置学习率调整策略。

参数

  • optimizer:优化器
  • lr_lambda:自定义函数或函数列表,用于计算学习率的乘法因子
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要完全自定义学习率调整策略的场景。

2.8 MultiplicativeLR

MultiplicativeLR通过用户自定义的函数逐epoch乘以一个因子来调整学习率。

参数

  • optimizer:优化器
  • lr_lambda:自定义函数或函数列表,用于计算学习率的乘法因子
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要逐epoch乘法调整学习率的场景。

2.9 ConstantLR

ConstantLR在预定义的epoch数内将学习率乘以一个常数因子,然后恢复原始学习率。

参数

  • optimizer:优化器
  • factor:学习率乘以的因子,默认为1/3
  • total_iters:应用因子的epoch数,默认为5
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于训练初期需要降低学习率的场景。

2.10 LinearLR

LinearLR在线性变化过程中逐渐调整学习率,从[start_factor]到[end_factor]。

参数

  • optimizer:优化器
  • start_factor:初始学习率乘以的因子,默认为1/3
  • end_factor:结束时学习率乘以的因子,默认为1.0
  • total_iters:线性变化的总epoch数,默认为5
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要线性调整学习率的场景。

2.11 PolynomialLR

PolynomialLR使用多项式函数来衰减学习率。

参数

  • optimizer:优化器
  • total_iters:学习率衰减的总步数,默认为5
  • power:多项式的幂次,默认为1.0
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要多项式衰减学习率的场景。

2.12 CosineAnnealingWarmRestarts

CosineAnnealingWarmRestarts使用余弦退火算法,并在每次重启时重置学习率。

参数

  • optimizer:优化器
  • T_0:第一次重启的迭代次数
  • T_mult:重启后增加T_i的因子,默认为1
  • eta_min:学习率下限,默认为0
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要周期性重启训练的场景。

2.13 CyclicLR

CyclicLR在两个学习率边界之间周期性调整学习率。

参数

  • optimizer:优化器
  • base_lr:学习率下限
  • max_lr:学习率上限
  • step_size_up:上升阶段的训练迭代次数,默认为2000
  • step_size_down:下降阶段的训练迭代次数,默认为None
  • mode:调整策略,可选'triangular'、'triangular2'、'exp_range'
  • gamma:'exp_range'策略中的常数因子
  • scale_fn:自定义缩放策略函数
  • scale_mode:定义scale_fn的评估方式,'cycle'或'iterations'
  • cycle_momentum:是否同时调整动量,默认为True
  • base_momentum:动量下限,默认为0.8
  • max_momentum:动量上限,默认为0.9
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要周期性调整学习率的场景。

2.14 SequentialLR

SequentialLR允许按顺序使用多个调度器,在不同的训练阶段使用不同的调度策略。

参数

  • optimizer:优化器
  • schedulers:调度器列表
  • milestones:切换调度器的epoch点列表
  • last_epoch:最后一个epoch索引,默认为-1
  • verbose:是否打印学习率更新信息,默认为False

使用场景:适用于需要在不同训练阶段使用不同调度策略的场景。

2.15 ChainedScheduler

ChainedScheduler可以链式调用多个调度器,同时应用多种调度策略。

参数

  • schedulers:调度器列表

使用场景:适用于需要同时应用多种调度策略的场景。

3. 使用示例

以下是一个使用学习率调度器的基本示例:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
import numpy as np

# 定义模型
model = nn.Sequential(
    nn.Linear(10, 5),
    nn.ReLU(),
    nn.Linear(5, 1)
)

# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)

# 选择一个学习率调度器
# 示例1: StepLR
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

# 示例2: ReduceLROnPlateau
# scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10)

# 示例3: CosineAnnealingWarmRestarts
# scheduler = lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=1)

# 示例4: OneCycleLR
# scheduler = lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, total_steps=100)

# 示例5: SequentialLR
# scheduler1 = lr_scheduler.ConstantLR(optimizer, factor=0.5, total_iters=5)
# scheduler2 = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
# scheduler = lr_scheduler.SequentialLR(optimizer, schedulers=[scheduler1, scheduler2], milestones=[5])

# 训练循环
for epoch in range(100):
    # 训练代码...
    train(...)
    
    # 验证代码...
    val_loss = validate(...)
    
    # 更新学习率
    # 对于大多数调度器
    scheduler.step()
    
    # 对于ReduceLROnPlateau
    # scheduler.step(val_loss)
    
    # 打印当前学习率
    print(f"Epoch {epoch+1}, Learning Rate: {optimizer.param_groups[0]['lr']}")

4. 选择合适的调度器

选择合适的学习率调度器需要考虑以下因素:

  1. 训练数据集大小:大数据集通常可以使用更复杂的学习率调度策略
  2. 模型复杂度:复杂模型可能需要更精细的学习率调整
  3. 训练时间要求:如果需要快速训练,可以考虑OneCycleLR等策略
  4. 验证指标监控:如果有可靠的验证指标,ReduceLROnPlateau是不错的选择
  5. 先验知识:如果有相关经验,可以使用StepLR或MultiStepLR

一般来说:

  • 如果刚开始训练模型,可以先尝试StepLR或MultiStepLR
  • 如果希望根据模型性能调整学习率,使用ReduceLROnPlateau(我个人很喜欢这个scheduler,方便快捷,其他的不见得有很大优势)
  • 如果追求快速训练,可以尝试OneCycleLR
  • 如果需要周期性训练,可以使用CosineAnnealingLR或CosineAnnealingWarmRestarts
  • 如果需要完全自定义学习率调整策略,可以使用LambdaLR
  • 如果需要组合多种调度策略,可以使用SequentialLR或ChainedScheduler

通过合理使用学习率调度器,可以显著提高模型训练的效率和最终性能。

posted @ 2025-09-19 11:47  aaooli  阅读(221)  评论(0)    收藏  举报