眾所周知,learning rate 如果設置的過大,有可能會導致梯度爆炸,同時也有可能會導致難以收斂到更好的 local minima;反之,如果 learning rate 過小,會導致網絡訓練得太慢。
在訓練初期,由於網絡參數是隨機初始化的, loss 很大,導致 gradient 很大,此時我們希望 learning rate 小壹點,防止梯度爆炸;而在訓練中期,我們希望 learning rate 大壹點,加速網絡訓練,在訓練末期我們希望網絡收斂到 local minima,此時 learning rate 也應該小壹點。warm up 的壹套流程正好迎合了這種需求。
訓練初始,warm up 把學習率設置得很小,隨著訓練的進行,學習率逐漸上升,最終達到正常訓練的學習率。這個階段就是 warm up 的核心階段。接著,隨著訓練的進行,我們希望逐漸減小學習率,(learning rate decay),訓練完成時,learning rate 降為 0 。
warm up 有幾個重要的參數:
事實上,任何壹種滿足第壹部分設計需求的 learning rate 更新策略都可以叫 warm up,這裏只實現壹種。
其中 為訓練步數, 。我們可以看到,當 時,初始學習率為 ;隨著 的增加,學習率逐漸上升,當 時,學習率為 ,即正式訓練的初始學習率。
warm up 階段結束後,下壹步是隨著訓練的進行,讓學習率逐漸降低到 0。這裏需要用到兩個新的參數:
從 (2) 可以看到,當 時, 前面的參數為 1,學習率就是 ;當 時, 前面的參數為 0,學習率為 0 。再觀察 ,當 時,學習率線性降低到 0;當 時,括號裏面的底數始終是大於 0 小於 1 的,因此它的 次方應該比它本身要大,因此 會讓學習率比同時期線性 decay 得到的學習率更大壹點;當 時,學習率比同時期線性 decay 的學習率要小。由於學習率最終都是降到了 0,顯然應該設置 ,讓正式訓練初期學習率降得慢壹點,而正式訓練末期,學習率迅速降低到 0,而不是 導致正式訓練初期學習率就降得很快,而正式訓練末期學習率降得很慢,拖慢訓練進程。
參數:
下面把不同 step 對應的 learning rate 畫出來:
可以發現,前 1000 步 warm up 階段,學習率由 1e-5 迅速上升到正式訓練的初始學習率 1e-2,接著,隨著叠代步數的增加,學習率緩慢下降,最終降為0。學習率的變化率(斜率)也也很有意思,warm up 初始階段,斜率很低,學習率增長緩慢,代表需要維持壹段時間的低學習率,以讓模型更好地熱身。快接近 warmup 尾聲時,斜率很高,代表學習率增長得很快,以達到正式訓練的初始學習率。decay 的初始階段,學習率下降得較慢,表示需要維持壹段時間的高學習率,以加快模型收斂,訓練快結束時,學習率迅速下降,以便模型收斂到更好的 local minima。
為了更好地展示上面描述的過程,這裏調整壹下參數(並非實際訓練,實際訓練時可參考上面的各種參數配置比例)。