重磅干貨,第一時(shí)間送達
介紹
數據科學(xué)研究者們最常遇見(jiàn)的問(wèn)題之一就是怎樣避免過(guò)擬合。你也許在訓練模型的時(shí)候也遇到過(guò)同樣的問(wèn)題--在訓練數據上表現非同一般的好,卻在測試集上表現很一般?;蛘呤悄阍诠_(kāi)排行榜上名列前茅,卻在最終的榜單排名中下降數百個(gè)名次這種情況。那這篇文章會(huì )很適合你。
避免過(guò)擬合可以提高我們模型的性能。
在本文中,我們將解釋過(guò)擬合的概念以及正則化如何幫助克服過(guò)擬合問(wèn)題。隨后,我們將介紹幾種不同的正則化技術(shù),并且最后實(shí)戰一個(gè)Python實(shí)例以進(jìn)一步鞏固這些概念。
目錄
什么是正則化?
正則化如何幫助減少過(guò)擬合?
深度學(xué)習中的不同正則化技術(shù)
L2和L1正則化
Dropout
數據增強(Data Augmentation)
早停(Early stopping)
使用Keras處理MNIST數據案例研究
一. 什么是正則化?
深入探討這個(gè)話(huà)題之前,請看一下這張圖片:
不知道你之前有么有看到過(guò)這張圖片?當我們訓練模型時(shí),我們的模型甚至會(huì )試圖學(xué)到訓練數據中的噪聲,最終導致在測試集上表現很差。
換句話(huà)說(shuō)就是在模型學(xué)習過(guò)程中,雖然模型的復雜性增加、訓練錯誤減少,但測試錯誤卻一點(diǎn)也沒(méi)有減少。這在下圖中顯示。
來(lái)源:Slideplayer
如果你有構建過(guò)神經(jīng)網(wǎng)絡(luò )的經(jīng)驗,你就知道它們是有多復雜。這使得更容易過(guò)擬合。
正則化是一種對學(xué)習算法進(jìn)行微調來(lái)增加模型魯棒性的一種技術(shù)。這同時(shí)也意味著(zhù)會(huì )改善了模型在未知的數據上的表現。
二. 正則化如何幫助減少過(guò)擬合?
讓我們來(lái)分析一個(gè)在訓練中過(guò)擬合的神經(jīng)網(wǎng)絡(luò )模型,如下圖所示。
如果你了解過(guò)機器學(xué)習中正則化的概念,那你肯定了解正則項懲罰系數。在深度學(xué)習中,它實(shí)際上會(huì )懲罰節點(diǎn)的權重矩陣。
如果我們的正則項系數很高以至于一些權重矩陣幾乎等于零。

這將導致出現一個(gè)極其簡(jiǎn)單的線(xiàn)性網(wǎng)絡(luò )結構和略微訓練數據不足。
較大數值的正則項系數顯然并不是那么有用。我們需要優(yōu)化正則項系數的值。以便獲得一個(gè)良好擬合的模型,如下圖所示。

三. 深度學(xué)習中的不同正則化技術(shù)
現在我們已經(jīng)理解正則化如何幫助減少過(guò)擬合,為了將正則化應用于深度學(xué)習,我們將學(xué)習一些不同的技巧。
1. L2和L1正則化
L1和L2是最常見(jiàn)的正則化手段。通過(guò)添加正則項來(lái)更新代價(jià)函數。
代價(jià)函數=損失(比如二元交叉熵)+正則項
由于添加了正則項,使得加權矩陣的值減小--得益于它假定具有更小權重矩陣的神經(jīng)網(wǎng)絡(luò )產(chǎn)生更簡(jiǎn)單的模型,故它也會(huì )在一定程度上減少過(guò)擬合。
這個(gè)正則項在L1和L2中是不同的。
在L2中,我們有:

這里的lambda是正則項懲罰數。它是一個(gè)超參數。它的值可以被優(yōu)化以獲得更好的結果。L2正則化也稱(chēng)為權重衰減(weight decay),因為它使權重趨向零衰減(但不完全為零)。
在L1中,我們有:

這里是懲罰權重的絕對值。與L2不同,這里的權重可以減少到零。因此,當我們試圖壓縮我們的模型時(shí),它非常有用。其他的情況下,我們通常更喜歡L2。
在keras,我們可以對每一層進(jìn)行正則化。
以下是將L2正則化應用于全連接層的示例代碼。

同樣,我們也可以使用L1正則化。在本文后面的案例研究中,我們將更詳細地研究這一點(diǎn)。
2. Dropout
Dropout是最有趣正則化手段之一。它同樣會(huì )產(chǎn)生較好的結果,也是深度學(xué)習領(lǐng)域中最常用的正則化技術(shù)。
為了理解dropout,我們假設我們的神經(jīng)網(wǎng)絡(luò )結構類(lèi)似于下面顯示的那樣:

那么dropout是怎么工作的呢?在每次迭代中,它隨機選擇一些節點(diǎn),并將它們連同它們的所有傳入和傳出連接一起刪除,如下圖所示。

所以每次迭代都有一組不同的節點(diǎn),這導致了一組不同的輸出。它也可以被認為是機器學(xué)習中的集成技術(shù)(ensemble technique)。
集成模型通常比單一模型表現得更好,因為它們捕獲更多的隨機表達。類(lèi)似地,dropout也比正常的神經(jīng)網(wǎng)絡(luò )模型表現得更好。
選擇丟棄節點(diǎn)的比率是dropout函數中的超參數。如上圖所示,dropout可以應用于隱藏層以及輸入層。

