Improving Deep Neural Networks[2]

Improving Deep Neural Networks[2]

對吳恩達老師的《優化深度神經網絡》課程作業知識進行總結。

正則化 Regularization

首先,明確正則化的目的:避免模型在訓練過程中出現過擬合(overfitting)的情況。

過擬合:模型對訓練集的適應性非常好,但是對測試集的適應性不佳,太過”特殊化“。

在這裏插入圖片描述

不妨參考以上圖片(圖源:紅色石頭):

圖一屬於欠擬合狀態,一般解決方法:增加神經網絡的隱藏層個數、神經元個數,訓練時間延長,選擇其它更復雜的NN模型等。

圖三處於過擬合狀態,一般解決方法: 增加訓練樣本數據,進行正則化Regularization,選擇其他更復雜的NN模型等。


在本例中,我們面臨的過擬合情況如下:

在這裏插入圖片描述
在這裏插入圖片描述

可以看到,存在幾個紅點/藍點區域存在過擬合現象。


1 正則化是如何解決過擬合問題的?

簡單地說,過擬合情況由於當前模型對當前訓練集的特異性太強,缺乏一般化。

一個複雜的模型通常有着更強的表達能力,對於訓練集數據量不足、問題較簡單的情況,過於複雜的模型可能會導致結果太過特化。

正則化的實質是對模型的一個弱化,考慮較常用的兩種正則化方法(也是吳恩達老師在本節中提到的):L2 Regularization,Dropout Regularization。


L2 Regularization

參考吳恩達老師的課件,L2 正則化將:
J=1mi=1m(y(i)log(a[L](i))+(1y(i))log(1a[L](i)))(1)J = -\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} \tag{1}
轉化爲:
Jregularized=1mi=1m(y(i)log(a[L](i))+(1y(i))log(1a[L](i)))cross-entropy cost+1mλ2lkjWk,j[l]2L2 regularization cost(2)J_{regularized} = \small \underbrace{-\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} }_\text{cross-entropy cost} + \underbrace{\frac{1}{m} \frac{\lambda}{2} \sum\limits_l\sum\limits_k\sum\limits_j W_{k,j}^{[l]2} }_\text{L2 regularization cost} \tag{2}

在上式中,正則化項λ2ml=1LW[l]F2\dfrac{\lambda}{2m}\sum\limits_{l=1}^{L}||W^{[l]}||_F^2,被展開表示了。

正則化項的含義實際上是每一層權重矩陣的F範數(矩陣元素平方和再開平方)平方和乘上係數λ\lambda,再除二倍的樣本數。
在這裏插入圖片描述
因爲代價函數的改變,反向傳播過程也有改變:

比起原先的情況,梯度新添正則項梯度:ddW(λ2mW2)=λmw[l]\dfrac{d}{dW}(\dfrac{\lambda}{2m}W^2)=\dfrac{\lambda}{m}w^{[l]}

更新參數時,參數額外減去正則項。
dw[l]=dwbefore[l]+λmw[l]w[l]:=w[l]αdw[l] \begin{array}{l}{d w^{[l]}=d w_{b e f o r e}^{[l]}+\frac{\lambda}{m} w^{[l]}} \\ {w^{[l]}:=w^{[l]}-\alpha \cdot d w^{[l]}}\end{array}
即:
w[l]:=wlαdwl=wlα(dwbeforel+λmwl)=(1αλm)w[l]αdwbefore[l] \begin{aligned} w^{[l]} &:=w^{|l|}-\alpha \cdot d w^{|l|} \\ &=w^{|l|}-\alpha \cdot\left(d w_{b e f o r e}^{|l|}+\frac{\lambda}{m} w^{|l|}\right) \\ &=\left(1-\alpha \frac{\lambda}{m}\right) w^{[l]}-\alpha \cdot d w_{b e f o r e}^{[l]} \end{aligned}
考慮係數(1αλm)(1-\alpha \frac{\lambda}{m})λ\lambda取較大值,該權值將會接近0,等同於該神經元將會接近失活狀態

通過這種方法,可以弱化整個模型。

在這裏插入圖片描述

參考上圖(圖源:紅色石頭):

弱化後的複雜模型退化成了線性模型。當然,這是一種極端的情況。

因此,我們可以通過調整合適的λ\lambda值,來保證解決過擬合而不引起欠擬合的情況。

注:L2 正則化是針對W權重進行的,一般地,我們不對偏置量b進行正則化,有以下兩個解釋,個人傾向於後者:

紅色石頭:其實也可以對b進行正則化。但是一般w的維度很大,而b只是一個常數。相比較來說,參數很大程度上由w決定,改變b值對整體模型影響較小。所以,一般爲了簡便,就忽略對b的正則化了。

csdn博主:我們通常只對權重做懲罰,而不對偏置做正則懲罰。因爲精確擬合偏置所需的數據通常比權重少的多,正則化偏置參數可能會導致明顯的欠擬合。


Dropout Regularization

Dropout 正則化譯爲隨機失活,顧名思義,按照這一策略,我們將令每一個神經元以一定的概率失活(或存活)。

在這裏插入圖片描述

