1.介绍
转自:https://blog.csdn.net/program_developer/article/details/80867468
在训练到一定阶段后,学习率可能会产生震荡,但是一开始用小的学习率的话,训练速度会很慢。
学习率衰减(learning rate decay) 就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。
学习率衰减基本有两种实现方法:
-
线性衰减。例如:每过5个epochs学习率减半。
-
指数衰减。例如:随着迭代轮数的增加学习率自动发生衰减,每过5个epochs将学习率乘以0.9998。具体算法如下:
decayed_learning_rate=learning_rate*decay_rate^(global_step/decay_steps)
其中decayed_learning_rate为每一轮优化时使用的学习率,learning_rate为事先设定的初始学习率,decay_rate为衰减系数,decay_steps为衰减速度。
2.WarmupLinearSchedule 热启动机制
https://www.zhihu.com/question/338066667 ,宝藏问题。
warmup是初始阶段使用较小学习率启动,后期恢复正常;而decay是初始时使用较大的学习率,之后进行衰减。
这里面的回答我还待看,为什么warmup是有效的呢?还挺难的。有公式推导。
https://blog.csdn.net/zkq_1986/article/details/100220425 这个讲的就很直接:
//不太懂,还需要再看。
3.pytorch实现不同策略
https://zhuanlan.zhihu.com/p/93624972
3.1 指数衰减
optimizer_ExpLR = torch.optim.SGD(net.parameters(), lr=0.1)
ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)
gamma表示不同的衰减率。
3.2 固定步长衰减
optimizer_StepLR = torch.optim.SGD(net.parameters(), lr=0.1)
StepLR = torch.optim.lr_scheduler.StepLR(optimizer_StepLR, step_size=step_size, gamma=0.65)
3.3 多步长衰减
optimizer_MultiStepLR = torch.optim.SGD(net.parameters(), lr=0.1)
torch.optim.lr_scheduler.MultiStepLR(optimizer_MultiStepLR,
milestones=[200, 300, 320, 340, 200], gamma=0.8)
希望不同的区间采用不同的更新频率,或者是有的区间更新学习率,有的区间不更新学习率,这就需要使用MultiStepLR来实现动态区间长度控制。
3.4 余弦退火衰减
3.5 用法
scheduler = ... >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step()
一回训练之后达到的结果。