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()
一回訓練之后達到的結果。