1. 程式人生 > >機器學習之過擬合欠擬合

機器學習之過擬合欠擬合

機器學習之過擬合,欠擬合

過擬合現象是指當我們能夠提高訓練集上的表現時,然而測試集的表現很差,例如在深度學習中經常訓練集達到99以上而資料集卻在50,60左右明顯過擬合,此時就要想辦法阻止過擬合,過擬合也成為過配。

過擬合發生的本質原因,是由於監督學習問題的不適定:在高中數學我們知道,從n個(線性無關)方程可以解n個變數,解n+1個變數就會解不出。在監督學習中,往往資料(對應了方程)遠遠少於模型空間(對應了變數)。因此過擬合現象的發生,可以分解成以下三點:

  1. 有限的訓練資料不能完全反映出一個模型的好壞,然而我們卻不得不在這有限的資料上挑選模型,因此我們完全有可能挑選到在訓練資料上表現很好而在測試資料上表現很差的模型,因為我們完全無法知道模型在測試資料上的表現。
  2. 如果模型空間很大,也就是有很多很多模型可以給我們挑選,那麼挑到對的模型的機會就會很小。
  3. 與此同時,如果我們要在訓練資料上表現良好,最為直接的方法就是要在足夠大的模型空間中挑選模型,否則如果模型空間很小,就不存在能夠擬合數據很好的模型。

由上3點可見,要擬合訓練資料,就要足夠大的模型空間;用了足夠大的模型空間,挑選到測試效能好的模型的概率就會下降。因此,就會出現訓練資料擬合越好,測試效能越差的過擬合現象。

過擬合的解決方案:

1、交叉檢驗,通過交叉檢驗得到較優的模型引數;
2、特徵選擇,減少特徵數或使用較少的特徵組合,對於按區間離散化的特徵,增大劃分的區間;
3、正則化,常用的有 L1、L2 正則。而且 L1正則還可以自動進行特徵選擇;
4、如果有正則項則可以考慮增大正則項引數 lambda;
5、增加訓練資料可以有限的避免過擬合;
6、Bagging ,將多個弱學習器Bagging 一下效果會好很多,比如隨機森林等.

在深度神經網路模型訓練中的解決方案:

1,增加資料量,可以通過資料增強的方法增加,隨機裁剪翻轉,抖動。。

2,早停策略。本質上是交叉驗證策略,選擇合適的訓練次數,避免訓練的網路過度擬合訓練資料。
3,整合學習策略。而DNN可以用Bagging的思路來正則化。首先我們要對原始的m個訓練樣本進行有放回隨機取樣,構建N組m個樣本的資料集,然後分別用這N組資料集去訓練我們的DNN。即採用我們的前向傳播演算法和反向傳播演算法得到N個DNN模型的W,b引數組合,最後對N個DNN模型的輸出用加權平均法或者投票法決定最終輸出。不過用整合學習Bagging的方法有一個問題,就是我們的DNN模型本來就比較複雜,引數很多。現在又變成了N個DNN模型,這樣引數又增加了N倍,從而導致訓練這樣的網路要花更加多的時間和空間。因此一般N的個數不能太多,比如5-10個就可以了。
4,DropOut策略。所謂的Dropout指的是在用前向傳播演算法和反向傳播演算法訓練DNN模型時,一批資料迭代時,隨機的從全連線DNN網路中去掉一部分隱藏層的神經元。在對訓練集中的一批資料進行訓練時,我們隨機去掉一部分隱藏層的神經元,並用去掉隱藏層的神經元的網路來擬合我們的一批訓練資料。使用基於dropout的正則化比基於bagging的正則化簡單,這顯而易見,當然天下沒有免費的午餐,由於dropout會將原始資料分批迭代,因此原始資料集最好較大,否則模型可能會欠擬合。

5,新增正則化

欠擬合解決方案:

1、增加新特徵,可以考慮加入進特徵組合、高次特徵,來增大假設空間;
2、嘗試非線性模型,比如核SVM 、決策樹、DNN等模型;
3、如果有正則項可以減小正則項引數 ;
4、Boosting ,Boosting 往往會有較小的 Bias,比如 Gradient Boosting 等.

