學習率衰減問題


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()

一回訓練之后達到的結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM