This is a journal of learning Tensorflow, OpenAi Gym.

2017年10月4日 星期三

深度學習基礎─Model的訓練、優化與選擇

深度學習基礎─Model的訓練、優化與選擇

一、資料的分配



在訓練Model之前我們必須先將資料分成好幾塊。大多數人的做法是將原本的Data Set分成Training Data以及Testing Data,而Testing Data又分成public以及private,不過還有一種做法是將Training Data再分成Training Set以及Validation Set。

Training Data顧名思義就是用來訓練 model的,而Validation Data則是用來挑選以及修改model的。一個好的model他的表現再Training Data以及Validation Data上應該要差不多,如果他在Testing Data的表現很好,但是在Validation Data的表現很糟,此時就是處於Overfitting的狀態,但是如果他在Testing Data的表現就很糟,那麼就是Underfitting了。
在上圖中之所以會將Validation data歸類在Training Data裡面是因為重新設計且挑選好Model後,我們可以把Model 用整個Training Data 重新更新一次參數。

有的人可能會問,既然我們都有了Validation Data,那麼為何要再抓一個Testing Data呢?Testing Data 與 Validation Data的最大不同點在於我們不會針對他修正Model或是更新參數,他用來讓我們知道這個Model在真實情況下他的期望狀況會是如何。至於 Private Testing Data 的功能則是讓老師打作業成績用的(誤)。


還有一種做法叫做N-fold Crodd Validation。
以這個投影片為例,我們將Training Set 分成三份,其中兩份是Training Set 一分是 Validation Set ,這樣的分法就可以使我們的Traing Set 與 Validation Set有很多種不同排列組合。我們將三個不同的Model 在各個組合上做訓練並計算出Loss的平均值,就可以從中得到比較好的一個Model。

二、Loss 從哪裡來?


現在我們學會了如何分割Data Set,也有了最基本的Model(如果忘記了請複習上一篇文章),此時我們的model很有可能與target 有非常大的Loss,為了要降低Loss,我們必須先了解Loss 是怎麼來的。




Model 與 Target 之間的Loss主要來自於Bias以及Loss,在課程中老師以打靶的方式做比喻:
我們的目標值y是靶心,模型的預測值則是子彈,子彈與靶心的距離來自於Bias,Bias大就會離靶心很遠;打出去的子彈散的多開則取決於Variance,Variance大就要打很多次才會打中靶心。


假設我們將估測值Y(投影片上的Sample N points X上標n)取平均值m,那麼我們會發現它並不會與真實預測值的平均值Miu相等。此時我們再估測m的Variance會發現它會是Variable of x / N,也就是說樣本數N增加,那麼Variance就會越小。


至於Bias的估算方式則是抓上圖S的期望值,接著我們就會發現S的期望值剛好會是Variance of x 的N-1/N。

而Variance 與 Bias 與Model的複雜度有相當程度的關係

越複雜的Model 越容易得到大的Variance,因為越複雜的Model 越容易受到input data影響。



Bias的估算方式比較麻煩,因為一開始的時候我們根本不知道我們的Model丟出什麼東西,此時只好假設黑色線是我們的Target function,而藍色線則是Model測試上千次實驗後得到的平均值。
此時我們可以發現簡單的Model地的估算值比較集中,但是會離目標函數比較遠;複雜的Model雖然每次的預測值都散得很開,但是經過上千次的實驗預測後,平均值會與目標函數相近。


如果我們的Model在Training 階段就無法命中Target function (Underfitting),那麼就代表Bias 太大;如果我們的Model在training Data上表現不錯,但是在testing Data上卻有巨大的Error (Overfitting),此時就是Variance過大。

如果要解決Bias過大的問題,我們可以input 更多feature 或是提高model的複雜度來解決;如果是Variance過大,我們就要透過增加Data 或是透過 Regularization 的方式解決。
以下將介紹何謂Regularization 。



Regularization terms就是將每一個weights平方後乘上常數Landa,我們的Model為了要減少Loss就必須要盡可能的使wieghts減小,此時就會得到一個比較平滑的function,而我們認為比較平滑的function Loss會比較小
至於為什麼這樣做會得到一個比較平滑的function呢?
改辦後的Loss function 可以想像成我們直接對原本的model做了一點修改,我們在原本的function中於兩邊同時加上Summation(Weights * Xi的變化量),為了要減小輸入對輸出的影響,我們就必須盡可能的使Weights縮小,這樣一來就可以是複雜的model平滑一點了。



理論上來說,Landa越大則function越平滑,且在Testing Set的Loss就會越小,但是在Training Set的Loss則會比較大,原因的話其實滿直觀的,原本的model參數只要讓Loss越來越小就好,但是現在還要讓function更平滑,因此就會產生顧此失彼的情況。
至於為什麼增加一個參數就可以使function變平滑呢?因為當我們輸入一個值進來後它會使Y做變化,而這時候Regularization terms的功用就是使Y的變化不要那麼的大。



總結:
在我們設計好Model,分割好Data後,我們就會開始Train Model。一開始大家遇到Model Error很大的時候其實就會直接去塞進更多的feature或是把Model設計得更複雜,但是其實在做這些事之前我們應該要先了解Model 的問題是來自於Bias 還是 Variance,這樣子才能夠有效率的修正Model。

沒有留言:

張貼留言