iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
0
AI & Machine Learning

Machine Learning 與 Deep Learning 筆記系列 第 8

[Day8] 如何正確訓練 Model

  • 分享至 

  • xImage
  •  

因為我們試圖最小化成本函數,所以電腦會盡量在資料當中找到最好的權重。不過這對真實狀況來說其實不合理,為什麼呢?

舉例來說,當新的資料進來,我們很容易因為原本的模型太擬合,導致如果模型看到一個從來沒看過的資料,有可能會失準。

意思是說,模型過於擬合並不是一件好事囉?是的,這就像穿著一件緊身褲一樣,只有符合特定尺寸的寬度才穿得下。我們希望模型可以擬合更多沒有看過的資料。

Overfitting(過擬合)

以上提到的狀況叫做過擬合(overfitting)。雖然對於**訓練資料(training data)**有很好的效果,但對於沒看過的資料,卻有很差的結果。

我們通常會用正確率來幫一個模型打分數,正確率的定義為,在所有的 label 當中,我們預測中的 label 有多少:
$$
accuracy = prob(Y=prediction(X, weight))
$$
雖然模型可以非常完美地擬合已經出現過的資料,但在實務上我們想要做的並不是擬合已經出現過的資料(因為都已經有輸出結果了),而是面對不知道的資料時,仍然可以準確地預估結果為何。

所以,針對之前提到的兩個模型,線性迴歸邏輯回歸,想要在模型中加入一些常數,讓這個模型可以更加泛化,更能擬合未知的資料。

Underfitting(欠擬合)

跟過擬合不同,欠擬合是指雖然已經透過梯度下降來更新權重,卻仍然有很高的 error。有幾個原因可能造成欠擬合:

  • 梯度下降的迭代次數過少
  • 特徵數太少

正規化(regularization)

會產生 overfitting 有幾個可能原因:

  • 特徵數太多
  • 模型太過擬合測試的數據
  • 選擇正確的 model

為了避免這種情況,會加入正規化參數,通常都會用 $\lambda$ 來表示。而正規化的效果通常都能夠改善模型的準確率。

現在讓我們來看看線性回歸與邏輯回歸兩個模型的正規化項(regular term)

線性迴歸

$$
cost(W)=\frac{1}{2m}\times[\sum_{i=1}^{m}(h(x_i) -y_{i})^2+\lambda\sum_{j=1}^{n}w_{j}^{2}]
$$

邏輯回歸

$$
cost(W)=[\frac{1}{m}\times\sum_{i=1}^{m}y_ilog(h(x_i)) + (1-y_i)log(1-h(x_i))]+\frac{\lambda}{2m}\sum_{j=1}^{n}w_j^2
$$

注意:$\lambda$ 有時會用 C 表示,定義為 $\lambda$ 的倒數
$$
C=\frac{1}{\lambda}
$$
這樣一來,每次訓練模型時,都可以讓模型不是那麼地擬合,也就可以適應更多未知的資料。他們的微分也相對簡單:

線性迴歸:

$$
\frac{1}{m}\times[\sum_{i=1}^{m}(h(x_i) -y_{i})\times x_i) +\lambda\sum_{j=1}^{n}w_{j}]
\
h(x)=w0x0+w1x1+...
$$

邏輯回歸:

$$
\frac{1}{m}\times\sum_{i=1}^{m}[(y_{i}log(h(x_{i}))+(1-y_i)log(1-h(x_{i}))]+\frac{\lambda}{m}\sum_{j=0}^{n}w_{j}
$$

Normalization

在前幾個例子當中,可以發現年份、薪水是個差距相當大的數字。例如:105 比上 50000,這在訓練模型時會因為數字相差太大而導致梯度下降的比較慢,雖然仍然可以找到正確的結果,但是效能比較差。如果相差在更大的話也有可能讓數字過大而直接 overflow。

所以我們通常會先用平均化的方式讓值的範圍縮在 -1 ~ 1 之間。

training, test, cross validation

到目前為止,我們實驗的方式都是把所有資料(training data)拿去做訓練,然後就直接來預測結果了。不過這樣一來我們就沒辦法知道這個 model 到底準不準,也不知道該從哪裡調整參數才好。

因此在實務上,我們會把訓練資料分為三個部分:training set, test set, cross validation set

  • training set:用來訓練參數的資料
  • cross validation set:把訓練好的參數用 cross validation set 做測試,並根據準確率做調整參數
  • test set:利用 cross validation set 調整好之後的參數,最後用 test 來評估這個模型的準確率

這是為了不讓模型先看過全部的資料,而是只用一部分的資料訓練,並觀察是否能在未知的資料上也有不錯的預測能力。通常分成:training set 80%, cross validation set: 10%, test set: 10%。(可根據資料大小做調整)

之後如果有時間,我會修改前兩個範例中的程式碼,加上正規項,來看看是否能夠增加準確率。


上一篇
[Day7] 邏輯回歸 - 2
下一篇
[Day9] SVM 支援向量機(Support Vector Machine)(尚未完成)
系列文
Machine Learning 與 Deep Learning 筆記10
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言