神經網路最佳化篇:詳解正則化(Regularization)

Oten發表於2023-12-19

正則化

深度學習可能存在過擬合問題——高方差,有兩個解決方法,一個是正則化,另一個是準備更多的資料,這是非常可靠的方法,但可能無法時時刻刻準備足夠多的訓練資料或者獲取更多資料的成本很高,但正則化通常有助於避免過擬合或減少的網路誤差。

如果懷疑神經網路過度擬合了資料,即存在高方差問題,那麼最先想到的方法可能是正則化,另一個解決高方差的方法就是準備更多資料,這也是非常可靠的辦法,但可能無法時時準備足夠多的訓練資料,或者,獲取更多資料的成本很高,但正則化有助於避免過度擬合,或者減少網路誤差,下面就來講講正則化的作用原理。

用邏輯迴歸來實現這些設想,求成本函式\(J\)的最小值,它是定義的成本函式,引數包含一些訓練資料和不同資料中個體預測的損失,\(w\)\(b\)是邏輯迴歸的兩個引數,\(w\)是一個多維度引數向量,\(b\)是一個實數。在邏輯迴歸函式中加入正則化,只需新增引數λ,也就是正則化引數。

\(\frac{\lambda}{2m}\)乘以\(w\)範數的平方,其中\(\left\| w \right\|_2^2\)\(w\)的歐幾里德範數的平方,等於\(w_{j}\)\(j\) 值從1到\(n_{x}\))平方的和,也可表示為\(w^{T}w\),也就是向量引數\(w\) 的歐幾里德範數(2範數)的平方,此方法稱為\(L2\)正則化,因為這裡用了歐幾里德範數,被稱為向量引數\(w\)\(L2\)範數。

為什麼只正則化引數\(w\)?為什麼不再加上引數 \(b\) 呢?可以這麼做,只是習慣省略不寫,因為\(w\)通常是一個高維引數向量,已經可以表達高偏差問題,\(w\)可能包含有很多引數,不可能擬合所有引數,而\(b\)只是單個數字,所以\(w\)幾乎涵蓋所有引數,而不是\(b\),如果加了引數\(b\),其實也沒太大影響,因為\(b\)只是眾多引數中的一個,所以通常省略不計,如果想加上這個引數,完全沒問題。

\(L2\)正則化是最常見的正則化型別,們可能聽說過\(L1\)正則化,\(L1\)正則化,加的不是\(L2\)範數,而是正則項\(\frac{\lambda}{m}\)乘以\(\sum_{j= 1}^{n_{x}}{|w|}\)\(\sum_{j =1}^{n_{x}}{|w|}\)也被稱為引數\(w\)向量的\(L1\)範數,無論分母是\(m\)還是\(2m\),它都是一個比例常量。

如果用的是\(L1\)正則化,\(w\)最終會是稀疏的,也就是說\(w\)向量中有很多0,有人說這樣有利於壓縮模型,因為集合中引數均為0,儲存模型所佔用的記憶體更少。實際上,雖然\(L1\)正則化使模型變得稀疏,卻沒有降低太多儲存記憶體,所以認為這並不是\(L1\)正則化的目的,至少不是為了壓縮模型,人們在訓練網路時,越來越傾向於使用\(L2\)正則化。

來看最後一個細節,\(\lambda\)是正則化引數,通常使用驗證集或交叉驗證集來配置這個引數,嘗試各種各樣的資料,尋找最好的引數,要考慮訓練集之間的權衡,把引數設定為較小值,這樣可以避免過擬合,所以λ是另外一個需要調整的超級引數,順便說一下,為了方便寫程式碼,在Python程式語言中,\(\lambda\)是一個保留欄位,編寫程式碼時,刪掉\(a\),寫成\(lambd\),以免與Python中的保留欄位衝突,這就是在邏輯迴歸函式中實現\(L2\)正則化的過程,如何在神經網路中實現\(L2\)正則化呢?

神經網路含有一個成本函式,該函式包含\(W^{[1]}\)\(b^{[1]}\)\(W^{[l]}\)\(b^{[l]}\)所有引數,字母\(L\)是神經網路所含的層數,因此成本函式等於\(m\)個訓練樣本損失函式的總和乘以\(\frac{1}{m}\),正則項為\(\frac{\lambda }{2m}{{\sum\nolimits_{1}^{L}{| {{W}^{[l]}}|}}^{2}}\),稱\({||W^{\left[l\right]}||}^{2}\)為範數平方,這個矩陣範數\({||W^{\left[l\right]}||}^{2}\)(即平方範數),被定義為矩陣中所有元素的平方求和,

看下求和公式的具體引數,第一個求和符號其值\(i\)從1到\(n^{[l - 1]}\),第二個其\(J\)值從1到\(n^{[l]}\),因為\(W\)是一個\(n^{[l]}\times n^{[l-1]}\)的多維矩陣,\(n^{[l]}\)表示\(l\) 層單元的數量,\(n^{[l-1]}\)表示第\(l-1\)層隱藏單元的數量。

該矩陣範數被稱作“弗羅貝尼烏斯範數”,用下標\(F\)標註”,鑑於線性代數中一些神秘晦澀的原因,不稱之為“矩陣\(L2\)範數”,而稱它為“弗羅貝尼烏斯範數”,矩陣\(L2\)範數聽起來更自然,但鑑於一些大家無須知道的特殊原因,按照慣例,稱之為“弗羅貝尼烏斯範數”,它表示一個矩陣中所有元素的平方和。

該如何使用該範數實現梯度下降呢?

backprop計算出\(dW\)的值,backprop會給出\(J\)\(W\)的偏導數,實際上是$ W{[l]}$,把$W\(替換為\)W^{[l]}\(減去學習率乘以\)dW$。

這就是之前額外增加的正則化項,既然已經增加了這個正則項,現在要做的就是給\(dW\)加上這一項\(\frac {\lambda}{m}W^{[l]}\),然後計算這個更新項,使用新定義的\(dW^{[l]}\),它的定義含有相關引數代價函式導數和,以及最後新增的額外正則項,這也是\(L2\)正則化有時被稱為“權重衰減”的原因。

用$ dW{[l]}$的定義替換此處的$dW\(,可以看到,\)W{[l]}$的定義被更新為$W\(減去學習率\)\alpha$ 乘以backprop 再加上\(\frac{\lambda}{m}W^{[l]}\)

該正則項說明,不論\(W^{[l]}\)是什麼,都試圖讓它變得更小,實際上,相當於給矩陣W乘以\((1 - \alpha\frac{\lambda}{m})\)倍的權重,矩陣\(W\)減去\(\alpha\frac{\lambda}{m}\)倍的它,也就是用這個係數\((1-\alpha\frac{\lambda}{m})\)乘以矩陣\(W\),該係數小於1,因此\(L2\)範數正則化也被稱為“權重衰減”,因為它就像一般的梯度下降,\(W\)被更新為少了\(\alpha\)乘以backprop輸出的最初梯度值,同時\(W\)也乘以了這個係數,這個係數小於1,因此\(L2\)正則化也被稱為“權重衰減”。

不打算這麼叫它,之所以叫它“權重衰減”是因為這兩項相等,權重指標乘以了一個小於1的係數。

以上就是在神經網路中應用\(L2\)正則化的過程。

相關文章