【2021機器學習筆記】機器學習任務攻略

作業

作業二: 語音辨識

我們的x就是非常小的一段聲音訊號。

x 是一小段訊號,ŷ 是要去預測 是要去判斷這一小段聲音訊號,它對應到哪一個phoneme(音素)。

作業三:影象辨識

這個時候我們的x是一張圖片,ŷ是機器要判斷說這張圖片裡面有什麼樣的東西。

作業四:語者辨識

這個x也是一段聲音訊號,ŷ現在不是phoneme,ŷ是現在是哪一個人在說話。

這樣的系統現在其實非常的有用,如果你打電話去銀行的客服。

現在都有自動的語者辨認系統,它會聽說現在打電話進來的人是不是客戶本人,就少了客服人員問你身份驗證的時間。

作業五:機器翻譯

x 是某一個語言,它的ŷ就是另外一句話這樣。

訓練三個步驟

第一步:寫出一個有未知數的function

你要先寫出一個有未知數的function,這個未知數以後我們都用θ來代表一個Model裡面所有的未知函數。

所以fθ(x)的意思就是說,我現在有一個function叫f(x),它裡面有一些未知的參數。

這些未知的參數表示成θ,它的input叫做x,這個input叫做feature。

第二步:定 loss

loss是一個function,這個loss的輸入就是一組參數,去判斷說這一組參數是好還是不好。

第三步:解 Optimization problem

你要去找一個 θ,這個 θ 可以讓loss的值越小越好。

可以讓loss的值,最小的那個θ,我們叫做θ*。

有了θ*,我們就把它拿來用在測試資料上。

也就是你把θ* 帶入這些未知的參數,本來fθ(x)裡面有一些未知的參數,現在θ 用θ*來取代。

它的輸入就是你現在的測試資料,輸出的結果你就把它存起來,然後上傳到Kaggle就結束了。

從最上面開始,如果你覺得你在 Kaggle 上的結果不滿意的話,第一件事情你要做的是檢查你的training data 的 loss。

有人說 我在意的不是應該是testing data的loss嗎?

Kaggle上面的結果,呈現的是testing data的結果。

但是你要先檢查你的training data,看看你的model在training data上面,有沒有學起來,再去看testing的結果。

如果你發現你的training data的loss很大,顯然它在訓練資料上面也沒有學好。

接下來你要分析一下,在訓練資料上面沒有學好,是什麼樣的原因。

這邊有兩個可能,第一個可能是model的bias,所謂model bias的意思是說假設你的model太過簡單。

舉例來說,我們現在寫了一個有未知 parameter 的 function,這個未知的parameter,我們可以代各種不同的數字。

你代θ¹ 得到一個function,我們把 function用一個點來表示。

θ² 得到另一個function。

把所有的function集合起來得到一個function的set,但是這個function的set它太小了。

這個 function 的 set 裡面沒有包含任何一個 function,可以讓我們的loss變低。

代入不同的數值得到不同的 function,把所有 function 集合起來,得到一個function的set。

在這個 set 裡面,沒有任何一個 function,可以讓 loss 變低。

在這個情況下,就算你找出了一個θ*,它是這些藍色的function裡面最好的那一個,但是也沒用,loss還是不夠低。

這個時候重新設計一個 model,給你的 model 更大的彈性。

我們上週已經示範過,舉例來說,可以增加你輸入的features。

本來我們輸入的features,只有前一天的資訊。

假設我們要預測接下來的觀看人數的話,我們用前一天的資訊不夠多。

改用56天前的資訊,那model的彈性就比較大了。

你也可以用Deep Learning,增加更多的彈性。

所以如果你覺得,你的model的彈性不夠大,那你可以增加更多features。

可以設一個更大的model,可以用deep learning,來增加model的彈性。

這是第一個可以的解法。

但是並不是training的時候,loss大就代表一定是model bias。

你可能會遇到另外一個問題,就是optimization做得不好。

