深度学习正则化
學習目標
- 目標 - 了解偏差與方差的意義
- 知道L2正則化與L1正則化的數學意義
- 知道Droupout正則化的方法
- 了解早停止法、數據增強法的其它正則化方式
 
- 應用 - 無
 
2.3.1 偏差與方差
2.3.1.1 數據集劃分
首先我們對機器學習當中涉及到的數據集劃分進行一個簡單的復習
- 訓練集(train set):用訓練集對算法或模型進行訓練過程;
- 驗證集(development set):利用驗證集(又稱為簡單交叉驗證集,hold-out cross validation set)進行交叉驗證,選擇出最好的模型;
- 測試集(test set):最后利用測試集對模型進行測試,對學習方法進行評估。
在小數據量的時代,如 100、1000、10000 的數據量大小,可以將數據集按照以下比例進行劃分:
- 無驗證集的情況:70% / 30%
- 有驗證集的情況:60% / 20% / 20%
而在如今的大數據時代,擁有的數據集的規模可能是百萬級別的,所以驗證集和測試集所占的比重會趨向于變得更小。
- 100 萬數據量:98% / 1% / 1%
- 超百萬數據量:99.5% / 0.25% / 0.25%
以上這些比例可以根據數據集情況選擇。
2.3.1.2 偏差與方差的意義
“偏差-方差分解”(bias-variance decomposition)是解釋學習算法泛化性能的一種重要工具。
泛化誤差可分解為偏差、方差與噪聲,泛化性能是由學習算法的能力、數據的充分性以及學習任務本身的難度所共同決定的。
- 偏差:度量了學習算法的期望預測與真實結果的偏離程度,即刻畫了學習算法本身的擬合能力
- 方差:度量了同樣大小的訓練集的變動所導致的學習性能的變化,即刻畫了數據擾動所造成的影響
- 噪聲:表達了在當前任務上任何學習算法所能夠達到的期望泛化誤差的下界,即刻畫了學習問題本身的難度。
那么偏差、方差與我們的數據集劃分到底有什么關系呢?
- 1、訓練集的錯誤率較小,而驗證集/測試集的錯誤率較大,說明模型存在較大方差,可能出現了過擬合
- 2、訓練集和測試集的錯誤率都較大,且兩者相近,說明模型存在較大偏差,可能出現了欠擬合
- 3、訓練集和測試集的錯誤率都較小,且兩者相近,說明方差和偏差都較小,這個模型效果比較好。
所以我們最終總結,方差一般指的是數據模型得出來了,能不能對未知數據的擾動預測準確。而偏差說明在訓練集當中就已經誤差較大了,基本上在測試集中沒有好的效果。
所以如果我們的模型出現了較大的方差或者同時也有較大的偏差,該怎么去解決?
2.3.1.3 解決方法
對于高方差,有以下幾種方式:
- 獲取更多的數據,使得訓練能夠包含所有可能出現的情況
- 正則化(Regularization)
- 尋找更合適的網絡結構
對于高偏差,有以下幾種方式:
- 擴大網絡規模,如添加隱藏層或者神經元數量
- 尋找合適的網絡架構,使用更大的網絡結構,如AlexNet
- 訓練時間更長一些
不斷嘗試,直到找到低偏差、低方差的框架。
2.3.2 正則化(Regularization)
正則化,即在成本函數中加入一個正則化項(懲罰項),懲罰模型的復雜度,防止網絡過擬合
2.3.2.1 邏輯回歸的L1與L2正則化
邏輯回歸的參數W數量根據特征的數量而定,那么正則化如下
- 邏輯回歸的損失函數中增加L2正則化
J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}{||w||}^2_2J(w,b)=?m??1??∑?i=1?m??L(?y?^???(i)??,y?(i)??)+?2m??λ??∣∣w∣∣?2?2??
其中的L2范數可以理解:\frac{\lambda}{2m}{||w||}^2_2=\frac{\lambda}{2m}\sum_{j=1}^{n_x}w^2_j = \frac{\lambda}{2m}w^Tw?2m??λ??∣∣w∣∣?2?2??=?2m??λ??∑?j=1?n?x????w?j?2??=?2m??λ??w?T??w
解釋:所有w參數的平方和的結果
- 邏輯回歸的損失函數中增加L1正則化
J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)}) + \frac{\lambda}{2m}{||w||}_1J(w,b)=?m??1??∑?i=1?m??L(?y?^???(i)??,y?(i)??)+?2m??λ??∣∣w∣∣?1??
其中L2范數可以理解為:\frac{\lambda}{2m}{||w||}_1 = \frac{\lambda}{2m}\sum_{j=1}^{n_x}{|w_j|}?2m??λ??∣∣w∣∣?1??=?2m??λ??∑?j=1?n?x????∣w?j??∣
注:其中,λ 為正則化因子,是超參數。由于 L1 正則化最后得到 w 向量中將存在大量的 0,使模型變得稀疏化,因此 L2 正則化更加常用。
2.3.2.2 正則化項的理解
在損失函數中增加一項,那么其實梯度下降是要減少損失函數的大小,對于L2或者L1來講都是要去減少這個正則項的大小,那么也就是會減少W權重的大小。這是我們一個直觀上的感受。
- 接下來我們通過方向傳播來理解這個其中的L2,對于損失函數我們要反向傳播求參數梯度:
(1)?dW = \frac{\partial L}{\partial w}+ \frac{\lambda}{m} {W}dW=??w???L??+?m??λ??W
前面的默認損失函數的梯度計算結果默認為backprop,那么更新的參數就為
(2)?W := W - \alpha dWW:=W?αdW?那么我們將第一個公式帶入第二個得到
-->W := W - \alpha(\frac{\partial L}{\partial w} + \frac{\lambda}{m}W)??>W:=W?α(??w???L??+?m??λ??W)
-->=W - \frac{\alpha \lambda}{m}W - \alpha*\frac{\partial L}{\partial w}??>=W??m??αλ??W?α???w???L??
所以每次更新的時候都會讓W(1 - \frac{\alpha \lambda}{m})W(1??m??αλ??),這個系數永遠小于1,所以我們通常稱L2范數為權重衰減。
2.3.2.3 神經網絡中的正則化
神經網絡中的正則化與邏輯回歸相似,只不過參數W變多了,每一層都有若干個權重,可以理解成一個矩陣
?
我們把w[l]w[l]理解某一層神經元的權重參數,其中這是加入了L2范數,可以是
{\begin{Vmatrix}w^{[l]}\end{Vmatrix}}^2_F = \sum^{n^{[l-1]}}_{i=1}\sum^{n^{[l]}}_{j=1}(w^{[l]}_{ij})^2?∥?∥???w?[l]?????∥?∥???F?2??=∑?i=1?n?[l?1]????∑?j=1?n?[l]????(w?ij?[l]??)?2??
對于矩陣的L2范數,有個專業名稱叫弗羅貝尼烏斯范數(Frobenius Norm)
2.3.2.4 正則化為什么能夠防止過擬合
正則化因子設置的足夠大的情況下,為了使成本函數最小化,權重矩陣 W 就會被設置為接近于 0 的值,直觀上相當于消除了很多神經元的影響,那么大的神經網絡就會變成一個較小的網絡。
?
在加入正則化項后,當λ增大,導致W^[l]W?[??l]減小,Z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]}Z?[l]??=W?[l]??a?[l?1]??+b?[l]??便會減小。由上圖可知,在 z 較小(接近于 0)的區域里,函數近似線性,所以每層的函數就近似線性函數,整個網絡就成為一個簡單的近似線性的網絡,因此不會發生過擬合。
2.3.3 Droupout正則化
Droupout論文地址:http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pdf
?
Droupout:隨機的對神經網絡每一層進行丟棄部分神經元操作。
?
對于網絡的每一層會進行設置保留概率,即keep_prob。假設keep_prob為0.8,那么也就是在每一層所有神經元有20% 的概率直接失效,可以理解為0.
?
2.3.3.1 Inverted droupout
這種方式會對每層進行如下代碼操作
# 假設設置神經元保留概率
keep_prob = 0.8
# 隨機建立一個標記1 or 0的矩陣,表示隨機失活的單元,占比20%
dl = np.random.rand(al.shape[0], al.shape[1]) < keep_prob
# 讓a1對應d1的為0地方結果為0
al = np.multiply(al, dl)# 為了測試的時候,每一個單元都參與進來
al /= keep_prob
-  訓練練的時候只有占比為pp的隱藏層單元參與訓練。 
-  增加最后一行代碼的原因,在預測的時候,所有的隱藏層單元都需要參與進來,就需要測試的時候將輸出結果除以以pp使下一層的輸入規模保持不變。 
假設keep_prob=p=0.8
z^{l}=w^{l}a^{l-1}+b^{l}z?l??=w?l??a?l?1??+b?l???,當$l-1$層有比例為 $1-p=0.2$單元drop后,a^{l-1}a?l?1??大約會變為原來的80%,為了保證ll層的zz值期望(可以理解為均值)不變,所以要在a^{l-1}a?l?1??與dropout矩陣乘積后的權重進行擴大,要乘以\frac{1}{p}=10/8?p??1??=10/8(增大)
注:原始:(1+1+1+1+1+1+1+1+1+1)/10 = 1,現在其中20%失效,則平均值為0.8,所以0.8 * (10/8) = 1. 相當于其中8個神經元參數增大了(10/8)倍
2.3.3.2 droupout為什么有效總結
加入了 dropout 后,輸入的特征都存在被隨機清除的可能,所以該神經元不會再特別依賴于任何一個輸入特征,也就是不會給任何一個輸入特征設置太大的權重。通過傳播過程,dropout 將產生和 L2 正則化相同的收縮權重的效果。
-  對于不同的層,設置的keep_prob大小也不一致,神經元較少的層,會設keep_prob為 1.0,而神經元多的層則會設置比較小的keep_prob 
-  通常被使用在計算機視覺領域,圖像擁有更多的特征,場景容易過擬合,效果被實驗人員證明是很不錯的。 
調試時候使用技巧:
- dropout 的缺點是成本函數無法被明確定義,因為每次會隨機消除一部分神經元,所以參數也無法確定具體哪一些,在反向傳播的時候帶來計算上的麻煩,也就無法保證當前網絡是否損失函數下降的。如果要使用droupout,會先關閉這個參數,保證損失函數是單調下降的,確定網絡沒有問題,再次打開droupout才會有效。
2.3.4 其它正則化方法
- 早停止法(Early Stopping)
- 數據增強
2.3.4.1 早停止法(Early Stopping)
通常我們在訓練驗證的時候,發現過擬合。可以得到下面這張損失圖
?
通常不斷訓練之后,損失越來越小。但是到了一定之后,模型學到的過于復雜(過于擬合訓練集上的數據的特征)造成測試集開始損失較小,后來又變大。模型的w參數會越來越大,那么可以在測試集損失減小一定程度之后停止訓練。
但是這種方法治標不治本,得從根本上解決數據或者網絡的問題。
2.3.4.2 數據增強
- 數據增強
指通過剪切、旋轉/反射/翻轉變換、縮放變換、平移變換、尺度變換、對比度變換、噪聲擾動、顏色變換等一種或多種組合數據增強變換的方式來增加數據集的大小。
?
即使卷積神經網絡被放在不同方向上,卷積神經網絡對平移、視角、尺寸或照度(或以上組合)保持不變性,都會認為是一個物體。
- 為什么這樣做?
?
假設數據集中的兩個類。左邊的代表品牌A(福特),右邊的代表品牌B(雪佛蘭)。
假設完成了訓練,并且輸入下面的圖像(品牌A),但是你的神經網絡輸出認為它是品牌B的汽車!
?
為什么會發生這種現象? 因為算法可能會尋找區分一個類和另一個類的最明顯特征。在這個例子中 ,這個特征就是所有品牌A的汽車朝向左邊,所有品牌B的汽車朝向右邊。神經網絡的好壞取決于輸入的數據。
怎么解決這個問題?
我們需要減少數據集中不相關特征的數量。對上面的汽車類型分類器來說,你只需要將現有的數據集中的照片水平翻轉,使汽車朝向另一側?,F在,用新的數據集訓練神經網絡,通過過增強數據集,可以防止神經網絡學習到不相關的模式,提升效果。(在沒有采集更多的圖片前提下)
- 數據增強類別
那么我們應該在機器學習過程中的什么位置進行數據增強?在向模型輸入數據之前增強數據集。
- 離線增強。預先進行所有必要的變換,從根本上增加數據集的規模(例如,通過翻轉所有圖像,保存后數據集數量會增加2倍)。
- 在線增強,或稱為動態增強??赏ㄟ^對即將輸入模型的小批量數據的執行相應的變化,這樣同一張圖片每次訓練被隨機執行一些變化操作,相當于不同的數據集了。
那么我們的代碼中也是進行這種在線增強。
- 數據增強技術
下面一些方法基礎但功能強大的增強技術,目前被廣泛應用。
- 翻轉:tf.image.random_flip_left_right - 你可以水平或垂直翻轉圖像。一些架構并不支持垂直翻轉圖像。但,垂直翻轉等價于將圖片旋轉180再水平翻轉。下面就是圖像翻轉的例子。
 
