Datawhale X 李宏毅蘋果書AI夏令營深度學習進階(二)

W12w發表於2024-08-30

一.動量法
在上一個部落格中,我們提到了動量法,現在繼續補充

如圖所示,紅色表示負梯度方向,藍色虛線表示前一步的方向,藍色實線表示真實的移動量。一開始沒有前一次更新的方向,完全按照梯度給指示往右移動引數。負梯度方向跟前一步移動的方向加起來,得到往右走的方向。一般梯度下降走到一個區域性最小值或鞍點時,就被困住了。但有動量還是有辦法繼續走下去,因為動量不是隻看梯度,還看前一步的方向。即使梯度方向往左走,但如果前一步的影響力比梯度要大,球還是有可能繼續往右走,甚至翻過一個小丘,也許可以走到更好的區域性最小值,這就是動量有可能帶來的好處 。

二.自適應學習率
臨界點其實不一定是在訓練一個網路的時候會遇到的最大的障礙。一般在訓練一個網路的時候,損失原來很大,隨著引數不斷的更新,損失會越來越小,最後就卡住了,損失不再下降。當我們走到臨界點的時候,意味著梯度非常小,但損失不再下降的時候,梯度並沒有真的變得很小。隨著迭代次數增多,雖然損失不再下降,但是梯度的範數並沒有真的變得很小。梯度在山谷的兩個谷壁間,不斷地來回“震盪”,這個時候損失不會再下降,它不是真的卡到了臨界點,卡到了鞍點或區域性最小值。但它的梯度仍然很大,只是損失不一定再減小了。所以訓練一個網路,訓練到後來發現損失不再下降的時候,有時候不是卡在區域性最小值或鞍點,只是單純的損失無法再下降。
假如訓練一個網路,訓練到現在引數在臨界點附近,再根據特徵值的正負號判斷該臨界點是鞍點還是區域性最小值。實際上在訓練的時候,要走到鞍點或區域性最小值,是一件困難的事情。一般的梯度下降,其實是做不到的。用一般的梯度下降訓練,往往會在梯度還很大的時候,損失就已經降了下去,這個是需要特別方法訓練的。要走到一個臨界點其實是比較困難的,多數時候訓練在還沒有走到臨界點的時候就已經停止了。
最原始的梯度下降連簡單的誤差表面都做不好,因此需要更好的梯度下降的版本。在梯度下降裡面,所有的引數都是設同樣的學習率,這顯然是不夠的,應該要為每一個引數定製化學習率,即引入自適應學習率(adaptive learning rate)的方法,給每一個引數不同的學習率。
接下來介紹幾個簡單的相關概念:
AdaGrad
AdaGrad(Adaptive Gradient)是典型的自適應學習率方法,其能夠根據梯度大小自動調整學習率。AdaGrad 可以做到梯度比較大的時候,學習率就減小,梯度比較小的時候,學習率就放大。
RMSProp
同一個引數需要的學習率,也會隨著時間而改變。在某種誤差表面中,如果考慮橫軸方向,綠色箭頭處坡度比較陡峭,需要較小的學習率,但是走到紅色箭頭處,坡度變得平坦了起來,需要較大的學習率。因此同一個引數的同個方向,學習率也是需要動態調整的,於是就有了一個新的方法———RMSprop(Root Mean Squared propagation)。
Adam
最常用的最佳化的策略或者最佳化器(optimizer)是Adam(Adaptive moment estimation)[7]。Adam 可以看作 RMSprop 加上動量,其使用動量作為引數更新方向,並且能夠自適應調整學習率。PyTorch 裡面已經寫好了 Adam 最佳化器,這個最佳化器裡面有一些超引數需要人為決定,但是往往用 PyTorch 預設的引數就足夠好了。

三.學習率排程
之前的學習率調整方法中 η 是一個固定的值,而在學習率排程中 η 跟時間有關。學習率排程中最常見的策略是學習率衰減(learning rate decay),也稱為學習率退火(learning rateannealing)。隨著引數的不斷更新,讓 η 越來越小。除了學習率下降以外,還有另外一個經典的學習率排程的方式———預熱。預熱的方法是讓學習率先變大後變小,至於變到多大、變大的速度、變小的速度是超引數。殘差網路裡面是有預熱的,在殘差網路裡面,學習率先設定成 0.01,再設定成 0.1,特別的,一開始用 0.1 反而訓練不好。除了殘差網路,BERT 和 Transformer 的訓練也都使用了預熱,使用預熱的原因是當我們使用 Adam、RMSprop 或 AdaGrad 時,需要計算 σ。而 σ 是一個統計的結果。從 σ 可知某一個方向的陡峭程度。統計的結果需要足夠多的資料才精準,一開始統計結果 σ 是不精準的。一開始學習率比較小是用來探索收集一些有關誤差表面的情報,先收集有關 σ 的統計資料,等 σ 統計得比較精準以後,再讓學習率慢慢爬升。如果讀者想要學更多有關預熱的東西可參考 Adam 的進階版———RAdam。

四.分類
(一)分類與迴歸的關係
迴歸是輸入一個向量 x,輸出 yˆ,我們希望 yˆ 跟某一個標籤 y 越接近越好,y 是要學習的目標。而分類可當作迴歸來看,輸入 x 後,輸出仍然是一個標量 yˆ,要讓它跟正確答案的那個類越接近越好。yˆ 是一個數字,我們可以把類也變成數字。如果有三個類,標籤 y 就是一個三維的向量,如果目標 y 是一個向量,比如 y 是有三個元素的向量,網路也要輸出三個數字才行。

相關文章