当前位置:   article > 正文

学习率调整策略_调整了学习率

调整了学习率

学习率调整策略

一、六个学习率调整策略

1. 等间隔调整学习率 StepLR

等间隔调整学习率,调整倍数为 gamma 倍,调整间隔为 step_size。间隔单位是step。需要注意的是, step 通常是指 epoch,不要弄成 iteration 了。学习率调整: l r = l r ∗ g a m m a lr = lr * gamma lr=lrgamma

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
  • 1

参数:

  • optimizer:优化器
  • step_size(int): 学习率下降间隔数,若为 30,则会在 30、 60、 90…个 step 时,将学习率调整为 lr*gamma。
  • gamma(float):学习率调整倍数,默认为 0.1 倍,即下降 10 倍。
  • last_epoch(int):上一个 epoch 数,这个变量用来指示学习率是否需要调整。当last_epoch 符合设定的间隔时,就会对学习率进行调整。当为-1 时,学习率设置为初始值。

2. 按需调整学习率 MultiStepLR

按设定的间隔调整学习率。这个方法适合后期调试使用,观察 loss 曲线,为每个实验定制学习率调整时机。
与StepLR的区别是,调节的epoch是自己定义,衰减是由外部的设置来更改的。
例如:在指定的epoch值,如[5,20,25,80]处对学习率进行衰减, l r = l r ∗ g a m m a lr = lr * gamma lr=lrgamma

torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
  • 1

参数:

  • milestones(list):一个 list,每一个元素代表何时调整学习率, list 元素必须是递增的不用等间隔。如milestones=[30,80,120]
  • gamma(float)- 学习率调整倍数,默认为 0.1 倍,即下降 10 倍
  • last_epoch(int):上一个epoch数,这个变量用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整;当为-1时,学习率设置为初始值

3. 指数衰减调整学习率 ExponentialLR

指数衰减调整学习率的调整公式: l r = l r ∗ g a m m a e p o c h lr=lr∗gamma^{epoch} lr=lrgammaepoch

torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)
  • 1

参数:
gamma:学习率调衰减的底数,选择不同的gamma值可以获得幅度不同的衰减曲线,指数为 epoch,即 gamma**epoch 或 g a m m a e p o c h gamma^{epoch} gammaepoch

4. 余弦退火调整学习率 CosineAnnealingLR

以初始学习率为最大学习率,以2 ∗ T _ m a x 2 ∗ T_max2∗T_max 为周期,在一个周期内先下降,后上升。

torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
  • 1

参数:

  • T_max(int):学习率下降到最小值时的epoch数,即当epoch=T_max时,学习率下降到余弦函数最小值,当epoch>T_max时,学习率将增大。
  • eta_min(float):学习率的最小值,即在一个周期中,学习率最小会下降到 eta_min,默认值为 0。
  • last_epoch,这个变量用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整;当为-1时,学习率设置为初始值。

5. 自适应调整学习率 ReduceLROnPlateau

当某指标不再变化(下降或升高),调整学习率,这是非常实用的学习率调整策略。例如,当验证集的 loss 不再下降时,进行学习率调整;或者监测验证集的 accuracy,当accuracy 不再上升时,则调整学习率。

torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
  • 1

参数

  • mode(str)- 模式选择,有 min 和 max 两种模式, min 表示当指标不再降低(如监测loss), max 表示当指标不再升高(如监测 accuracy)。
  • factor(float)- 学习率调整倍数(等同于其它方法的 gamma),即学习率更新为 lr = lr * factor
  • patience(int)- 忍受该指标多少个 step 不变化,当忍无可忍时,调整学习率。
  • verbose(bool)- 是否打印学习率信息, print(‘Epoch {:5d}: reducing learning rate of group {} to {:.4e}.’.format(epoch, i, new_lr))
  • threshold_mode(str)- 选择判断指标是否达最优的模式,有两种模式, rel 和 abs。
  • cooldown(int)- “冷却时间“,当调整学习率之后,让学习率调整策略冷静一下,让模型再训练一段时间,再重启监测模式。
  • min_lr(float or list)- 学习率下限,可为 float,或者 list,当有多个参数组时,可用 list 进行设置。
  • eps(float)- 学习率衰减的最小值,当学习率变化小于 eps 时,则不调整学习率。

6. 自定义调整学习率 LambdaLR

为不同参数组设定不同学习率调整策略。调整规则为, l r = b a s e l r ∗ l a m b d a ( l a s t _ e p o c h ) lr=base_{lr}∗lambda(last\_epoch) lr=baselrlambda(last_epoch)这在fine-tune 中十分有用,我们不仅可为不同的层设定不同的学习率,还可以为其设定不同的学习率调整策略。

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
  • 1

参数:
lr_lambda(function or list)- 一个计算学习率调整倍数的函数,输入通常为 step,当有多个参数组时,设为 list。

二、Warm-up

1. 什么是Warm-up

Warmup是在ResNet论文中提到的一种学习率预热的方法,指训练开始的时候先选择使用一个较小的学习率,训练了一些epoches或者steps(比如4个epoches,10000steps),再修改为预先设置的学习来进行训练。

2. 为什么用Warm-up

由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。

  • 有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳
  • 有助于保持模型深层的稳定性

3. 几种常见的warmup方式

实验设置:使用的学习率衰减策略为MultiStep,milestones设置为[15, 20],即学习率会在第16个epoch和第21个epoch衰减,乘以0.1的系数。整个训练过程持续了30个epoch,初始学习率
为5,warmup_epochs设置为10,warmup_factor设置为0.001。

如果不适用warm-up,学习率的变化曲线如下,横坐标为epoch(从0开始索引),纵坐标为学习率。
在这里插入图片描述
常见的warmup方式有三种:constant,linear和exponent。

  • constant:在warmup期间,学习率 η = η 0 × w a r m u p f a c t o r = 5 × 0.001 = 0.005 \eta = \eta_0 \times warmup_{factor} = 5 \times 0.001 = 0.005 η=η0×warmupfactor=5×0.001=0.005
    。ResNet论文中就使用了这种方式,在cifar10上训练ResNet 101时,先用0.01的学习率训练直到训练误差低于80%(大概训练了400个steps),然后使用0.1的学习率进行训练。
    在这里插入图片描述
  • linear:constant的不足之处在于从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。于是18年Facebook提出了gradual warmup来解决这个问题,即从最初的小学习率开始,每个step增大一点点,在warmup期间,学习率从 η 0 × w a r m u p f a c t o r \eta_0 \times warmup_{factor} η0×warmupfactor线性增长
    在这里插入图片描述
  • exponent:在warmup期间,学习率从
    η 0 × w a r m u p f a c t o r \eta_0 \times warmup_{factor} η0×warmupfactor 指数增长

    在这里插入图片描述

原文链接:1. https://blog.csdn.net/qq_35091353/article/details/117322293
2. https://zhuanlan.zhihu.com/p/508953700
3. Detectron2之lr_scheduler https://zhuanlan.zhihu.com/p/99568607

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/349746
推荐阅读
相关标签
  

闽ICP备14008679号