版權聲明:未經許可, 不能轉載 https://blog.csdn.net/heyongluoyao8/article/details/49429629 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭頭圖標 勿刪 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
<p>原文地址:一隻鳥的天空,<a href="http://blog.csdn.net/heyongluoyao8/article/details/49429629" rel="nofollow" target="_blank">http://blog.csdn.net/heyongluoyao8/article/details/49429629</a></p>
防止過擬合的處理方法
過擬合
咱們都知道,在進行數據挖掘或者機器學習模型創建的時候,由於在統計學習中,假設數據知足獨立同分布(i.i.d,independently and identically distributed),即當前已產生的數據能夠對將來的數據進行推測與模擬,所以都是使用歷史數據創建模型,即便用已經產生的數據去訓練,而後使用該模型去擬合將來的數據。可是通常獨立同分布的假設每每不成立,即數據的分佈可能會發生變化(distribution drift),而且可能當前的數據量過少,不足以對整個數據集進行分佈估計,所以每每須要防止模型過擬合,提升模型泛化能力。而爲了達到該目的的最多見方法即是:正則化,即在對模型的目標函數(objective function)或代價函數(cost function)加上正則項。
在對模型進行訓練時,有可能遇到訓練數據不夠,即訓練數據沒法對整個數據的分佈進行估計的時候,或者在對模型進行過分訓練(overtraining)時,經常會致使模型的過擬合(overfitting)。以下圖所示:
經過上圖能夠看出,隨着模型訓練的進行,模型的複雜度會增長,此時模型在訓練數據集上的訓練偏差會逐漸減少,可是在模型的複雜度達到必定程度時,模型在驗證集上的偏差反而隨着模型的複雜度增長而增大。此時便發生了過擬合,即模型的複雜度升高,可是該模型在除訓練集以外的數據集上卻不work。
爲了防止過擬合,咱們須要用到一些方法,如:early stopping、數據集擴增(Data augmentation)、正則化(Regularization)、Dropout等。css
Early stopping
對模型進行訓練的過程便是對模型的參數進行學習更新的過程,這個參數學習的過程每每會用到一些迭代方法,如梯度降低(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……html
數據集擴增
在數據挖掘領域流行着這樣的一句話,「有時候每每擁有更多的數據賽過一個好的模型」。由於咱們在使用訓練數據訓練模型,經過這個模型對未來的數據進行擬合,而在這之間又一個假設即是,訓練數據與未來的數據是獨立同分布的。即便用當前的訓練數據來對未來的數據進行估計與模擬,而更多的數據每每估計與模擬地更準確。所以,更多的數據有時候更優秀。可是每每條件有限,如人力物力財力的不足,而不能收集到更多的數據,如在進行分類的任務中,須要對數據進行打標,而且不少狀況下都是人工得進行打標,所以一旦須要打標的數據量過多,就會致使效率低下以及可能出錯的狀況。因此,每每在這時候,須要採起一些計算的方式與策略在已有的數據集上進行手腳,以獲得更多的數據。
通俗得講,數據機擴增即須要獲得更多的符合要求的數據,即和已有的數據是獨立同分布的,或者近似獨立同分布的。通常有如下方法:web
- 從數據源頭採集更多數據
- 複製原有數據並加上隨機噪聲
- 重採樣
- 根據當前數據集估計數據分佈參數,使用該分佈產生更多數據等
正則化方法
正則化方法是指在進行目標函數或代價函數優化時,在目標函數或代價函數後面加上一個正則項,通常有L1正則與L2正則等。算法
- L1正則
L1正則是基於L1範數,即在目標函數後面加上參數的L1範數和項,即參數絕對值和與參數的積項,即:
C=C0+λn∑w|w|
其中
C0
表明原始的代價函數,
n
是樣本的個數,
λ
就是正則項係數,權衡正則項與
C0
項的比重。後面那一項即爲L1正則項。
在計算梯度時,
w
的梯度變爲:
∂C∂w=∂C0∂w+λnsgn(w)
其中,
sgn
是符號函數,那麼便使用下式對參數進行更新:
w:=w+α∂C0∂w+βλnsgn(w)
對於有些模型,如線性迴歸中(L1正則線性迴歸即爲Lasso迴歸),常數項
b
的更新方程不包括正則項,即:
b:=b+α∂C0∂b
其中,梯度降低算法中,
α<0,β<0
,而在梯度上升算法中則相反。
從上式能夠看出,當
w
爲正時,更新後
w
會變小;當
w
爲負時,更新後
w
會變大;所以L1正則項是爲了使得那些原先處於零(即
|w|≈0
)附近的參數
w
往零移動,使得部分參數爲零,從而下降模型的複雜度(模型的複雜度由參數決定),從而防止過擬合,提升模型的泛化能力。
其中,L1正則中有個問題,即是L1範數在0處不可導,即
|w|
在0處不可導,所以在
w
爲0時,使用原來的未經正則化的更新方程來對
w
進行更新,即令
sgn(0)=0
,這樣即:
sgn(w)|w>0=1,sgn(w)|w<0=−1,sgn(w)|w=0=0
- L2正則
L2正則是基於L2範數,即在目標函數後面加上參數的L2範數和項,即參數的平方和與參數的積項,即:
C=C0+λ2n∑ww2
其中
C0
表明原始的代價函數,
n
是樣本的個數,與L1正則化項前面的參數不一樣的是,L2項的參數乘了
12
,是爲了便於計算以及公式的美感性,由於平方項求導有個2,
λ
就是正則項係數,權衡正則項與
C0
項的比重。後面那一項即爲L2正則項。
L2正則化中則使用下式對模型參數進行更新:
w:=w+α∂C0∂w+βλnw
對於有些模型,如線性迴歸中(L2正則線性迴歸即爲Ridge迴歸,嶺迴歸),常數項
b
的更新方程不包括正則項,即:
b:=b+α∂C0∂b
其中,梯度降低算法中,
α<0,β<0
,而在梯度上升算法中則相反。
從上式能夠看出,L2正則項起到使得參數
w
變小加重的效果,可是爲何能夠防止過擬合呢?一個通俗的理解即是:更小的參數值
w
意味着模型的複雜度更低,對訓練數據的擬合剛恰好(奧卡姆剃刀),不會過度擬合訓練數據,從而使得不會過擬合,以提升模型的泛化能力。
在這裏須要提到的是,在對模型參數進行更新學習的時候,有兩種更新方式,mini-batch (部分增量更新)與 full-batch(全增量更新),即在每一次更新學習的過程當中(一次迭代,即一次epoch),在mini-batch中進行分批處理,先使用一部分樣本進行更新,而後再使用一部分樣本進行更新。直到全部樣本都使用了,此次epoch的損失函數值則爲全部mini batch的平均損失值。設每次mini batch中樣本個數爲
m
,那麼參數的更新方程中的正則項要改爲:
λm∑w|w|
λ2m∑ww2
而full-batch即每一次epoch中,使用所有的訓練樣本進行更新,那麼每次的損失函數值即爲所有樣本的偏差之和。更新方程不變。
- 總結
正則項是爲了下降模型的複雜度,從而避免模型區過度擬合訓練數據,包括噪聲與異常點(outliers)。從另外一個角度上來說,正則化便是假設模型參數服從先驗機率,即爲模型參數添加先驗,只是不一樣的正則化方式的先驗分佈是不同的。這樣就規定了參數的分佈,使得模型的複雜度下降(試想一下,限定條件多了,是否是模型的複雜度下降了呢),這樣模型對於噪聲與異常點的抗干擾性的能力加強,從而提升模型的泛化能力。還有個解釋即是,從貝葉斯學派來看:加了先驗,在數據少的時候,先驗知識能夠防止過擬合;從頻率學派來看:正則項限定了參數的取值,從而提升了模型的穩定性,而穩定性強的模型不會過擬合,即控制模型空間。
另一個角度,過擬合從直觀上理解即是,在對訓練數據進行擬合時,須要照顧到每一個點,從而使得擬合函數波動性很是大,即方差大。在某些小區間裏,函數值的變化性很劇烈,意味着函數在某些小區間裏的導數值的絕對值很是大,因爲自變量的值在給定的訓練數據集中的必定的,所以只有係數足夠大,才能保證導數的絕對值足夠大。以下圖(引用知乎):
另一個解釋,規則化項的引入,在訓練(最小化cost)的過程當中,當某一維的特徵所對應的權重過大時,而此時模型的預測和真實數據之間距離很小,經過規則化項就可使總體的cost取較大的值,從而,在訓練的過程當中避免了去選擇那些某一維(或幾維)特徵的權重過大的狀況,即過度依賴某一維(或幾維)的特徵(引用知乎)。
L2與L1的區別在於,L1正則是拉普拉斯先驗,而L2正則則是高斯先驗。它們都是服從均值爲0,協方差爲
1λ
。當
λ=0
時,即沒有先驗)沒有正則項,則至關於先驗分佈具備無窮大的協方差,那麼這個先驗約束則會很是弱,模型爲了擬合全部的訓練集數據, 參數
w
能夠變得任意大從而使得模型不穩定,即方差大而誤差小。
λ
越大,標明先驗分佈協方差越小,誤差越大,模型越穩定。即,加入正則項是在誤差bias與方差variance之間作平衡tradeoff(來自知乎)。下圖即爲L2與L1正則的區別:
上圖中的模型是線性迴歸,有兩個特徵,要優化的參數分別是w1和w2,左圖的正則化是L2,右圖是L1。藍色線就是優化過程當中遇到的等高線,一圈表明一個目標函數值,圓心就是樣本觀測值(假設一個樣本),半徑就是偏差值,受限條件就是紅色邊界(就是正則化那部分),兩者相交處,纔是最優參數。可見右邊的最優參數只可能在座標軸上,因此就會出現0權重參數,使得模型稀疏。
其實拉普拉斯分佈與高斯分佈是數學家從實驗中偏差服從什麼分佈研究中得來的。通常直觀上的認識是服從應該服從均值爲0的對稱分佈,而且偏差大的頻率低,偏差小的頻率高,所以拉普拉斯使用拉普拉斯分佈對偏差的分佈進行擬合,以下圖:
而拉普拉斯在最高點,即自變量爲0處不可導,由於不便於計算,因而高斯在這基礎上使用高斯分佈對其進行擬合,以下圖:
具體參見:正態分佈的前世此生
Dropout
正則是經過在代價函數後面加上正則項來防止模型過擬合的。而在神經網絡中,有一種方法是經過修改神經網絡自己結構來實現的,其名爲Dropout。該方法是在對網絡進行訓練時用一種技巧(trick),對於以下所示的三層人工神經網絡:
對於上圖所示的網絡,在訓練開始時,隨機得刪除一些(能夠設定爲一半,也能夠爲1/3,1/4等)隱藏層神經元,即認爲這些神經元不存在,同時保持輸入層與輸出層神經元的個數不變,這樣便獲得以下的ANN:
而後按照BP學習算法對ANN中的參數進行學習更新(虛線鏈接的單元不更新,由於認爲這些神經元被臨時刪除了)。這樣一次迭代更新便完成了。下一次迭代中,一樣隨機刪除一些神經元,與上次不同,作隨機選擇。這樣一直進行瑕疵,直至訓練結束。
Dropout方法是經過修改ANN中隱藏層的神經元個數來防止ANN的過擬合。具體可參見這裏。markdown