知乎对应:【tricks】学习率调整策略lr_scheduler
后期主要针对知乎进行更新~~~请移步知乎哦
学习率是深度学习训练中至关重要的参数,很多时候一个合适的学习率才能发挥出模型的较大潜力。
Pytorch中常见的学习率调整方法。
文章目录
一、整体代码框架
Pytorch 实现的绘制学习率轮次变化图
import torch
import matplotlib.pyplot as plt
import torchvision.models as models
import torch.optim.lr_scheduler as lr_scheduler
# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False
def get_lr(optimizer): # 从优化器中读取学习率
for param_group in optimizer.param_groups:
return param_group['lr']
if __name__ == "__main__":
# ------------------------------------#
# 神经网络模型
# ------------------------------------#
model = models.resnet18(pretrained=False)
# ------------------------------------#
# 训练设置
# ------------------------------------#
number_epoches = 500
# 学习率和优化策略
learning_rate = 1e-1
optimizer = torch.optim.Adam(model.parameters(), learning_rate, weight_decay=5e-4)
lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=1, gamma=0.9)
epoches = []
lrs = []
for epoch in range(0, number_epoches):
# =====================plot=============================
epoches.append(epoch)
lrs.append(learning_rate)
# =====================train============================
optimizer.step()
# =====================updateLR=========================
lr_scheduler.step()
learning_rate = get_lr(optimizer)
plt.plot(epoches, lrs)
plt.xlabel('epoch')
plt.ylabel('learning-rate')
plt.title("StepLR")
plt.axis([0, number_epoches, 0, 0.11])
plt.show()
以上是一段通用代码,将初始学习率设置为0.1。
后面部分展示学习率调整策略的代码,以及对应的学习率曲线。
二、自带学习率调整策略
1、StepLR
这是最简单常用的学习率调整方法,每过step_size轮,将此前的学习率乘以gamma。
代码如下(示例):
lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.8)
2、MultiStepLR
MultiStepLR同样也是一个非常常见的学习率调整策略,它会在每个milestone时,将此前学习率乘以gamma。
代码如下(示例):
lr_scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[50, 200,400], gamma=0.5)
3、ExponentialLR
ExponentialLR是指数型下降的学习率调节器,每一轮会将学习率乘以gamma,所以这里千万注意gamma不要设置的太小,不然几轮之后学习率就会降到0。
lr_scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
4.、LinearLR
LinearLR是线性学习率,给定起始factor和最终的factor,LinearLR会在中间阶段做线性插值。
比如学习率为0.1,起始factor为1,最终的factor为0.2,那么第0次迭代,学习率将为0.1,最终轮学习率为0.02。
lr_scheduler = lr_scheduler.LinearLR(optimizer, start_factor=1, end_factor=0.2, total_iters=80)
5、循环学习率 CyclicLR
CyclicLR的参数要更多一些,它的曲线看起来就像是不断的上坡与下坡。base_lr为谷底的学习率,max_lr为顶峰的学习率,step_size_up是从谷底到顶峰需要的轮数,step_size_down时从顶峰到谷底的轮数。
lr_scheduler = lr_scheduler.CyclicLR(optimizer, base_lr=0.02, max_lr=0.1, step_size_up=30, step_size_down=10,
cycle_momentum=False)
6、OneCycleLR
OneCycleLR顾名思义就像是CyclicLR的一周期版本,它也有多个参数,max_lr就是最大学习率,pct_start是学习率上升部分所占比例,一开始的学习率为 max_lr / div_factor,最终的学习率为 max_lr / final_div_factor,总的迭代次数为total_steps。
lr_scheduler = lr_scheduler.OneCycleLR(optimizer, max_lr=0.1, pct_start=0.5, total_steps=100, div_factor=10,
final_div_factor=10)
7、CosineAnnealingLR
CosineAnnealingLR是余弦退火学习率,T_max是周期的一半,最大学习率在optimizer中指定,最小学习率为eta_min。这里同样能够帮助逃离鞍点。值得注意的是最大学习率不宜太大,否则loss可能出现和学习率相似周期的上下剧烈波动。
lr_scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=20, eta_min=0.02)
8、SequentialLR
SequentialLR可以将多个学习率调整策略按照顺序串联起来,在milestone时切换到下一个学习率调整策略。下面就是将一个指数衰减的学习率和线性衰减的学习率结合起来。
lr_scheduler = lr_scheduler.SequentialLR(optimizer, schedulers=[lr_scheduler.ExponentialLR(optimizer, gamma=0.9),
lr_scheduler.LinearLR(optimizer, start_factor=1,
end_factor=0.1,
total_iters=80)],
milestones=[50])
9、ChainedScheduler
ChainedScheduler和SequentialLR类似,也是按照顺序调用多个串联起来的学习率调整策略,不同的是ChainedScheduler里面的学习率变化是连续的。
lr_scheduler = lr_scheduler.ChainedScheduler(
[lr_scheduler.LinearLR(optimizer, start_factor=1, end_factor=0.5, total_iters=10),
lr_scheduler.ExponentialLR(optimizer, gamma=0.95)])
10、ConstantLR
ConstantLR非常简单,在total_iters轮内将optimizer里面指定的学习率乘以factor,total_iters轮外恢复原学习率。
lr_scheduler = lr_scheduler.ConstantLR(optimizer, factor=0.5, total_iters=20)