過擬合和欠擬合現象及解決方案

過擬合和欠擬合

欠擬合:(under-fitting)也稱爲欠學習,它的直觀表現是算法訓練得到的模型在訓練集上表現差,沒有學到數據的規律。引起欠擬合的原因有:模型本身過於簡單,例如數據本身是非線性的但使用了線性模型;特徵數太少無法正確的建立統計關係。

過擬合:(over-fitting)隨着訓練過程的進行,模型複雜度,在training data上的error漸漸減小。可是在驗證集上的error卻反而漸漸增大——由於訓練出來的網絡過擬合了訓練集,對訓練集以外的數據卻不work。過擬合即在訓練誤差很小,而泛化誤差很大,因爲模型可能過於的複雜,使其”記住”了訓練樣本,然而其泛化誤差卻很高。

解決過擬合的方法:

1. 加入正則化項,參數範數懲罰,可在優化原來目標函數的同時,避免權值過大帶來的過擬合風險

最常用的範數懲罰爲L1,L2正則化,L1又被成爲Lasso,

Lasso迴歸的損失函數:

Ridge迴歸損失函數:

L1正則可以產生稀疏模型(L1是怎麼讓係數等於零的)。

假設有如下帶L1正則化的損失函數:

其中J0是原始的損失函數,加號後面的一項是L1正則化項,α是正則化係數。注意到L1正則化是權值的絕對值之和,J是帶有絕對值符號的函數,因此J是不完全可微的。機器學習的任務就是要通過一些方法(比如梯度下降)求出損失函數的最小值。當我們在原始損失函數J0後添加L1正則化項時,相當於對J0做了一個約束。令L=α∑w∣w∣,則J=J0+L,此時我們的任務變成在L約束下求出J0取最小值的解。考慮二維的情況,即只有兩個權值w1和w2,此時L=∣w1∣+∣w2∣對於梯度下降法,求解J0的過程可以畫出等值線,同時L1正則化的函數L。

L也可以在w1w2的二維平面上畫出來。如下圖:

圖中等值線是J0的等值線,黑色方形是L函數的圖形。在圖中,當J0等值線與L圖形首次相交的地方就是最優解。上圖中J0與L在L的一個頂點處相交,這個頂點就是最優解。注意到這個頂點的值是(w1,w2)=(0,w)。可以直觀想象,因爲L函數有很多『突出的角』(二維情況下四個,多維情況下更多),J0與這些角接觸的機率會遠大於與L其它部位接觸的機率,而在這些角上,會有很多權值等於0,這就是爲什麼L1正則化可以產生稀疏模型,進而可以用於特徵選擇。

而正則化前面的係數α,可以控制L圖形的大小。α越小,L的圖形越大(上圖中的黑色方框);α越大,L的圖形就越小,可以小到黑色方框只超出原點範圍一點點,這是最優點的值(w1,w2)=(0,w)中的w可以取到很小的值。

L2正則:

二維平面下L2正則化的函數圖形是個圓,與方形相比,被磨去了棱角。因此J0與L相交時使得w1或w2等於零的機率小了許多,這就是爲什麼L2正則化不具有稀疏性的原因。

(2)數據增強,增加樣本數據量