來(lái)源:chatbotslife
由于這些原因,當運用較大的神經(jīng)網(wǎng)絡(luò )結構時(shí)若想增加隨機性,通常首選dropout。
在keras中,我們可以使用keras常用層(core layers)實(shí)現dropout。如下:

3. 數據增強(Data Augmentation)
減少過(guò)擬合的最簡(jiǎn)單方法是增加訓練數據的大小。在機器學(xué)習中,我們無(wú)法增加訓練數據的大小,因為標記的數據成本太高。
但是,現在讓我們考慮我們正在處理圖像。在這種情況下,可以通過(guò)幾種方法來(lái)增加訓練數據的大小-旋轉圖像,翻轉,縮放,移位等。下圖是在手寫(xiě)數字數據集上進(jìn)行的一些變換。

這種技術(shù)被稱(chēng)為數據增強。這通常會(huì )較大的提高模型的準確性。為了改進(jìn)模型得的泛化能力,它可以被視為暴力技巧。
在keras中,我們可以使用ImageDataGenerator執行所有這些轉換。它有一大堆你可以用來(lái)預處理訓練數據的參數列表。
以下是實(shí)現它的示例代碼。

4. 早停(Early stopping)
早停是基于交叉驗證策略--將一部分訓練集作為驗證集。一旦發(fā)現驗證集的性能越來(lái)越差時(shí),我們就立即停止對該模型的訓練。這個(gè)過(guò)程被稱(chēng)為早停(Early stopping)。

在上圖中,我們將在虛線(xiàn)出停止訓練,因為在此之后,我們的模型將在訓練集上過(guò)擬合。
在keras中,我們可以使用回調函數(callback)實(shí)現早停。以下是它的示例代碼。

在這里,monitor表示需要監視的數量, val_err 表示驗證錯誤。
Patience表示當early stopping被激活(如發(fā)現loss相比上一個(gè)epoch訓練沒(méi)有下降),則經(jīng)過(guò) patience 個(gè)epoch后停止訓練。為了更好地理解,讓我們再看看上面的圖片。在虛線(xiàn)之后每經(jīng)歷一個(gè)epoch都會(huì )導致更高的驗證集錯誤率。因此,虛線(xiàn)后5個(gè)epoch(因為我們的patience等于5)后我們的模型將停止訓練--由于不再進(jìn)一步的提升。
注意:在5個(gè)epochs(這是為patience一般定義的值)之后,模型可能會(huì )再次開(kāi)始改善,并且驗證錯誤也開(kāi)始減少。因此,我們需要在調整超參數時(shí)多加小心。
四. 使用Keras處理MNIST數據集案例研究(A case study on MINIST data with keras)
到這里,你應該對不同的正則化技術(shù)有了一定的理論基礎。我們現在將這些技術(shù)手段應用于我們的深度學(xué)習實(shí)踐問(wèn)題--手寫(xiě)體數字識別中(https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-digits/)。下載了數據集后,就可以開(kāi)始下面的實(shí)踐之旅了。首先,導入一些基本庫。



數據集可視化顯示圖片。



創(chuàng )建驗證集(val),優(yōu)化我們的模型以獲得更好的表現。我們將用70:30的訓練和驗證數據比率。

第一步,構建一個(gè)帶有5個(gè)隱藏層的簡(jiǎn)單神經(jīng)網(wǎng)絡(luò ),每個(gè)層都有500個(gè)節點(diǎn)。

請注意,運行10個(gè)epoch。讓我們看看它的實(shí)際表現。


然后,讓我們嘗試使用L2正則化方法,并對比它是否比簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò )模型有更好的結果。


注意lambda的值等于0.0001。Cool,獲得了比我們以前的NN模型更高的精度。
現在,我們來(lái)使用下L1正則化技術(shù)。

這對比之前未經(jīng)過(guò)處理的神經(jīng)網(wǎng)絡(luò )結構來(lái)說(shuō)沒(méi)有任何改進(jìn),接下來(lái)試一下dropout技術(shù)。


不錯。dropout使我們對比原來(lái)未處理的NN模型有了一些改進(jìn)。
現在,我們嘗試數據增強(data augmentation)。

現在,為了增加訓練數據

在這里,我使用了zca_whitening作為參數,它突出了每個(gè)數字的輪廓,如下圖所示。



哇。這次準確率有了較大的提升。這種優(yōu)化方式適用范圍廣,我們只需根據數據集中的圖像特點(diǎn)選擇適當的參數。
最后,讓我們嘗試最后一個(gè)正則化方法-早停(early stopping)。

你可以看到,模型訓練僅在5次迭代后就停止了--由于驗證集準確率不再提高。如果設置更大的epoch運行,它也許不會(huì )有較好的結果。你可以說(shuō)這是一種優(yōu)化epoch數量的技術(shù)。
結語(yǔ)
希望現在你對正則化技術(shù)以及怎樣在深度學(xué)習模型中實(shí)現它有了一定的了解。強烈建議在深度學(xué)習任務(wù)中應用它,它將可能會(huì )幫助提升你對模型的理解與認知。
是否覺(jué)得這篇文章會(huì )有幫助?歡迎下面的評論部分分享你的想法。
(編譯自:https://www.analyticsvidhya.com/blog/2018/04/fundamentals-deep-learning-regularization-techniques/)
聯(lián)系客服