(1、新增其他特徵項,有時候我們模型出現欠擬合的時候是因為特徵項不夠導致的,可以新增其他特徵項來很好地解決。例如,“組合”、“泛化”、“相關性”三類特徵是特徵新增的重要手段,無論在什麼場景,都可以照葫蘆畫瓢,總會得到意想不到的效果。除上面的特徵之外,“上下文特徵”、“平臺特徵”等等,都可以作為特徵新增的首選項。

2、新增多項式特徵,這個在機器學習演算法裡面用的很普遍,例如將線性模型通過新增二次項或者三次項使模型泛化能力更強。例如上面的圖片的例子。

3、減少正則化引數,正則化的目的是用來防止過擬合的,但是現在模型出現了欠擬合,則需要減少正則化引數。)

L1和L2正則化方法

在這些方法中,重點講解一下L1和L2正則化方法。L1正則化和L2正則化原理類似,二者的作用卻有所不同。 
(1) L1正則項會產生稀疏解。 
(2) L2正則項會產生比較小的解。 
在Matlab的DeepLearn-Toolbox中,僅實現了L2正則項。而在Keras中,則包含了L1和L2的正則項。

假如我們的每個樣本的損失函式是均方差損失函式,則所有的m個樣本的損失函式為:


而DNN的L2正則化通常的做法是隻針對與線性係數矩陣W,而不針對偏倚係數b。利用我們之前的機器學習的知識,我們很容易可以寫出DNN的L2正則化的損失函式。


如果使用上式的損失函式,進行反向傳播演算法時,流程和沒有正則化的反向傳播演算法完全一樣,區別僅僅在於進行梯度下降法時,W的更新公式。回想我們在深度神經網路(DNN)反向傳播演算法(BP)中,W的梯度下降更新公式為:


則加入L2正則化以後,迭代更新公式變成:


注意到上式中的梯度計算中m我忽略了,因為α是常數,而除以m也是常數,所以等同於用了新常數α來代替αm。進而簡化表示式,但是不影響損失演算法。類似的L2正則化方法可以用於交叉熵損失函式或者其他的DNN損失函式,這裡就不累述了。

對於L1正則項,不同之處僅在於迭代更新公式中的後一項。將其改為1範數的導數即可。而一範數的導數即sign(x),即將後一項改為sign(W)即可。

為什麼PCA不推薦要用來避免過擬合

PCA最大的“問題”,就在於它是無監督的。

PCA是高維環境下能想到的最直接的方案。比如人臉識別,維度往往成千上萬,但識別身份的話,每個人樣本最多也就幾十,過擬合現象是很嚴重的。由此產生了人臉識別早期研究中影響力極大的工作eigenface,其實就是先用PCA對人臉影象進行降維,然後再訓練分類器。

但PCA是無監督的,正如Andrew所說:“it does not consider the values of our results y”。所以它雖然能解決過擬合問題,但又會帶來欠擬合問題。拿人臉識別來說,eigenface雖然能訓練出識別能力尚可的分類器,但因為分類資訊並不一定存在於前幾個主成分上,所以用前幾個主成分來做分類的話,會丟失後面變化細微的主成分上存在的大量分類資訊。正因為如此,之後又出現了fisherface等有監督降維工作,識別能力也因此提高了很多。

深度學習也是這樣,pre-training階段很多訓練都是無監督的,其實和PCA異曲同工,但之後一定要有進一步的fine-tuning,把無監督提取出來的特徵transfer到我們的目標任務上,這樣得到的特徵才真正work。

所以說,類似於PCA和auto-encoder這樣的無監督方法,提取的特徵不會太差、但也不會太好,它最大的作用,是總結出一些關於X的較高層次的抽象知識、為之後的有監督訓練提供一個比原始特徵空間更好的起點。實際上,無監督最具優勢之處,就在於它的通用性:不管y是什麼,只要有X就行,之後可以在各種各樣的y上進一步訓練。有證據顯示,人類在嬰兒時期也是先有一個無監督學習階段,然後才是各種有監督學習。