pytorch必须掌握的的4种学习率衰减策略

梯度下降算法需要我们指定一个学习率作为权重更新步幅的控制因子,常用的学习率有0.01、0.001以及0.0001等,学习率越大则权重更新的越快。一般来说,我们希望在训练初期学习率大一些,使得网络收敛迅速,在训练后期学习率小一些,使得网络更好的收敛到最优解。 下图展示了随着迭代的进行动态调整学习率的4中策略曲线。
在这里插入图片描述
上述4种策略为衰减类型:指数衰减、固定步长的衰减、多步衰减、余弦衰减。下面逐一介绍其性质,及pytorch对应的使用方式,需要注意学习率衰减策略很大程度上是依赖于经验与具体问题的,不能照搬参数。

1指数衰减

学习率按照指数的形式衰减是比较常用的策略,我们首先需要确定针对哪个优化器执行学习率动态调整策略,也就是需要提前定义一个优化器。

optimizer_ExpLR = torch.optim.SGD(net.parameters(), lr=0.1)

定义好优化器以后,就可以给这个优化器绑定一个指数衰减学习率控制器。

ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)

其中参数gamma表示衰减的底数,选择不同的gamma值可以获得不同的衰减曲线,如下。
在这里插入图片描述

tensorfow实现

前10个epoch学习率保持不变,10个之后学习率按照指数进行衰减

def scheduler(epoch):
    if epoch < 10:
        return 0.01
    else:
        return 0.01*tf.math.exp(0.1*(10-epoch))

callback = tf.keras.callbacks.LearningRateScheduler(scheduler)

history = model.fit(x=data,y=label,batch_size=32,epochs=100,callbacks=[callback])

在这里插入图片描述

2 固定步长衰减

有时我们希望学习率每个一定步长(或者epoch)就衰减为原来的gamma分之一,使用固定步长衰减依旧先定义优化器,在给优化器绑定StepLR对象:

optimizer_StepLR = torch.optim.SGD(net.parameters(), lr=0.1)
StepLR = torch.optim.lr_scheduler.StepLR(optimizer_StepLR, step_size=step_size, gamma=0.65)

其中gamma参数表示衰减的程度,step_size参数表示每隔多少个step进行一次学习率调整,下面对比了不同gamma值下的学习率变化情况。
在这里插入图片描述

tensorfow实现

def StepLR(epoch,lr):
    if epoch % 20==0:
        lr = lr * 0.1
    else:
        lr = lr
    return lr

学习每20个epoch衰减一次,衰减的系数为0.1
在这里插入图片描述

3 多步长衰减

上述固定步长的衰减的虽然能够按照固定的区间长度进行学习率更新,但是有时候我们希望不同的区间采用不同的更新频率,或者是有的区间更新学习率,有的区间不更新学习率, 这就需要使用MultiStepLR来实现动态区间长度控制。

optimizer_MultiStepLR = torch.optim.SGD(net.parameters(), lr=0.1)
torch.optim.lr_scheduler.MultiStepLR(optimizer_MultiStepLR,
                    milestones=[200, 300, 320, 340, 200], gamma=0.8)

其中milestones参数为表示学习率更新的起止区间,在区间[0,200]内学习率不更新,而在[200, 300]、[300, 320]…[340, 400]的右侧值都进行一次更新;gamma参数表示学习率衰减为上次的gamma分之一。其图示如下。
在这里插入图片描述
从图中可以看出,学习率在区间[200,400]内快速的下降,这就是milestone参数所控制的,在milestone以外的区间学习率始终保持不变。

4 余弦退火衰减

严格的说,余弦退火策略不应该算是学习率衰减策略,应为它使得学习率按周期变化,其定义方式如下:

optimizer_CosineLR = torch.optim.SGD(net.parameters(), lr=0.1)
CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)

其包含的参数和余弦知识一样,参数T_max表示余弦周期;eta_min表示学习率的最小值,默认它是0表示学习率至少为正值。确定一个余弦函数需要知道最值和周期,其中周期就是T_max,最值是初始学习率,下图展示了不同周期下的余弦学习率更新曲线:
在这里插入图片描述

总结

上述4中学习率动态更新策略,4个负责学习率调整的类:StepLR、ExponentialLR、MultiStepLR和CosineAnnealingLR,其完整对学习率的更新都是在其step()函数被调用以后完成的,这个step表达的含义可以是一次迭代,当然更多情况下应该是一个epoch以后进行一次scheduler.step(),这根据具体问题来确定。此外,根据pytorch官网上给出的说明,scheduler.step()函数的调用应该在训练代码以后:

scheduler = ...
>>> for epoch in range(100):
>>>     train(...)
>>>     validate(...)
>>>     scheduler.step()
  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在深度学习中,学习率是一个非常重要的超参数,它决定了模型在每次参数更新时的步长大小。降低学习率可以帮助模型更好地收敛并获得更好的性能。以下是一些常见的降低学习率的方法: 1. 固定学习率:最简单的方法是使用固定的学习率,不进行任何调整。这方法适用于简单的问题或者数据集较小的情况。 2. 学习率衰减学习率衰减是一常见的降低学习率的方法。它通过在训练过程中逐渐减小学习率来实现。常见的学习率衰减策略有: - 常数衰减:在每个固定的训练步骤或者固定的训练轮次后,将学习率乘以一个小于1的因子。 - 指数衰减:在每个训练步骤或者训练轮次后,将学习率乘以一个指数衰减因子。 - 阶梯衰减:在预定义的训练步骤或者训练轮次后,将学习率降低到一个较小的值。 3. 自适应学习率方法:自适应学习率方法根据模型在训练过程中的表现来动态地调整学习率。常见的自适应学习率方法有: - 动量优化器:动量优化器使用动量来加速梯度下降,并且可以自适应地调整学习率。 - AdaGrad:AdaGrad根据参数的历史梯度信息来自适应地调整学习率。 - RMSProp:RMSProp结合了AdaGrad的思想,并对梯度进行指数加权平均,以自适应地调整学习率。 - Adam:Adam是一结合了动量优化器和RMSProp的方法,它可以自适应地调整学习率和动量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值