一、資料劃分:訓練 / 驗證 / 測試集
應用深度學習是一個典型的疊代過程。
對于一個需要解決的問題的樣本資料,在建立模型的過程中,資料會被劃分為以下幾個部分:
- 訓練集(train set):用訓練集對算法或模型進行訓練過程;
- 驗證集(development set):利用驗證集(又稱為簡單交叉驗證集,hold-out cross validation set)進行交叉驗證,選擇出最好的模型;
- 測試集(test set):最後利用測試集對模型進行測試,擷取模型運作的無偏估計(對學習方法進行評估)。
在小資料量的時代,如 100、1000、10000 的資料量大小,可以将資料集按照以下比例進行劃分:
- 無驗證集的情況:70% / 30%;
- 有驗證集的情況:60% / 20% / 20%;
而在如今的大資料時代,對于一個問題,我們擁有的資料集的規模可能是百萬級别的,是以驗證集和測試集所占的比重會趨向于變得更小。
驗證集的目的是為了驗證不同的算法哪種更加有效,是以驗證集隻要足夠大到能夠驗證大約 2-10 種算法哪種更好,而不需要使用 20% 的資料作為驗證集。如百萬資料中抽取 1 萬的資料作為驗證集就可以了。
測試集的主要目的是評估模型的效果,如在單個分類器中,往往在百萬級别的資料中,我們選擇其中 1000 條資料足以評估單個模型的效果。
- 100 萬資料量:98% / 1% / 1%;
- 超百萬資料量:99.5% / 0.25% / 0.25%(或者99.5% / 0.4% / 0.1%)
PS:
-
建議
建議驗證集要和訓練集來自于同一個分布(資料來源一緻),可以使得機器學習算法變得更快并獲得更好的效果。
如果不需要用無偏估計來評估模型的性能,則可以不需要測試集。
-
補充:交叉驗證(cross validation)
交叉驗證的基本思想是重複地使用資料;把給定的資料進行切分,将切分的資料集組合為訓練集與測試集,在此基礎上反複地進行訓練、測試以及模型選擇。
二、模型估計:偏差 / 方差
“偏差-方差分解”(bias-variance decomposition)是解釋學習算法泛化性能的一種重要工具。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cscXRU1EawdlW5plMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5ETNzUzNwYTM1EDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
泛化誤差可分解為偏差、方差與噪聲之和:
- 偏差:度量了學習算法的期望預測與真實結果的偏離程度,即刻畫了學習算法本身的拟合能力;
- 方差:度量了同樣大小的訓練集的變動所導緻的學習性能的變化,即刻畫了資料擾動所造成的影響;
- 噪聲:表達了在目前任務上任何學習算法所能夠達到的期望泛化誤差的下界,即刻畫了學習問題本身的難度。
偏差-方差分解說明,泛化性能是由學習算法的能力、資料的充分性以及學習任務本身的難度所共同決定的。給定學習任務,為了取得好的泛化性能,則需要使偏差較小,即能夠充分拟合資料,并且使方差較小,即使得資料擾動産生的影響小。
在欠拟合(underfitting)的情況下,出現高偏差(high bias)的情況,即不能很好地對資料進行分類。
當模型設定的太複雜時,訓練集中的一些噪聲沒有被排除,使得模型出現過拟合(overfitting)的情況,在驗證集上出現高方差(high variance)的現象。
當訓練出一個模型以後,如果:
- 訓練集的錯誤率較小,而驗證集的錯誤率卻較大,說明模型存在較大方差,可能出現了過拟合;
- 訓練集和開發集的錯誤率都較大,且兩者相當,說明模型存在較大偏差,可能出現了欠拟合;
- 訓練集錯誤率較大,且開發集的錯誤率遠較訓練集大,說明方差和偏差都較大,模型很差;
- 訓練集和開發集的錯誤率都較小,且兩者的相差也較小,說明方差和偏差都較小,這個模型效果比較好。
PS:偏差和方差的權衡問題對于模型來說十分重要。
最優誤差通常也稱為“貝葉斯誤差”。
三、機器學習基礎
首先保證偏差降低到可接受的數值,然後檢查方差有沒有問題。
存在高偏差:
- 擴大網絡規模,如添加隐藏層或隐藏單元數目;
- 尋找合适的網絡架構,使用更大的 NN 結構;
- 花費更長時間訓練。
存在高方差:
- 擷取更多的資料;
- 正則化(regularization);
- 尋找更合适的網絡結構。
不斷嘗試,直到找到低偏差、低方差的架構。
在深度學習的早期階段,沒有太多方法能做到隻減少偏差或方差而不影響到另外一方。而在大資料時代,深度學習對監督式學習大有裨益,使得我們不用像以前一樣太過關注如何平衡偏差和方差的權衡問題,通過以上方法可以在不增加某一方的前提下減少另一方的值。
四、正則化
正則化是在成本函數中加入一個正則化項,懲罰模型的複雜度。正則化可以用于解決高方差的問題。
1、Logistic 回歸中的正則化
對于 Logistic 回歸,加入 L2 正則化(也稱“L2 範數”)的成本函數:
- L2 正則化:
吳恩達深度學習筆記02——改善深層神經網絡1深度學習的實用層面 - L1正則化: 其中,λ 為正則化因子,是超參數。
吳恩達深度學習筆記02——改善深層神經網絡1深度學習的實用層面
由于 L1 正則化最後得到 w 向量中将存在大量的 0,使模型變得稀疏化,是以 L2 正則化更加常用。
注意,lambda在 Python 中屬于保留字,是以在程式設計的時候,用lambd代替這裡的正則化因子。
2、神經網絡中的正則化
對于神經網絡,加入正則化的成本函數:
因為 w 的大小為 (n[l−1], n[l]),是以:
該矩陣範數被稱為弗羅貝尼烏斯範數(Frobenius Norm),是以神經網絡中的正則化項被稱為弗羅貝尼烏斯範數矩陣。
3、權重衰減
4、正則化可以減小過拟合的原因
-
直覺解釋
正則化因子設定的足夠大的情況下,為了使成本函數最小化,權重矩陣 W 就會被設定為接近于 0 的值,直覺上相當于消除了很多神經元的影響,那麼大的神經網絡就會變成一個較小的網絡。當然,實際上隐藏層的神經元依然存在,但是其影響減弱了,便不會導緻過拟合。
-
數學解釋
假設神經元中使用的激活函數為g(z) = tanh(z)(sigmoid 同理)。
吳恩達深度學習筆記02——改善深層神經網絡1深度學習的實用層面 -
其他解釋
在權值 w[L]變小之下,輸入樣本 X 随機的變化不會對神經網絡模造成過大的影響,神經網絡受局部噪音的影響的可能性變小。這就是正則化能夠降低模型方差的原因。
五、dropout 正則化
1、概念
正則化的方法除了L2,還有dropout(随機失活)。在計算機視覺中應用的特别多。它是在神經網絡的隐藏層為每個神經元結點設定一個随機消除的機率,保留下來的神經元形成一個結點較少、規模較小的網絡用于訓練。dropout 正則化較多地被使用在計算機視覺(Computer Vision)領域。
2、反向随機失活(Inverted dropout)
反向随機失活是實作 dropout 的方法。對第l層進行 dropout:
keep_prob = 0.8 # 設定神經元保留機率
dl = np.random.rand(al.shape[0], al.shape[1]) < keep_prob
al = np.multiply(al, dl)
al /= keep_prob
注意,在測試階段不要使用 dropout,因為那樣會使得預測結果變得随機。
3、了解 dropout
對于單個神經元,其工作是接收輸入并産生一些有意義的輸出。但是加入了 dropout 後,輸入的特征都存在被随機清除的可能,是以該神經元不會再特别依賴于任何一個輸入特征,即不會給任何一個輸入特征設定太大的權重。
是以,通過傳播過程,dropout 将産生和 L2 正則化相同的收縮權重的效果。
對于不同的層,設定的
keep_prob
也不同。一般來說,神經元較少的層,會設
keep_prob
為 1.0,而神經元多的層則會設定比較小的
keep_prob
。
總結一下,如果你擔心某些層比其他層更容易發生過拟合,可以把某些層的
keep_prob
值設定的比其他層更低。缺點是為了使用交叉驗證,你要搜尋更多的超級參數。另一種方法在一些層上應用dropout,而有的則不用。
dropout 的一大缺點是成本函數無法被明确定義。因為每次疊代都會随機消除一些神經元結點的影響,是以無法確定成本函數單調遞減。是以,使用 dropout 時,先将
keep_prob
全部設定為 1.0 後運作代碼,確定 J(w,b)函數單調遞減,再打開 dropout。
六、其他正則化方法
- 資料擴增(Data Augmentation):通過圖檔的一些變換(翻轉,局部放大後切割等),得到更多的訓練集和驗證集。
- 早停止法(Early Stopping):将訓練集和驗證集進行梯度下降時的成本變化曲線畫在同一個坐标軸内,當訓練集誤差降低但驗證集誤差升高,兩者開始發生較大偏差時及時停止疊代,并傳回具有最小驗證集誤差的連接配接權和門檻值,以避免過拟合。這種方法的缺點是無法同時達成偏差和方差的最優。
七、标準化輸入
使用标準化處理輸入 X 能夠有效加速收斂。
1、标準化公式
第一步是零均值化,第二步是歸一化方差,總結起來為:
PS:注意,訓練集和測試集要使用同樣的均值和方差。
2、使用标準化的原因
有圖可知,使用标準化前後,成本函數的形狀有較大差别。
在不使用标準化的成本函數中,如果設定一個較小的學習率,可能需要很多次疊代才能到達全局最優解;而如果使用了标準化,那麼無論從哪個位置開始疊代,都能以相對較少的疊代次數找到全局最優解。
八、梯度消失和梯度爆炸
在梯度函數上出現的以指數級遞增或者遞減的情況分别稱為梯度爆炸或者梯度消失。
對于導數同理。是以,在計算梯度時,根據不同情況梯度函數會以指數級遞增或遞減,導緻訓練導數難度上升,梯度下降算法的步長會變得非常小,需要訓練的時間将會非常長。
利用初始化緩解梯度消失和爆炸:
因為Z=W1X1+W2X2+…WnXn+b可知,當輸入的數量 n 較大時,我們希望每個 wi 的值都小一些,這樣它們的和得到的 z 也較小。
為了得到較小的 wi,設定Var(wi)=1/n,這裡稱為 Xavier initialization。
WL = np.random.randn(WL.shape[0], WL.shape[1]) * np.sqrt(1/n)
其中 n 是輸入的神經元個數,即WL.shape[1]。
這樣,激活函數的輸入 x 近似設定成均值為 0,标準方差為 1,神經元輸出 z 的方差就正則化到 1 了。雖然沒有解決梯度消失和爆炸的問題,但其在一定程度上确實減緩了梯度消失和爆炸的速度。
同理,也有 He Initialization。它和 Xavier initialization 唯一的差別是Var(wi)=2/n,适用于 ReLU 作為激活函數時。
當激活函數使用 ReLU 時,Var(wi)=2/n;當激活函數使用 tanh 時,Var(wi)=1/n。
九、梯度檢驗(Gradient checking)
1、梯度的數值逼近
使用雙邊誤差的方法去逼近導數,精度要高于單邊誤差。
- 單邊誤差:
吳恩達深度學習筆記02——改善深層神經網絡1深度學習的實用層面 誤差:O(ε)吳恩達深度學習筆記02——改善深層神經網絡1深度學習的實用層面 - 雙邊誤差
吳恩達深度學習筆記02——改善深層神經網絡1深度學習的實用層面 吳恩達深度學習筆記02——改善深層神經網絡1深度學習的實用層面 誤差:O(ε2)
當 ε 越小時,結果越接近真實的導數,也就是梯度值。可以使用這種方法來判斷反向傳播進行梯度下降時,是否出現了錯誤。
2、梯度檢驗的實施
- 連接配接參數
現在,我們需要找到 dθ 和代價函數 J 的梯度的關系。
- 進行梯度檢驗
如果梯度檢驗值和 ε 的值相近,說明神經網絡的實施是正确的,否則要去檢查代碼是否存在 bug。一般來說,10-7~10-5是好的,如果是高于10-3就考慮bug
PS:在神經網絡實施梯度檢驗的實用技巧和注意事項
- 不要在訓練中使用梯度檢驗,它隻用于調試(debug)。使用完畢關閉梯度檢驗的功能;
- 如果算法的梯度檢驗失敗,要檢查所有項,并試着找出 bug,即确定哪個 dθapprox[i] 與 dθ 的值相差比較大;
- 當成本函數包含正則項時,也需要帶上正則項進行檢驗;
- 梯度檢驗不能與 dropout 同時使用。因為每次疊代過程中,dropout 會随機消除隐藏層單元的不同子集,難以計算 dropout 在梯度下降上的成本函數 J。建議關閉 dropout,用梯度檢驗進行雙重檢查,确定在沒有 dropout 的情況下算法正确,然後打開 dropout;