深度学习学习率调整小结

禁止以任何形式转载或抄袭!!

简介

learning rate schedules主要就是对分子部分进行调整,采用learning rate schedules的时候多用于SGD这类非自适应的算法之中。
在这里插入图片描述
PyTorch提供的学习率调整策略分为三大类:

  1. 有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和 余弦退火CosineAnnealing
  2. 自适应调整:自适应调整学习率 ReduceLROnPlateau
  3. 自定义调整:自定义调整学习率 LambdaLR

代码

在PyTorch 1.1.0之前,学习率调度程序应该在优化器更新之前调用;1.1.0以后改变了这种方式。如果在优化器更新(调用optimizer.step())之前使用学习率调度程序(调用scheduler.step()),这将跳过学习率调度程序的第一个值。In PyTorch 1.1.0 and later, you should call them in the opposite order: optimizer.step() before lr_scheduler.step().

model_param = [Parameter(torch.randn(2, 2, requires_grad=True))]
optimizer = SGD(model_param, 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()

注意,一般都是在优化器进行调整之后,才应用学习率调整策略对学习率进行调整。
大多数学习率调整程序,都是可以根据前一个调整策略所获得的学习率再次进行调整的。

model = [Parameter(torch.randn(2, 2, requires_grad=True))]
optimizer = SGD(model, 0.1)
scheduler1 = ExponentialLR(optimizer, gamma=0.9)
scheduler2 = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)


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()
    scheduler1.step()
    scheduler2.step()

StepLR

等间隔调整

scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

在这里插入图片描述

MultiStepLR

按需调整学习率

scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[40,70], gamma=0.1)

在这里插入图片描述

ExponentialLR

指数衰减,用得少

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

在这里插入图片描述

OneCycleLR

scheduler =lr_scheduler.OneCycleLR(optimizer,max_lr=0.9,total_steps=1000, verbose=True)

注意:之前的几个学习率优化器是放在每个epoch,每个epoch更新一次,这个方法是每个step更新一次,应该放在step的循环中。

  1. total_steps:总的batch数,这个参数设置后就不用设置epochs和steps_per_epoch,anneal_strategy 默认是"cos"方式,当然也可以选择"linear"
  2. 注意这里的max_lr和你优化器中的lr并不是同一个
  3. 低版本torch里面没有这个函数

在这里插入图片描述

CyclicLR

在这里插入图片描述
在这里插入图片描述
同样的,这里也是以每个step进行更新的。

scheduler = lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1,step_size_up=150,step_size_down=250,mode='triangular')

在这里插入图片描述
mode=‘triangular2’:
在这里插入图片描述

scheduler = lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1,step_size_up=150,step_size_down=250,mode='exp_range',gamma=0.997)

在这里插入图片描述

CosineAnnealingLR

与上一个函数所不同的是,这里使用余弦函数进行学习率的衰减,而且学习率是大学习率开始的。仍然是每个step更新。

T_max:Cosine是个周期函数,这里的T_max就是这个周期的一半,如果你将T_max设置为10,则学习率衰减的周期是20个epoch,其中前10个epoch从学习率的初值(也是最大值)下降到最低值,后10个epoch从学习率的最低值上升到最大值
eta_min:学习率衰减时的最小值,默认值为0
last_epoch:(上次训练)最后一个epoch的索引值,默认值为-1。如果你将其设置为20,那定义出来的scheduler的第一次step就会到第21个epoch对应的学习率。这里是为了resuming

optimizer = optim.SGD(params=model.parameters(), lr=0.05)
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=200, eta_min=0.01, last_epoch=-1)

当然,这里你可以只选择用最前面的一段,从大到小的余弦衰减
在这里插入图片描述

CosineAnnealingWarmRestarts

T_0 – 设定初次在哪里WarmRestarts
T_mult – 每次Restarts后周期扩展系数 默认为: 1.
eta_min–最小学习率,默认为0

scheduler = lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=300, T_mult=1, eta_min=0)

在这里插入图片描述

scheduler = lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=200, T_mult=2, eta_min=0)

在这里插入图片描述

这一个是用于自适应调整的学习率衰减函数。
功能:监控指标,当指标不再变化则调整(很实用)
比如监控Loss不再下降、或者分类准确率acc不再上升就进行学习率的调整。
在这里插入图片描述

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, 'min')
 for epoch in range(10):
     train(...)
     val_loss = validate(...)
     # Note that step should be called after validate()
     scheduler.step(val_loss)

LambdaLR

自定义调整策略
这里主要是通过lr_lambda (function or list) 参数来设定学习率调整策略:

lambda1 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=lambda1)

或者有多个学习率需要调整

#Assuming optimizer has two groups.
lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])

