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忽略。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值