• 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
  • 相关阅读:
    Nginx中间件服务:负载均衡(调度算法)
    python r代表什么意思
    如何评估测试用例的优先级?
    Nacos集群搭建
    《动手学深度学习》(八) -- 多尺度标检测和单发多框检测
    LDAP、OpenLDAP和Active Directory的区别(上)
    Python的加密
    【面经】特斯拉大数据开发笔经
    图像阈值分割(一)
    SpringBoot一站式功能提供框架(二)Mybatis Plus分页、Websocket 消息推送、提取word--柚子真好吃
  • 原文地址:https://blog.csdn.net/KyrieHe/article/details/126049267