我这里来定义一个复杂一点的函数,

def lr_lambda(current_step: int,num_warmup_steps=280,num_training_steps=1000):
     # 自定义函数
    '''
    num_warmup_steps (:obj:`int`):
        The number of steps for the warmup phase.
    num_training_steps (:obj:`int`):
        The total number of training steps.
     last_epoch (:obj:`int`, `optional`, defaults to -1):
        The index of the last epoch when resuming training.
    '''
    if current_step < num_warmup_steps:
        return float(current_step) / float(max(1, num_warmup_steps))
    return max(
        0.0, float(num_training_steps - current_step) / float(max(1, num_training_steps - num_warmup_steps))
    )
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lr_lambda)

在这里插入图片描述

MultiplicativeLR

将每个参数组的学习速率乘以指定函数中给定的因子。跟LambdaLR差不多,用得很少,就不画图了。

lambdaa = lambda epoch : 0.5
scheduler = optim.lr_scheduler.MultiplicativeLR(optimizer, lambdaa)

上一篇:深度学习Optimizer优化器小结

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: torch.optim.lr_scheduler.cosineannealingwarmrestarts是PyTorch中的一种学习率调度器,它可以根据余弦函数的形式来调整学习率,以达到更好的训练效果。此外,它还可以在训练过程中进行“热重启”,即在一定的周期后重新开始训练,以避免陷入局部最优解。 ### 回答2: torch.optim.lr_scheduler.cosineannealingwarmrestarts是PyTorch中用于优化算法的学习率调度器,它通过余弦退火函数来调整学习率。此外,它还具有热重启功能,在每次重启时可以将学习率设置为初始值来避免陷入局部极小值。下面对其进行详细介绍。 余弦退火函数是一种学习率调整策略,它在训练过程中逐渐减少学习率。在余弦退火函数中,学习率的变化将根据余弦曲线进行,随着训练步数的增加,学习率将逐渐减小。具体而言,余弦退火函数的公式如下: $$\eta_t=\eta_{min}+\frac{1}{2}(\eta_{max}-\eta_{min})(1+\cos(\frac{T_{cur}}{T_{max}}\pi))$$ 其中,$\eta_t$表示在第t步的学习率,$\eta_{min}$和$\eta_{max}$分别表示学习率的下限和上限,$T_{cur}$表示当前训练的轮数,$T_{max}$表示一次完整训练的总轮数。 然而,传统的余弦退火函数通常会陷入局部最小值,无法跳出。为此,torch.optim.lr_scheduler.cosineannealingwarmrestarts在每次重启时会将学习率重新设置为初始值,从而避免陷入局部最小值。 此外,torch.optim.lr_scheduler.cosineannealingwarmrestarts还有两个参数:T_0和T_mult。T_0表示一次完整训练的轮数,T_mult表示T_0的倍数,用于控制热重启的次数。具体而言,热重启策略是:当当前训练轮数达到T_0时,将学习率重置为初始值,并将T_0乘以T_mult。因此,在热重启策略的作用下,学习率可以在训练过程中多次重置,避免陷入局部最小值和过早收敛的问题。 综上所述,torch.optim.lr_scheduler.cosineannealingwarmrestarts是一种基于余弦退火函数和热重启策略的学习率调整器,其可以帮助我们有效地训练深度神经网络模型。 ### 回答3: torch.optim.lr_scheduler.cosineannealingwarmrestarts是PyTorch中一个用于实现学习率调整的工具。它是一种基于余弦退火的方法,能够根据一定的规则调整学习率,从而更有效地训练神经网络。 具体来说,torch.optim.lr_scheduler.cosineannealingwarmrestarts模块提供的是一种类似于自适应学习率的方法,可以对学习率进行周期性的调整。在每一个周期结束时,它会根据余弦函数的形式将学习率逐渐降低,以调整模型的参数,并提高模型的训练效度。 除了余弦退火的特点外,torch.optim.lr_scheduler.cosineannealingwarmrestarts还有其特有的"warm restarts"方法。它实现了一个类似于指数衰减方法的学习率调整策略,使得周期性的调整不会影响模型的性能,并且可以在短时间内让模型快速收敛。 使用torch.optim.lr_scheduler.cosineannealingwarmrestarts模块,只需要按照预设的参数设置周期、初始学习率、最小学习率、周期的长度、以及warm restarts的次数等,即可快速进行模型的训练。 总之torch.optim.lr_scheduler.cosineannealingwarmrestarts是现代深度神经网络中广泛使用的一个学习率调整算法,不仅能够为深度神经网络提供便捷的训练效度管理方法,同时也能使得神经网络模型在更短的时间内达到较好的训练效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值