我們知道我們今天用的optimization在這門課裡面,我們其實都只會用到gradient descent 這種optimization的方法。

這種optimization的方法很多的問題。

舉例來說,我們上週也講過說,你可能會卡在local minima的地方。

你沒有辦法找到一個真的可以讓loss很低的參數。

如果用圖具象化的方式來表示,這個是你的 model 可以表示的函式所形成的集合。

你可以把θ 代入不同的數值形成不同的function,把所有的function通通集合在一起,得到這個藍色的set。

這個藍色的set裡面,確實包含了一些function,這些function它的loss是低的。

但問題是gradient descent這一個演算法,沒辦法幫我們找出這個loss低的function。

gradient descent說你要我幫你解optimization的problem,我給你這個θ* 然後就結束了,但是這個θ* 它給我的loss不夠低。

這一個藍色橢圓的 model 裡面存在著某一個 function,它的 loss 是夠低的。

gradient descent 沒有給我們這一個function。

問題判斷

這邊問題就來了,我們今天看到training data的loss不夠低的時候,到底是model bias還是optimization的問題呢?

今天我們發現我們找不到一個loss低的function,到底是因為我們的model的彈性不夠?

還是我們的model的彈性已經夠了,只是optimization gradient descent不給力?

怎麼判斷這件事呢?

這邊一個建議判斷的方法,就是你可以透過比較不同的模型來得知你的model現在到底夠不夠大。

我們這邊舉一個例子,這一個實驗是從residual network那篇paper裡面節錄出來的。

這篇paper一開頭就跟你講一個故事,它說我想測2個networks,一個network有20層,一個network有56層。

我們把它們測試在測試資料上,這個橫軸指的是training的過程就是你參數update的過程。

隨著參數的update,當然你的loss會越來越低,但是結果20層的loss比較低,56層的loss還比較高。

這個residual network是比較早期的paper,2015年的paper。

所以那個時候大家對Deep Learning了解還沒有那麼的透徹。

所以看到這個實驗有人就會說最深沒有比較好,所以這個叫做overfitting。

但是這個是overfitting嗎?

這個不是overfitting,等一下會告訴你overfitting是什麼。

並不是所有的結果不好,都叫做overfitting。

你檢查訓練資料的結果發現說,現在20層的network跟56層的network比起來。

在訓練資料上,20層的network loss其實是比較低的,56層的network loss是比較高的。

這代表56層的network,它的optimization沒有做好。

你可能會問,你怎麼知道是56層的optimization不給力,搞不好是model bias;

搞不好是56層的network的model彈性還不夠大,它要156層才好。

56層也許彈性還不夠大,但是你比較56層跟20層,20層的loss都已經可以做到這樣了,56層的彈性一定比20層更大。

如果今天56層的network要做到20層的network可以做到的事情,對它來說是輕而易舉的。

它只要前20層的參數,跟這個20層的network一樣,剩下36層就什麼事都不做。

identity copy前一層的輸出就好了,56層的network一定可以做到20層的network可以做到的事情。

所以沒有道理20層的network可以做到的事情56層的network做不到,所以56層的network如果你optimization成功的話,它應該要比20層的network可以得到更低的loss。

56層network彈性是夠的問題是optimization做得不夠好。

你怎麼知道你的optimization有沒有做好呢?

判斷 optimization

這邊給大家的建議是看到一個你從來沒有做過的問題,可以先跑一些比較小的、比較淺的network。

或甚至用一些不是deep learning的方法,比如說 linear model、比如說support vector machine。

它們可能是比較容易做Optimize的,比較不會有optimization失敗的問題。

也就是這些model它會竭盡全力的在它們的能力範圍之內,找出一組最好的參數。

它們比較不會有失敗的問題,所以你可以先train一些比較淺的model,或者是一些比較簡單的model。

先有個概念說這些簡單的model,到底可以得到什麼樣的loss。

接下來還缺一個深的model。

optimization 有問題判斷

