• Pytorch torch.optim.lr_scheduler API如何调整学习率


    1. 如何调整学习率

    torch.optim.lr_scheduler提供了多种方法来根据epoch的大小调整学习率。

    torch.optim.lr_scheduler.ReduceLROnPlateau允许基于一些验证测量的动态学习率降低。

    优化器更新后再使用学习率调度;例如:

    model = [Parameter(torch.randn(2, 2, requires_grad=True))]
    optimizer = SGD(model, 0.1)
    scheduler = ExponentialLR(optimizer, gamma=0.9)
    
    for epoch in range(20):
        for input, target in dataset:
            optimizer.zero_grad()
            output = model(input)
            loss = loss_fn(output, target)
            loss.backward()
            optimizer.step()
        scheduler.step()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2. Pytorch 学习率相关API

    lr_scheduler.LambdaLR

    torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
    
    • 1

    将每个参数组的学习率设置为初始 lr 乘以给定函数。

    lr_scheduler.MultiplicativeLR

    torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
    
    • 1

    将每个参数组的学习率乘以指定函数中给出的因子。

    lr_scheduler.StepLR

    torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1, verbose=False)
    
    • 1

    StepLR和ExponentialLR差不多,区别是不是每一次调用step()都进行学习率调整,而是每隔step_size才调整一次。

    lr_scheduler.MultiStepLR

    torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1, verbose=False)
    
    • 1

    当epoch 的数量满足规定值中的情况时,通过 gamma 因子衰减每个参数组的学习率。StepLR每隔step_size就调整一次学习率,而MultiStepLR则根据用户指定的milestones进行调整,假设milestones是[2, 5, 9],在[0, 2)是lr,在[2, 5)是lr * gamma,在[5, 9)是lr * (gamma **2),在[9, )是lr * (gamma **3)。

    lr_scheduler.ConstantLR

    torch.optim.lr_scheduler.ConstantLR(optimizer, factor=0.3333333333333333, total_iters=5, last_epoch=-1, verbose=False)
    
    
    • 1
    • 2

    将每个参数组的学习率衰减一个小的常数因子,直到epoch的数量达到一个预先定义的结果:total_ters。ConstantLR和固定学习率差不多,唯一的区别是在前total_iters,学习率为初始学习率 * factor,需要注意的是由于factor取值范围是[0, 1],所以这是一个学习率递增的策略。

    lr_scheduler.LinearLR

    torch.optim.lr_scheduler.LinearLR(optimizer, start_factor=0.3333333333333333, end_factor=1.0, total_iters=5, last_epoch=-1, verbose=False)
    
    • 1

    LinearLR和固定学习率也差不多,唯一的区别是在前total_iters,学习率先线性增加或递减,然后再固定为初始学习率 * end_factor。

    lr_scheduler.ExponentialLR

    torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1, verbose=False)
    
    • 1

    学习率呈指数衰减,当然也可以将gamma设置为>1,进行指数增加,不过估计没人愿意这么做。
    每个 epoch 衰减每个参数组的学习率。

    lr_scheduler.CosineAnnealingLR

    torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=- 1, verbose=False)
    
    • 1

    CosineAnnealingLR和CosineDecayLR很像,区别在于前者不仅包含余弦衰减的过程,也可以包含余弦增加,在前T_max步,学习率由lr余弦衰减到eta_min, 如果cur_step > T_max,然后再余弦增加到lr,不断重复这个过程。

    lr_scheduler.ChainedScheduler

    torch.optim.lr_scheduler.ChainedScheduler(schedulers)
    
    • 1

    Chains list of learning rate schedulers.

    lr_scheduler.SequentialLR

    torch.optim.lr_scheduler.SequentialLR(optimizer, schedulers, milestones, last_epoch=- 1, verbose=False)
    
    • 1

    Receives the list of schedulers that is expected to be called sequentially during optimization process and milestone points that provides exact intervals to reflect which scheduler is supposed to be called at a given epoch.

    lr_scheduler.ReduceLROnPlateau

    torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08, verbose=False)
    
    • 1

    当指标停止改进时降低学习率。

    lr_scheduler.CyclicLR

    torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=- 1, verbose=False)
    
    • 1

    根据循环学习率策略 (CLR) 设置每个参数组的学习率。

    lr_scheduler.OneCycleLR

    torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr, total_steps=None, epochs=None, steps_per_epoch=None, pct_start=0.3, anneal_strategy='cos', cycle_momentum=True, base_momentum=0.85, max_momentum=0.95, div_factor=25.0, final_div_factor=10000.0, three_phase=False, last_epoch=- 1, verbose=False)
    
    • 1

    根据 1cycle learning rate policy 设置每个参数组的学习率。

    lr_scheduler.CosineAnnealingWarmRestarts

    torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=- 1, verbose=False)
    
    • 1
  • 相关阅读:
    python+django高校体育乒乓球场地预约管理系统_s2409
    《性能之巅第2版》阅读笔记(二)--CPU监测
    在Microsoft Exchange Server 2007中安装SSL证书的教程
    滨州注册商标材料清单
    网络类型及数据链路层的协议
    没有任何销售经验怎么管理销售团队?
    C++运算符优先级一览表
    Rust 中使用 :: 这种语法的几种情况
    LayaBox---TypeScript---JavaScript文件类型检查
    消息队列实现进程之间通信方式代码,现象
  • 原文地址:https://blog.csdn.net/KyrieHe/article/details/126049267