有哪些学习率调节策略?

OneCycleLR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import cv2
import torch.nn as nn
import torch
from torchvision.models import AlexNet
import matplotlib.pyplot as plt
steps = []
lrs = []
model = AlexNet(num_classes=2)
lr = 0.1
optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9)

#scheduler =torch.optim.lr_scheduler.OneCycleLR(optimizer,max_lr=0.9,total_steps=10*2, verbose=True)
#total_steps:总的batch数,这个参数设置后就不用设置epochs和steps_per_epoch,anneal_strategy 默认是"cos"方式,当然也可以选择"linear"
#注意这里的max_lr和你优化器中的lr并不是同一个

scheduler=torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=1e-2,steps_per_epoch=781, epochs=100)
for epoch in range(100):
for batch in range(781):
scheduler.step()
lrs.append(scheduler.get_lr()[0])
steps.append(epoch)
plt.figure()
plt.legend()
plt.plot(steps, lrs, label='OneCycle')

#注意,无论你optim中的lr设置是啥,最后起作用的还是max_lr

论文中作者将神经网络的快速收敛称为"super-convergence"。在Cifar-10上训练56层的残差网络时,发现测试集上的准确率在使用高学习率和相对较少的训练轮次的时候也依然保持较高(如下图所示),这个现象给"super-convergence"提供了可能。

这说明在高学习率的某些情况下的更新并不会破坏网络。

  CLR(如上图所示)不是单调地降低训练过程中的学习率,而是让学习率在设定好地最大值与最小值之间往复变化,文中提出CLR能够work的原因在于两点: 

  1. CLR里面增大学习率的过程可以帮助损失函数值逃离鞍点 
  2. 最优的学习率会在设定好的最大值与最小值之间,最优学习率附近的值在整个训练过程中会被一直使用到。\(stepsize\)一般设置为\(number of samplesbatchsize\)的2-10倍,一个cycle包括2个\(stepsize\)\(base\_lr\)一般设置为\(max\_lr\)\(\frac{1}{3}\) 或者 \(\frac{1}{4}\)。一般当学习率回到base_lr时使训练结束。

  在CLR的基础上,"1cycle"是在整个训练过程中只有一个cycle,学习率首先从初始值上升至max_lr,之后从max_lr下降至低于初始值的大小。和CosineAnnealingLR不同,OneCycleLR一般每个batch后调用一次。