前言
(我們今天要先進第四章節囉~)
這幾天的文章會是一系列的,會需要一起看才比較能看懂整個ML模型的輪廓,
然而因為一天能寫的內容量有限,所以我會在前言部分稍微說明我寫到哪。
複習一下ML的整個訓練過程
因為ML模型的訓練階段章節內容會分很多部分,我們要先確認好自己在哪個階段,
以免吸收新內容卻不知道用在內容的什麼地方。
★ML的整個「訓練過程」:這裡以監督式學習(Supervised Learning)為例
| 階段 | 要做的事情 | 簡介 |
|---|---|---|
(訓練前) | 決定資料集與分析資料 | 你想要預測的是什麼資料? 這邊需要先知道 example、label、features的概念。介紹可參考:[【Day 15】](https://ithelp.ithome.com.tw/articles/10215499),而我們這次作為範例的訓練資料集介紹在[【Day 19】](https://ithelp.ithome.com.tw/articles/10217666)。 |
(訓練前) | 決定問題種類 | 依據資料,會知道是什麼類型的問題。regression problem(回歸問題)? classification problem(分類問題)? 此處可參考:[【Day 16】](https://ithelp.ithome.com.tw/articles/10216585)、與進階內容:[【Day 17】](https://ithelp.ithome.com.tw/articles/10215946) |
(訓練前) | 決定ML模型(ML models) | 依據問題的種類,會知道需要使用什麼對應的ML模型。回歸模型(Regression model)? 分類模型(Classification model)? 此處可參考:[【Day 18】](https://ithelp.ithome.com.tw/articles/10217431),神經網路(neural network)? 簡介於:[【Day 25】](https://ithelp.ithome.com.tw/articles/10221227) |
| (模型裡面的參數) | ML模型裡面的參數(parameters)與超參數(hyper-parameters) 此處可參考:[【Day 18】](https://ithelp.ithome.com.tw/articles/10217431) | |
(訓練中) 調整模型 | 評估當前模型好壞 | 損失函數(Loss Functions):使用損失函數評估目前模型的好與壞。以MSE(Mean Squared Error), RMSE(Root Mean Squared Error), 交叉熵(Cross Entropy)為例。此處可參考:[【Day 20】](https://ithelp.ithome.com.tw/articles/10218158) |
(訓練中) 調整模型 | 修正模型參數 | 以梯度下降法 (Gradient Descent)為例:決定模型中參數的修正「方向」與「步長(step size)」此處可參考:[【Day 21】](https://ithelp.ithome.com.tw/articles/10218980) |
(訓練中) 調整腳步 | 調整學習腳步 | 透過學習速率(learning rate)來調整ML模型訓練的步長(step size),調整學習腳步。(此參數在訓練前設定,為hyper-parameter)。此處可參考:[【Day 22】](https://ithelp.ithome.com.tw/articles/10219458) |
(訓練中) 加快訓練 | 取樣與分堆 | 設定batch size,透過batch從訓練目標中取樣,來加快ML模型訓練的速度。(此參數在訓練前設定,為hyper-parameter)。與迭代(iteration),epoch介紹。此處可參考:[【Day 23】](https://ithelp.ithome.com.tw/articles/10219945/draft) |
(訓練中) 加快訓練 | 檢查loss的頻率 | 調整「檢查loss的頻率」,依據時間(Time-based)與步驟(Step-based)。此處可參考:[【Day 23】](https://ithelp.ithome.com.tw/articles/10219945/draft) |
(訓練中) 完成訓練 | (loop) -> 完成 | 重覆過程(評估當前模型好壞 -> 修正模型參數),直到能通過「驗證資料集(Validation)」的驗證即可結束訓練。此處可參考:[【Day 27】](https://ithelp.ithome.com.tw/articles/10222043) |
(訓練後) | 訓練結果可能問題 | 「不適當的最小loss?」 此處可參考:[【Day 28】](https://ithelp.ithome.com.tw/articles/10222317) |
(訓練後) | 訓練結果可能問題 | 欠擬合(underfitting)?過度擬合(overfitting)? 此處可參考:[【Day 26】](https://ithelp.ithome.com.tw/articles/10221245) |
(訓練後) | 評估 - 性能指標 | 性能指標(performance metrics):以混淆矩陣(confusion matrix)分析,包含「Accuracy」、「Precision」、「Recall」三種評估指標。簡介於:[【Day 28】](https://ithelp.ithome.com.tw/articles/10222317)、詳細介紹於:[【Day 29】](https://ithelp.ithome.com.tw/articles/10222697) |
(訓練後) | 評估 - 新資料適用性 | 泛化(Generalization):對於新資料、沒看過的資料的模型適用性。此處可參考:[【Day 26】](https://ithelp.ithome.com.tw/articles/10221245) |
(訓練後) | 評估 - 模型測試 | 使用「獨立測試資料集(Test)」測試? 使用交叉驗證(cross-validation)(又稱bootstrapping)測試? 此處可參考:[【Day 27】](https://ithelp.ithome.com.tw/articles/10222043) |
| (資料分堆的方式) | (訓練前) 依據上方「模型測試」的方法,決定資料分堆的方式:訓練用(Training)、驗證用(Validation)、測試用(Test)。此處可參考:[【Day 27】](https://ithelp.ithome.com.tw/articles/10222043) |
★小實驗系列:
| 文章 | 實驗內容 |
|---|---|
| [【Day 24】](https://ithelp.ithome.com.tw/articles/10220441) | TensorFlow Playground 的簡介與介面介紹 |
| [【Day 24】](https://ithelp.ithome.com.tw/articles/10220441) | learning rate 的改變對訓練過程的影響 |
| [【Day 25】](https://ithelp.ithome.com.tw/articles/10221227) | 使用神經網路(neural network)分類資料 |
| [【Day 25】](https://ithelp.ithome.com.tw/articles/10221227) | 觀察batch size如何影響gradient descent |
Course - Launching into Machine Learning
第四章節的課程地圖:(紅字標記為本篇文章中會介紹到的章節)
- Generalization and Sampling
Introduction to Generalization and SamplingIntroduction
GeneralizationGeneralization and ML Models- When to Stop Model Training
- Sampling
- Creating Repeatable Samples in BigQuery
- Demo of Splitting Datasets in BigQuery
- Lab: Creating Repeatable Dataset Splits
- Lab Introduction
- Lab: Creating Repeatable Dataset Splits in BigQuery
- Lab Solution Walkthrough
- Lab: Exploring and Creating ML Datasets
- Lab Introduction
- Lab: Exploring and Creating ML Datasets
- Lab Solution Walkthrough
- Module Quiz
0. 一樣先來整理今天重點
★ 名詞解釋:
泛化(generalize):指ML模型「對未知資料集」的預測能力。
泛化(generalize)能力差:等於預測「對未知資料集」的預測能力能力差。但如果對「對自己的資料」的預測能力很好,有可能是發生了過度擬合(overfitting)的現象。
★ 欠擬合(underfitting) 與 過度擬合(overfitting)
| 比較 | 欠擬合(underfitting) | 過度擬合(overfitting) |
|---|---|---|
(訓練前) | (可能)決定了太簡單的模型 | (可能)決定了太複雜的模型 |
(訓練中) | (可能)訓練太早結束 | (可能)訓練過頭,也就是太晚結束 |
(訓練後)對自已的資料 | 訓練後發現模型「對自已的資料」預測能力太差 | 訓練後發現模型「對自已的資料」預測能力非常好(可能好到沒有誤差) |
(訓練後)對新的資料 | (對自己的資料都不行了還要試新資料嗎XD) | 訓練後發現模型「對新的資料」預測能力非常差 |
| 代表的意義 | 我們的模型「對自已的資料」沒辦法達到理想的預測能力。 | 我們的模型「對新的資料」沒辦法達到理想的預測能力,然而對「對自已的資料」預測能力非常好。 |
| 自己的記法(不完全正確) | 連自己的資料預測都不行,根本還不能預測東西。 | 訓練到根本把「自己的資料」都「背下來」了,難怪新資料完全不能預測。 |
自己的註:
「最佳的ML模型訓練結果」應該介於欠擬合(underfitting) 與 過度擬合(overfitting)之間。
★ 用圖簡單解釋 欠擬合(underfitting) 與 過度擬合(overfitting):

1. Introduction to Generalization and Sampling
課程地圖
- Generalization and Sampling
- Introduction to Generalization and Sampling
- Introduction
- Introduction to Generalization and Sampling
我們在這章節要討論的是泛化(generalization) 與 取樣(sampling)
在討論之前,我們一樣來複習前面所學過的內容,
我們已經討論過ML model是如何訓練的,
並且在TensorFlow playground中做了實驗,看到了視覺化的結果。
現在我們就可以思考一個有趣的問題,
什麼時候一個被訓練很精確的ML模型,實際上卻不是正確的結果,
事實上這個問題的關鍵就是在:
「對我們的模型而言的loss為0,實際上在現實生活中並不一定是真的好的。」
自己的註:
對一個資料集的分析,loss為0僅代表「這個誤差對資料集的預測沒有影響」,不等於預測是對的。
★ 「好的ML模型」不是指對「我們的資料集」預測結果好,而是對於「未看過的資料」表現的也好。
我們的ML模型如果將來想要產品化,這表示會有更多我們的ML模型沒看過的資料,
這就是我們必須仔細評估的問題。
所以我們要來討論怎麼去「評估我們沒看過的資料」?
首先,我們必須要得到一些我們沒有在訓練中使用的資料,
在我們的訓練完成後,我們就可以用這些資料來評估,
我們也可以藉由這樣的評估來判斷我們的模型是否有過度擬合(overfitting)的現象,
以及確定什麼時候應該模型要停止訓練。
第二部分就是我們可以如何在一開始就創造一些未知的資料集,
正常情況下,我們可能很難取得未看過的資料。
但因為我們有訓練資料集,
所以我們可以將訓練資料集拆成「訓練用」與「評估用」,
我們可以使用其中一組資料集訓練我們的模型,
而當模型訓練完成時,我們就可以使用另外的資料來進行測試與評估模型的表現。
所以我們也會學到如何去建 training, evaluation, test 的資料集,
並透過這樣的方式實際建立測試模型的指標。
2. Generalization and ML Models
課程地圖
- Generalization and Sampling
- Generalization
- Generalization and ML Models
- Generalization
我們先來解決泛化(generalization)的問題,這可以幫助我們理解
「為什麼我們訓練一個預測準確的模型,並不一定是最好的模型。」
2.1. 觀察過度擬合(overfitting)的現象

我們再來看一下我們所熟悉的出生率資料集,
不過這次我們使用「母親的體重增加」在X軸上,
來預測在Y軸上的「預測懷孕的時間」,
首先我們可以直覺的感覺到,這兩組資料看起來有很強的相關性,
也就是說,體重增加的越多,懷孕的時間就越長,
這件事情似乎在嬰兒的成長過程中是很直觀的。
我們也來複習前面一點的內容,當我們說到要對這樣的關係建立模型,
證明這兩個數據具有相關性,我們需要使用線性回歸模型(linear regression model)
而當我們討論回歸問題(regression problems)時,
我們通常用來計算的loss的方式都是MSE(mean squared error)或RMSE(root mean squared error)

- MSE
MSE(mean squared error)可以告訴我們我們預測的回歸線與實際結果有多接近,
我們實際上在計算就是「每個資料點」與「回歸線(我們的預測)」的距離,
這段距離我們又可以稱為error(誤差),
在MSE(mean squared error)的計算之下,我們會將誤差平方,
所以我們會移除負號而只觀測其值。
此外,因為MSE的關係,我們可以加重「預測」與「實際值」差異的處罰。
- RMSE
用MSE取平方根即可得到RMSE,RMSE有點像所有數據與預測的平均距離。
而因為RMSE能夠修正單位的問題,我們能直接解釋為Y軸上的測量單位。
所以以相關係數來說,RMSE會是個更好的測量單位。
不論是這兩種誤差的測量,越小的值都表示模型的性能更好,
我們期望這樣的模型訓練最後能越接近零(表示預測沒有誤差)
這裡我們使用線性回歸模型(linear regression model),
我們透過這模型簡單的繪製了一條最佳回歸線,最大程度的減少了誤差,
我們最終的RMSE值為2.224,似乎還不夠小,那我們來看看另外一個例子。

我們現在來看上面這個有趣的圖形,
我們現在使用更複雜的模型來預測,更複雜的模型會有更多的參數(parameters)
在這個例子中,這些參數(parameters)替我們捕獲到了資料集的每個資料的細節,
然後我們的RMSE值就降到0了,現在這結果「對於我們的資料集」非常的精確。
然而這樣的結果真的是最好的嗎? 我們能使用這模型來生產嗎?
其實這結果非常的有問題,我們舉個例子,
如果今天來了一個我們沒看過的資料,我們訓練出的模型就沒有這樣的直覺,
所以如果問我們,具有8個node的比12個node的好嗎?
我們有個16個node的神經網路,他有最低的RMSE,我們應該使用這個嗎?
我們在這裡所看到的例子,可能是有數百次方的多項式,然後具有數百個node的神經網路。
雖然更多的node(也代表更複雜的模型)能夠幫助我們優化更多的參數,
也能幫助我們找到最適合「複雜數據的分類」結果,
(例如像上一張分類螺旋資料集的例子)
但同時,這樣子做也會讓模型去記住更簡單的、更小的數據集。
自己的註:
就是把整個數據集都「背下來」了,但「不是這個數據集」的反而不會了。
這就是過度擬合(overfitting)。
2.2. 泛化(Generalization)

所以,我們應該要在什麼時候停止訓練模型?
並且我們要避免模型「背下資料集」導致過度擬合(overfitting)?
現在我們有個驗證模型的方法,就是拿我們的模型給沒看過的新資料集看性能如何,
然後我們就可以決定現在的模型對新資料集的泛化(generalize)程度如何,
這也會是未來我們在生產ML模型的重要指標。
自己的註:
泛化(generalize):基本上就是指ML模型對未知資料集的預測能力。
如果沒有良好的泛化(generalize),表示我們的模型只對我們的資料集預測好而已。
我們現在再回到線性回歸模型(linear regression model)與神經網路模型(neural network model),然後看它們表現的怎麼樣。

我們的線性回歸模型(linear regression model)對於新資料集的「泛化(generalize)能力非常好」
從我們「新資料集計算出」的RMSE與我們「訓練所計算出」的RMSE差不多可以判斷。
在這樣的情況下,對於我們的ML模型是一件好事。
我們就是希望再預測(training)與驗證(validation)過程中,
我們的模型能有差不多的表現。

我們現在看到第二個模型,我們可以發現他對於新資料集的「泛化(generalize)能力非常差」
就算對於我們「訓練所計算出」的RMSE為0,
對於「新資料集計算出」的RMSE從0跑到3.2,
這代表一個非常嚴重的問題,也指示出我們的模型有著過度擬合(overfitting)的現象,
也證明了這模型對於新資料的預測能力非常的弱。
2.3. 泛化(Generalization)問題的解法

現在我們可能會想問,怎麼確定我們的模型訓練有沒有過度擬合(overfitting)?
所以我們該如何決定我們訓練停止的時間? 這個問題的答案十分的簡單。
我們先將我們的資料集分成兩部分。
現在我們將我們的原始資料分成完全兩個獨立的組別,
一個為「訓練用資料集(training)」、另一個為「驗證用資料集(validation)」
我們可以拿我們的「訓練用資料集」來不斷的反覆訓練我們的模型,
當我們完成訓練之後,拿訓練好的模型使用「驗證用資料集」來看模型的表現。
如果模型泛化(generalize)的很好,它應該也會在「驗證用資料集」有差不多的loss值
(也就是「訓練用資料集(training)」、「驗證用資料集(validation)」的loss差不多。)

當我們看見我們的模型對於「驗證資料集(validation)」預測結果開始不好的時候,
也就是像上圖,當我們計算出的loss開始增加,我們的模型訓練就該停止了。
自己的註:
正常來說「驗證資料集(validation)」的RMSE應該也要差不多2.2左右
誤差太大也表示我們的ML模型有可能在「背資料」了。
同時訓練和驗證ML模型,能夠幫我們找到正確的泛化結果與最合適訓練資料集的模型參數,而不是將模型整個背下來。
2.4. 欠擬合(underfitting) 與 過度擬合(overfitting)

欠擬合(underfitting)
我們先看上圖中最上面的圖形,
我們有一個過於簡單的線性模型,它並不太適合預測我們這組資料,
上圖中,我們可以視覺上的發現很多點都是在這條預測之外,
這樣的情形我們就稱為欠擬合(underfitting)
過度擬合(overfitting)
而與上述相反的情況,如果結果太過符合所有的資料點,
我們就稱之為過度擬合(overfitting)
我們適當增加線性模型(linear model)的複雜度,使它成為n階多項式,
讓結果能符合我們資料的預測,
因此,這就是為什麼我們需要驗證的資料集,
我們就是要決定是否模型的參數是否已經過度訓練導致過度擬合(overfitting)的發生。
過度擬合(overfitting)或模型「只知道」我們訓練資料集的如何預測,
很多時候都會到生產階段才知道,這也就是為什麼我們還需要驗證的資料集。
一個正確的結果,也就是在欠擬合(underfitting)與過度擬合(overfitting)之間找到適當的模型複雜度,
接下來我們就要來看如何使用驗證資料集(validation dataset),幫助我們決定模型停止訓練的時間,與他是如何幫助我們避免過度擬合(overfitting)。
本文同步發佈在: 第 11 屆 iT 邦幫忙鐵人賽
【Day 26】 Google ML - Lesson 10 - 泛化(Generalization)-檢查ML模型對於未知資料集的預測能力, underfitting與overfitting的問題
參考資料
coursera - Launching into Machine Learning 課程
若圖片有版權問題請告知我,我會將圖撤掉