• pytorch几种learning rate的使用方式


    pytorch的学习率都在torch.optim.lr_scheduler里面

    使用方式基本一致,都需要和optimizer配合使用。说一下几个常用的。

    StepLR

    StepLR, 顾名思义,每隔多少个step,就乘以gamma衰减一次

    使用方式scheduler = StepLR(optimizer, step_size = 30, gamma = 0.1, last_epoch = -1, verbose=False)

    上面这个就表示每隔30个step就使得学习率变成之前的0.1倍。last_epoch表明这个更新LR的策略结束的位置,设置-1就是一直到最后。verbose意思是是否在更新lr时打印log,默认False。由于last_epoch和verbose都是可以设置的,后续就不写出来了。

    当每一个epoch运行完之后记得使用scheduler.step()

    MultiStepLR

    与之类似的是MultiStepLR,如果你不想以固定的step更新LR,你可以自己手动设置一堆更新的节点,必须是递增的。

    scheduler = MultiStepLR(optimizer, milestones=[30, 60, 120], gamma=0.1)

    以上这个方式就表明在30,60和120的时候会更新lr。

    ExponentialLR

    与之类似的还有ExponentialLR,也是通过gamma系数变化,只是他只能每个epoch变化。
    scheduler = ExponentialLR(optimizer, gamma) 相当于简化版的StepLR。

    LinearLR

    如果不希望学习率按乘法系数衰减,也可以使用线性的方式,设置好起始点和终点,学习率就会在这两个点直接以线性方式变化。

    scheduler = LinearLR(optimizer, start_factor = 0.5, end_factor=1.5, total_iters = 5)

    通过这种方式,学习率会线性变化,一种变化total_iters次,从start_factor均匀地变换到end_factor。(0.7, 0.9, 1.1, 1.3, 1.5)

    CosineAnnealingLR

    单调变化的学习率或许会使模型陷入局部最优点,所以有时候希望学习率能够更复杂一点。这时可以使用scheduler = CosineAnnealingLR(optimizer, T_max = 300, eta_min = 1e-5)

    T_max设定最大的iteration数,eta_min是允许的最小学习率。通过这种方式,学习率可以周期性变化。

    CyclicLR

    这一个可以设置的参数有点多
    scheduler = cyclicLR(optimizer, base_lr = 1e-4, max_lr = 5e-4, step_size_up = 2000. step_size_down = 2000, mode = 'triangular', gamma = 0.5, scale_fn = None, scale_mode='cycle', cycle_momentum = True, base_momentum = 0.8, max_momentum = 0.9)

    base_lr是初始学习率,max_lr是学习率上界,每一个cycle的学习率都应该是在这两个数的区间内。

    step_size_up, 每一个cycle上升部分的iterations数,默认2000,同理step_size_down是cycle的下降区间,默认跟step_size_up是一样的大小,也就是step_size_up+step_size_down就构成一个cycle,所以无需再单独设置cycle数量。当然这两个数也可以不相等。

    mode和scale_fn配套使用,如果其中一个设置了,另一个就是None,默认设置为mode=‘triangular’, scale_fn=None。mode还可以选择的有triangular2, exp_range

    gamma系数,默认为1

    scale_mode: 默认为cycle,也可以是‘iteration’

    cycle_momentum: 默认True,如果是True,momentum就会随着学习率的反比循环。

    base_momentum: 默认0.8, 他是随着学习率的反比循环。在一个cycle的顶点,momentum = ‘base_momentum’, 并且lr=‘max_lr’。

    max_momentum: 默认0.9,在cycle的开始阶段,momentum = ‘max_momentum’ 并且lr = ‘base_lr’。

    ReduceOnPlateau

    顾名思义,当loss降到一个平原地带(plateau),也就是不再继续下降了,就更新学习率政策, 这种方式比手动设置step更加灵活。

    scheduler = ReduceOnPlateau(optimizer, mode='min', factor=0.1, patience = 20, threshold = 1e-4, threshold_mode = 'rel', cooldown = 0, min_lr = 1e-6, eps = 1e-8)

    mode,如果设置min,就判断loss是否停止下降,设置max就判断是否停止增长。

    factor,等同于其他gamma。

    patience,默认10,在这个区间内,不更新学习率。超出这个范围后,如果loss没有得到提升,就更新学习率。

    threshold和threshold_mode 配套使用,threshold_mode 有’rel’, ’abs’可选,会影响threshold的计算方式。

    cooldown:lr变化之后,再次进行操作的冷却时间。

    min_lr: 每个param group的下限。

    eps: 如果两次lr的变化小于eps,则update忽略。

  • 相关阅读:
    051:mapboxGL改变bearing和pitch,变换查看视角
    吃鸡达人必备神器,提升战斗力享受顶级游戏干货!
    实现Spring底层机制(三)
    flink1.10袋鼠云 迁移 flink1.15原生环境 事项汇总
    在本地模拟C/S,Socket套接字的使用
    SpringMvc视图解析器
    《机器人SLAM导航核心技术与实战》第1季:第2章_C++编程范式
    java之单元测试与注解与枚举
    用python实现基本数据结构【03/4】
    八、Thmeleaf
  • 原文地址:https://blog.csdn.net/OldDriver1995/article/details/126762630