Contents
为什么要学习率衰减🤔
PyTorch中的学习率并不总是一成不变的,而是可以随着epoch
或者迭代次数的变化而有规律地更新,称之为scheduler
。
在神经网络的训练过程中,当accuracy
出现震荡或loss
不再下降时,进行适当的学习率衰减是一个行之有效的手段,很多时候能明显提高accuracy
。
学习率衰减的大致步骤为:
1 2 3 4 5 6 7 8 9 10 11 |
optimizer = optim.SGD(network.parameters(), lr=0.1) # 定义优化器 scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=200, gamma=0.1) # 定义衰减策略 for epoch in range(500): print(f'epoch:{epoch + 1}, lr{scheduler.get_lr()}') optimizer.step() # train # eval scheduler.step() |
学习率衰减策略
Step学习率
Step学习率以固定间隔乘以一个系数gamma
(一般为0.1)。
1 2 3 |
#!- python scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=200, gamma=0.1) |
Multi-Step学习率
Multi-Step学习率同样是每次乘以一个系数gamma
,不过需要给定学习率衰减的epoch
列表。
1 2 3 4 |
#!- python milestones = [50, 100, 250] scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1) |
指数衰减学习率
指数衰减学习率的公式为lr = base_lr * gamma ^ epoch
。gamma一般为0.99
。
1 2 3 |
#!- python scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99) |
Cos学习率
Cos学习率在初始学习率base_lr
和最小值eta_min
之间以余弦形式调整,在MAX_T
个epochs
时衰减到最小值。
1 2 3 |
#!- python scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50, eta_min=0.05) |
动态周期的Cos学习率
动态周期的Cos学习率在衰减到最小值
以后重新回到最大值
,然后以更慢的速度衰减。
1 2 3 |
#!- python scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=80, T_mult=2, eta_min=0) |
Cyclic学习率
Cyclic学习率在最大值和最小值之间来回弹跳。
1 2 3 |
#!- python scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.05, max_lr=0.1, step_size_up=30, step_size_down=70) |
Lambda学习率
顾名思义,Lambda学习率就是自定义一个学习率关于epoch的函数
来调整学习率。定义Lambda函数时给出初始学习率乘以的系数
即可。
1 2 3 4 5 6 7 8 9 |
def lambda_decay(epoch): warm_epoch = 40 if epoch <= warm_epoch: return epoch / warm_epoch else: return 0.99 ** (epoch-warm_epoch) scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lambda_decay) |
# 参考资料
https://blog.csdn.net/junqing_wu/article/details/93248190
https://www.jianshu.com/p/26a7dbc15246