【tricks篇】学习率调整策略lr_scheduler

知乎对应:【tricks】学习率调整策略lr_scheduler
后期主要针对知乎进行更新~~~请移步知乎哦

学习率是深度学习训练中至关重要的参数,很多时候一个合适的学习率才能发挥出模型的较大潜力。
Pytorch中常见的学习率调整方法。


一、整体代码框架

Pytorch 实现的绘制学习率轮次变化图

import torch
import matplotlib.pyplot as plt
import torchvision.models as models
import torch.optim.lr_scheduler as lr_scheduler

# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False

def get_lr(optimizer):  # 从优化器中读取学习率
    for param_group in optimizer.param_groups:
        return param_group['lr']
 
if __name__ == "__main__":
    # ------------------------------------#
    #   神经网络模型
    # ------------------------------------#
    model = models.resnet18(pretrained=False)

    # ------------------------------------#
    #   训练设置
    # ------------------------------------#
    number_epoches = 500
    # 学习率和优化策略
    learning_rate = 1e-1
    optimizer = torch.optim.Adam(model.parameters(), learning_rate, weight_decay=5e-4)
    lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=1, gamma=0.9)

    epoches = []
    lrs = []
    for epoch in range(0, number_epoches):
        # =====================plot=============================
        epoches.append(epoch)
        lrs.append(learning_rate)
        # =====================train============================
        optimizer.step()
        # =====================updateLR=========================
        lr_scheduler.step()
        learning_rate = get_lr(optimizer)

    plt.plot(epoches, lrs)
    plt.xlabel('epoch')
    plt.ylabel('learning-rate')
    plt.title("StepLR")
    plt.axis([0, number_epoches, 0, 0.11])
    plt.show()

以上是一段通用代码,将初始学习率设置为0.1。

后面部分展示学习率调整策略的代码,以及对应的学习率曲线。


二、自带学习率调整策略

1、StepLR

这是最简单常用的学习率调整方法,每过step_size轮,将此前的学习率乘以gamma。
代码如下(示例):

lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.8)

每过50轮,将此前的学习率乘以0.8

2、MultiStepLR

MultiStepLR同样也是一个非常常见的学习率调整策略,它会在每个milestone时,将此前学习率乘以gamma。
代码如下(示例):

lr_scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[50, 200,400], gamma=0.5)

在这里插入图片描述

3、ExponentialLR

ExponentialLR是指数型下降的学习率调节器,每一轮会将学习率乘以gamma,所以这里千万注意gamma不要设置的太小,不然几轮之后学习率就会降到0。

lr_scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)

在这里插入图片描述

4.、LinearLR

LinearLR是线性学习率,给定起始factor和最终的factor,LinearLR会在中间阶段做线性插值。

比如学习率为0.1,起始factor为1,最终的factor为0.2,那么第0次迭代,学习率将为0.1,最终轮学习率为0.02。

lr_scheduler = lr_scheduler.LinearLR(optimizer, start_factor=1, end_factor=0.2, total_iters=80)

训练100轮,但total_iters=80,所以超过80时,学习率恒定。

5、循环学习率 CyclicLR

CyclicLR的参数要更多一些,它的曲线看起来就像是不断的上坡与下坡。base_lr为谷底的学习率,max_lr为顶峰的学习率,step_size_up是从谷底到顶峰需要的轮数,step_size_down时从顶峰到谷底的轮数。

lr_scheduler = lr_scheduler.CyclicLR(optimizer, base_lr=0.02, max_lr=0.1, step_size_up=30, step_size_down=10,
                                         cycle_momentum=False)

在这里插入图片描述

6、OneCycleLR

OneCycleLR顾名思义就像是CyclicLR的一周期版本,它也有多个参数,max_lr就是最大学习率,pct_start是学习率上升部分所占比例,一开始的学习率为 max_lr / div_factor,最终的学习率为 max_lr / final_div_factor,总的迭代次数为total_steps。

lr_scheduler = lr_scheduler.OneCycleLR(optimizer, max_lr=0.1, pct_start=0.5, total_steps=100, div_factor=10,
                                           final_div_factor=10)

在这里插入图片描述

7、CosineAnnealingLR

CosineAnnealingLR是余弦退火学习率,T_max是周期的一半,最大学习率在optimizer中指定,最小学习率为eta_min。这里同样能够帮助逃离鞍点。值得注意的是最大学习率不宜太大,否则loss可能出现和学习率相似周期的上下剧烈波动。

lr_scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=20, eta_min=0.02)

在这里插入图片描述

8、SequentialLR

SequentialLR可以将多个学习率调整策略按照顺序串联起来,在milestone时切换到下一个学习率调整策略。下面就是将一个指数衰减的学习率和线性衰减的学习率结合起来。

lr_scheduler = lr_scheduler.SequentialLR(optimizer, schedulers=[lr_scheduler.ExponentialLR(optimizer, gamma=0.9),
                                                                    lr_scheduler.LinearLR(optimizer, start_factor=1,
                                                                                          end_factor=0.1,
                                                                                          total_iters=80)],
                                             milestones=[50])

在这里插入图片描述

9、ChainedScheduler

ChainedScheduler和SequentialLR类似,也是按照顺序调用多个串联起来的学习率调整策略,不同的是ChainedScheduler里面的学习率变化是连续的。

lr_scheduler = lr_scheduler.ChainedScheduler(
        [lr_scheduler.LinearLR(optimizer, start_factor=1, end_factor=0.5, total_iters=10),
         lr_scheduler.ExponentialLR(optimizer, gamma=0.95)])

在这里插入图片描述

10、ConstantLR

ConstantLR非常简单,在total_iters轮内将optimizer里面指定的学习率乘以factor,total_iters轮外恢复原学习率。

lr_scheduler = lr_scheduler.ConstantLR(optimizer, factor=0.5, total_iters=20)

在这里插入图片描述


三、参考

史上最全学习率调整策略lr_scheduler

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值