摘要: 本文總結深度學習過擬合產生的緣由以及解決辦法,涵蓋正則化、dropout等操做,能夠做爲工程中的一份開發指南。
神經網絡經過大量的參數模擬各類繁多的任務,並能擬合各類複雜的數據集。這種獨特的能力使其可以在許多難以在「傳統」機器學習時代取得進展的領域——例如圖像識別、物體檢測或天然語言處理等領域表現優異。然而,有時候,最大的優勢也是潛在的弱點。模型在學習過程時,若是缺少控制可能會致使過擬合(overfitting)現象的發生——神經網絡模型在訓練集上表現很好,但對新數據預測時效果很差。瞭解過擬合產生的緣由以及防止這種現象發生的方法對於成功設計神經網絡而言顯得相當重要。算法
在實踐中,檢測模型過擬合是困難的。不少時候,將訓練好的模型上線後才意識到模型出現問題。事實上,只有經過新數據的建議,才能確保一切正常。但在訓練期間,應儘可能表示真實狀況。所以,比較好的做法是將數據集劃分爲三個部分——訓練集、開發集(也稱爲交叉驗證集)和測試集。構建的模型僅經過訓練集來學習,驗證集用於跟蹤訓練進度並根據驗證集上的結果優化模型。同時,在訓練過程結束後使用測試集來評估模型的性能。使用全新的數據可讓咱們對算法的仿真狀況有一個客觀的見解。網絡
確保驗證集和測試集來自同一分佈以及它們可以準確地反映但願未來收到的數據很是重要。只有這樣,才能確保在學習過程當中作出的決策更接近好的解決方案。那麼如何分割手上的數據集呢?最常推薦的拆分方法之一是按照60/20/20
的比例拆分,但在大數據時代,當數據集是數百萬條目時,這種固定比例的劃分已經再也不合適。簡而言之,一切都取決於使用的數據集的大小,若是有數以百萬計的條目可供使用,或許最好的劃分方法是按照98/1/1
的比例劃分。注意:開發集和測試集應該足夠大,以使得對構建的模型的性能有很高的信心。根據數據大小劃分數據集的推薦方法如圖1所示。機器學習
當準備好數據集後,須要使用工具來評估模型的性能。然而,在得出任何結論以前,咱們應該熟悉兩個新的概念——誤差(bias)和方差(variance)。爲了讓咱們更好地理解這個複雜的問題,這裏舉一個簡單的例子。假設數據集由位於二維空間中的兩類點組成,如圖2所示。函數
因爲這是一個簡單的演示用例,此次就沒有測試集,僅使用訓練集和驗證集。接下來,咱們準備三個模型:第一個是簡單的線性迴歸,另外兩個是由幾個密集鏈接層構建的神經網絡。在圖3中,咱們能夠看到使用這些模型定義的分類邊界。右上角的第一個模型很是簡單,所以具備較高的誤差,即它沒法找到要素和結果之間的全部重要連接,這是因爲數據集中有不少噪音,所以簡單的線性迴歸沒法有效地處理它。從圖中能夠看到,在神經網絡模型上表現得更好,但左下角的模型太緊密地擬合數據,這使得它在驗證集上表現得更糟,這意味着它具備很大的方差——它適合噪聲而不是預期的輸出。在最後的模型中,經過使用正則化來減輕這種不指望的影響。工具
上述舉的例子很簡單,只有兩個特徵。當咱們在多維空間中操做時,須要使用包含數十個特徵的數據集,這種狀況該怎麼辦?這個時候須要比較使用訓練集和交叉驗證集計算獲得的偏差值。固然,最佳狀況是這兩組的錯誤率都很低。主要問題是如何定義低錯誤率——在某些狀況下它能夠是1%,而在其餘狀況下它能夠高達10%或更大。在訓練神經網絡時,設立一個比較模型性能的基準是有所幫助的。一般,這取決於執行此任務的人員能力水平。而後嘗試確保設計的算法在訓練期間有一個接近參考水平的偏差。若是已經實現了這個目標,可是在驗證集上驗證錯誤率時,錯誤率會顯著增長,這可能意味着模型存在過擬合(高方差)。另外一方面,若是模型在訓練集和交叉驗證上表現都不佳,那麼它可能太弱而且具備高誤差。固然,這個問題會更復雜,並且涉及的面也更廣,在這裏不作討論,感興趣的讀者能夠閱讀NG的新書。性能
當咱們的神經網絡具備較高的方差時,這裏有不少方法能夠有所幫助。好比,很是廣泛的方法——獲取更多數據,這種方法通常每次都運行良好。還有一些操做,例如正則化,但這種方法須要一些經驗和技巧,由於對神經網絡施加太多限制可能會損害其有效學習的能力。如今讓咱們試着看一下減小過擬合的一些最流行的方法,並討論它們起做用的緣由。學習
當須要減小過擬合時,應該嘗試的第一種方法是正則化。這種方法涉及到在損失函數中添加一個額外的式子,這會使得模型過於複雜。簡單來講,就是在權重矩陣中使用太高的值,這樣就會嘗試限制其靈活性,同時也鼓勵它根據多種特徵構建解決方案。這種方法的兩個流行版本是L1-最小絕對誤差(LAD)和L2-最小二乘偏差(LS),相應的公式以下。在大多數狀況下,L2正則化是首選,由於它將不過重要的特徵的權重值減少到零。可是在處理具備大量異常值的數據集時不是首選。測試
如今看一下在誤差和方差的例子中使用的兩個神經網絡。正如以前提到的,使用正則化來消除過擬合。在三維空間中可視化權重矩陣並比較在有正則化和沒有正則化的模型之間得到的結果以下圖所示。此外,還使用正則化對許多模型進行了模擬,改變λ值以驗證其對權重矩陣中包含的值的影響。矩陣行和列索引對應於水平軸值,權重爲垂直座標值。大數據
在前面提到的L1和L2兩個版本中的正則化公式中,引入了超參數λ (也稱爲正則化率)。在選擇其值時,試圖在模型的簡單性和擬合訓練數據之間達到最佳點。增長λ值也會增長正則化效應。在圖4中能夠注意到,沒有正則化的模型得到的平面,以及具備很是低λ的模型其係數值很是「紊亂」,有許多具備重要價值的峯值。在應用具備較高超參數值的L2正則化以後,該平面圖是平坦的。最後,能夠看到將lambda值設置爲0.1或1會致使模型中權重值急劇降低。優化
另外一種很是流行的神經網絡正則化方法是dropout。這個想法實際上很是簡單——神經網絡的每一個單元(屬於輸出層的那些單元)都被賦予在計算中被暫時忽略的機率p。超參數p稱爲丟失率,一般將其默認值設置爲0.5。而後,在每次迭代中,根據指定的機率隨機選擇丟棄的神經元。所以,每次訓練會使用較小的神經網絡。下圖顯示了使用dropout操做的神經網絡的示例。從圖中能夠看到,在每次迭代過程當中是隨機停用來自第二和第四層神經元。
這種方法的有效性是很是使人驚訝。畢竟,在現實世界中,若是經理天天隨機選擇員工並將其送回家,工廠的生產率是不會提升的。讓咱們從單個神經元的角度來看這個問題,在每次迭代中,任何輸入值均可能會被隨機消除,神經元會嘗試平衡風險而不會支持任何特徵。結果,權重矩陣值的分佈變得更均勻。
下圖顯示了在後續的學習過程迭代期間在測試和交叉驗證集上獲得的準確度值的變化狀況。從中能夠看到,最終獲得的模型並非最好的模型。最終獲得的結果比150個epoch後的狀況要糟糕得多。爲何不在模型開始過擬合以前就中斷學習過程?這一觀察啓發了一種流行的過擬合減小方法,即提早中止(early stopping)。
在實踐中,每迭代幾回就對模型進行檢查它在驗證集上的工做狀況,並保存每一個比之前全部迭代時都要好的模型。此外,還設置最大迭代次數這個限制,超過此值時中止學習。儘管提早中止能夠顯著改善模型的性能,但在實踐中,其應用極大地使得模型的優化過程變得複雜,很難與其餘常規技術結合使用。
掌握如何確認模型是否過擬合對於構建神經模型是很重要的,掌握防止過擬合發生的解決方法也是最基本的。受限於篇幅,本文中沒有進行詳細描述,但總結了相關內容,具體的操做技巧還須要各位在實踐中進行嘗試。
本文爲雲棲社區原創內容,未經容許不得轉載。