pytorch常用的數據增強:

    #隨機比例縮放
		new_im = transforms.Resize((100, 200))(im)
	#隨機位置裁剪
		new_im = transforms.RandomCrop(100)(im)		#裁剪出100x100的區域
		new_im = transforms.CenterCrop(100)(im)
	#隨機水平/垂直翻轉
		new_im = transforms.RandomHorizontalFlip(p=1)(im) 
		new_im = transforms.RandomVerticalFlip(p=1)(im)
	#隨機角度旋轉
		new_im = transforms.RandomRotation(45)(im)  
	#色度、亮度、飽和度、對比度的變化
		new_im = transforms.ColorJitter(brightness=1)(im)
		new_im = transforms.ColorJitter(contrast=1)(im)
		new_im = transforms.ColorJitter(saturation=0.5)(im)
		new_im = transforms.ColorJitter(hue=0.5)(im)
	#進行隨機的灰度化
		new_im = transforms.RandomGrayscale(p=0.5)(im)    # 以0.5的概率進行灰度化
	#Padding (將原始圖padding成正方形)
		new_im = transforms.Pad((0, (im.size[0]-im.size[1])//2))(im)  # 原圖爲(500,313)
	#使用Compose函數生成一個PiPeLine
		data_transform={‘train':transforms.Compose([
					transforms.RandomHorizontalFlip(),
					transforms.Resize(image_size),
					transforms.CenterCrop(image_size),
					transforms.ToTensor(),
					transforms.Normalize([0.485, 0.456, 0.406],
								 [0.229, 0.224, 0.225]																
					])

(3)提前終止(early stopping)

模型在驗證集上的誤差在一開始是隨着訓練集的誤差的下降而下降的。當超過一定訓練步數後,模型在訓練集上的誤差雖然還在下降,但是在驗證集上的誤差卻不在下降了。此時我們的模型就過擬合了。因此我們可以觀察我們訓練模型在驗證集上的誤差,一旦當驗證集的誤差不再下降時,我們就可以提前終止我們訓練的模型。

(4)參數綁定與參數共享

在卷積神經網絡CNN中,卷積層就是其中權值共享的方式,一個卷積核通過在圖像上滑動從而實現共享參數,大幅度減少參數的個數,用卷積的形式是合理的。

(5)bagging 和其他集成方法

(6)Dropout

當一個複雜的前饋神經網絡被訓練在小的數據集時,容易造成過擬合。爲了防止過擬合,可以通過阻止特徵檢測器的共同作用來提高神經網絡的性能。

Dropout說的簡單一點就是:我們在前向傳播的時候,讓某個神經元的激活值以一定的概率p停止工作,這樣可以使模型泛化性更強,因爲它不會太依賴某些局部的特徵。

沒有Dropout的網絡計算公式:

採用Dropout的網絡計算公式:

代碼層面實現讓某個神經元以概率p停止工作,其實就是讓它的激活函數值以概率p變爲0。比如我們某一層網絡神經元的個數爲1000個,其激活函數輸出值爲y1、y2、y3、……、y1000,我們dropout比率選擇0.4,那麼這一層神經元經過dropout後,1000個神經元中會有大約400個的值被置爲0。

訓練的時候會隨機的丟棄一些神經元,但是預測的時候就沒辦法隨機丟棄了。如果丟棄一些神經元,這會帶來結果不穩定的問題,也就是給定一個測試數據,有時候輸出a有時候輸出b,結果不穩定,這是實際系統不能接受的,用戶可能認爲模型預測不準。那麼一種”補償“的方案就是每個神經元的權重都乘以一個p,這樣在“總體上”使得測試數據和訓練數據是大致一樣的。比如一個神經元的輸出是x,那麼在訓練的時候它有p的概率參與訓練,(1-p)的概率丟棄,那麼它輸出的期望是px+(1-p)0=px。因此測試的時候把這個神經元的權重乘以p可以得到同樣的期望。

爲什麼說Dropout可以解決過擬合?

a. 取平均的作用

b. 減少神經元之間複雜的共適應關係

c. Dropout類似於性別在生物進化中的角色

(7) 輔助分類節點(auxiliary classifiers)

在Google Inception V1中,採用了輔助分類節點的策略,即將中間某一層的輸出用作分類,並按一個較小的權重加到最終的分類結果中,這樣相當於做了模型的融合,同時給網絡增加了反向傳播的梯度信號,提供了額外的正則化的思想.

(8) Batch Normalization

BN在訓練某層時,會對每一個mini-batch數據進行標準化(normalization)處理,使輸出規範到N(0,1)的正太分佈,減少了Internal convariate shift(內部神經元分佈的改變),傳統的深度神經網絡在訓練是,每一層的輸入的分佈都在改變,因此訓練困難,只能選擇用一個很小的學習速率,但是每一層用了BN後,可以有效的解決這個問題,學習速率可以增大很多倍.

(9)降低模型複雜度

在數據量較少時,模型過於複雜是產生過擬合的主要因素,適當降低模型複雜度可以避免模型擬合過多的採樣噪聲。例如,在神經網絡中減少網絡層數、神經元個數;在決策樹模型中降低樹的深度,進行剪枝。

解決欠擬合的方法:

1. 添加新特徵。

當特徵不足或現有特徵與樣本標籤的相關性不強時,模型容易出現欠擬合。通過挖掘“上下文特徵”“ID類特徵”“組合特徵”等新的特徵,往往能取得更好的效果。在深度學習潮流中,有很多模型可以幫助完成特徵工程,如因子分解機、梯度提升決策樹、Deep-crossing等都可以成爲豐富特徵的方法。

2. 增加模型複雜度

簡單的模型學習能力較差,通過增加模型的複雜度可以使模型擁有更強的擬合能力。例如,在線性模型中添加高次項, 在神經網絡中增加網絡層數或神經元個數等。

3. 減少正則化係數

正則化是用來防止過擬合的,但當模型出現欠擬合時,需要有針對性地減少正則化係數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章