在進行數據挖掘或者機器學習模型創建的時候,由於在統計學習中,假設數據知足獨立同分布(i.i.d,independently and identically distributed),即當前已產生的數據能夠對將來的數據進行推測與模擬,所以都是使用歷史數據創建模型,即便用已經產生的數據去訓練,而後使用該模型去擬合將來的數據。 在咱們機器學習和深度學習的訓練過程當中,常常會出現過擬合和欠擬合的現象。訓練一開始,模型一般會欠擬合,因此會對模型進行優化,然而等到訓練到必定程度的時候,就須要解決過擬合的問題了。html
如何判斷過擬合呢?咱們在訓練過程當中會定義訓練偏差,驗證集偏差,測試集偏差(泛化偏差)。訓練偏差老是減小的,而泛化偏差一開始會減小,但到必定程序後不減反而增長,這時候便出現了過擬合的現象。算法
以下圖所示,從直觀上理解,欠擬合就是尚未學習到數據的特徵,還有待繼續學習,而過擬合則是學習進行的太完全,以致於把數據的一些局部特徵或者噪聲帶來的特徵都給學到了,因此在進行測試的時候泛化偏差也不佳。網絡
從方差和誤差的角度來講,欠擬合就是在訓練集上高方差、高誤差,過擬合也就是訓練集上高方差、低誤差。爲了更加生動形象的表示,咱們看一些經典的圖:機器學習
對比這幾個圖,發現圖一的擬合併無把大致的規律給擬合出來,這個就是欠擬合。圖三則是擬合的太細緻了,用的擬合函數太複雜了,在這些數據集上的效果很好,可是換到另外的一個數據集效果確定可預見的很差。只有圖二是最好的,把數據的規律擬合出來了,同時在更換數據集後,效果也不會不好。ide
仔細想一想圖片三中的模型,擬合函數確定是一個高次函數,其參數個數確定確定比圖二的要多,能夠說圖三的擬合函數比圖二的要大,模型更加複雜。這也是過擬合的一個判斷經驗,模型是否太複雜。另外,針對圖三,咱們把一些高次變量對應的參數值變小,也就至關於把模型變簡單了。這個角度上看,能夠減少參數值,也就是通常模型過擬合,參數值總體比較大。從模型複雜性來說,能夠是:函數
一、模型的參數個數;二、模型的參數值的大小。個數越多,參數值越大,模型就越複雜。性能
一、欠擬合的表現學習
針對模型過擬合這個問題,有沒有什麼方法來斷定模型是否過擬合呢?其實通常都是依靠模型在訓練集和驗證集上的表現有一個大致的判斷就好了。若是要有一個具體的方法,能夠參考機器學中,學習曲線來判斷模型是否過擬合。以下圖:測試
也就是看訓練集合驗證集隨着樣本數量的增長,他們之間的差值變化。若是訓練集和測試集的準確率都很低,那麼說明模型欠擬合。優化
二、欠擬合的解決方案
模型在訓練集上的表現很好,但在測試集和新數據上的表現不好。
訓練集上的表現 | 測試集上的表現 | 結論 |
很差 | 很差 | 欠擬合 |
好 | 很差 | 過擬合 |
好 | 好 | 適度擬合 |
二、過擬合的緣由
1)數據量過小
這個是很容易產生過擬合的一個緣由。設想,咱們有一組數據很好的吻合3次函數的規律,如今咱們局部的拿出了很小一部分數據,用機器學習或者深度學習擬合出來的模型很大的可能性就是一個線性函數,在把這個線性函數用在測試集上,效果可想而知確定不好了。
2)訓練集和驗證集分佈不一致
訓練集訓練出一個適合訓練集那樣分佈的數據集,當你把模型運用到一個不同分佈的數據集上,效果確定大打折扣。這個是顯而易見的。
3)模型複雜度太大
在選擇模型算法的時候,首先就選定了一個複雜度很高的模型,而後數據的規律是很簡單的,複雜的模型反而就不適用了。
4)數據質量不好
數據還有不少噪聲,模型在學習的時候,確定也會把噪聲規律學習到,從而減少了具備通常性的規律。這個時候模型用來預測確定效果也很差。
5)過分訓練
這個是同第4個是相聯繫的,只要訓練時間足夠長,那麼模型確定就會吧一些噪聲隱含的規律學習到,這個時候下降模型的性能是顯而易見的。
三、解決方案
1)下降模型複雜度
處理過擬合的第一步就是下降模型複雜度。爲了下降複雜度,咱們能夠簡單地移除層或者減小神經元的數量使得網絡規模變小。與此同時,計算神經網絡中不一樣層的輸入和輸出維度也十分重要。雖然移除層的數量或神經網絡的規模並沒有通用的規定,但若是你的神經網絡發生了過擬合,就嘗試縮小它的規模。
2)數據集擴增
在數據挖掘領域流行着這樣的一句話,「有時候每每擁有更多的數據賽過一個好的模型」。由於咱們在使用訓練數據訓練模型,經過這個模型對未來的數據進行擬合,而在這之間又一個假設即是,訓練數據與未來的數據是獨立同分布的。即便用當前的訓練數據來對未來的數據進行估計與模擬,而更多的數據每每估計與模擬地更準確。所以,更多的數據有時候更優秀。可是每每條件有限,如人力物力財力的不足,而不能收集到更多的數據,如在進行分類的任務中,須要對數據進行打標,而且不少狀況下都是人工得進行打標,所以一旦須要打標的數據量過多,就會致使效率低下以及可能出錯的狀況。因此,每每在這時候,須要採起一些計算的方式與策略在已有的數據集上進行手腳,以獲得更多的數據。
通俗得講,數據機擴增即須要獲得更多的符合要求的數據,即和已有的數據是獨立同分布的,或者近似獨立同分布的。通常有如下方法:
3)數據加強
使用數據加強能夠生成多幅類似圖像。這能夠幫助咱們增長數據集規模從而減小過擬合。由於隨着數據量的增長,模型沒法過擬合全部樣本,所以不得不進行泛化。計算機視覺領域一般的作法有:翻轉、平移、旋轉、縮放、改變亮度、添加噪聲等等
4)正則化
正則化方法是指在進行目標函數或代價函數優化時,在目標函數或代價函數後面加上一個正則項,通常有L1正則與L2正則等。
L1懲罰項的目的是使權重絕對值最小化。公式以下:
$L(x, y) \equiv \sum_{i=1}^{n}\left(y_{i}-h_{\theta}\left(x_{i}\right)\right)^{2}+\lambda \sum_{i=1}^{n}\left|\theta_{i}\right|$
L2懲罰項的目的是使權重的平方最小化。公式以下:
$L(x, y) \equiv \sum_{i=1}^{n}\left(y_{i}-h_{\theta}\left(x_{i}\right)\right)^{2}+\lambda \sum_{i=1}^{n} \theta_{i}^{2}$
如下表格對兩種正則化方法進行了對比:
L1正則化 | L2正則化 |
1. L1懲罰權重絕對值的總和 | 1. L2懲罰權重平方和的總和 |
2. L1生成簡單、可解釋的模型 | 2. L2正則化可以學習複雜數據模式 |
3. L1受極端值影響較小 | 3. L2受極端值影響較大 |
若是數據過於複雜以致於沒法準確地建模,那麼L2是更好的選擇,由於它可以學習數據中呈現的內在模式。而當數據足夠簡單,能夠精確建模的話,L1更合適。對於我遇到的大多數計算機視覺問題,L2正則化幾乎老是能夠給出更好的結果。然而L1不容易受到離羣值的影響。因此正確的正則化選項取決於咱們想要解決的問題。
總結
正則項是爲了下降模型的複雜度,從而避免模型區過度擬合訓練數據,包括噪聲與異常點(outliers)。從另外一個角度上來說,正則化便是假設模型參數服從先驗機率,即爲模型參數添加先驗,只是不一樣的正則化方式的先驗分佈是不同的。這樣就規定了參數的分佈,使得模型的複雜度下降(試想一下,限定條件多了,是否是模型的複雜度下降了呢),這樣模型對於噪聲與異常點的抗干擾性的能力加強,從而提升模型的泛化能力。還有個解釋即是,從貝葉斯學派來看:加了先驗,在數據少的時候,先驗知識能夠防止過擬合;從頻率學派來看:正則項限定了參數的取值,從而提升了模型的穩定性,而穩定性強的模型不會過擬合,即控制模型空間。
另一個角度,過擬合從直觀上理解即是,在對訓練數據進行擬合時,須要照顧到每一個點,從而使得擬合函數波動性很是大,即方差大。在某些小區間裏,函數值的變化性很劇烈,意味着函數在某些小區間裏的導數值的絕對值很是大,因爲自變量的值在給定的訓練數據集中的必定的,所以只有係數足夠大,才能保證導數的絕對值足夠大。以下圖(引用知乎):
另一個解釋,規則化項的引入,在訓練(最小化cost)的過程當中,當某一維的特徵所對應的權重過大時,而此時模型的預測和真實數據之間距離很小,經過規則化項就可使總體的cost取較大的值,從而,在訓練的過程當中避免了去選擇那些某一維(或幾維)特徵的權重過大的狀況,即過度依賴某一維(或幾維)的特徵(引用知乎)。
L2與L1的區別在於,L1正則是拉普拉斯先驗,而L2正則則是高斯先驗。它們都是服從均值爲0,協方差爲$\frac{1}{\lambda}$。當$\lambda =0$時,即沒有先驗)沒有正則項,則至關於先驗分佈具備無窮大的協方差,那麼這個先驗約束則會很是弱,模型爲了擬合全部的訓練集數據,參數能夠變得任意大從而使得模型不穩定,即方差大而誤差小。$\lambda$越大,標明先驗分佈協方差越小,誤差越大,模型越穩定。即,加入正則項是在誤差bias與方差variance之間作平衡tradeoff(來自知乎)。下圖即爲L2與L1正則的區別:
上圖中的模型是線性迴歸,有兩個特徵,要優化的參數分別是w1和w2,左圖的正則化是L2,右圖是L1。藍色線就是優化過程當中遇到的等高線,一圈表明一個目標函數值,圓心就是樣本觀測值(假設一個樣本),半徑就是偏差值,受限條件就是紅色邊界(就是正則化那部分),兩者相交處,纔是最優參數。可見右邊的最優參數只可能在座標軸上,因此就會出現0權重參數,使得模型稀疏。
其實拉普拉斯分佈與高斯分佈是數學家從實驗中偏差服從什麼分佈研究中得來的。通常直觀上的認識是服從應該服從均值爲0的對稱分佈,而且偏差大的頻率低,偏差小的頻率高,所以拉普拉斯使用拉普拉斯分佈對偏差的分佈進行擬合,以下圖:
而拉普拉斯在最高點,即自變量爲0處不可導,由於不便於計算,因而高斯在這基礎上使用高斯分佈對其進行擬合,以下圖:
5)dropout
正則是經過在代價函數後面加上正則項來防止模型過擬合的。而在神經網絡中,有一種方法是經過修改神經網絡自己結構來實現的,其名爲Dropout。該方法是在對網絡進行訓練時用一種技巧(trick),對於以下所示的三層人工神經網絡:
對於上圖所示的網絡,在訓練開始時,隨機得刪除一些(能夠設定爲一半,也能夠爲1/3,1/4等)隱藏層神經元,即認爲這些神經元不存在,同時保持輸入層與輸出層神經元的個數不變,這樣便獲得以下的ANN:
而後按照BP學習算法對ANN中的參數進行學習更新(虛線鏈接的單元不更新,由於認爲這些神經元被臨時刪除了)。這樣一次迭代更新便完成了。下一次迭代中,一樣隨機刪除一些神經元,與上次不同,作隨機選擇。這樣一直進行瑕疵,直至訓練結束。
這種技術被證實能夠減小不少問題的過擬合,這些問題包括圖像分類、圖像切割、詞嵌入、語義匹配等問題。
6)早停
對模型進行訓練的過程便是對模型的參數進行學習更新的過程,這個參數學習的過程每每會用到一些迭代方法,如梯度降低(Gradient descent)學習算法。Early stopping即是一種迭代次數截斷的方法來防止過擬合的方法,即在模型對訓練數據集迭代收斂以前中止迭代來防止過擬合。
Early stopping方法的具體作法是,在每個Epoch結束時(一個Epoch集爲對全部的訓練數據的一輪遍歷)計算validation data的accuracy,當accuracy再也不提升時,就中止訓練。這種作法很符合直觀感覺,由於accurary都再也不提升了,在繼續訓練也是無益的,只會提升訓練的時間。以下圖所示,在幾回迭代後,即便訓練偏差仍然在減小,但測驗偏差已經開始增長了。
那麼該作法的一個重點即是怎樣才認爲validation accurary再也不提升了呢?並非說validation accuracy一降下來便認爲再也不提升了,由於可能通過這個Epoch後,accuracy下降了,可是隨後的Epoch又讓accuracy又上去了,因此不能根據一兩次的連續下降就判斷再也不提升。通常的作法是,在訓練的過程當中,記錄到目前爲止最好的validation accuracy,當連續10次Epoch(或者更屢次)沒達到最佳accuracy時,則能夠認爲accuracy再也不提升了。此時即可以中止迭代了(Early Stopping)。這種策略也稱爲「No-improvement-in-n」,n即Epoch的次數,能夠根據實際狀況取,如十、20、30……
7)從新清洗數據
把明顯異常的數據剔除
8)使用集成學習方法
把多個模型集成在一塊兒,下降單個模型的過擬合風險
參考
https://www.cnblogs.com/tsruixi/p/10693101.html
https://www.jianshu.com/p/f8b86af75020