吳恩達深度學習筆記02——改善深層神經網絡1深度學習的實用層面

一、數據劃分:訓練 / 驗證 / 測試集

應用深度學習是一個典型的迭代過程。

對於一個需要解決的問題的樣本數據,在建立模型的過程中,數據會被劃分爲以下幾個部分:

  • 訓練集(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)是解釋學習算法泛化性能的一種重要工具。
在這裏插入圖片描述

泛化誤差可分解爲偏差、方差與噪聲之和:

  • 偏差:度量了學習算法的期望預測與真實結果的偏離程度,即刻畫了學習算法本身的擬合能力;
  • 方差:度量了同樣大小的訓練集的變動所導致的學習性能的變化,即刻畫了數據擾動所造成的影響;
  • 噪聲:表達了在當前任務上任何學習算法所能夠達到的期望泛化誤差的下界,即刻畫了學習問題本身的難度。

偏差-方差分解說明,泛化性能是由學習算法的能力、數據的充分性以及學習任務本身的難度所共同決定的。給定學習任務,爲了取得好的泛化性能,則需要使偏差較小,即能夠充分擬合數據,並且使方差較小,即使得數據擾動產生的影響小。

在欠擬合(underfitting)的情況下,出現高偏差(high bias)的情況,即不能很好地對數據進行分類。

當模型設置的太複雜時,訓練集中的一些噪聲沒有被排除,使得模型出現過擬合(overfitting)的情況,在驗證集上出現高方差(high variance)的現象。

當訓練出一個模型以後,如果:

  • 訓練集的錯誤率較小,而驗證集的錯誤率卻較大,說明模型存在較大方差,可能出現了過擬合;
  • 訓練集和開發集的錯誤率都較大,且兩者相當,說明模型存在較大偏差,可能出現了欠擬合;
  • 訓練集錯誤率較大,且開發集的錯誤率遠較訓練集大,說明方差和偏差都較大,模型很差;
  • 訓練集和開發集的錯誤率都較小,且兩者的相差也較小,說明方差和偏差都較小,這個模型效果比較好。

PS:偏差和方差的權衡問題對於模型來說十分重要。

最優誤差通常也稱爲“貝葉斯誤差”。




三、機器學習基礎

首先保證偏差降低到可接受的數值,然後檢查方差有沒有問題。

存在高偏差:

  • 擴大網絡規模,如添加隱藏層或隱藏單元數目;
  • 尋找合適的網絡架構,使用更大的 NN 結構;
  • 花費更長時間訓練。

存在高方差:

  • 獲取更多的數據;
  • 正則化(regularization);
  • 尋找更合適的網絡結構。

不斷嘗試,直到找到低偏差、低方差的框架。

在深度學習的早期階段,沒有太多方法能做到只減少偏差或方差而不影響到另外一方。而在大數據時代,深度學習對監督式學習大有裨益,使得我們不用像以前一樣太過關注如何平衡偏差和方差的權衡問題,通過以上方法可以在不增加某一方的前提下減少另一方的值。




四、正則化

正則化是在成本函數中加入一個正則化項,懲罰模型的複雜度。正則化可以用於解決高方差的問題。

1、Logistic 迴歸中的正則化

對於 Logistic 迴歸,加入 L2 正則化(也稱“L2 範數”)的成本函數:
在這裏插入圖片描述

  • L2 正則化:
    在這裏插入圖片描述

  • L1正則化:
    在這裏插入圖片描述
    其中,λ 爲正則化因子,是超參數。

由於 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 同理)。
    在這裏插入圖片描述
  • 其他解釋
    在權值 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、梯度的數值逼近

使用雙邊誤差的方法去逼近導數,精度要高於單邊誤差。

  • 單邊誤差:
    在這裏插入圖片描述
    在這裏插入圖片描述
    誤差:O(ε)

  • 雙邊誤差
    在這裏插入圖片描述在這裏插入圖片描述
    誤差: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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章