前兩天打的東西也沒什麼內容廢話居多,因此今天終於要來到了一個重要單元,也就是要來探討模型的預測能力了。很多老師或教授比較喜歡在一開始先談這個,那我在前面幾天先談的反而是模型質量指標,而不是談模型預測能力的原因,是希望大家先裝備好模型質量檢驗標準的概念,也就是實際應用場景可能會有一些限制的觀念,再來討論模型預測能力,雖然這兩者是沒有直接的關係的。
今天在這邊我們不會特別討論誤差函數、MSE 之類的數學主題,而是會著重討論 Underfitting (欠擬合)與 Overfitting (過擬合)兩者之間的關係,這邊會假定讀者有點基本概念,而這些關係會在應用場和帶來什麼樣的困難,這實際上是 DAY 7 的第四個步驟,一樣這邊會以監督式學習為主。
實際上這是一個很大的主題,我們這邊主要分享的內容是為了後續啟發式演算法鋪路,實務上在 underfitting 與 overfitting 這兩個問題上有太多不同角度可以切入探討,大家有興趣也可以主動去研究看看。
欠擬合也就是 Underfitting ,是指說我們訓練出來的模型,在模型輸出值與標籤值之間有顯著的落差,造成這個模型實際上沒有什麼用處,而這很有可能就是一種成本的浪費。最簡單的理解就是一個非線性相關的資料,例如你的年齡和身高,隨著你長大身高變化會慢慢趨近於零,但是如果你用線性函數去描述你的年齡與身高,這會很詭異,因為年齡只要持續增加,模型就會給予你一個持續增加的身高。
過擬合也就是 Overfitting ,是指說只要我們模型給予足夠多的彈性與自由,你就可以讓你的模型輸出值與標籤值之間幾乎不會有誤差,然而這個模型在脫離了訓練樣本之後,很有可能在其他樣本上面的表現會十分的奇怪,因為他的模型過度的去匹配訓練樣本,導致在測試模型的過程中發現模型根本不能用。
基本的定義大概是這樣,大家網路上也可以找到很多文章,今天我主要分享的事情是欠擬合與過擬合之間的關係,這個關係是建築在訓練樣本與測試樣本(或模型正式上線之後的實際樣本)上面,我們首先考慮在訓練樣本中欠擬合的情況:
一般我們在實務上會傾向於先用簡單的模型先測試看看,也就是說我們會有「少即是好」的歸納偏置,我們認為在越簡單的模型底下能把資料訓練起來,應該會比在越複雜的情況底下訓練起來,更能避免過度訓練。因此欠擬合雖然不好,但它是一個很重要的開始,因為模型如果越簡單,一般來說我們在訓練的過程上時間和資源耗費就會越少,大家要記得一件事情,我們現在在探討的仍然是類神經網路搭配啟發式演算法,而啟發式演算法是十分自由的演算法,因此我們將會面臨嚴峻的資源成本限制(沒那麼多時間可以訓練),這在未來 Day 11-20 會探討到。
重點是要觀察在欠擬合的情況底下,你是否仍能嚴守模型質量檢驗標準?也就是說假設你有個金融股價預測模型,雖然你股價每次都預測偏差很大,但是如果你能根據這樣的偏差做決策,並且決策整體看下來仍然不錯,這個模型搞不好也是能用的哦!因為模型的擬合能力永遠排第二,第一的永遠是應用場景中能不能創造利益。
但是實際上模型擬合能力不足,通常奠基在此上面的決策也不會太好,這件事情我講不一定準確,你要以你的資料和所屬領域做判斷,因為在金融資料上常常會有噪音或是相對問題沒什麼幫助的價格波動,因此我通常都不會追求模型擬合能力一定要很好,他只要能讓我正例判例達到一個標準,我通常就讓他上線做測試,永遠要記得一件事情,欠擬合不是罪,y罪是你不會善用欠擬合的模型,更進階一點的問題是如果你的模型會搭配其他模型做複合使用,通常擬合能力不足的也不太能和其他模型組合決策。
通常一個模型欠擬合,我們會認為是模型的複雜度不足,會加大模型的複雜度來解決欠擬合的問題。
這個基本沒什麼問題,只是說模型加大複雜度的同時,你永遠要記得控制好其它變因,我舉個例子,例如當你在 RBFNN 中增加中心點的時候,你不能同時讓你的訓練樣本也變多、或是改變輸入的資料,這樣我們才能確保模型的擬合度是來自於我們新增加的模型複雜度,許多模型的複雜度會有很多個面向,例如 RNN 或 CNN 等,在加大模型複雜度解決欠擬合也是不容易。
我們這邊假定你透過加大模型複雜度之後,順利解決訓練樣本在模型輸出值與標籤值的誤差問題,成功匹配。現在你把模型運用到測試樣本,在時間序列資料中也就是說你把模型運用到另一段新的時間區間的資料,來看看模型是否能像在訓練樣本一樣表現良好。
通常情況是,如果你是新手又選擇一個比較困難的主題,例如一個國家的能源使用率的預測,你會發現你在測試樣本中你的模型表現結果很糟糕,也就是說你在訓練樣本內訓練得很好,但是在測試樣本表現不如訓練樣本好:
這時候我們就會認為你原本訓練的模型「過擬合」了,然而事實真的是如此嗎?很多人很少去探究其中的原因,會不會你在訓練樣本中只要把模型複雜度調低一些,你的訓練樣本就訓練不起來了呢?而你選擇的模型複雜度,已經是所有能訓練起來的模型中,複雜度最低的了,舉例來說如下圖:
這個時候該怎麼辦呢?這時候你就需要去修改一些其他參數,也就是不涉及到模型複雜度的參數,舉例來說你的模型的訓練過程中使用的學習速率、初始化權重的位置等(例如我們後面會提到的啟發式演算法,也有一些參數)再來重新測試一次模型擬合度,或是增加或減少訓練樣本等(一般來說去動訓練樣本會是我真的萬無所施的時候才會做的事情)。
最美好的情況,就是你在訓練樣本與測試樣本中間找到一個最佳的模型複雜度區間,在這個區間的模型複雜度能在訓練樣本訓練的起來,在測試樣本也很成功的使用:
事實上在啟發式演算法的訓練中,我們有很多彈性可以去調整我們的擬合函數(或是誤差函數),所以除了修改模型複雜度之外,我們也可以修改我們的訓練目標。
在實際模型上線之後,你會發現如果你的資料是牽涉到時間維度的,你的模型很有可能會在使用一段時間之後出問題,現在問題來了,到底模型在測試樣本(或是上線之後的實際運作過程)中遇到欠擬合的情況,是模型在訓練樣本中是否能考慮的到的呢?
我舉個例子,做水文資料就常常會遇到這個問題,例如突然之間的一個劇烈地質改變,造成當地水文環境劇烈改變,你可說這樣的資料應該在訓練樣本中訓練起來嗎?好,你可能說你會盡你可能把所有資料和所有期間都包含到你的模型之中,那這樣子你的模型一定很大很複雜,訓練成本會太高,所以也不要一昧的倚賴模型,最好是在決策中放入一些保險絲,舉例來說,我在處理金融資料的時候,我也會考慮這些金融價格資料個別的波動、彼此之間的相關性,有時候我也會算他的動差,例如三四階動差等等,從模型外部去干涉決策,這點我在 Day 8 沒有特別提到,但的確決策除了倚賴模型之外也是可以考量其他因素的。
這是很重要的觀念,所以為什麼我在 Day 4 強調模型質量指標,也就是說模型雖然有預測能力,但是模型也是可以舉手投降說我沒辦法的!這時候你就可以透過一些其他機制來干涉,而這就是說單純只考慮類神經網路技術的人,他們比較不會著墨的地方。
開始出現倦怠感了哈哈,我會持續加油的,之前欠得先放著吧。