学习率衰减问题

1.介绍

转自:https://blog.csdn.net/program_developer/article/details/80867468

在训练到一定阶段后,学习率可能会产生震荡,但是一开始用小的学习率的话,训练速度会很慢。

学习率衰减(learning rate decay) 就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。
学习率衰减基本有两种实现方法:
  1. 线性衰减。例如:每过5个epochs学习率减半。
  2. 指数衰减。例如:随着迭代轮数的增加学习率自动发生衰减,每过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()

一回训练之后达到的结果。

posted @ 2021-01-07 12:02  lypbendlf  阅读(975)  评论(0编辑  收藏  举报