如果你發現你深的model,跟淺的model比起來,深的model明明彈性比較大,但loss卻沒有辦法比淺的model壓得更低,那就代表說你的optimization有問題。

你的gradient descent不給力,你要有一些其它的方法來把optimization這件事情做得更好。

舉例來說,我們上次看到的這個,觀看人數預測的例子。

我們說在訓練資料上面2017年到2020年的資料是訓練資料,一層的network,它的loss是0.28k,2層就降到0.18k,3層就降到0.14k,4層就降到0.10k,但是 我測5層的時候結果變成0.34k。

這是什麼問題,我們現在loss很大,這是什麼問題,這是model bias的問題嗎?

顯然不是,因為4層都可以做到0.10k了,5層應該可以做得更低,這個是optimization的problem。

這個是optimization的時候做得不好,才造成這樣子的問題。

如果model bias 那就把model變大。

如果是optimization失敗了,那就看等一下的課程怎麼解這個問題。

那接下來你就可以來看 testing data loss,看testing data loss做得怎麼樣。

如果testing data loss也小,有比這個strong baseline還要小就結束了。

好 那但是如果你覺得還不夠小呢

如果training data上面的loss小,testing data上的loss大,那你可能就是真的遇到overfitting的問題。

你要把training data loss記下來,先確定說你的optimization沒有問題,你的model夠大了。

然後接下來,才看看是不是testing的問題。

如果是training的loss小,testing的loss大,這個有可能是overfitting。

為什麼會有overfitting這樣的狀況呢?

為什麼有可能training的loss小,testing的loss大呢?

這是我們的訓練資料。

假設根據這些訓練資料,某一個很廢的machine learning的方法,它找出了一個一無是處的function。

如果今天x當做輸入的時候,我們就去比對這個x有沒有出現在訓練資料裡面。

如果x有出現在訓練資料裡面,就把它對應的ŷ當做輸出。

如果x沒有出現在訓練資料裡面,就輸出一個隨機的值。

那你可以想像說,這個function啥事也沒有幹,它是一個一無是處的function。

但雖然它是一個一無是處的function,它在training的data上,它的loss可是0。

你把training的data通通丟進這個function裡面,它的輸出跟你的訓練資料的level是一模一樣的。

所以在training data上面,這個一無是處的function的loss是0。

可是在testing data上面,它的loss會變得很大,因為它其實什麼都沒有選。

這是一個比較極端的例子。

在一般的狀況下,也有可能發生類似的事情。

舉例來說,假設我們輸入的feature叫做x,我們輸出的level叫做y。

那x跟y都是一維的。x跟y之間的關係是這個二次的曲線。

這個曲線我們刻意用虛線來表示,因為我們通常沒有辦法直接觀察到這條曲線。

我們真正可以觀察到的是我們的訓練資料。

你可以把訓練資料想像成從這條曲線上面隨機sample出來的幾個點。

今天的模型,他的能力非常的強,flexibility很大,如果你只給它這三個點,它會知道說在這三個點上面我們要讓loss低。

所以今天你的model,它的這個曲線會通過這三個點。

但是其它,沒有訓練資料做為限制的地方,它就會有freestyle。

因為它的這個flexibility很大,所以你的model可以變成各式各樣的function。

你沒有給它資料做為訓練,它就會產生各式各樣奇怪的結果。

這個時候果你再丟進你的testing data,你的testing data 和training的data,當然不會一模一樣。

它們可能是從同一個distribution sample出來的。

testing data是橙色的這些點,訓練data是藍色的這些點。

用藍色的這些點,找出一個function以後,你測試在橘色的這些點上,效果不一定會好。

如果你的model的自由度很大的話,它可以產生非常奇怪的曲線,導致訓練資料上的結果好,但是測試資料上的loss很大。

那怎麼解決剛才那個overfitting的問題呢

有兩個可能的方向,第一個方向是也許是最有效的方向,是增加你的訓練資料。

所以今天假設你自己想要做一個application,你發現有overfitting的問題。

其實我覺得最簡單解決overfitting的方法,就是增加你的訓練資料。

