Improving Deep Neural Networks[2]
對吳恩達老師的《優化深度神經網絡》課程作業知識進行總結。
文章目錄
正則化 Regularization
首先,明確正則化的目的:避免模型在訓練過程中出現過擬合(overfitting)的情況。
過擬合:模型對訓練集的適應性非常好,但是對測試集的適應性不佳,太過”特殊化“。
不妨參考以上圖片(圖源:紅色石頭):
圖一屬於欠擬合狀態,一般解決方法:增加神經網絡的隱藏層個數、神經元個數,訓練時間延長,選擇其它更復雜的NN模型等。
圖三處於過擬合狀態,一般解決方法: 增加訓練樣本數據,進行正則化Regularization,選擇其他更復雜的NN模型等。
在本例中,我們面臨的過擬合情況如下:
可以看到,存在幾個紅點/藍點區域存在過擬合現象。
1 正則化是如何解決過擬合問題的?
簡單地說,過擬合情況由於當前模型對當前訓練集的特異性太強,缺乏一般化。
一個複雜的模型通常有着更強的表達能力,對於訓練集數據量不足、問題較簡單的情況,過於複雜的模型可能會導致結果太過特化。
正則化的實質是對模型的一個弱化,考慮較常用的兩種正則化方法(也是吳恩達老師在本節中提到的):L2 Regularization,Dropout Regularization。
L2 Regularization
參考吳恩達老師的課件,L2 正則化將:
轉化爲:
在上式中,正則化項,被展開表示了。
正則化項的含義實際上是每一層權重矩陣的F範數(矩陣元素平方和再開平方)平方和乘上係數,再除二倍的樣本數。
在這裏插入圖片描述
因爲代價函數的改變,反向傳播過程也有改變:
比起原先的情況,梯度新添正則項梯度:
更新參數時,參數額外減去正則項。
即:
考慮係數,當取較大值,該權值將會接近0,等同於該神經元將會接近失活狀態。
通過這種方法,可以弱化整個模型。
參考上圖(圖源:紅色石頭):
弱化後的複雜模型退化成了線性模型。當然,這是一種極端的情況。
因此,我們可以通過調整合適的值,來保證解決過擬合而不引起欠擬合的情況。
注:L2 正則化是針對W權重進行的,一般地,我們不對偏置量b進行正則化,有以下兩個解釋,個人傾向於後者:
紅色石頭:其實也可以對b進行正則化。但是一般w的維度很大,而b只是一個常數。相比較來說,參數很大程度上由w決定,改變b值對整體模型影響較小。所以,一般爲了簡便,就忽略對b的正則化了。
csdn博主:我們通常只對權重做懲罰,而不對偏置做正則懲罰。因爲精確擬合偏置所需的數據通常比權重少的多,正則化偏置參數可能會導致明顯的欠擬合。
Dropout Regularization
Dropout 正則化譯爲隨機失活,顧名思義,按照這一策略,我們將令每一個神經元以一定的概率失活(或存活)。
每一個神經元將以 keep_prob
的概率存活,以 1 - keep_prob
的概率失活。
參考L2 正則化中的解釋,不難理解這一方法解決過擬合的原理。
Ref:
吳恩達《優化深度神經網絡》課程筆記(1)– 深度學習的實用層面
2 L2 Regularization
依照:
在本例中,三層網絡的正則化代價計算如下:
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 圖如下:
預測結果圖如下:
可以看到,在合適的的幫助下,過擬合現象得到了解決。
同時需要注意的是,吳恩達老師在本節中提到:
- 是一個超參數,在訓練過程中可以由驗證集進行調整,以取得合適的取值。
- 太大的 會導致欠擬合現象。
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分佈,其輸出激活值的期望變爲 ,此時若要保持期望和不使用dropout時一致,就要除以 p。Ref: CSDN博主「ytusdc」
cost - iteration 圖如下:
預測結果如下:
顯然,使用Dropout正則化後,過擬合現象得到了解決。
同時需要注意的是:
- 注意不要在訓練和測試的時候都使用Dropout正則化,只需要在訓練時使用就可以了。
- 大部分開源框架都內置有Dropout正則化功能,無需擔心使用難度。
- 前向、反向傳播都需要使用Dropout。
- 在訓練時,將輸出結果除
keep_prob
以確保每個神經元的期望輸出與不使用Dropout時一致。
4 總結 Conclusion
吳恩達老師在本節末提到:
- 正則化會使權重W的值降低
- 因爲阻止了過擬合的發生,正則化會破壞訓練集的表現(譬如降低訓練集的準確度)。
- 但是正則化對測試集(未用於訓練的數據)有利,這也是對整個模型系統有利的。
- L2 regularization 以及 Dropout 是兩種非常有效的正則化方法。
上一篇:Improving Deep Neural Networks[1]
下一篇:Improving Deep Neural Networks[3]
2019/10 Karl