首先我們理解一下,什么叫做正則化?
目的角度:防止過擬合
簡單來說,正則化是一種為了減小測試誤差的行為(有時候會增加訓練誤差)。我們在構造機器學習模型時,最終目的是讓模型在面對新數據的時候,可以有很好的表現。當你用比較復雜的模型比如神經網絡,去擬合數據時,很容易出現過擬合現象(訓練集表現很好,測試集表現較差),這會導致模型的泛化能力下降,這時候,我們就需要使用正則化,降低模型的復雜度。
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