学习率调整策略

学习率直接控制参数更新的步伐。
通常在训练中,一开始学习率可以给的比较大,让参数更新的步伐大一些。后期,让学习率小一些,让参数更新的步伐小一些。
学习率调整是以epoch为周期的。千万不要在iteration中。
在pytorch中提供了很好的学习率调整策略。这六种策略都是继承于_LRScheduler这个基类。所以,我们先来学这个类的基本属性和基本方法。
optimizer:关联的优化器。在讲优化器的时候,我们知道,在优化器中才存放学习率。而_LRScheduler会去修改优化器中的学习率,所以要关联优化器,才能改动其中的学习率。
last_epoch:记录epoch数。从这里可以知道,学习率调整是以epoch为周期的。千万不要在iteration中。base_lrs:记录初始学习率。看右边的__init__函数,发现只接受两个参数。

(1)StepLR的功能是等间隔地调整学习率。比如设置step_size为50,那么就会每隔50个epoch调整一次。
调整方式,是lr*gamma。gamma是一个调整系数。

  1. MultiStepLR

按给定的间隔调整学习率。
跟StepLR不同:
StepLR是等间隔,这个是可以自己设置,可以给定一个list,告知什么时候调整。比如[50,120,180]。

  1. ExponentialLR

按照指数衰减学习率。
gamma:是指数的底,通常设置为接近于1的一个数,比如0.95。 lr乘以 gamma^epoch。
没执行一个epoch,都会乘以gamma。成指数下降。

  1. CosineAnnealingLR

T_max: 下降周期。比如T_max=50,那就是经过50个epoch,学习率从最大下降到最小。
eta_min: 学习率下限,通常设置为0.

  1. ReduceLRonPlateau

这个非常实用。
mode: min模式下,监控指标,如果不下降就调整。max模型下,监控指标,如果不上升,就调整。min模式通常是监控loss,max模型通常是监控分类准确率。
factor:调整系数。
patience:连续多少次不再发生变化,就调整。
cooldown:调整完后给一定的冷却时间,不去监控指标。等冷却时间过了之后再监控。
verbose:是否打印日志。记录什么时候更新了学习率。
min_lr:当学习率到了这个之后就不会再往下降了。

  1. LambdaLR

可以自定义调整策略。
只有一个参数lr_lambda,这个参数可以是一个function,也可以是一个list。如果是一个list,其每一个元素也必须是一个function。
可以自定义一个函数,调整学习率。
还可以设置不同的参数组有不同的学习策略。在模型fintune的时候常用到。

总结:

(1)

(2)学习率初始化方法
要调整学习率,至少要有个初始的学习率。初始学习率该如何设置呢?
这里介绍两个常用的方法:

  1. 设置个较小的数。比如如果从头训练就设置0.01。如果finetune,就设置0.0001。
    2.可以按这篇论文搜索一个学习率。感兴趣可以看一下。