所以今天如果訓練資料藍色的點變多了,那雖然你的model它的彈性可能很大。

但是因為你這邊的點非常非常的多,它就可以限制住。

它看起來的形狀還是會很像產生這些資料背後的二次曲線。

但是你在作業裡面你是不能夠使用這一招的,因為我們並不希望大家浪費時間來蒐集資料,這個不是機器學習技術最核心的部分。

我們希望大家多focus在機器學習核心的技術上,而不是花太多力氣去網路上蒐集資料。

解法一data augmentation

Data augmentation就是你用一些你對於這個問題的理解,自己創造出新的資料。

Data augmentation: 

1. 圖片左右翻轉
2. 圖片放大

舉例來說在做影像辨識的時候,常做的一個招式是假設你的訓練資料裡面有某一張圖片,把它左右翻轉,或者是把它其中一塊截出來放大等等。

你做左右翻轉,資料就變成兩倍,那這個就是data augmentation。

這個data augmentation要做得有道理。

舉例來說在影像辨識裡面,你就很少看到有人把影像上下顛倒,當作augmentation。

那如果你給機器看這種奇怪的影像的話,它可能就會學到奇怪的東西。

所以data augmentation要根據你對資料的特性,對你現在要處理的問題的理解,來選擇合適的data augmentation的方式。

解法二: 給 model 一些限制

另外一個解法就是不要讓你的模型有那麼大的彈性,給它一些限制。

舉例來說 假設我們直接限制說,現在我們的model一定是一條二次曲線。

我們somehow知道說x跟y背後的關係,其實就是一條二次曲線。

只是我們不明確的知道這二次曲線,裡面的每一個參數長什麼樣。

那你怎麼會知道說,要用多constrain的model才會好呢?

那這就取決於你對這個問題的理解,因為這種model是你自己設計的。

到底model要多constrain多flexible,結果才會好,那這個要問你自己。

那要看這個設計出不同的模型,你就會得出不同的結果。

那現在假設我們已經知道說,模型就是二次曲線,那你就會給你你就會在選擇function的時候,有很大的限制。

因為二次曲線來來去去就是那幾個形狀而已。

所以當我們的訓練資料有限的時候,因為我們來來去去能夠選那幾個function。

所以你可能雖然說只給了三個點,但是因為我們能選擇的function有限。

你可能就會正好選到跟真正的distribution比較接近的function,然後在測試資料上得到比較好的結果。

最好你的model正好跟背後產生資料的過程,你的process是一樣的,那你可能就有機會得到好的結果。

有哪些方法可以給model製造限制呢?

舉例來說,給它比較少的參數,如果是deep learning的話,就給它比較少的神經元的數目。

本來每層一千個神經元改成一百個神經元之類的。

或者是你可以讓model共用參數,你可以讓一些參數有一樣的數值,那這個部分如果你沒有很清楚的話也沒有關係。

就是我們之前講的network的架構叫做fully-connected network。

那fully-connected network,其實是一個比較有彈性的架構。

CNN是一個比較有限制的架構,它厲害的地方就是它是針對影像的特性,來限制模型的彈性。

所以fully-connected的network可以找出來的function所形成的集合,其實是比較大的。

CNN這個model所找出來的function,它形成的集合其實是比較小的,其實包含在fully-connected的network裡面的。

但是就是因為CNN給了比較大的限制,所以CNN在影像上反而會做得比較好。

還有哪些其它的方法呢?

方法 feature

一個就是用比較少的features,

還有一個方法叫做Early stopping、Regularization跟Dropout,都是之後課程還會講到的東西。

那這三件事情在作業一的程式裡面。

這個Early stopping其實是有的,那Dropout是另外一個在Deep Learning裡面常用來限制模型的方法,那這個之後還會再提到。

但是我們也不要給太多的限制,為什麼不能給模型太多的限制呢?

假設我們現在給模型更大的限制,我們假設我們的模型一定是Linear的Model,一定是寫成y=a+bx。

