首先我們理解一下,什麼叫做正則化?
目的角度:防止過擬合
簡單來說,正則化是一種為了減小測試誤差的行為(有時候會增加訓練誤差)。我們在構造機器學習模型時,最終目的是讓模型在面對新資料的時候,可以有很好的表現。當你用比較複雜的模型比如神經網路,去擬合數據時,很容易出現過擬合現象(訓練集表現很好,測試集表現較差),這會導致模型的泛化能力下降,這時候,我們就需要使用正則化,降低模型的複雜度。
1、矩陣的F-1範數、F-2範數
說明:這裡的F-範數指的是Frobenius範數,和logistics迴歸的L1、L2正則化的向量範數不一樣。
矩陣的F-1範數:矩陣所有元素的絕對值之和。公式為:
矩陣的F-2範數:矩陣所有元素的平方求和後開根號。公式為:
2、L1正則化與L2正則化(主要使用L2)
這裡m為樣本數,l為各個隱藏層,λλ為超引數,需要自己除錯,L2中2m是為了後面求梯度的時候可以抵消掉常數2。
3、L1正則化與L2正則化的區別
L1 正則化項的效果是讓權值 W 往 0 靠,使網路中的權值儘可能為 0,也就相當於減小了網路複雜度,防止過擬合。事實上,L1 正則化能產生稀疏性,導致 W 中許多項變成零。
L2 正則化項的效果是減小權值 W。事實上,更小的權值 W,從某種意義上說,表示網路的複雜度更低,對資料的擬合剛剛好。
二、Dropout正則化(隨機失活)
Dropout提供了正則化一大類模型的方法,計算方便且功能強大。它不同於L1、L2正則項那樣改變損失函式。而是改變模型本身。Dropout可以被認為是整合大量深層神經網路的使用Bagging的方法。Dropout提供一種廉價的Bagging整合近似,能夠訓練和評估指數級數量的神經網路。
假設訓練的網路:
對於使用dropout技術的話,我們隨機刪除隱層的神經元,形成新的網路:
然後,我們通過前向求損失,反向傳到損失,批量梯度下降完成一批,更新完w和b,然後繼續隨機刪除隱藏層的神經元,繼續批量梯度下降更新權值和偏置。
反向隨機失活(inverted dropout):
反向隨機失活(inverted dropout),是在訓練時就進行數值範圍調整,從而讓前向傳播在測試時保持不變。這樣做還有一個好處,無論你決定是否使用隨機失活,預測方法的程式碼可以保持不變。
反向隨機失活的程式碼如下:
"""
反向隨機失活推薦實現方式
在訓練時drop和調整數值範圍,測試時不做任何事
""" p = 0.5 #啟用神經元得概率,P值更高=隨機失活更弱 def train_step(x):
#三層neural network的向前傳播
H1 = np.maximum(0,np.dot(w1,X) + b1)
U1 = (np.random.rand(*H1.shape) < p) / p #第一個隨機失活遮罩。注意P!!!
H1 *=U1 #drop!
H2 = np.maximum(0,np.dot(w2,H1) + b2)
U2 = (np.random.rand(*H2.shape) < p) / p #第一個隨機失活遮罩。注意P!!!
H2 *=U2 #drop!
out = np.dot(w3,H2)+b3 #反向傳播:計算梯度。。。(略)
#進行引數更新。。。(略) def predict(X):
# 向前傳播時模型整合
H1 = np.maximum(0,np.dot(w1,X) + b1) #不用進行數值範圍調整
H2 = np.maximum(0,np.dot(w2,H1) + b2)
out = np.dot(w3,H2) + b3