每一個神經元將以 keep_prob 的概率存活,以 1 - keep_prob的概率失活。

參考L2 正則化中的解釋,不難理解這一方法解決過擬合的原理。


Ref:

吳恩達《優化深度神經網絡》課程筆記(1)– 深度學習的實用層面

小結深度學習中的正則化(超詳細分析)


2 L2 Regularization

依照:

Jregularized=1mi=1m(y(i)log(a[L](i))+(1y(i))log(1a[L](i)))cross-entropy cost+1mλ2lkjWk,j[l]2L2 regularization cost J_{regularized} = \small \underbrace{-\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} }_\text{cross-entropy cost} + \underbrace{\frac{1}{m} \frac{\lambda}{2} \sum\limits_l\sum\limits_k\sum\limits_j W_{k,j}^{[l]2} }_\text{L2 regularization cost}

在本例中,三層網絡的正則化代價計算如下:

def compute_cost_with_regularization(A3, Y, parameters, lambd):
    m = Y.shape[1]
    W1 = parameters["W1"]
    W2 = parameters["W2"]
    W3 = parameters["W3"]
    
    cross_entropy_cost = compute_cost(A3, Y) 
    
    L2_regularization_cost = 
    	(1/m) * lambd * 0.5 * (np.sum(np.square(W1)) + 
                               np.sum(np.square(W2)) + 
                               np.sum(np.square(W3)))
    
    cost = cross_entropy_cost + L2_regularization_cost
    
    return cost

cost - iteration 圖如下:

在這裏插入圖片描述
預測結果圖如下:

在這裏插入圖片描述

可以看到,在合適的λ\lambda的幫助下,過擬合現象得到了解決。

同時需要注意的是,吳恩達老師在本節中提到:

  1. λ\lambda 是一個超參數,在訓練過程中可以由驗證集進行調整,以取得合適的取值。
  2. 太大的 λ\lambda 會導致欠擬合現象。

3 Dropout Regularization

根據隨機失活的原理,每個神經元將以 keep_prob 的概率存活,以 1 - keep_prob的概率失活。

def forward_propagation_with_dropout(X, parameters, keep_prob = 0.5):
    
    # retrieve parameters
    W1 = parameters["W1"]
	# ...
    b3 = parameters["b3"]
    
    # LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID
    Z1 = np.dot(W1, X) + b1
    A1 = relu(Z1)
    D1 = np.random.rand(A1.shape[0], A1.shape[1])
    D1 = D1 < keep_prob
    A1 = np.multiply(D1, A1)
    A1 = A1 / keep_prob

    Z2 = np.dot(W2, A1) + b2
    A2 = relu(Z2)
    D2 = np.random.rand(A2.shape[0], A2.shape[1])
    D2 = D2 < keep_prob
    A2 = np.multiply(D2, A2)
    A2 = A2 / keep_prob
    
    Z3 = np.dot(W3, A2) + b3
    A3 = sigmoid(Z3)
    
    cache = (Z1, D1, A1, W1, b1, Z2, D2, A2, W2, b2, Z3, A3, W3, b3)
    
    return A3, cache

代碼生成一個隨機矩陣(元素值在(0-1)之間),按照 keep_prob 的閾值映射爲(0-1)矩陣,對應位置相乘以實現“失活”。

因爲在模型訓練階段使用Dropout正則化,而在模型發佈後使用過程中是不會進行正則化的,因此我們需要保證每個神經元輸出的期望與未使用dropout時一致。因此,在計算結束後,將矩陣Ai每個元素除 keep_prob

結合概率論的知識來具體看一下:假設一個神經元的輸出激活值爲a,在不使用dropout的情況下,其輸出期望值爲a,如果使用了dropout,神經元就可能有保留和關閉兩種狀態,把它看作一個離散型隨機變量,它就符合概率論中的0-1分佈,其輸出激活值的期望變爲 pa+(1p)0=pap*a+(1-p)*0=pa,此時若要保持期望和不使用dropout時一致,就要除以 p。Ref: CSDN博主「ytusdc」


cost - iteration 圖如下:
在這裏插入圖片描述
預測結果如下:
在這裏插入圖片描述

顯然,使用Dropout正則化後,過擬合現象得到了解決。

同時需要注意的是:

  1. 注意不要在訓練和測試的時候都使用Dropout正則化,只需要在訓練時使用就可以了。
  2. 大部分開源框架都內置有Dropout正則化功能,無需擔心使用難度。
  3. 前向、反向傳播都需要使用Dropout。
  4. 在訓練時,將輸出結果除 keep_prob 以確保每個神經元的期望輸出與不使用Dropout時一致。

4 總結 Conclusion

吳恩達老師在本節末提到:

  1. 正則化會使權重W的值降低
  2. 因爲阻止了過擬合的發生,正則化會破壞訓練集的表現(譬如降低訓練集的準確度)。
  3. 但是正則化對測試集(未用於訓練的數據)有利,這也是對整個模型系統有利的。
  4. L2 regularization 以及 Dropout 是兩種非常有效的正則化方法。


上一篇:Improving Deep Neural Networks[1]
下一篇:Improving Deep Neural Networks[3]

2019/10 Karl

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章