那你的model它能夠產生的function,就一定是一條直線。

今天給三個點,沒有任何一條直線可以同時通過這三個點,但是你只能找到一條直線。

這條直線跟這些點比起來,它們的距離是比較近的,但是你沒有辦法找到任何一條直線同時通過這三個點。

這個時候你的模型的限制就太大了,在測試資料上就不會得到好的結果。

但是,這個是overfitting嗎?

這個不是overfitting,因為你又回到了model bias的問題。

所以你現在這樣在這個情況下,這個投影片的case上面你結果不好,並不是因為overfitting了,而是因為你給你模型太大的限制,大到你有了model bias的問題。

今天你讓你的模型的複雜的程度,或這樣讓你的模型的彈性越來越大。

什麼叫做彈性?

那今天我們先用直觀的來了解。

什麼叫做複雜的程度?

所謂比較複雜就是它可以包含的function比較多、它的參數比較多,這個就是一個比較複雜的model。

複雜的程度:
可以包含的function比較多、參數比較多

比較複雜的model,如果你看它的training的loss。

你會發現說,隨著model越來越複雜,Training的loss可以越來越低,但是testing的時候,當model複雜 越來越複雜的時候。

剛開始,你的testing的loss會跟著下降。

但是當複雜的程度,超過某一個程度以後,Testing的loss就會突然暴增了。

那這就是因為說,當你的model複雜到某一個程度,overfitting的狀況就會出現,所以你在training的loss上面,可以得到比較好的結果,那在Testing的loss上面會得到比較大的loss。

那我們當然期待說,我們可以選一個中庸的模型,不是太複雜的,也不是太簡單的,剛剛好可以在訓練資料上給我們最好的結果,給我們最低的loss,給我們最低的testing loss。

怎麼選出這樣的model呢?

假設我們有三個模型,它們的複雜的程度不太一樣,我不知道要選哪一個模型才會在測試資料上得到最好的結果。

因為你選太複雜的就overfitting,選太簡單的有model bias的問題,那怎麼選一個不偏不倚的。

把這三個模型的結果都跑出來,然後上傳到kaggle上面,你及時的知道了你的分數,看看哪個分數最低,那個模型顯然就是最好的模型,但是並不建議你這麼做。

為什麼不建議你這麼做呢?

我們再舉一個極端的例子,我們再把剛才那個極端的例子拿出來。

假設現在有一群model,這一群model不知道為什麼都非常廢,它們每一個model產生出來的都是一無是處的function。

我們有一到這個零有多少個,假設有一兆好了。

我們有一到一兆個model,不知道為什麼learn出來的function都是一無是處的function。

它們會做的事情就是訓練資料裡面有的資料就把它記下來,訓練資料沒看過的就直接output隨機的結果。

那你現在有一兆個模型,那你再把這一兆個模型的結果,通通上傳到kaggle上面,你就得到一兆個分數。

然後這一兆的分數裡面,哪一個結果最好,你就覺得那個模型是最好的。

雖然每一個模型它們在這個Testing data上面這個testing data它都沒有看過,所以它輸出的結果都是隨機的。

但雖然在testing data上面,輸出的結果都是隨機的,但是你不斷的隨機,你總是會找到一個好的結果對不對。

所以也許編號五六七八九的那個模型,它找出來的function正好在testing data上面就給你一個好的結果。

那你就會很高興覺得說,這個model編號五六七八九是個好model,但它其實是隨機的,但你不知道。

但這個好function在這個testing data上面給我們好的結果。

因為這個model畢竟是隨機的,它恰好在public的testing set data上面得到一個好結果,但是它在private的testing set上可能仍然是隨機的。

我們這個testing set分成public的set跟private的set。

你在看分數的時候 你只看得到public的分數 private的分數,要deadline以後才知道。

所以假設你今天在選model的時候,你都用public的。

但假設你在挑模型的時候,你完全看你在public set上面的也就leaderboard上的分數來選擇你的模型的話。

