(我們今天要先進第四章節囉~)
這幾天的文章會是一系列的,會需要一起看才比較能看懂整個ML模型的輪廓,
然而因為一天能寫的內容量有限,所以我會在前言部分稍微說明我寫到哪。
因為ML模型的訓練階段章節內容會分很多部分,我們要先確認好自己在哪個階段,
以免吸收新內容卻不知道用在內容的什麼地方。
★ML的整個「訓練過程」:這裡以監督式學習(Supervised Learning)
為例
階段 | 要做的事情 | 簡介 |
---|---|---|
(訓練前 ) |
決定資料集與分析資料 | 你想要預測的是什麼資料? 這邊需要先知道 example 、label 、features 的概念。介紹可參考:【Day 15】,而我們這次作為範例的訓練資料集介紹在【Day 19】。 |
(訓練前 ) |
決定問題種類 | 依據資料,會知道是什麼類型的問題。regression problem(回歸問題) ? classification problem(分類問題) ? 此處可參考:【Day 16】、與進階內容:【Day 17】 |
(訓練前 ) |
決定ML模型(ML models) | 依據問題的種類,會知道需要使用什麼對應的ML模型。回歸模型(Regression model) ? 分類模型(Classification model) ? 此處可參考:【Day 18】,神經網路(neural network) ? 簡介於:【Day 25】 |
(模型裡面的參數) | ML模型裡面的參數(parameters) 與超參數(hyper-parameters) 此處可參考:【Day 18】 |
|
(訓練中 ) 調整模型 |
評估當前模型好壞 | 損失函數(Loss Functions) :使用損失函數評估目前模型的好與壞。以MSE(Mean Squared Error) , RMSE(Root Mean Squared Error) , 交叉熵(Cross Entropy) 為例。此處可參考:【Day 20】 |
(訓練中 ) 調整模型 |
修正模型參數 | 以梯度下降法 (Gradient Descent) 為例:決定模型中參數的修正「方向」與「步長(step size) 」此處可參考:【Day 21】 |
(訓練中 ) 調整腳步 |
調整學習腳步 | 透過學習速率(learning rate) 來調整ML模型訓練的步長(step size) ,調整學習腳步。(此參數在訓練前 設定,為hyper-parameter )。此處可參考:【Day 22】 |
(訓練中 ) 加快訓練 |
取樣與分堆 | 設定batch size ,透過batch 從訓練目標中取樣,來加快ML模型訓練的速度。(此參數在訓練前 設定,為hyper-parameter )。與迭代(iteration) ,epoch 介紹。此處可參考:【Day 23】 |
(訓練中 ) 加快訓練 |
檢查loss的頻率 | 調整「檢查loss的頻率」,依據時間(Time-based) 與步驟(Step-based) 。此處可參考:【Day 23】 |
(訓練中 ) 完成訓練 |
(loop) -> 完成 | 重覆過程(評估當前模型好壞 -> 修正模型參數),直到能通過「驗證資料集(Validation)」的驗證 即可結束訓練。此處可參考:【Day 27】 |
(訓練後 ) |
訓練結果可能問題 | 「不適當的最小loss?」 此處可參考:【Day 28】 |
(訓練後 ) |
訓練結果可能問題 | 欠擬合(underfitting) ?過度擬合(overfitting) ? 此處可參考:【Day 26】 |
(訓練後 ) |
評估 - 性能指標 | 性能指標(performance metrics) :以混淆矩陣(confusion matrix) 分析,包含「Accuracy 」、「Precision 」、「Recall 」三種評估指標。簡介於:【Day 28】、詳細介紹於:【Day 29】 |
(訓練後 ) |
評估 - 新資料適用性 | 泛化(Generalization) :對於新資料、沒看過的資料的模型適用性。此處可參考:【Day 26】 |
(訓練後 ) |
評估 - 模型測試 | 使用「獨立測試資料集(Test) 」測試? 使用交叉驗證(cross-validation) (又稱bootstrapping )測試? 此處可參考:【Day 27】 |
(資料分堆的方式) | (訓練前 ) 依據上方「模型測試」的方法,決定資料分堆的方式:訓練用(Training)、驗證用(Validation)、測試用(Test)。此處可參考:【Day 27】 |
★小實驗系列:
文章 | 實驗內容 |
---|---|
【Day 24】 | TensorFlow Playground 的簡介與介面介紹 |
【Day 24】 | learning rate 的改變對訓練過程的影響 |
【Day 25】 | 使用神經網路(neural network) 分類資料 |
【Day 25】 | 觀察batch size 如何影響gradient descent |
第四章節的課程地圖:(紅字標記為本篇文章中會介紹到的章節)
Introduction to Generalization and Sampling
Introduction
Generalization
Generalization and ML Models
★ 名詞解釋:
泛化(generalize)
:指ML模型「對未知資料集」的預測能力。
泛化(generalize)
能力差:等於預測「對未知資料集」的預測能力能力差。但如果對「對自己的資料」的預測能力很好,有可能是發生了過度擬合(overfitting)
的現象。
★ 欠擬合(underfitting)
與 過度擬合(overfitting)
比較 | 欠擬合(underfitting) |
過度擬合(overfitting) |
---|---|---|
(訓練前 ) |
(可能)決定了太簡單的模型 | (可能)決定了太複雜的模型 |
(訓練中 ) |
(可能)訓練太早結束 | (可能)訓練過頭,也就是太晚結束 |
(訓練後 )對自已的資料 |
訓練後發現模型「對自已的資料」預測能力太差 | 訓練後發現模型「對自已的資料」預測能力非常好(可能好到沒有誤差) |
(訓練後 )對新的資料 |
(對自己的資料都不行了還要試新資料嗎XD) | 訓練後發現模型「對新的資料」預測能力非常差 |
代表的意義 | 我們的模型「對自已的資料」沒辦法達到理想的預測能力。 | 我們的模型「對新的資料」沒辦法達到理想的預測能力,然而對「對自已的資料」預測能力非常好。 |
自己的記法(不完全正確) | 連自己的資料預測都不行,根本還不能預測東西。 | 訓練到根本把「自己的資料」都「背下來」了,難怪新資料完全不能預測。 |
自己的註:
「最佳的ML模型訓練結果」應該介於
欠擬合(underfitting)
與過度擬合(overfitting)
之間。
★ 用圖簡單解釋 欠擬合(underfitting)
與 過度擬合(overfitting)
:
課程地圖
我們在這章節要討論的是泛化(generalization)
與 取樣(sampling)
在討論之前,我們一樣來複習前面所學過的內容,
我們已經討論過ML model是如何訓練的,
並且在TensorFlow playground中做了實驗,看到了視覺化的結果。
現在我們就可以思考一個有趣的問題,
什麼時候一個被訓練很精確的ML模型,實際上卻不是正確的結果,
事實上這個問題的關鍵就是在:
「對我們的模型而言的loss為0,實際上在現實生活中並不一定是真的好的。」
自己的註:
對一個資料集的分析,loss為0僅代表「這個誤差對資料集的預測沒有影響」,不等於預測是對的。
★ 「好的ML模型」不是指對「我們的資料集」預測結果好,而是對於「未看過的資料」表現的也好。
我們的ML模型如果將來想要產品化,這表示會有更多我們的ML模型沒看過的資料,
這就是我們必須仔細評估的問題。
所以我們要來討論怎麼去「評估我們沒看過的資料」?
首先,我們必須要得到一些我們沒有在訓練中使用的資料,
在我們的訓練完成後,我們就可以用這些資料來評估,
我們也可以藉由這樣的評估來判斷我們的模型是否有過度擬合(overfitting)
的現象,
以及確定什麼時候應該模型要停止訓練。
第二部分就是我們可以如何在一開始就創造一些未知的資料集,
正常情況下,我們可能很難取得未看過的資料。
但因為我們有訓練資料集,
所以我們可以將訓練資料集拆成「訓練用」與「評估用」,
我們可以使用其中一組資料集訓練我們的模型,
而當模型訓練完成時,我們就可以使用另外的資料來進行測試與評估模型的表現。
所以我們也會學到如何去建 training, evaluation, test 的資料集,
並透過這樣的方式實際建立測試模型的指標。
課程地圖
我們先來解決泛化(generalization)
的問題,這可以幫助我們理解
「為什麼我們訓練一個預測準確的模型,並不一定是最好的模型。」
過度擬合(overfitting)
的現象我們再來看一下我們所熟悉的出生率資料集,
不過這次我們使用「母親的體重增加」在X軸上,
來預測在Y軸上的「預測懷孕的時間」,
首先我們可以直覺的感覺到,這兩組資料看起來有很強的相關性,
也就是說,體重增加的越多,懷孕的時間就越長,
這件事情似乎在嬰兒的成長過程中是很直觀的。
我們也來複習前面一點的內容,當我們說到要對這樣的關係建立模型,
證明這兩個數據具有相關性,我們需要使用線性回歸模型(linear regression model)
而當我們討論回歸問題(regression problems)
時,
我們通常用來計算的loss的方式都是MSE(mean squared error)
或RMSE(root mean squared error)
MSE(mean squared error)
可以告訴我們我們預測的回歸線與實際結果有多接近,
我們實際上在計算就是「每個資料點」與「回歸線(我們的預測)」的距離,
這段距離我們又可以稱為error(誤差),
在MSE(mean squared error)
的計算之下,我們會將誤差平方,
所以我們會移除負號而只觀測其值。
此外,因為MSE的關係,我們可以加重「預測」與「實際值」差異的處罰。
用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)
。
所以,我們應該要在什麼時候停止訓練模型?
並且我們要避免模型「背下資料集」導致過度擬合(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)
的現象,
也證明了這模型對於新資料的預測能力非常的弱。
現在我們可能會想問,怎麼確定我們的模型訓練有沒有過度擬合(overfitting)
?
所以我們該如何決定我們訓練停止的時間? 這個問題的答案十分的簡單。
我們先將我們的資料集分成兩部分。
現在我們將我們的原始資料分成完全兩個獨立的組別,
一個為「訓練用資料集(training)」、另一個為「驗證用資料集(validation)」
我們可以拿我們的「訓練用資料集」來不斷的反覆訓練我們的模型,
當我們完成訓練之後,拿訓練好的模型使用「驗證用資料集」來看模型的表現。
如果模型泛化(generalize)的很好,它應該也會在「驗證用資料集」有差不多的loss值
(也就是「訓練用資料集(training)」、「驗證用資料集(validation)」的loss差不多。)
當我們看見我們的模型對於「驗證資料集(validation)」預測結果開始不好的時候,
也就是像上圖,當我們計算出的loss開始增加,我們的模型訓練就該停止了。
自己的註:
正常來說「驗證資料集(validation)」的RMSE應該也要差不多2.2左右
誤差太大也表示我們的ML模型有可能在「背資料」了。
同時訓練和驗證ML模型,能夠幫我們找到正確的泛化結果與最合適訓練資料集的模型參數,而不是將模型整個背下來。
我們先看上圖中最上面的圖形,
我們有一個過於簡單的線性模型,它並不太適合預測我們這組資料,
上圖中,我們可以視覺上的發現很多點都是在這條預測之外,
這樣的情形我們就稱為欠擬合(underfitting)
而與上述相反的情況,如果結果太過符合所有的資料點,
我們就稱之為過度擬合(overfitting)
我們適當增加線性模型(linear model)的複雜度,使它成為n階多項式,
讓結果能符合我們資料的預測,
因此,這就是為什麼我們需要驗證的資料集,
我們就是要決定是否模型的參數是否已經過度訓練導致過度擬合(overfitting)
的發生。
過度擬合(overfitting)
或模型「只知道」我們訓練資料集的如何預測,
很多時候都會到生產階段才知道,這也就是為什麼我們還需要驗證的資料集。
一個正確的結果,也就是在欠擬合(underfitting)
與過度擬合(overfitting)
之間找到適當的模型複雜度,
接下來我們就要來看如何使用驗證資料集(validation dataset),幫助我們決定模型停止訓練的時間,與他是如何幫助我們避免過度擬合(overfitting)
。
coursera - Launching into Machine Learning 課程
若圖片有版權問題請告知我,我會將圖撤掉