深度學習中的正則化技術概述
本文原載於微信公眾號「磐創AI」,由磐創AI技術團隊的磐石編譯,AI研習社獲其授權轉載。關注「磐創AI」公眾號並發送關鍵字「正則化數據集」獲取數據集下載指引,發送關鍵字「正則化代碼」獲取完整代碼。
介紹
數據科學研究者們最常遇見的問題之一就是怎樣避免過擬合。你也許在訓練模型的時候也遇到過同樣的問題--在訓練數據上表現非同一般的好,卻在測試集上表現很一般。或者是你曾在公開排行榜上名列前茅,卻在最終的榜單排名中下降數百個名次這種情況。那這篇文章會很適合你。
避免過擬合可以提高我們模型的性能。
在本文中,我們將解釋過擬合的概念以及正則化如何幫助克服過擬合問題。隨後,我們將介紹幾種不同的正則化技術,並且最後實戰一個Python實例以進一步鞏固這些概念。
目錄
什麼是正則化?
正則化如何幫助減少過擬合?
深度學習中的不同正則化技術
L2和L1正則化
Dropout
數據增強(Data Augmentation)
早停(Early stopping)
使用Keras處理MNIST數據案例研究
一. 什麼是正則化?
深入探討這個話題之前,請看一下這張圖片:
不知道你之前有么有看到過這張圖片?當我們訓練模型時,我們的模型甚至會試圖學到訓練數據中的雜訊,最終導致在測試集上表現很差。
換句話說就是在模型學習過程中,雖然模型的複雜性增加、訓練錯誤減少,但測試錯誤卻一點也沒有減少。這在下圖中顯示。
來源:Slideplayer
如果你有構建過神經網路的經驗,你就知道它們是有多複雜。這使得更容易過擬合。
正則化是一種對學習演算法進行微調來增加模型魯棒性的一種技術。這同時也意味著會改善了模型在未知的數據上的表現。
二. 正則化如何幫助減少過擬合?
讓我們來分析一個在訓練中過擬合的神經網路模型,如下圖所示。
如果你了解過機器學習中正則化的概念,那你肯定了解正則項懲罰係數。在深度學習中,它實際上會懲罰節點的權重矩陣。
如果我們的正則項係數很高以至於一些權重矩陣幾乎等於零。
這將導致出現一個極其簡單的線性網路結構和略微訓練數據不足。
較大數值的正則項係數顯然並不是那麼有用。我們需要優化正則項係數的值。以便獲得一個良好擬合的模型,如下圖所示。
三. 深度學習中的不同正則化技術
現在我們已經理解正則化如何幫助減少過擬合,為了將正則化應用於深度學習,我們將學習一些不同的技巧。
1. L2和L1正則化
L1和L2是最常見的正則化手段。通過添加正則項來更新代價函數。
代價函數=損失(比如二元交叉熵)+正則項
由於添加了正則項,使得加權矩陣的值減小--得益於它假定具有更小權重矩陣的神經網路產生更簡單的模型,故它也會在一定程度上減少過擬合。
這個正則項在L1和L2中是不同的。
在L2中,我們有:
這裡的lambda是正則項懲罰數。它是一個超參數。它的值可以被優化以獲得更好的結果。L2正則化也稱為權重衰減(weight decay),因為它使權重趨向零衰減(但不完全為零)。
在L1中,我們有:
這裡是懲罰權重的絕對值。與L2不同,這裡的權重可以減少到零。因此,當我們試圖壓縮我們的模型時,它非常有用。其他的情況下,我們通常更喜歡L2。
在keras,我們可以對每一層進行正則化。
以下是將L2正則化應用於全連接層的示例代碼。
注意:這裡0.01是正則項係數的值,即lambda,其仍須進一步優化。我們可以使用網格搜索方法(grid-search)對其進行優化。
同樣,我們也可以使用L1正則化。在本文後面的案例研究中,我們將更詳細地研究這一點。
2. Dropout
Dropout是最有趣正則化手段之一。它同樣會產生較好的結果,也是深度學習領域中最常用的正則化技術。
為了理解dropout,我們假設我們的神經網路結構類似於下面顯示的那樣:
那麼dropout是怎麼工作的呢?在每次迭代中,它隨機選擇一些節點,並將它們連同它們的所有傳入和傳出連接一起刪除,如下圖所示。
所以每次迭代都有一組不同的節點,這導致了一組不同的輸出。它也可以被認為是機器學習中的集成技術(ensemble technique)。
集成模型通常比單一模型表現得更好,因為它們捕獲更多的隨機表達。類似地,dropout也比正常的神經網路模型表現得更好。
選擇丟棄節點的比率是dropout函數中的超參數。如上圖所示,dropout可以應用於隱藏層以及輸入層。
GIF
來源:chatbotslife
由於這些原因,當運用較大的神經網路結構時若想增加隨機性,通常首選dropout。
在keras中,我們可以使用keras常用層(core layers)實現dropout。如下:
正如你所看到的,令丟棄率為0.25。也可以使用網格搜索方法進一步調優。
3. 數據增強(Data Augmentation)
減少過擬合的最簡單方法是增加訓練數據的大小。在機器學習中,我們無法增加訓練數據的大小,因為標記的數據成本太高。
但是,現在讓我們考慮我們正在處理圖像。在這種情況下,可以通過幾種方法來增加訓練數據的大小-旋轉圖像,翻轉,縮放,移位等。下圖是在手寫數字數據集上進行的一些變換。
這種技術被稱為數據增強。這通常會較大的提高模型的準確性。為了改進模型得的泛化能力,它可以被視為暴力技巧。
在keras中,我們可以使用ImageDataGenerator執行所有這些轉換。它有一大堆你可以用來預處理訓練數據的參數列表。
以下是實現它的示例代碼。
4. 早停(Early stopping)
早停是基於交叉驗證策略--將一部分訓練集作為驗證集。一旦發現驗證集的性能越來越差時,我們就立即停止對該模型的訓練。這個過程被稱為早停(Early stopping)。
在上圖中,我們將在虛線出停止訓練,因為在此之後,我們的模型將在訓練集上過擬合。
在keras中,我們可以使用回調函數(callback)實現早停。以下是它的示例代碼。
在這裡,monitor表示需要監視的數量,"val_err"表示驗證錯誤。
Patience表示當early stopping被激活(如發現loss相比上一個epoch訓練沒有下降),則經過 patience 個epoch後停止訓練。 為了更好地理解,讓我們再看看上面的圖片。在虛線之後每經歷一個epoch都會導致更高的驗證集錯誤率。因此,虛線後5個epoch(因為我們的patience等於5)後我們的模型將停止訓練--由於不再進一步的提升。
注意:在5個epochs(這是為patience一般定義的值)之後,模型可能會再次開始改善,並且驗證錯誤也開始減少。因此,我們需要在調整超參數時多加小心。
四. 使用Keras處理MNIST數據集案例研究(A case study on MINIST data with keras)
到這裡,你應該對不同的正則化技術有了一定的理論基礎。我們現在將這些技術手段應用於我們的深度學習實踐問題--手寫體數字識別中(https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-digits/)。下載了數據集後,就可以開始下面的實踐之旅了。首先,導入一些基本庫。
載入數據集。
數據集可視化顯示圖片。
創建驗證集(val),優化我們的模型以獲得更好的表現。我們將用70:30的訓練和驗證數據比率。
第一步,構建一個帶有5個隱藏層的簡單神經網路,每個層都有500個節點。
請注意,運行10個epoch。讓我們看看它的實際表現。
然後,讓我們嘗試使用L2正則化方法,並對比它是否比簡單的神經網路模型有更好的結果。
注意lambda的值等於0.0001。Cool,獲得了比我們以前的NN模型更高的精度。
現在,我們來使用下L1正則化技術。
這對比之前未經過處理的神經網路結構來說沒有任何改進,接下來試一下dropout技術。
不錯。dropout使我們對比原來未處理的NN模型有了一些改進。
現在,我們嘗試數據增強(data augmentation)。
現在,為了增加訓練數據:
在這裡,我使用了zca_whitening作為參數,它突出了每個數字的輪廓,如下圖所示。
哇。這次準確率有了較大的提升。這種優化方式適用範圍廣,我們只需根據數據集中的圖像特點選擇適當的參數。
最後,讓我們嘗試最後一個正則化方法-早停(early stopping)。
你可以看到,模型訓練僅在5次迭代後就停止了--由於驗證集準確率不再提高。如果設置更大的epoch運行,它也許不會有較好的結果。你可以說這是一種優化epoch數量的技術。
結語
希望現在你對正則化技術以及怎樣在深度學習模型中實現它有了一定的了解。強烈建議在深度學習任務中應用它,它將可能會幫助提升你對模型的理解與認知。
是否覺得這篇文章會有幫助?歡迎下面的評論部分分享你的想法。
(編譯自:https://www.analyticsvidhya.com/blog/2018/04/fundamentals-deep-learning-regularization-techniques/)
NLP 工程師入門實踐班
三大模塊,五大應用,知識點全覆蓋;
海外博士講師,豐富項目分享經驗;
理論+實踐,帶你實戰典型行業應用;
專業答疑社群,討論得出新知。
新人福利
【超過 1000G 神經網路 / AI / 大數據資料】
嘀~正則表達式快速上手指南(上篇)
※從文本匹配到圖文匹配:所見所想所找-基於生成模型的多模態檢索
※AWS 上可用的公用數據集,任何人都可以免費訪問
TAG:AI研習社 |