你可能就會這個樣子,你在public的leaderboard上面排前十,但是deadline一結束你就心態就崩了這樣,你就掉到三百名之外。

而且我們這修課的人這麼多,你搞不好會掉到一千名之外也說不定。

因為今年我們會看public就是說我們在算分數的時候,你在public上面的結果好還是會給你一點分數,我們不是只看private的分數而已,是public跟private的分數都看。

為什麼不能就通通都分public呢?

為什麼要不能讓自己知道private上的結果是什麼?

你自己想想看假設所有的data都是public,那我剛才說就算是一個一無是處的Model得到了一無是處的function。

它也有可能在public的data上面,得到好的結果。

如果我們今天只有public的testing set,沒有private的testing set。

那你就回去寫一個程式,不斷random產生輸出就好。

所以我們不能去看public Testing Set的結果嗎?

然後不斷把random的輸出,上傳到kaggle,然後看你什麼時候,可以random出一個好的結果,那這個作業就結束了。

這個顯然沒有意義,顯然不是我們要的。

你知道因為今天如果,public的testing data是公開的。

你可以知道public的testing data的結果,那你就算是一個很廢的模型,產生了很廢的function,也可能得到非常好的結果。

那這就應證了說為什麼在機器學習的領域,在那些benchmark的corpora上面往往機器可以得到異於尋常的好的結果,往往都超越人類。

所謂benchmark corpora的意思就是,有一些data set是公開的。

用來訓練語音辨識的資料集。

所有人都共用一模一樣的testing set,那我們就可以比較不同模型的好壞。

但是問題是這些testing set的結果都是public的。

所以就算是一個很廢的模型,它只能產生很廢的function。

只要做得夠多,你還是可以在public的set上得到好的結果。

那這就解釋為什麼說這些benchmark corpora最終往往機器可以得到超乎人類的結果。

那這個最有名的例子就是這個。

大家記得16年的時候Microsoft跟那個IBM都不約而同的說,它們的machine在語音辨識上面得到超越人類的結果、專業的聽打員做的這個語音辨識的錯誤率還要低。

其實就是做在benchmark的corpora上面,做在一個叫做switchboard benchmark corpora上面

得到一個非常好的超越人類的結果。

在現實生活中 它真的有超越人類嗎?

我想你不會相信對不對

就算你不是做語音辨識的研究人員,你光是有用過

每個手機拿出來都有語音辨識,你其實不會相信說機器在語音辨識的能力已經超越人類。

所以這個就是在那些benchmark corpora上,Benchmark corpora的testing set就是public的testing set。

但是你真的訓練出一個語音辨識系統上線給人用的時候,那這個是private的testing set。

你有可能在public的testing set上面,得到什麼超越人類的結果,但並不代表它在private的testing set上一定是好的。

在那些benchmark corpora上面,今天機器都說超越人類的語音辨識的正確率了,並不代表在日常生活中它的語音辨識的正確率超越了人類。

所以你知道說那些說在benchmark corpora得到什麼超越人類的結果其實不是真的。

不過我覺得說有benchmark corpora所做出結果來,還算是 已經是很有品了。

我聽過更沒有品的是怎樣呢?

就是有一個不知道哪來的新創,去接了一個政府的計劃。

然後說要做語音辨識,然後就拿那個data set,KPI就訂說,我們這個要做到90%以上的正確率,然後做完 沒有得到90%,怎麼做都做不到90%。

人家要來驗收了怎麼辦呢?

它們就說 跟驗收的人說,你這個testing set不好,裡面雜訊很多,我幫你把它清乾淨這樣。

我把有雜訊的那個句子拿掉這樣,然後KPI就達到了正確率就90%以上,就起飛了 就過了那個KPI了。

就是有人會,有怪怪的新創會拿出拿出它自己的語音辨識系統app給你看,說跟google辨識出來的結果都一樣好。

為什麼呢?

就是因為它偷copy了google的API這樣子。