?
                  從左側開始分別是:原始圖像,水平翻轉圖像,垂直翻轉圖像
- 旋轉:rotat
???????
?
                                      從左到右,圖像相對于前一個圖像順時針旋轉90度
- 剪裁:random_crop - 隨機從原始圖像中采樣一部分,然后將這部分圖像調整為原始圖像大小。這個方法更流行的叫法是隨機裁剪。
 
?
                 從左側開始分別為:原始圖像,從左上角裁剪出一個正方形部分,然后從右下角裁剪出一個正方形部分。剪裁的部分被調整為原始圖像大小。
- 平移、縮放等等方法
數據增強的效果是非常好的,比如下面的例子,綠色和粉色表示沒有數據增強之前的損失和準確率效果,紅色和藍色表示數據增強之后的損失和準確率結果,可以看到學習效果也改善較快。
?
那么TensorFlow 官方源碼都是基于 vgg與inception論文的圖像增強介紹,全部通過tf.image相關API來預處理圖像。并且提供了各種封裝過tf.image之后的API。那么TensorFlow 官網也給我們提供了一些模型的數據增強過程。
2.3.5 總結
- 掌握偏差與方差的意義
- 掌握L2正則化與L1正則化的數學原理 - 權重衰減
 
- 掌握droupout原理以及方法 - Inverted droupout
 
- 知道正則化的作用
總結
 
                            
                        - 上一篇: 深度学习:梯度下降算法改进
- 下一篇: Lumen / Laravel 使用网
