上一堂課講到為了避免overfitting,可以使用regularization的技巧,把一個regularizer加在Ein上面,轉而求Augmented Error反而可以有效的解決模型複雜度太高的問題。這一堂課會講到該如何使用Validation的手法幫助選擇機器學習裡面不同的參數。
在訓練一個機器學習模型,其中會遇到很多的選擇,包含使用哪些演算法、使用多少資料、要使用什麼非線性轉換方法,甚至是要使用哪一種regularizer。
Machine Learning裡面最實務的問題,就是如何作出好的選擇讓最後Eout可以作到最好,如果用視覺化的方法來作選擇,反而會受到自己的主觀影響,那到底該怎麼作選擇呢?
如果使用Ein來作模型選擇的話,就會受到overfitting的影響,越複雜的模型就越容易作好更好的Ein,但是會付出模型複雜度的代價,因為overfitting造成泛化能力變差,Eout反而也作不好。
那如果我們可以拿到實際的測試資料,就拿實際的測試資料衡量模型表現就好了,但是實務上可能不會有這樣的實際測試資料。
如果使用Ein來選模型不可行,而實務上又拿不到實際的資料該怎麼取平衡呢?我們可以使用手上的樣本資料,把一部份切出來當作看不到的測試資料,再拿剩下的資料作學習,並使用切出來的資料衡量模型的效果。
原本的樣本資料D要負擔兩種角色,一個是透過D來求出最好的Ein,然後再把D丟進演算法得到一個Hypothesis G,前面有講到如果這樣的話很可能會造成overfitting問題,所以我們把資料分成train和validation,先使用train總共N-K筆資料練習出好的Ein,並得到Hypothesis G,最後再透過K筆validation資料來驗證G到底好還不好。
從前面講到的learning curve可以知道,如果使用較多的資料來訓練會得到比較好的結果,所以實務上雖然會使用D(train)來訓練出不同的Hypothesis,然後使用D(val)作評估並選出最好的模型,但是最後在選好模型之後,會再把全部的資料D丟進模型裡作訓練,因為使用全部的資料會比較用部份訓練資料所訓練出來的模型還要好。
從驗證資料量和Eout來分析可以看到黑線的Eout會很大,因為在使用複雜的模型之下可能因為overfitting的關係造成Eout作不好;而虛線是用Etest資料,但是這個最佳的測試資料常常是不存在的;紅色是只使用訓練資料建立模型得到的Eout,他會比藍色使用全部資料來訓練所得到的Eout還要來的高。至於為什麼使用訓練資料會比使用Ein還要來的差的原因,是因為當驗證資料量K越大,代表訓練資料就越小,可能產生underfitting使得模型怎麼樣都練習不好。
所以我們會遇到不知道該怎麼選擇驗證資料量K的情況,因為如果用了比較大的K,雖然可以確保validation和Eout可以比較接近,但卻會造成訓練資料的Eout和全部資料的Eout差很多;但如果使用小的K雖然可以確保訓練資料的Eout和全部資料的Eout很接近,但是就無法確保validation和Eout到底接不接近。實務上的K常使用N/5。
假設今天設定K=1,並且重複抽出一筆當驗證算出error,再來把error作平均,就可以透過計算這個平均的error來推估Eout。而這種只抽一筆當驗證的方法就稱為leave-one-out的cross validation,因為每次都用N-K筆計算一個g,所以稱為交叉驗證。
在使用leave-one-out cross validation可以有兩種方法,第一種是拿掉一個點,用剩下的點作迴歸,再計算驗證的點到迴歸的距離當作error;第二種是拿掉一個貫,用剩下的點中間取一個常數,再計算驗證的點到常數的距離當作error,透過比較這兩種方法得到的較小的error,就可以選出比較好的模型,也許使用計算迴歸不一定會得到比較小的error,反而使用常數來計算還得到較好的結果。
而且leave-one-out cross validation的期望值,確實也可以證明和Eout是相近的,這個部份證明這裡就不多作說明了。
在實務上,如果使用Ein來選擇模型,使用越多的特徵雖然可以得到較小的Ein,但卻也可以造成overfitting,反而和Eout相差很大。但是如果使用leave-one-out cross validation的方法來選模型,確實可以找到一個比較接近Eout的結果,而且絕對對比Ein要來的好很多。
使用leave-one-out的最大問題,就是他會花很多的時間在作訓練,如果樣本資料有1000筆,每次都要拿999筆來訓練並重複作一千次才能取到平均的Error,所以在實務上leave-one-out要用來選擇模型可能比較不可行。第二個問題是leave-one-out因為每次只取一個點,所以他的變動程度很高,雖然有取平均,但是他本質上還是一個變動程度比較高的評估方法。
所以實務上,第一個希望可以降低訓練的次數,比起之前的1000次訓練,可以切成10份的方式,每次取9份作訓練1份作驗證後作平均,這樣就只需要作10次而不需要作到1000次。而且這個方法也可以作到交叉驗證的效果,leave-one-out其實也就是這種方法的極端例子。實務上比較常用的方法是切成十份,又可以稱為10-fold cross validation
使用cross validation在實務上會比只作一次validation當果會比較好也比較穩定,但是前提是在計算上是充許的,因為作k次的交叉驗證作平均需要額外的運算資源;而validation切5份或是10份就可以得到比較好的結果,不需要真的使用到leave-one-out。我們透過validation是可以讓我們選到一個比較好的模型,但是要注意的是,這個validation還是比最終使用測試資料的結果應該還是要樂觀的,只要真正應用在測試資料,你才會知道真的的效果如何。
總結來說,這堂課學到使用Ein來選擇模型是很危險的,並談到leave-one-out cross validaion與實務上會使用到的k-fold corss validation可以用來作模型選擇。