所以有各種各樣奇奇怪怪的東西,網路上奇奇怪怪的吹捧。

大家有時候看看就好。

好 所以講了這麼多,只是想要告訴大家說,我們為什麼要切public的testing set,我為什麼要切private的testing set。

然後你其實不要用你public的testing set去調你的模型,因為你可能會在private的testing set上面得到很差的結果。

那不過因為今年你在public set上面的好的結果也有算分數。

所以怎麼辦呢?

為了避免你 就你可能會說,好 那我放棄private set的結果,就只拿public set的結果,然後不斷地產生隨機的結果去上傳到Kaggle來。

然後看看說能不能夠正好隨機出一個好的結果。

為了避免你浪費時間做這件事情,所以有每日上傳的限制,你沒辦法拿很廢的模型只產生隨機的結果,不斷的測試public的testing的score。

那到底要怎麼做才選擇model,才是比較合理的呢?

那界定的方法是這個樣子的,你要把Training的資料分成兩半,一部分叫作Training Set,一部分是Validation Set。

有90%的資料放在Training Set裡面,有10%的資料會被拿來做Validation Set。

你在Training Set上訓練出來的模型,你在Validation Set上面去衡量它們的分數。

你根據Validation Set上面的分數去挑選結果,再把這個結果上傳到Kaggle上面,去看看你得到的public的分數。

那因為你在挑分數的時候是用Validation Set來挑你的model,所以你的public的Testing Set的分數就可以反應你的private Testing Set的分數。

就比較不會得到說在public上面結果很好,但是在private上面結果很差。

其實你看到public的結果以後,你就會去想要調它,你看到你現在弄了一堆模型然後用Validation Set檢查一下。

找了一個模型放到public set上以後發現結果不好,你其實不太可能不根據這一個結果去調整你的模型。

但是假設這一個route做太多次,你根據你的public Testing Set上的結果去調整你的model太多次。

你就又有可能fit在你的public Testing Set上面,然後在private Testing Set上面得到差的結果。

不過還好反正我們有限制上傳的次數,所以這個route你也沒有辦法走太多次,可以避免你太過fit在public的Testing Set上面的結果。

好 那我知道說今天因為public的Testing Set上面的結果是大家都可以看到的,然後很多人都會

根據過去的經驗,就在public leaderboard上排前幾名的,往往private很容易就慘掉這樣子。

所以在public的Testing上面得到太好的結果,也不用高興得太早。

其實,最好的做法,就是用Validation loss最小的直接挑就好了,就是你不要去管你的public Testing Set的結果。

那我知道說在實作上,你不太可能這麼做因為public set的結果你有看到,所以它對你的模型的選擇可能還是會有些影響的。

但是你要越少去看那個public Testing Set的結果越好。

理想上你就用Validation Set挑就好,然後上傳以後 怎樣就是怎樣,有過那個strong basseline以後,就不要再去動它了,那這樣子就可以避免你overfit在Testing Set上面。

那但是這邊會有一個問題就是怎麼分Training Set跟Validation Set呢?

那如果在助教程式裡面就是隨機分的,但是你可能會說搞不好我這個分 分得不好啊。

搞不好我分到很奇怪的Validation Set,會導致我的結果很差。

如果你有這個擔心的話,那你可以用N-fold Cross Validation,就是你先把你的訓練資料切成N等份。

在這個例子裡面我們切成三等份,切完以後,你拿其中一份當作Validation Set,另外兩份當Training Set。

然後這件事情你要重複三次。

也就是說,你先第一份第二份當Train,第三份當Validation。

然後第一份第三份當Train,第二份當Validation。

第一份當Validation,第二份第三份當Train。

然後接下來 你有三個模型,你不知道哪一個是好的,你就把這三個模型,在這三個setting下,在這三個Training跟Validation的data set上面通通跑過一次,然後把這三個模型。

在這三種狀況的結果都平均起來,把每一個模型在這三種狀況的結果都平均起來,再看看誰的結果最好。

