back to index
【機器學習2021】機器學習任務攻略

link |
接下來要告訴你每一個作業通關的大戰略、通關的攻略長什麼樣子。
link |
那我們已經看了作業一了,那其實之後好幾個作業,它看起來的樣子基本上都是大同小異。
link |
就是你會有一堆訓練的資料,那這些訓練資料裡面呢,會包含了X跟Y的片。
link |
你會有X1跟它對應的Y1,X2跟它對應的Y2,Xn還有它對應的Yn。
link |
然後測試資料呢,測試資料就是你只有X,沒有Y。
link |
那剛才大家已經看了作業一了,其實在之後每幾個作業看起來都是非常類似的格式。
link |
比如說作業二,其實是做語音辨識,那我們的X呢,就是非常小的一段聲音訊號。
link |
那其實這個不是真正的完整的語音辨識系統啦,它是語音辨識系統的一個閹割版,那個X是一小段訊號。
link |
那Y呢,是要去預測,是要去判斷說這一小段聲音訊號呢,它對應到哪一個風鈴。
link |
那你知道風鈴是什麼沒有關係,你就把它想成是KK音標就可以了。
link |
那作業三呢,是要做影像辨識,那這個時候我們的X呢,是一張圖片。
link |
那Y呢,是機器要判斷說這張圖片裡面有什麼樣的東西。
link |
那作業四呢,是語者辨識,那語者辨識是要做什麼事情呢?
link |
語者辨識要做的事情是,這個X呢,也是一段聲音訊號。
link |
那Y呢,現在不是風鈴,Y呢,是現在是哪一個人在說話。
link |
那你可以想像說這樣的系統現在其實非常的有用,如果你打電話去銀行的客服,那現在都有自動的語者辨識系統,
link |
那會聽說現在打電話進來的人是不是客戶本人,那就少了客服人員問你身分驗證的時間。
link |
那作業五呢,是做Machine Translation,是做機器翻譯。
link |
那X呢,就是某一個語言,比如說,這是我文藝會的一句日文,
link |
Itamiro Shiden,它的Y呢,就是另外一句話。
link |
現在你在留言區裡面就可以洗一些諸葛春夫之類的。
link |
那訓練資料呢,拿來做什麼呢?訓練資料就是要拿來訓練我們的Model。
link |
那訓練Model的過程,上週已經講過了,訓練的過程就是三個步驟。
link |
第一個步驟,你要先寫出一個有未知數的Function。
link |
那這個未知數呢,以後我們都用Theta來代表一個Model裡面所有的未知參數。
link |
所以Ftheta的意思就是說,我現在有一個Function叫F of X,
link |
但它裡面有一些未知的參數,這些未知的參數表示成Theta,
link |
那它的Input呢,叫做X,這個Input呢,叫做Feature。
link |
那接下來呢,你要定一個東西叫做Loss,Loss是一個Function,
link |
這個Loss的輸入呢,就是一組參數,然後去判斷說這一組參數是好還是不好。
link |
那接下來你要解一個Optimization Problem,你要去找一個Theta,
link |
那這個Theta呢,可以讓Loss的值越小越好。
link |
那可以讓Loss的值最小的那個Theta,我們就寫做Theta star。
link |
那有了Theta star以後,那你就把它拿來用在測試資料上,
link |
也就是你把Theta star代入這些未知的參數。
link |
再來,F Theta of X裡面有一些未知的參數,現在這個Theta呢,用Theta star來取代。
link |
那它的輸入呢,就是你現在的測試資料,那輸出的結果,
link |
你就把它存起來,然後上傳到Cargo,就結束了。
link |
但接下來你就會遇到一個問題,那直接執行註調的Sample Code,
link |
往往只能夠給你過Simple Baseline的結果而已。
link |
如果你想要做得更好,那應該要怎麼辦呢?
link |
開局就送,可以幫助你打贏前期所有的副本。
link |
第一個是,你今天如果你覺得你在Cargo上的結果不滿意的話,
link |
檢查你的Trending Data的Loss。
link |
有的人說,我在意的不是應該是Testing Data的Loss嗎?
link |
因為Cargo上面的結果呈現的是Testing Data的結果啊。
link |
但是,你要先檢查你的Trending Data,
link |
看看你的Model在Trending Data上面有沒有學起來,再去看Testing的結果。
link |
所以你要先檢查一下Trending Data的Loss。
link |
如果你發現你的Trending Data的Loss很大,
link |
在訓練資料上面沒有學好是什麼樣的原因。
link |
所謂Model Bias的意思是說,假設你的Model太過簡單。
link |
舉例來說,我們現在寫了一個有未知Parameter的Function。
link |
那這個未知的Parameter,我們可以帶各種不同的數字。
link |
你在SetR1得到一個Function,我們把那個Function用這個點來表示。
link |
在SetR2得到另外一個Function,
link |
你把所有的Function集合起來,得到一個Function的Set。
link |
但是這個Function的Set它太小了。
link |
這個Function的Set裡面沒有包含任何一個Function,
link |
可以讓Loss變低的Function,
link |
不在你的Model可以描述的範圍內。
link |
你的Model裡面有未知的參數、未知的參數,
link |
可以在任何的數值,把這些數值帶進去以後,
link |
你得到了一個Function的Set。
link |
採用不同的數值,得到不同的Function,
link |
把所有的Function集合起來,你得到一個Function的Set。
link |
這個Set裡面沒有任何一個Function,
link |
那在這個情況下,就算你找出了一個SetR star,
link |
它是這些藍色的Function裡面最好的那一個,
link |
它是藍色的Function裡面可以讓Loss最低的那一個,
link |
這些都是魯蛇,它只是魯蛇裡面的霸主,
link |
就還是一個魯蛇,那個Loss還是不夠低。
link |
你想要在大海裡面撈針,這個針指的是一個Loss低的Function,
link |
因為針根本就不在你的Function Set裡面,
link |
舉例來說,你可以增加你輸入的feature,
link |
我們上週說,本來我們輸入的feature只有前一天的資訊,
link |
假設我們要預測接下來的觀看人數的話,
link |
那你也可以用Deep Learning增加更多的彈性。
link |
所以如果你覺得你的Model的彈性不夠大,
link |
可以用Deep Learning來增加Model的彈性。
link |
但是並不是Training的時候Lockdown,
link |
這個問題是Optimization做得不好。
link |
我們知道說,我們今天用的Optimization,
link |
我們其實都只會用到Gradient Descent這種Optimization的方法。
link |
那這種Optimization的方法有很多的問題。
link |
你可能會卡在Local Minima的地方,
link |
你沒有辦法找到一個真的可以讓Loss很低的參數。
link |
把所有的Function統統集合在一起,
link |
這個藍色的Set裡面確實包含了一些Function,
link |
這些Function它的Loss是低的,
link |
但問題是Gradient Descent這一個演算法,
link |
沒辦法幫我們找出這個Loss低的Function。
link |
Gradient Descent說,
link |
你要我幫你解Optimization的Problem,
link |
但這個Theta Start它給我們的Loss不夠低。
link |
這個Model裡面存在著某一個Function,
link |
但Gradient Descent沒有給我們這一個Function。
link |
我們今天看到Trending Data的Loss不夠低的時候,
link |
還是Optimization的問題呢?
link |
我們找不到一個Loss低的Function,
link |
到底是因為我們的Model的彈性不夠,
link |
還是說我們的Model彈性已經夠了,
link |
Gradient Descent不給力,
link |
來得知說你的Model現在到底夠不夠大。
link |
那這個實驗是從Residual Network那篇Paper裡面
link |
這篇Paper一開頭就跟你講了一個故事,
link |
它說我想Train兩個Network,
link |
那這個橫軸指的是Training的過程,
link |
那這個Residual Network是比較早期的Paper,
link |
所以那個時候大家對Deep Learning,
link |
大家對Deep Learning有各種奇怪的誤解。
link |
就告訴你Deep Learning不Work了,
link |
也不是每個人都覺得Deep Learning是好的,
link |
那個時候還有很多對Deep Learning的質疑,
link |
但是這個是Overfitting嗎?
link |
等一下會告訴你Overfitting是什麼,
link |
並不是所有的結果不好都叫做Overfitting。
link |
現在20層的Network跟56層的Network比起來,
link |
在訓練資料上,20層的Network的Loss其實是比較低的,
link |
50層的Network的Loss是比較高的。
link |
它的Optimization沒有做好,
link |
它的Optimization不給力。
link |
欸,你怎麼知道是56層的Optimization不給力,
link |
20層的Loss都已經可以做到這樣了,
link |
56層的彈性一定比20層更大,對不對?
link |
如果今天56層的Network要做到
link |
20層的Network可以做到的事情,
link |
它只要前20層的參數跟這個20層的Network一樣,
link |
Identity, Copy前一層的輸出就好。
link |
那56層的Network一定可以做到
link |
20層的Network可以做到的事情。
link |
所以20層的Network都已經可以走到這麼低的Loss了,
link |
56層的Network它比20層的Network的彈性還要更大啊,
link |
所以沒有道理20層的Network可以做到的事情
link |
如果你Optimization成功的話,
link |
它應該要比20層的Network可以得到更低的Loss,
link |
這個不是Overfitting,這個也不是Model Bias,
link |
因為56層的Network彈性是夠的,
link |
這個問題是你的Optimization不給力,
link |
Optimization做得不夠好。
link |
你怎麼知道你的Optimization有沒有做好呢?
link |
也許你可以先跑一些比較小的、比較淺的Network,
link |
或甚至用一些不是Deep Learning的方法,
link |
比如說Support Vector Machine。
link |
有一些方法,比如說Support Vector Machine,
link |
他們可能是比較容易做Optimize的,
link |
他們比較不會有Optimization失敗的問題,
link |
他們會竭盡全力的在他們的能力範圍之內,
link |
所以你可以先Train一些比較淺的Model,
link |
這些簡單的Model到底可以得到什麼樣的North。
link |
接下來才Train一個深的Model,
link |
如果你發現你深的Model跟淺的Model比起來,
link |
但North卻沒有辦法比淺的Model壓得更低,
link |
那就代表說你的Optimization有問題,
link |
你的Gradient Descent不給力,
link |
來把Optimization這件事情做得更好。
link |
舉例來說,我們上次看到的觀看人數預測的例子,
link |
一層的Network,它的North是0.28K,
link |
但是我測五層的時候,結果變成0.34K。
link |
顯然不是,因為四層都可以做到0.10K了,
link |
這個是Optimization的Problem,
link |
這個是Optimization的時候做得不好,
link |
好,那如果Optimization做得不好的話,怎麼辦呢?
link |
現在如果你的Training的North大,
link |
到底是Model Bias,還是Optimization。
link |
如果Model Bias,那就把Model變大,
link |
如果是Optimization失敗了,
link |
你已經可以讓你的Training Data的North變小了,
link |
那接下來,你就可以來看Testing Data的North,
link |
看Testing Data的North做得怎麼樣。
link |
那如果Testing Data的North也小,
link |
比如比這個Strong Baseline還要小,
link |
那就結束了,沒什麼好做的,就結束了,好嗎?
link |
如果Training Data上面的North小,
link |
Testing Data上的North大,
link |
那你可能就是真的遇到Overfitting的問題。
link |
那你要注意,是Training的North小,
link |
Testing的North大,才叫做Overfitting。
link |
在Testing上的結果不好,就說這個是Overfitting。
link |
你的Training Data上的North到底做得怎麼樣?
link |
要看Training Data的North嗎?
link |
我沒有把Training Data的North記下來耶。
link |
你要把Training Data的North記下來,
link |
先確定說你的Optimization沒有問題,
link |
然後接下來才看看是不是Testing的問題。
link |
好,那如果是Training的North小,
link |
這個有可能是Overfitting。
link |
那為什麼會有Overfitting這樣的狀況呢?
link |
為什麼有可能Training的North小,
link |
某一個很廢的Machine Learning的方法,
link |
他找出了一個一無是處的Function。
link |
這個一無是處的Function是什麼樣的Function呢?
link |
我們就去比對這個X有沒有出現在訓練資料裡面。
link |
如果X沒有出現在訓練資料裡面,那怎麼辦?
link |
你可以想像說這個Function啥事也沒有幹,
link |
它是一個一無是處的Function。
link |
但雖然它是一個一無是處的Function,
link |
你把Training的Data通通丟進這個Function裡面,
link |
它的輸出跟你的訓練資料的Label是一模一樣的。
link |
所以在Training的Data上面,
link |
只是在Testing的Data上面,
link |
假設我們輸入的Feature叫做X,輸出的Label叫做Y。
link |
因為我們通常沒有辦法直接觀察到這條曲線。
link |
我們真正可以觀察到的是我們的訓練資料。
link |
就是從這條曲線上面隨機Sample出來的幾個點。
link |
但是其它沒有訓練資料作為限制的地方,
link |
因為它的Flexibility很大,
link |
所以你的Model可以變成各式各樣的Function。
link |
它就有Free Style可以產生各式各樣奇怪的結果。
link |
如果你在丟進你的Testing Data,
link |
那Testing Data跟Training Data當然不會一模一樣。
link |
是從同一個Distribution Sample出來的,
link |
Testing Data是橙色的這些點,
link |
Training Data是藍色的這些點,
link |
用藍色的這些點找出一個Function以後,
link |
好,那我們今天就是講一下它的概念就好。
link |
那怎麼解決剛才那個Overfitting的問題呢?
link |
要想要做一個Application,
link |
你發現有Overfitting的問題,
link |
其實我覺得最簡單解決Overfitting的方法就是,
link |
雖然很像是在產生這些資料背後的直曲線,
link |
那這個不是機器學習技術最核心的部分,
link |
我們希望大家多Focus在機器學習核心的技術上,
link |
你可以做Data Augmentation,
link |
Data Augmentation是什麼意思呢?
link |
Data Augmentation就是,
link |
那這個就是Data Augmentation。
link |
但是你要注意一下Data Augmentation,
link |
這個Data Augmentation,
link |
所以Data Augmentation,
link |
來選擇合適的Data Augmentation的方式。
link |
現在我們的Model一定是一條二次曲線,
link |
我們商號通靈出,知道說X跟Y背後的關係,
link |
這二次曲線裡面的每一個參數長什麼樣。
link |
要用多Constraint的Model才會好呢?
link |
到底Model要多Constraint,
link |
你就會在選擇Function的時候有很大的限制,
link |
因為我們來來去去只能夠選那幾個Function,
link |
但是因為我們能選擇的Function有限,
link |
你可能就會正好選到跟真正的Distribution
link |
背後產生資料的過程的Process是一樣的,
link |
有哪些方法可以給Model製造限制呢?
link |
如果是Deep Learning的話,
link |
就是我們之前講的Network架構,
link |
叫做Fully Connected Network。
link |
那Fully Connected Network,
link |
沒錯,他是一個比較沒有彈性的Model。
link |
所以今天Fully Connected Network,
link |
可以找出來的Function所形成的集合性是比較大的。
link |
CNN這個Model所找出來的Function,
link |
其實包含在Fully Connected Network裡面的。
link |
但是就是因為CNN給了比較大的限制,
link |
所以CNN在影像上反而會做得比較好。
link |
一個就是用比較少的feature啦。
link |
Regularization跟Dropout,
link |
這個Early Stopping其實是有的。
link |
反正你直接執行Sample Code裡面就有了。
link |
那你不知道什麼是Regularization,
link |
反正你可以過得了middle的baseline。
link |
Regularization是什麼,
link |
這是另外一個在Deep Learning裡面
link |
我們假設我們的模型一定是linear的model,
link |
它能夠產生的function就一定是一條直線。
link |
沒有任何一條直線可以同時通過這三個點,
link |
但是這個是overfitting嗎?
link |
因為你又回到了model bias的問題。
link |
並不是因為overfitting了,
link |
達到你有了model bias的問題。
link |
它可以包含的function比較多,
link |
如果你看它的training的notes,
link |
training的notes可以越來越低。
link |
剛開始你的testing的notes會跟著下降。
link |
但是,當複雜的程度超過某一個程度以後,
link |
testing的notes就會突然暴增了。
link |
overfitting的狀況就會出現。
link |
所以你在training的notes上面,
link |
但在testing的notes上面,
link |
給我們最低的testing loss。
link |
你很有可能沒有人告訴你要怎麼做的話,
link |
因為你選太複雜的,就overfitting,
link |
太簡單的,有model bias的問題,
link |
這一群model不知道為什麼都非常廢,
link |
不知道為什麼認出來的function,
link |
他們在這個testing data上,
link |
雖然在testing data上面,
link |
所以也許編號56789的那一個模型,
link |
正好在testing data上面,
link |
這個好model得到一個好function,
link |
在這個testing data上面,
link |
Python testing set上的結果。
link |
他恰好在public的testing data上面,
link |
他public的testing set上,
link |
但是他在private的testing set上,
link |
所以假設你今天在選model的時候,
link |
就是我們這個testing set,
link |
分成public的set跟private的set,
link |
你完全看你在public set上面的,
link |
也就是leaderboard上的分數,
link |
你在public的leaderboard上面,
link |
我們不是只看private的分數而已,
link |
是public跟private的分數看啦。
link |
過去有些學期是只看private的分數的時候,
link |
那為什麼我們要把testing的set,
link |
分成public跟private呢?
link |
為什麼我們不能就通通都分public就好呢?
link |
不知道自己private上的結果是什麼呢?
link |
假設所有的data都是public,
link |
它也有可能在public的data上面,
link |
如果我們今天只有public的testing set,
link |
沒有private的testing set,
link |
然後不斷把random的輸出上傳到kart頭,
link |
然後看你什麼時候可以random出一個好的結果,
link |
因為如果今天public的testing data是公開的,
link |
你可以知道public的testing data的結果,
link |
在那些benchmark的conference上面,
link |
所謂benchmark conference的意思就是,
link |
這個libri-speech是一個公開的,
link |
那如果你想要測試自己的語音辨識的模型,
link |
那就訓練在libri-speech上面,
link |
那libri-speech有testing set,
link |
所有人都共用一模一樣的testing set,
link |
這些testing set的結果都是public的。
link |
你還是可以在public的set上得到結果,
link |
這些benchmark conference最終,
link |
Microsoft跟IPM都不約而同的說,
link |
他們的machine在語音辨識上面,
link |
專業的聽打員做的語音辨識的錯誤率還要低。
link |
那個其實就是做在benchmark的conference上面啦。
link |
那個其實是做在一個叫做switch4的benchmark的conference上面。
link |
那在benchmark conference上面得到一個非常好的超越人類的結果,
link |
所以這個就是在那些benchmark conference上,
link |
benchmark conference的testing set,
link |
就是public的testing set。
link |
但是你真的訓練出一個語音辨識系統上線給人用的時候,
link |
那這個是private的testing set。
link |
你有可能在public的testing set上面得到什麼超越人類的結果,
link |
但並不代表它在private的testing set上一定是好的。
link |
在那些benchmark conference上面,
link |
機器都說超越人類的語音辨識的正確率了,
link |
那些說在benchmark conference上得到什麼超越人類的結果,
link |
那個都比較像是片片麻瓜的商業的辭令。
link |
有benchmark conference做出結果來,
link |
你這個testing set裡面雜訊很多,
link |
然後KPI就達到了正確率90%以上,
link |
跟Google辨識出來的結果都一樣好喔。
link |
就是因為他偷摳了Google的API這樣子。
link |
好,所以有各種各樣奇奇怪怪的東西啦,
link |
我們為什麼要切public的testing set,
link |
我們為什麼要切private的testing set,
link |
不要用你public的testing set去調你的模型,
link |
因為你可能會在private的testing set上面,
link |
你在public set上面的好的結果,
link |
好,那我放棄private set的結果,
link |
我就只拿public set的結果,
link |
然後看看說能不能夠正好隨機出一個好的結果。
link |
不斷的測試public的testing score。
link |
你要把training的資料分成兩半,
link |
一部分叫做training set,
link |
一部分是validation set。
link |
有90%的資料放在training set裡面,
link |
有10%的資料會被拿來做validation set。
link |
那你在training set上訓練出來的模型,
link |
你在validation set上面去衡量他們的分數,
link |
你根據validation set上面的分數,
link |
再把這個結果上傳到Cartel上面,
link |
是用validation set來挑你的model,
link |
所以你的public testing set的分數,
link |
就可以反映你的private testing set的分數,
link |
然後用validation set檢查一下,
link |
找了一個模型放到public set上以後,
link |
你根據你的public testing set上的結果,
link |
你就又有可能fit在你的public testing set上面,
link |
然後在private testing set上面得到差的結果。
link |
可以避免你太多fit在public testing set上面的結果。
link |
今天因為public testing set上面的結果,
link |
就在public leaderboard上排前幾名的,
link |
往往public是很容易剷掉這樣子,
link |
所以在public的testing上面得到太好的結果,
link |
就是用validation log最小的直接挑就好了,
link |
就是你不要去管你的public testing set的結果。
link |
因為public set的結果你有看到,
link |
所以他對你的模型的選擇可能還是有一些影響的,
link |
但是你要越少去看public testing set的結果越好。
link |
所以我們不能去看public testing set的結果嗎?
link |
你就用validation set挑就好,
link |
有過那個strong baseline以後就不要再去動它了,
link |
那這樣子可以避免你overfit在testing set上面。
link |
就是怎麼分training set跟validation set呢?
link |
那如果在助教程式裡面,就是隨機分的。
link |
搞不好我分到很奇怪的validation set啊,
link |
那你可以用N4的cross validation。
link |
那N4的cross validation是怎麼做的呢?
link |
你拿其中一份當作validation set,
link |
另外兩份當training set。
link |
你先第一份第二份當training,
link |
然後第一份第三份當training,
link |
這三個training跟validation的data set上面,
link |
那假設現在model 1的結果最好,
link |
用在全部的training set上,
link |
這個是M4的cross-validation。
link |
上週比較多人選了三層的network,
link |
這個是今年2021年觀看人數最高的一天啦。
link |
上週我花了很多力氣去點了這個video,
link |
所以這一天是今年觀看人數最多的一天。
link |
那你可能會想說,那別的模型怎麼樣呢?
link |
其實我也跑了一層、二層跟四層的看看啦,
link |
其實四層跟一層比較好,都是1.8K左右。
link |
我覺得出現這種狀況應該算是另外一種錯誤的形式,
link |
這種錯誤的形式我們這邊叫做Mismatch。
link |
也有人會說Mismatch也算是一種Overfitting,
link |
這樣也可以啦,這都只是名詞定義的問題。
link |
Mismatch它的原因跟Overfitting其實不一樣,
link |
一般的Overfitting你可以用收集更多的資料來克服,
link |
在訓練資料跟測試資料分佈是不一樣的時候,
link |
你訓練資料再增加,其實也沒有幫助了。
link |
我們不會遇到這種Mismatch的問題,
link |
舉例來說,以剛才作業一的COVID-19為例的話,
link |
假設我們今天資料在分訓練資料跟測試資料的時候,
link |
那Mismatch的問題可能就很嚴重了,
link |
試了一下,如果今天用2020年當訓練資料,
link |
2021年當測試資料,你就怎麼做都是慘的,
link |
因為2020年的資料跟2021年的資料,
link |
在2021年的作業一的資料上你根本就預測不準,
link |
所以後來助教是用了別的方式來分割訓練資料跟測試資料。
link |
所以我們多數的作業都不會有這種Mismatch的問題,
link |
那除了作業十一,因為作業十一就是針對Mismatch的問題來設計的,
link |
所以你知道這個時候增加資料哪有什麼用呢?
link |
增加資料你也沒有辦法讓你的模型做得更好,
link |
所以這種問題要怎麼解決,留待作業十一的時候再講。
link |
那你可能會問說,我怎麼知道現在到底是不是Mismatch呢?
link |
那我覺得要不知道是不是Mismatch,
link |
你可能要對你的訓練資料跟測試資料的產生方式有一些理解,
link |
才能判斷說他是不是遇到了Mismatch的狀況。
link |
那我們在這邊停下來,看看大家有沒有問題要問的。