那假設現在model 1的結果最好,你用這三個fold得出來的結果是這個model 1最好,然後你再把model 1用在全部的Training Set上,然後訓練出來的模型再用在Testing Set上面。

那這個是N-fold Cross Validation。

好 那這個就是這門課前期的攻略,它可以帶你打贏前期所有的副本。

那接下來也許你要問的一個問題是,上週結束的時候,不是講到預測2/26,也就是上週五的觀看人數嗎,到底結果做得怎麼樣。

好 那這個就是我們要做的結果,上週比較多人選了三層的network,所以我們就把三層的network,拿來測試一下。

以下是測試的結果,我們就沒有再調參數了。

這個圖上 這個橫軸就是從,2021年的1月1號開始 一直往下,然後紅色的線是真實的數字,藍色的線是預測的結果。

2/26在這邊 這個是今年2021年,觀看人數最高的一天了。

那機器的預測怎樣呢?

差距非常的大,差距有2.58k這麼多。

感謝大家,為了讓這個模型不準,上週五花了很多力氣去點了這個video。

所以這一天是今年觀看人數最多的一天,那你可能開始想說,那別的模型怎麼樣呢?

其實我也跑了一層二層跟四層的看看,所有的模型 都會慘掉,兩層跟三層的錯誤率都是2點多k,其實四層跟一層比較好,都是1.8k左右。

但是這四個模型不約而同的覺得2/26應該是個低點,但實際上2/26是一個公值。

那模型其實會覺得它是一個低點,也不能怪它。

因為根據過去的資料,禮拜五就是沒有人要學機器學習,禮拜五晚上大家都出去玩了對不對,禮拜五的觀看人數是最少了。

但是2/26出現了反常的狀況,這個就不能怪模型了。

那我覺得出現這種狀況,應該算是另外一種錯誤的形式,這種錯誤的形式我們這邊叫作mismatch。

那也有人會說mismatch也算是一種Overfitting。

這樣也可以這都只是名詞定義的問題。

那我這邊想要表達的事情是mismatch它的原因跟overfitting,其實不一樣。

一般的overfitting你可以用搜集更多的資料來克服。

但是mismatch意思是說你今天的訓練資料跟測試資料它們的分佈是不一樣的。

在訓練資料跟測試資料分佈是不一樣的時候,你訓練資料再增加其實也沒有幫助了。

那其實在多數的作業裡面我們不會遇到這種mismatch的問題,我們都有把題目設計好了,所以資料跟測試資料它的分佈差不多。舉例來說 以剛才作業一的Covid19為例的話。

假設我們今天資料在分訓練資料跟測試資料的時候,我們說2020年的資料是訓練資料,2021年的資料是測試資料。

那mismatch的問題可能就很嚴重了。

這個我們其實有試過了 試了一下,如果今天用2020年當訓練資料,2021年當測試資料。

你就怎麼做都是慘了 就做不起來,訓練什麼模型都會慘掉。

因為2020年的資料跟2021年的資料,它們的背後的分佈其實都是不一樣,所以你拿2020年的資料來訓練在2021年的作業一的資料上,你根本就預測不準。

所以後來助教是用了別的方式,來分割訓練資料跟測試資料。

所以我們多數的作業都不會有這種mismatch的問題,那除了作業十一。

因為作業十一就是針對mismatch的問題來設計的,作業十一也是一個影像分類的問題。

這是它的訓練資料,看起來蠻正常的。

但它測試資料就是長這樣子了,所以你知道這個時候,這個時候增加資料哪有什麼用呢?

增加資料你也沒有辦法讓你的模型做得更好,所以這種問題要怎麼解決。

那待作業十一的時候再講。

好 那你可能會問說 我怎麼知道現在到底是不是mismatch呢?

那就要看你對這個資料本身的理解了,你可能要對你的訓練資料跟測試資料的產生方式有一些理解,你才能判斷說,它是不是遇到了mismatch的狀況。

Leave a Comment

Your email address will not be published. Required fields are marked *