back to index

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


link |
00:00.000
好,那我們就繼續來上課吧。
link |
00:06.000
那接下來的課程要講什麼樣的內容呢?
link |
00:10.000
接下來要告訴你每一個作業通關的大戰略、通關的攻略長什麼樣子。
link |
00:19.000
那我們已經看了作業一了,那其實之後好幾個作業,它看起來的樣子基本上都是大同小異。
link |
00:28.000
就是你會有一堆訓練的資料,那這些訓練資料裡面呢,會包含了X跟Y的片。
link |
00:37.000
你會有X1跟它對應的Y1,X2跟它對應的Y2,Xn還有它對應的Yn。
link |
00:44.000
然後測試資料呢,測試資料就是你只有X,沒有Y。
link |
00:49.000
那剛才大家已經看了作業一了,其實在之後每幾個作業看起來都是非常類似的格式。
link |
00:57.000
比如說作業二,其實是做語音辨識,那我們的X呢,就是非常小的一段聲音訊號。
link |
01:04.000
那其實這個不是真正的完整的語音辨識系統啦,它是語音辨識系統的一個閹割版,那個X是一小段訊號。
link |
01:12.000
那Y呢,是要去預測,是要去判斷說這一小段聲音訊號呢,它對應到哪一個風鈴。
link |
01:20.000
那你知道風鈴是什麼沒有關係,你就把它想成是KK音標就可以了。
link |
01:25.000
那作業三呢,是要做影像辨識,那這個時候我們的X呢,是一張圖片。
link |
01:32.000
那Y呢,是機器要判斷說這張圖片裡面有什麼樣的東西。
link |
01:38.000
那作業四呢,是語者辨識,那語者辨識是要做什麼事情呢?
link |
01:44.000
語者辨識要做的事情是,這個X呢,也是一段聲音訊號。
link |
01:49.000
那Y呢,現在不是風鈴,Y呢,是現在是哪一個人在說話。
link |
01:56.000
那你可以想像說這樣的系統現在其實非常的有用,如果你打電話去銀行的客服,那現在都有自動的語者辨識系統,
link |
02:04.000
那會聽說現在打電話進來的人是不是客戶本人,那就少了客服人員問你身分驗證的時間。
link |
02:14.000
那作業五呢,是做Machine Translation,是做機器翻譯。
link |
02:19.000
那X呢,就是某一個語言,比如說,這是我文藝會的一句日文,
link |
02:24.000
Itamiro Shiden,它的Y呢,就是另外一句話。
link |
02:31.000
現在你在留言區裡面就可以洗一些諸葛春夫之類的。
link |
02:38.000
那訓練資料呢,拿來做什麼呢?訓練資料就是要拿來訓練我們的Model。
link |
02:44.000
那訓練Model的過程,上週已經講過了,訓練的過程就是三個步驟。
link |
02:50.000
第一個步驟,你要先寫出一個有未知數的Function。
link |
02:56.000
那這個未知數呢,以後我們都用Theta來代表一個Model裡面所有的未知參數。
link |
03:04.000
所以Ftheta的意思就是說,我現在有一個Function叫F of X,
link |
03:10.000
但它裡面有一些未知的參數,這些未知的參數表示成Theta,
link |
03:14.000
那它的Input呢,叫做X,這個Input呢,叫做Feature。
link |
03:19.000
那接下來呢,你要定一個東西叫做Loss,Loss是一個Function,
link |
03:24.000
這個Loss的輸入呢,就是一組參數,然後去判斷說這一組參數是好還是不好。
link |
03:30.000
那接下來你要解一個Optimization Problem,你要去找一個Theta,
link |
03:34.000
那這個Theta呢,可以讓Loss的值越小越好。
link |
03:38.000
那可以讓Loss的值最小的那個Theta,我們就寫做Theta star。
link |
03:43.000
那有了Theta star以後,那你就把它拿來用在測試資料上,
link |
03:49.000
也就是你把Theta star代入這些未知的參數。
link |
03:54.000
再來,F Theta of X裡面有一些未知的參數,現在這個Theta呢,用Theta star來取代。
link |
04:01.000
那它的輸入呢,就是你現在的測試資料,那輸出的結果,
link |
04:06.000
你就把它存起來,然後上傳到Cargo,就結束了。
link |
04:11.000
但接下來你就會遇到一個問題,那直接執行註調的Sample Code,
link |
04:16.000
往往只能夠給你過Simple Baseline的結果而已。
link |
04:20.000
如果你想要做得更好,那應該要怎麼辦呢?
link |
04:24.000
以下就是如何讓你做得更好的攻略。
link |
04:29.000
它適用於前期所有的作業。
link |
04:32.000
這個就跟魔關羽一樣,你知道嗎?
link |
04:34.000
開局就送,可以幫助你打贏前期所有的副本。
link |
04:38.000
好,那這個攻略是怎麼走的呢?
link |
04:41.000
從最上面開始走起。
link |
04:43.000
第一個是,你今天如果你覺得你在Cargo上的結果不滿意的話,
link |
04:50.000
第一件事情你要做的事情是什麼?
link |
04:53.000
檢查你的Trending Data的Loss。
link |
04:56.000
有的人說,我在意的不是應該是Testing Data的Loss嗎?
link |
05:01.000
因為Cargo上面的結果呈現的是Testing Data的結果啊。
link |
05:04.000
但是,你要先檢查你的Trending Data,
link |
05:08.000
看看你的Model在Trending Data上面有沒有學起來,再去看Testing的結果。
link |
05:14.000
所以你要先檢查一下Trending Data的Loss。
link |
05:18.000
如果你發現你的Trending Data的Loss很大,
link |
05:21.000
顯然它在訓練資料上面也沒有學好。
link |
05:24.000
那接下來你就要分析一下,
link |
05:26.000
在訓練資料上面沒有學好是什麼樣的原因。
link |
05:31.000
那這邊有兩個可能。
link |
05:33.000
第一個可能是Model的Bias。
link |
05:36.000
那Model的Bias這件事情呢,
link |
05:38.000
我們在上週已經跟大家講過了。
link |
05:41.000
所謂Model Bias的意思是說,假設你的Model太過簡單。
link |
05:45.000
舉例來說,我們現在寫了一個有未知Parameter的Function。
link |
05:50.000
那這個未知的Parameter,我們可以帶各種不同的數字。
link |
05:54.000
你在SetR1得到一個Function,我們把那個Function用這個點來表示。
link |
05:59.000
在SetR2得到另外一個Function,
link |
06:01.000
你把所有的Function集合起來,得到一個Function的Set。
link |
06:05.000
但是這個Function的Set它太小了。
link |
06:08.000
這個Function的Set裡面沒有包含任何一個Function,
link |
06:11.000
可以讓我們的Loss變低。
link |
06:14.000
可以讓Loss變低的Function,
link |
06:16.000
不在你的Model可以描述的範圍內。
link |
06:21.000
你的Model裡面有未知的參數、未知的參數,
link |
06:23.000
可以在任何的數值,把這些數值帶進去以後,
link |
06:26.000
你得到了一個Function的Set。
link |
06:27.000
採用不同的數值,得到不同的Function,
link |
06:29.000
把所有的Function集合起來,你得到一個Function的Set。
link |
06:32.000
這個Set裡面沒有任何一個Function,
link |
06:35.000
可以讓你的Loss變低。
link |
06:37.000
那在這個情況下,就算你找出了一個SetR star,
link |
06:41.000
它是這些藍色的Function裡面最好的那一個,
link |
06:44.000
它是藍色的Function裡面可以讓Loss最低的那一個,
link |
06:47.000
也無濟於事。
link |
06:49.000
這些都是魯蛇,它只是魯蛇裡面的霸主,
link |
06:52.000
就還是一個魯蛇,那個Loss還是不夠低。
link |
06:56.000
那這個狀況就是,
link |
06:58.000
你想要在大海裡面撈針,這個針指的是一個Loss低的Function,
link |
07:03.000
結果針根本就不在海裡,
link |
07:06.000
白忙一場,你怎麼撈都撈不出針,
link |
07:09.000
因為針根本就不在你的Function Set裡面,
link |
07:12.000
不在你的大海裡面。
link |
07:14.000
所以怎麼辦?
link |
07:15.000
這個時候,重新設計你的Model。
link |
07:18.000
怎麼重新設計?
link |
07:19.000
給你的Model更大的彈性。
link |
07:22.000
我們上週已經示範過,
link |
07:23.000
舉例來說,你可以增加你輸入的feature,
link |
07:27.000
我們上週說,本來我們輸入的feature只有前一天的資訊,
link |
07:31.000
假設我們要預測接下來的觀看人數的話,
link |
07:35.000
那我們用前一天的資訊不夠多,
link |
07:38.000
那用56天前的資訊,
link |
07:40.000
那Model的彈性就比較大了,
link |
07:43.000
那你也可以用Deep Learning增加更多的彈性。
link |
07:47.000
所以如果你覺得你的Model的彈性不夠大,
link |
07:51.000
那你可以增加更多feature,
link |
07:53.000
可以設一個更大的Model,
link |
07:55.000
可以用Deep Learning來增加Model的彈性。
link |
07:58.000
這是第一個可以的解法。
link |
08:02.000
但是並不是Training的時候Lockdown,
link |
08:05.000
就代表一定是Model Bias。
link |
08:08.000
你可能會遇到另外一個問題,
link |
08:10.000
這個問題是什麼?
link |
08:11.000
這個問題是Optimization做得不好。
link |
08:15.000
什麼意思呢?
link |
08:17.000
我們知道說,我們今天用的Optimization,
link |
08:20.000
在這門課裡面,
link |
08:21.000
我們其實都只會用到Gradient Descent這種Optimization的方法。
link |
08:25.000
那這種Optimization的方法有很多的問題。
link |
08:27.000
舉例來說,我們上週也講過說,
link |
08:30.000
你可能會卡在Local Minima的地方,
link |
08:33.000
你沒有辦法找到一個真的可以讓Loss很低的參數。
link |
08:38.000
那如果要圖具象化的方式來表示的話,
link |
08:41.000
就像是這個樣子。
link |
08:43.000
這個是你的Model,
link |
08:45.000
它可以表示的函式所形成的幾何。
link |
08:48.000
你可以把Theta帶入不同的數值,
link |
08:51.000
形成不同的Function,
link |
08:52.000
把所有的Function統統集合在一起,
link |
08:54.000
得到這個藍色的Set。
link |
08:56.000
這個藍色的Set裡面確實包含了一些Function,
link |
09:00.000
這些Function它的Loss是低的,
link |
09:02.000
但問題是Gradient Descent這一個演算法,
link |
09:06.000
沒辦法幫我們找出這個Loss低的Function。
link |
09:09.000
Gradient Descent說,
link |
09:10.000
你要我幫你解Optimization的Problem,
link |
09:13.000
我給你這個Theta Start,
link |
09:14.000
然後就結束了。
link |
09:15.000
但這個Theta Start它給我們的Loss不夠低。
link |
09:18.000
這個Model裡面存在著某一個Function,
link |
09:21.000
它的Loss是夠低的,
link |
09:22.000
但Gradient Descent沒有給我們這一個Function。
link |
09:27.000
那這就好像是說,
link |
09:29.000
我們想大海撈針,
link |
09:31.000
針確實在海裡,
link |
09:32.000
但是我們卻沒有辦法把針撈起來。
link |
09:36.000
那這邊問題就來了。
link |
09:38.000
我們今天看到Trending Data的Loss不夠低的時候,
link |
09:43.000
到底是Model Bias,
link |
09:45.000
還是Optimization的問題呢?
link |
09:48.000
今天我們發現說,
link |
09:49.000
我們找不到一個Loss低的Function,
link |
09:51.000
到底是因為我們的Model的彈性不夠,
link |
09:54.000
我們的海裡面沒有針,
link |
09:56.000
還是說我們的Model彈性已經夠了,
link |
10:00.000
只是Optimization,
link |
10:01.000
Gradient Descent不給力,
link |
10:03.000
它沒辦法把針撈出來。
link |
10:05.000
到底是哪一個呢?
link |
10:08.000
到底我們的Model已經夠大了,
link |
10:10.000
還是它不夠大了?
link |
10:13.000
怎麼判斷這件事呢?
link |
10:16.000
那這邊一個建議判斷的方法,
link |
10:18.000
就是你可以透過比較不同的模型,
link |
10:21.000
來得知說你的Model現在到底夠不夠大。
link |
10:26.000
怎麼說呢?
link |
10:27.000
我們這邊舉一個例子。
link |
10:28.000
那這個實驗是從Residual Network那篇Paper裡面
link |
10:33.000
揭露出來的。
link |
10:35.000
我們的Paper連結放在右上角。
link |
10:37.000
這篇Paper一開頭就跟你講了一個故事,
link |
10:40.000
它說我想Train兩個Network,
link |
10:43.000
一個Network有20層,
link |
10:45.000
一個Network有56層,
link |
10:48.000
那我們把它們測試在測試資料上。
link |
10:51.000
那這個橫軸指的是Training的過程,
link |
10:55.000
就是你參數Update的過程。
link |
10:57.000
那隨著參數的Update,
link |
10:59.000
當然你的Loss會越來越低,
link |
11:01.000
但是結果20層的Loss比較低,
link |
11:04.000
56層的Loss還比較高。
link |
11:07.000
那這個Residual Network是比較早期的Paper,
link |
11:10.000
2015年的Paper,
link |
11:12.000
如果你現在大學生的話,
link |
11:13.000
那個時候你都還是高中生而已。
link |
11:15.000
所以那個時候大家對Deep Learning,
link |
11:17.000
我覺得了解還沒有那麼透徹,
link |
11:19.000
大家對Deep Learning有各種奇怪的誤解。
link |
11:21.000
所以很多人看到這張圖就會說,
link |
11:23.000
啊,這個代表什麼?
link |
11:24.000
這個代表Overfitting,
link |
11:26.000
就告訴你Deep Learning不Work了,
link |
11:28.000
知道嗎?56層太深了,
link |
11:29.000
不Work根本就不需要那麼深。
link |
11:31.000
那個時候大家,
link |
11:32.000
也不是每個人都覺得Deep Learning是好的,
link |
11:34.000
那個時候還有很多對Deep Learning的質疑,
link |
11:37.000
所以看到這個實驗,
link |
11:38.000
有人就會說,
link |
11:39.000
最深沒有比較好,
link |
11:40.000
這個叫做Overfitting。
link |
11:42.000
但是這個是Overfitting嗎?
link |
11:44.000
這個不是Overfitting,
link |
11:46.000
等一下會告訴你Overfitting是什麼,
link |
11:48.000
並不是所有的結果不好都叫做Overfitting。
link |
11:50.000
你要檢查一下訓練資料上的結果。
link |
11:54.000
你檢查訓練資料的結果發現說,
link |
11:56.000
現在20層的Network跟56層的Network比起來,
link |
11:59.000
在訓練資料上,20層的Network的Loss其實是比較低的,
link |
12:03.000
50層的Network的Loss是比較高的。
link |
12:06.000
這代表什麼?
link |
12:07.000
這代表56層的Network,
link |
12:09.000
它的Optimization沒有做好,
link |
12:13.000
它的Optimization不給力。
link |
12:15.000
你可能問說,
link |
12:16.000
欸,你怎麼知道是56層的Optimization不給力,
link |
12:19.000
搞不好是Model Bias啊,
link |
12:21.000
搞不好是56層的Network,
link |
12:22.000
它的Model的彈性還不夠大啊,
link |
12:24.000
要156層才好啊,
link |
12:25.000
56層也許彈性還不夠大。
link |
12:27.000
但是你比較56層跟20層,
link |
12:30.000
20層的Loss都已經可以做到這樣了,
link |
12:33.000
56層的彈性一定比20層更大,對不對?
link |
12:36.000
如果今天56層的Network要做到
link |
12:39.000
20層的Network可以做到的事情,
link |
12:41.000
對它來說是輕而易舉的,
link |
12:43.000
它只要前20層的參數跟這個20層的Network一樣,
link |
12:47.000
剩下36層就什麼事都不做,
link |
12:51.000
Identity, Copy前一層的輸出就好。
link |
12:54.000
那56層的Network一定可以做到
link |
12:57.000
20層的Network可以做到的事情。
link |
12:58.000
所以20層的Network都已經可以走到這麼低的Loss了,
link |
13:02.000
56層的Network它比20層的Network的彈性還要更大啊,
link |
13:06.000
所以沒有道理20層的Network可以做到的事情
link |
13:09.000
56層的Network做不到啊。
link |
13:11.000
所以56層的Network,
link |
13:12.000
如果你Optimization成功的話,
link |
13:14.000
它應該要比20層的Network可以得到更低的Loss,
link |
13:18.000
但結果在訓練資料上面沒用。
link |
13:21.000
這個不是Overfitting,這個也不是Model Bias,
link |
13:25.000
因為56層的Network彈性是夠的,
link |
13:27.000
這個問題是你的Optimization不給力,
link |
13:31.000
Optimization做得不夠好。
link |
13:34.000
所以剛才那個例子就告訴我們說,
link |
13:37.000
你怎麼知道你的Optimization有沒有做好呢?
link |
13:39.000
這邊給大家的建議是,
link |
13:41.000
看到一個你從來沒有做過的問題,
link |
13:44.000
也許你可以先跑一些比較小的、比較淺的Network,
link |
13:49.000
或甚至用一些不是Deep Learning的方法,
link |
13:52.000
比如說Linear的Model,
link |
13:54.000
比如說Support Vector Machine。
link |
13:56.000
有一些方法,比如說Support Vector Machine,
link |
13:59.000
那不知道是什麼也沒有關係啦,
link |
14:01.000
他們可能是比較容易做Optimize的,
link |
14:05.000
他們比較不會有Optimization失敗的問題,
link |
14:10.000
也就是這些Model,
link |
14:11.000
他們會竭盡全力的在他們的能力範圍之內,
link |
14:15.000
找出一組最好的參數,
link |
14:17.000
他們比較不會有失敗的問題。
link |
14:18.000
所以你可以先Train一些比較淺的Model,
link |
14:21.000
或者是一些比較簡單的Model,
link |
14:23.000
先知道,先有一個概念說,
link |
14:25.000
這些簡單的Model到底可以得到什麼樣的North。
link |
14:30.000
接下來才Train一個深的Model,
link |
14:33.000
如果你發現你深的Model跟淺的Model比起來,
link |
14:35.000
深的Model明明彈性比較大,
link |
14:37.000
但North卻沒有辦法比淺的Model壓得更低,
link |
14:41.000
那就代表說你的Optimization有問題,
link |
14:45.000
你的Gradient Descent不給力,
link |
14:46.000
那你要用一些其他的方法,
link |
14:48.000
來把Optimization這件事情做得更好。
link |
14:52.000
舉例來說,我們上次看到的觀看人數預測的例子,
link |
14:58.000
我們說在訓練資料上面,
link |
15:00.000
2017年到2020年的訓練資料,
link |
15:04.000
一層的Network,它的North是0.28K,
link |
15:07.000
兩層就降到0.18K,
link |
15:09.000
三層就降到0.14K,
link |
15:11.000
四層就降到0.10K,
link |
15:13.000
但是我測五層的時候,結果變成0.34K。
link |
15:18.000
這是什麼問題?
link |
15:19.000
我們現在North很大,
link |
15:21.000
這個是什麼問題?
link |
15:22.000
這是Model Bias的問題嗎?
link |
15:24.000
顯然不是,因為四層都可以做到0.10K了,
link |
15:27.000
五層應該可以做得更低。
link |
15:30.000
這個是Optimization的Problem,
link |
15:32.000
這個是Optimization的時候做得不好,
link |
15:35.000
才造成這樣子的問題。
link |
15:37.000
好,那如果Optimization做得不好的話,怎麼辦呢?
link |
15:41.000
這個我們下一節課,
link |
15:43.000
就會告訴大家要怎麼辦。
link |
15:46.000
現在就知道說,有這個問題,
link |
15:48.000
知道怎麼判斷說,
link |
15:50.000
現在如果你的Training的North大,
link |
15:52.000
到底是Model Bias,還是Optimization。
link |
15:55.000
如果Model Bias,那就把Model變大,
link |
15:58.000
如果是Optimization失敗了,
link |
16:00.000
那就看等一下的課程,
link |
16:02.000
怎麼解決這個問題。
link |
16:05.000
好,那假設你現在經過一番的努力,
link |
16:09.000
你已經可以讓你的Training Data的North變小了,
link |
16:13.000
那接下來,你就可以來看Testing Data的North,
link |
16:17.000
看Testing Data的North做得怎麼樣。
link |
16:19.000
那如果Testing Data的North也小,
link |
16:21.000
比如比這個Strong Baseline還要小,
link |
16:24.000
那就結束了,沒什麼好做的,就結束了,好嗎?
link |
16:26.000
結束了。
link |
16:27.000
好,那但是如果你覺得還不夠小呢,
link |
16:31.000
如果Training Data上面的North小,
link |
16:33.000
Testing Data上的North大,
link |
16:35.000
那你可能就是真的遇到Overfitting的問題。
link |
16:39.000
那你要注意,是Training的North小,
link |
16:41.000
Testing的North大,才叫做Overfitting。
link |
16:45.000
很多同學每次一看到結果不好,
link |
16:47.000
在Testing上的結果不好,就說這個是Overfitting。
link |
16:50.000
不一定是Overfitting,
link |
16:52.000
你拿一個結果來問我說老師,
link |
16:53.000
這個結果要怎麼變做得更好的時候,
link |
16:55.000
第一個問題都會問你說,
link |
16:56.000
你的Training Data上的North到底做得怎麼樣?
link |
16:59.000
那我發現十個同學有八個都說,
link |
17:01.000
要看Training Data的North嗎?
link |
17:02.000
我沒有把Training Data的North記下來耶。
link |
17:04.000
你要把Training Data的North記下來,
link |
17:06.000
先確定說你的Optimization沒有問題,
link |
17:09.000
你的Model夠大了,
link |
17:10.000
然後接下來才看看是不是Testing的問題。
link |
17:15.000
好,那如果是Training的North小,
link |
17:18.000
Testing的North大,
link |
17:19.000
這個有可能是Overfitting。
link |
17:22.000
那為什麼會有Overfitting這樣的狀況呢?
link |
17:25.000
為什麼有可能Training的North小,
link |
17:27.000
Testing的North大呢?
link |
17:32.000
那這邊就舉一個極端的例子,
link |
17:35.000
來告訴你說為什麼會發生這樣的狀況。
link |
17:38.000
好,那這是我們的訓練資料。
link |
17:41.000
假設根據這些訓練資料,
link |
17:43.000
某一個很廢的Machine Learning的方法,
link |
17:47.000
他找出了一個一無是處的Function。
link |
17:50.000
這個一無是處的Function是什麼樣的Function呢?
link |
17:53.000
這個一無是處的Function說,
link |
17:55.000
如果今天X當作輸入的時候,
link |
17:58.000
我們就去比對這個X有沒有出現在訓練資料裡面。
link |
18:04.000
如果X有出現在訓練資料裡面,
link |
18:06.000
就把它對應的Y當作輸出。
link |
18:09.000
如果X沒有出現在訓練資料裡面,那怎麼辦?
link |
18:12.000
就輸出一個隨機的值。
link |
18:15.000
你可以想像說這個Function啥事也沒有幹,
link |
18:18.000
它是一個一無是處的Function。
link |
18:21.000
但雖然它是一個一無是處的Function,
link |
18:23.000
它在Training的Data上,
link |
18:25.000
它的North可是0了。
link |
18:27.000
你把Training的Data通通丟進這個Function裡面,
link |
18:30.000
它的輸出跟你的訓練資料的Label是一模一樣的。
link |
18:34.000
所以在Training的Data上面,
link |
18:36.000
這個一無是處的Function,
link |
18:38.000
它的North可是0了,
link |
18:39.000
只是在Testing的Data上面,
link |
18:41.000
它的North會變得很大,
link |
18:43.000
因為它其實什麼都沒有選。
link |
18:46.000
這是一個比較極端的例子。
link |
18:48.000
那在一般的狀況下,
link |
18:50.000
也有可能發生類似的事情。
link |
18:52.000
舉例來說,
link |
18:53.000
假設我們輸入的Feature叫做X,輸出的Label叫做Y。
link |
18:58.000
那X跟Y都是一維的,
link |
19:01.000
X跟Y之間的關係是這個二次的曲線。
link |
19:06.000
那這個曲線我們可以用虛線來表示,
link |
19:08.000
因為我們通常沒有辦法直接觀察到這條曲線。
link |
19:12.000
我們真正可以觀察到的是什麼?
link |
19:15.000
我們真正可以觀察到的是我們的訓練資料。
link |
19:20.000
那訓練資料你可以想像成
link |
19:23.000
就是從這條曲線上面隨機Sample出來的幾個點。
link |
19:28.000
你今天的模型呢,
link |
19:29.000
它的能力非常的強,
link |
19:32.000
它的Flexibility很大,
link |
19:34.000
它的彈性很大的話,
link |
19:36.000
你只給它這三個點,
link |
19:38.000
它會知道說在這三個點上面,
link |
19:41.000
我們要讓North低。
link |
19:43.000
所以你今天你的Model,
link |
19:45.000
它的這個曲線會通過這三個點,
link |
19:48.000
但是其它沒有訓練資料作為限制的地方,
link |
19:52.000
它就會有Free Style。
link |
19:54.000
因為它的Flexibility很大,
link |
19:57.000
它的彈性很大嘛,
link |
19:59.000
所以你的Model可以變成各式各樣的Function。
link |
20:02.000
你沒有給它資料作為訓練,
link |
20:04.000
它就有Free Style可以產生各式各樣奇怪的結果。
link |
20:08.000
那這個時候,
link |
20:10.000
如果你在丟進你的Testing Data,
link |
20:12.000
那Testing Data跟Training Data當然不會一模一樣。
link |
20:15.000
是從同一個Distribution Sample出來的,
link |
20:18.000
Testing Data是橙色的這些點,
link |
20:20.000
Training Data是藍色的這些點,
link |
20:22.000
用藍色的這些點找出一個Function以後,
link |
20:24.000
你測試在橘色的這些點上,
link |
20:26.000
不一定會好。
link |
20:28.000
如果你的Model,
link |
20:30.000
它的自由度很大的話,
link |
20:32.000
它可以產生非常奇怪的曲線,
link |
20:34.000
導致訓練資料上的結果好,
link |
20:36.000
但是測試資料上的Loss很大。
link |
20:39.000
那至於更詳細的背後的數學原理,
link |
20:44.000
為什麼比較有彈性的Model,
link |
20:48.000
它就比較會Overfitting,
link |
20:50.000
背後的數學原理,
link |
20:52.000
我們留待下下週,
link |
20:54.000
吳佩元老師會跟大家更詳細的說明。
link |
20:57.000
好,那我們今天就是講一下它的概念就好。
link |
21:01.000
那怎麼解決剛才那個Overfitting的問題呢?
link |
21:05.000
有兩個可能的方向。
link |
21:08.000
第一個方向是,
link |
21:10.000
也許這個方向往往是最有效的方向,
link |
21:13.000
是增加你的訓練資料。
link |
21:16.000
所以今天假設你自己,
link |
21:17.000
要想要做一個Application,
link |
21:19.000
你發現有Overfitting的問題,
link |
21:21.000
其實我覺得最簡單解決Overfitting的方法就是,
link |
21:24.000
增加你的訓練資料。
link |
21:27.000
所以今天如果訓練資料,
link |
21:28.000
藍色的點變多了,
link |
21:30.000
藍色的點變多了,
link |
21:32.000
那雖然你的Model,
link |
21:34.000
它的彈性可能很大,
link |
21:37.000
但是因為這邊的點非常非常的多,
link |
21:39.000
它就會被限制住。
link |
21:40.000
它看起來的形狀,
link |
21:41.000
雖然很像是在產生這些資料背後的直曲線,
link |
21:45.000
但是你在作業裡面,
link |
21:47.000
你是不能夠使用這一招的,
link |
21:49.000
因為我們並不希望大家浪費時間,
link |
21:51.000
來收集資料啊等等,
link |
21:54.000
那這個不是機器學習技術最核心的部分,
link |
21:57.000
我們希望大家多Focus在機器學習核心的技術上,
link |
22:00.000
而不是花太多力氣去網路上收集資料,
link |
22:03.000
看看怎麼把作業做好。
link |
22:04.000
所以這個不是我們要大家做的,
link |
22:06.000
在作業裡面,
link |
22:07.000
你不能夠自己收集資料。
link |
22:09.000
那你可以做什麼呢?
link |
22:10.000
你可以做Data Augmentation,
link |
22:14.000
這個方法並不算是使用了額外的資料。
link |
22:17.000
Data Augmentation是什麼意思呢?
link |
22:18.000
Data Augmentation就是,
link |
22:20.000
你用一些你對於這個問題的理解,
link |
22:23.000
自己創造出新的資料。
link |
22:26.000
舉例來說,
link |
22:27.000
在做影像辨識的時候,
link |
22:28.000
非常常做的一個招式是,
link |
22:30.000
假設你的訓練資料裡面有某一張圖片,
link |
22:33.000
把它左右翻轉,
link |
22:35.000
或者是把它其中一塊截出來放大等等。
link |
22:40.000
你做左右翻轉,
link |
22:41.000
你的資料就變成一倍,
link |
22:44.000
那這個就是Data Augmentation。
link |
22:46.000
但是你要注意一下Data Augmentation,
link |
22:48.000
不能夠隨便亂做。
link |
22:51.000
這個Data Augmentation,
link |
22:52.000
這個Augment,
link |
22:53.000
要Augment的有道理。
link |
22:55.000
舉例來說,
link |
22:56.000
在影像辨識裡面,
link |
22:57.000
你就很少看到有人把影像上下顛倒,
link |
23:01.000
當作Augmentation。
link |
23:02.000
為什麼?
link |
23:03.000
因為這些圖片都是合理的圖片,
link |
23:06.000
你把一張照片左右翻轉,
link |
23:08.000
並不會影響到裡面是什麼樣的東西。
link |
23:10.000
你把它顛倒,
link |
23:11.000
那就很奇怪了,
link |
23:12.000
這可能不是一個訓練資料裡面,
link |
23:14.000
可能不是真實世界會出現的影像。
link |
23:17.000
如果你給機器看這種奇怪的影像的話,
link |
23:19.000
它可能就會學到奇怪的東西。
link |
23:22.000
所以Data Augmentation,
link |
23:24.000
要根據你對資料的特性,
link |
23:27.000
對你現在要處理的問題的理解,
link |
23:29.000
來選擇合適的Data Augmentation的方式。
link |
23:34.000
好,那這邊是增加資料的部分,
link |
23:37.000
那還有什麼解法呢?
link |
23:39.000
另外一個解法就是,
link |
23:40.000
不要讓你的模型有那麼大的彈性,
link |
23:44.000
給它一些限制。
link |
23:47.000
舉例來說,
link |
23:48.000
假設我們直接限制說,
link |
23:50.000
現在我們的Model一定是一條二次曲線,
link |
23:55.000
我們商號通靈出,知道說X跟Y背後的關係,
link |
24:00.000
其實就是一條二次曲線,
link |
24:02.000
只是我們不明確的知道,
link |
24:03.000
這二次曲線裡面的每一個參數長什麼樣。
link |
24:07.000
那你說你怎麼會通靈出這樣子的結果,
link |
24:10.000
你怎麼會知道說,
link |
24:11.000
要用多Constraint的Model才會好呢?
link |
24:13.000
那這就取決於你對這個問題的理解。
link |
24:16.000
因為這種Model是你自己設計的,
link |
24:18.000
到底Model要多Constraint,
link |
24:21.000
多Flexible,結果才會好?
link |
24:23.000
那這個要問你自己,
link |
24:26.000
那要看這個設計出不同的模型,
link |
24:28.000
你就會得出不同的結果。
link |
24:30.000
好,那現在假設我們已經知道說,
link |
24:33.000
模型就是二次曲線,
link |
24:35.000
那你就會給你,
link |
24:37.000
你就會在選擇Function的時候有很大的限制,
link |
24:40.000
因為二次曲線要嘛就是這樣子,
link |
24:42.000
要嘛就是這樣子,
link |
24:43.000
來來去去就是那幾個形狀而已。
link |
24:46.000
所以當我們的訓練資料有限的時候,
link |
24:48.000
因為我們來來去去只能夠選那幾個Function,
link |
24:51.000
所以你可能雖然說只給了三個點,
link |
24:54.000
但是因為我們能選擇的Function有限,
link |
24:56.000
你可能就會正好選到跟真正的Distribution
link |
25:01.000
比較接近的Function,
link |
25:03.000
然後在測試資料上得到比較好的結果。
link |
25:07.000
所以這是第二個方法,
link |
25:09.000
解決Overfitting的問題,
link |
25:10.000
你要給你的Model一些限制。
link |
25:13.000
最好你的Model正好跟
link |
25:15.000
背後產生資料的過程的Process是一樣的,
link |
25:19.000
那你可能就會,
link |
25:21.000
那你就有機會得到好的結果。
link |
25:23.000
但是如果你給你的,
link |
25:26.000
有哪些方法可以給Model製造限制呢?
link |
25:31.000
舉例來說,
link |
25:32.000
給他比較少的參數,
link |
25:34.000
如果是Deep Learning的話,
link |
25:36.000
就給他比較少的神經元的數目,
link |
25:39.000
本來每成一千個神經元,
link |
25:41.000
改成一百個神經元之類的。
link |
25:43.000
或者是你可以讓Model共用參數,
link |
25:47.000
你可以讓一些參數有一樣的數值。
link |
25:50.000
那這個部分,
link |
25:51.000
如果你沒有很清楚的話也沒有關係,
link |
25:53.000
我們之後在講CNN的時候,
link |
25:56.000
會講到這個部分。
link |
25:58.000
所以這邊先前情先預告一下,
link |
26:01.000
就是我們之前講的Network架構,
link |
26:04.000
叫做Fully Connected Network。
link |
26:07.000
那Fully Connected Network,
link |
26:09.000
其實是一個比較有彈性的架構,
link |
26:13.000
而CNN是一個比較有限制的架構。
link |
26:17.000
你可能會說CNN不是比較厲害嗎?
link |
26:20.000
大家都說做影像就是要用CNN,
link |
26:22.000
那比較厲害的Model,
link |
26:23.000
難道他比較沒有彈性嗎?
link |
26:24.000
沒錯,他是一個比較沒有彈性的Model。
link |
26:27.000
他厲害的地方就是,
link |
26:28.000
他是針對影像的特性,
link |
26:31.000
來限制模型的彈性。
link |
26:34.000
所以今天Fully Connected Network,
link |
26:37.000
可以找出來的Function所形成的集合性是比較大的。
link |
26:40.000
CNN這個Model所找出來的Function,
link |
26:43.000
他形成的集合性是比較小的。
link |
26:45.000
其實包含在Fully Connected Network裡面的。
link |
26:48.000
但是就是因為CNN給了比較大的限制,
link |
26:51.000
所以CNN在影像上反而會做得比較好。
link |
26:54.000
這個之後都還會再提到。
link |
26:57.000
還有哪些其他的方法呢?
link |
26:59.000
一個就是用比較少的feature啦。
link |
27:03.000
那剛才朱教授已經示範過,
link |
27:05.000
本來給三天的資料,
link |
27:07.000
改成用給兩天的資料,
link |
27:08.000
其實結果就好了一些。
link |
27:10.000
那這個是一個招數。
link |
27:12.000
還有一個招數呢,
link |
27:13.000
叫做Early Stopping。
link |
27:15.000
Early Stopping,
link |
27:16.000
Regularization跟Dropout,
link |
27:17.000
都是之後課程還會講到的東西。
link |
27:19.000
那這三件事情呢,
link |
27:21.000
在作業1的程式裡面,
link |
27:23.000
這個Early Stopping其實是有的。
link |
27:27.000
朱教有寫在他的Code裡面,
link |
27:29.000
所以你不知道這是什麼也沒有關係,
link |
27:31.000
反正你直接執行Sample Code裡面就有了。
link |
27:34.000
Regularization,
link |
27:35.000
朱教留下了一個空格給大家填。
link |
27:38.000
那你不知道什麼是Regularization,
link |
27:40.000
沒有關係,
link |
27:41.000
反正你可以過得了middle的baseline。
link |
27:43.000
那如果想做得更好,
link |
27:44.000
也許你可以先自己survey一下
link |
27:46.000
Regularization是什麼,
link |
27:47.000
看看有沒有辦法自己寫。
link |
27:49.000
那Dropout,
link |
27:50.000
這是另外一個在Deep Learning裡面
link |
27:52.000
常用來限制模型的方法,
link |
27:54.000
這個之後還會再提到。
link |
27:59.000
但是啊,
link |
28:00.000
我們也不要給太多的限制。
link |
28:03.000
為什麼不能給模型太多的限制呢?
link |
28:05.000
假設我們現在給模型更大的限制說,
link |
28:08.000
我們假設我們的模型一定是linear的model,
link |
28:11.000
一定是寫成y等於a加bf。
link |
28:14.000
那你的model呢,
link |
28:15.000
它能夠產生的function就一定是一條直線。
link |
28:20.000
今天給三個點,
link |
28:21.000
沒有任何一條直線可以同時通過這三個點,
link |
28:24.000
但是你只能找到一條直線,
link |
28:26.000
這條直線跟這些點比起來,
link |
28:28.000
他們的距離是比較近的,
link |
28:30.000
但是你沒有辦法找到任何一條直線。
link |
28:32.000
同時通過這三個點。
link |
28:35.000
這個時候,
link |
28:36.000
你的模型的限制就太大了,
link |
28:39.000
你在測試資料上就不會得到好的結論。
link |
28:42.000
但是這個是overfitting嗎?
link |
28:45.000
這個不是overfitting,
link |
28:47.000
因為你又回到了model bias的問題。
link |
28:50.000
所以你現在這樣,
link |
28:51.000
在這個情況下,
link |
28:52.000
在這個投影片的case上面,
link |
28:53.000
你結果不好,
link |
28:54.000
並不是因為overfitting了,
link |
28:56.000
而是因為你給你的模型太大的限制,
link |
28:58.000
達到你有了model bias的問題。
link |
29:02.000
所以你會發現說,
link |
29:04.000
這邊產生了一個有點矛盾,
link |
29:07.000
這邊產生了一個矛盾的狀況。
link |
29:09.000
今天你讓你的模型的複雜的程度,
link |
29:13.000
或這樣讓你的模型的彈性越來越大,
link |
29:16.000
但什麼叫做複雜的程度,
link |
29:18.000
什麼叫做彈性,
link |
29:19.000
在今天這堂課裡面,
link |
29:20.000
我們其實都沒有給明確的定義,
link |
29:22.000
只給你一個概念上的敘述。
link |
29:24.000
在下下週的課程裡面,
link |
29:26.000
你會真的認識到,
link |
29:28.000
什麼叫做一個模型很複雜,
link |
29:30.000
什麼叫做一個模型有彈性,
link |
29:32.000
怎麼真的衡量一個模型的彈性,
link |
29:36.000
複雜的程度有多大。
link |
29:38.000
今天我們先用直觀的來了解,
link |
29:40.000
所謂比較複雜的就是,
link |
29:42.000
它可以包含的function比較多,
link |
29:44.000
它的參數比較多,
link |
29:45.000
這個就是一個比較複雜的model。
link |
29:49.000
那一個比較複雜的model,
link |
29:51.000
如果你看它的training的notes,
link |
29:53.000
你會發現說,
link |
29:54.000
隨著model越來越複雜,
link |
29:56.000
training的notes可以越來越低。
link |
30:00.000
但是,testing的時候呢,
link |
30:02.000
當model越來越複雜的時候,
link |
30:05.000
剛開始你的testing的notes會跟著下降。
link |
30:09.000
但是,當複雜的程度超過某一個程度以後,
link |
30:13.000
testing的notes就會突然暴增了。
link |
30:18.000
那這就是因為說,
link |
30:20.000
當你的model越來越複雜的時候,
link |
30:23.000
複雜到某一個程度,
link |
30:24.000
overfitting的狀況就會出現。
link |
30:26.000
所以你在training的notes上面,
link |
30:28.000
可以得到比較好的結果,
link |
30:29.000
但在testing的notes上面,
link |
30:31.000
你會得到比較大的loss。
link |
30:34.000
那我們當然期待說,
link |
30:36.000
我們可以選一個中庸的模型,
link |
30:40.000
不是太複雜的,
link |
30:41.000
也不是太簡單的,
link |
30:43.000
剛剛好可以在訓練資料上,
link |
30:46.000
給我們最好的結果,
link |
30:49.000
給我們最低的loss,
link |
30:51.000
給我們最低的testing loss。
link |
30:53.000
怎麼選出這樣的model呢?
link |
30:57.000
一個很直覺的,
link |
30:58.000
你很有可能沒有人告訴你要怎麼做的話,
link |
31:01.000
你可能很直覺就會這麼做的做法是說,
link |
31:04.000
這個kaggle不是立刻上傳,
link |
31:06.000
就可以知道答案了嗎?
link |
31:08.000
所以假設我們有三個模型,
link |
31:11.000
他們的複雜的程度不太一樣,
link |
31:13.000
我不知道選哪一個模型,
link |
31:15.000
才會剛剛好在測試資料上,
link |
31:17.000
得到最好的結果。
link |
31:18.000
因為你選太複雜的,就overfitting,
link |
31:20.000
太簡單的,有model bias的問題,
link |
31:23.000
那怎麼選一個不偏不倚的,
link |
31:25.000
不知道,那怎麼辦?
link |
31:26.000
把這三個模型的結果都跑出來,
link |
31:29.000
然後上傳到kaggle上面,
link |
31:32.000
你即時的知道了你的分數,
link |
31:35.000
看看哪個分數最低,
link |
31:37.000
那個模型顯然就是最好的模型。
link |
31:40.000
但是並不建議你這麼做。
link |
31:44.000
為什麼不建議你這麼做呢?
link |
31:46.000
我們再舉一個極端的例子。
link |
31:50.000
我們再把剛才那個極端的例子拿出來。
link |
31:53.000
假設現在有一群model,
link |
31:56.000
這一群model不知道為什麼都非常廢,
link |
31:59.000
他們每一個model產生出來的,
link |
32:01.000
都是一無是處的function。
link |
32:03.000
我們有1到這個0,
link |
32:05.000
有多少個我不知道,
link |
32:06.000
隨便打1兆好了,
link |
32:07.000
我們有1到1兆個model。
link |
32:11.000
這一到1兆個model,
link |
32:13.000
不知道為什麼認出來的function,
link |
32:15.000
都是一無是處的function。
link |
32:17.000
他們會做的事情就是,
link |
32:18.000
訓練資料裡面有的資料就把它記下來,
link |
32:21.000
訓練資料沒看過的,
link |
32:22.000
就直接open隨機的結果。
link |
32:24.000
那你現在有一兆個模型,
link |
32:27.000
那你再把這一兆個模型的結果,
link |
32:29.000
通通上傳到kaggle上面,
link |
32:32.000
你就得到1兆個分數,
link |
32:35.000
然後看這一兆個分數裡面,
link |
32:37.000
哪一個結果最好,
link |
32:38.000
你就覺得那個模型是最好的。
link |
32:40.000
雖然說每一個模型,
link |
32:42.000
他們在這個testing data上,
link |
32:44.000
他都沒有看過啊,
link |
32:45.000
所以他輸出的結果都是隨機的。
link |
32:47.000
雖然在testing data上面,
link |
32:49.000
輸出的結果都是隨機的,
link |
32:50.000
但是你不斷地隨機,
link |
32:53.000
你總是會找到一個好的結果,
link |
32:55.000
對不對?
link |
32:56.000
所以也許編號56789的那一個模型,
link |
33:00.000
他找出來的function,
link |
33:02.000
正好在testing data上面,
link |
33:04.000
就給你一個好的結果。
link |
33:06.000
那你就會很高興覺得說,
link |
33:08.000
這個model編號56789,
link |
33:10.000
是個好model,
link |
33:11.000
這個好model得到一個好function,
link |
33:13.000
雖然他其實是隨機的,
link |
33:14.000
但你不知道,
link |
33:15.000
這個好function,
link |
33:16.000
這個好function,
link |
33:17.000
在這個testing data上面,
link |
33:19.000
給我們好的結果。
link |
33:20.000
所以你就覺得說,
link |
33:21.000
這個結果不錯,
link |
33:23.000
就這樣,
link |
33:24.000
我就選這個model,
link |
33:25.000
這個function,
link |
33:26.000
當作我們最後上傳的結果,
link |
33:29.000
當作我最後要用在
link |
33:31.000
Python testing set上的結果。
link |
33:33.000
但是如果你這樣做,
link |
33:34.000
往往就會得到非常糟的結果,
link |
33:36.000
因為這個model畢竟是隨機的,
link |
33:38.000
他恰好在public的testing data上面,
link |
33:42.000
他public的testing set上,
link |
33:44.000
得到一個好結果,
link |
33:45.000
但是他在private的testing set上,
link |
33:48.000
可能仍然是隨機的。
link |
33:51.000
所以假設你今天在選model的時候,
link |
33:54.000
你都用public的,
link |
33:56.000
就是我們這個testing set,
link |
33:58.000
分成public的set跟private的set,
link |
34:01.000
你在看分數的時候,
link |
34:02.000
你只看得到public的分數,
link |
34:04.000
private的分數,
link |
34:05.000
要deadline以後才知道。
link |
34:06.000
但假設你在挑模型的時候,
link |
34:08.000
你完全看你在public set上面的,
link |
34:11.000
也就是leaderboard上的分數,
link |
34:12.000
來選擇你的模型的話,
link |
34:14.000
你可能就會這個樣子。
link |
34:16.000
你在public的leaderboard上面,
link |
34:19.000
排前十,
link |
34:20.000
但是deadline一結束,
link |
34:22.000
你心態就崩了,
link |
34:23.000
掉到三百名之外。
link |
34:25.000
而且我們這邊的修課人這麼多,
link |
34:26.000
你搞不好會掉到一千名之外,
link |
34:28.000
也說不定。
link |
34:29.000
而且這件事情並不是傳說,
link |
34:32.000
並沒有誇飾,
link |
34:33.000
每年都會有這樣子的狀況發生。
link |
34:37.000
因為今年我們會看public,
link |
34:39.000
就是說我們在算分數的時候,
link |
34:41.000
你在public上面的結果好,
link |
34:42.000
還是會給你一點分數。
link |
34:44.000
我們不是只看private的分數而已,
link |
34:46.000
是public跟private的分數看啦。
link |
34:48.000
過去有些學期是只看private的分數的時候,
link |
34:50.000
發生這種狀況,
link |
34:51.000
你心態就會整個崩掉這樣子。
link |
34:53.000
你就會非常非常的鬱悶。
link |
34:57.000
好,那這個時候有同學就會說,
link |
35:02.000
那為什麼我們要把testing的set,
link |
35:06.000
分成public跟private呢?
link |
35:08.000
為什麼我們不能就通通都分public就好呢?
link |
35:12.000
為什麼要為難大家呢?
link |
35:13.000
為什麼要讓大家疑神疑鬼,
link |
35:15.000
不知道自己private上的結果是什麼呢?
link |
35:18.000
你仔細想想看,
link |
35:19.000
假設所有的data都是public,
link |
35:22.000
那我剛才說,
link |
35:23.000
就算是一個一無是處的model,
link |
35:26.000
得到的一無是處的function,
link |
35:28.000
它也有可能在public的data上面,
link |
35:31.000
得到好的結果。
link |
35:33.000
如果我們今天只有public的testing set,
link |
35:35.000
沒有private的testing set,
link |
35:37.000
那你就回去寫一個程式,
link |
35:40.000
不斷random產生輸出就好,
link |
35:42.000
然後不斷把random的輸出上傳到kart頭,
link |
35:44.000
然後看你什麼時候可以random出一個好的結果,
link |
35:46.000
那這個作業就結束了。
link |
35:48.000
那這個顯然沒有意義,
link |
35:50.000
顯然不是我們要的。
link |
35:53.000
而且啊,因為如果今天,
link |
35:56.000
然後這邊有另外一個有趣的事情就是,
link |
35:59.000
因為如果今天public的testing data是公開的,
link |
36:03.000
你可以知道public的testing data的結果,
link |
36:07.000
那就算是一個很廢的模型,
link |
36:11.000
產生了很廢的function,
link |
36:13.000
也可能得到非常好的結果。
link |
36:15.000
那這就印證了說,
link |
36:17.000
為什麼在機器學習的領域,
link |
36:19.000
在那些benchmark的conference上面,
link |
36:22.000
往往機器可以得到,
link |
36:25.000
異乎尋常的好的結果,
link |
36:27.000
往往都超越人類。
link |
36:29.000
所謂benchmark conference的意思就是,
link |
36:31.000
有一些data set是公開的,
link |
36:33.000
然後舉例來說,
link |
36:35.000
這個libri-speech是一個公開的,
link |
36:37.000
用來訓練語音辨識的資料集,
link |
36:40.000
那如果你想要測試自己的語音辨識的模型,
link |
36:43.000
好不好的話,
link |
36:45.000
那就訓練在libri-speech上面,
link |
36:47.000
那libri-speech有testing set,
link |
36:49.000
所有人都共用一模一樣的testing set,
link |
36:51.000
那我們就可以比較不同模型的好壞。
link |
36:55.000
但是問題是,
link |
36:57.000
這些testing set的結果都是public的。
link |
37:00.000
所以就算是一個很廢的模型,
link |
37:03.000
它只能產生很廢的function,
link |
37:05.000
你只要做得夠多,
link |
37:06.000
你還是可以在public的set上得到結果,
link |
37:08.000
得到好的結果。
link |
37:10.000
那這就解釋為什麼說,
link |
37:12.000
這些benchmark conference最終,
link |
37:14.000
往往機器可以得到超乎人類的結果。
link |
37:17.000
那這個最有名的例子,
link |
37:19.000
就是這個,
link |
37:20.000
大家記得16年的時候,
link |
37:22.000
Microsoft跟IPM都不約而同的說,
link |
37:25.000
他們的machine在語音辨識上面,
link |
37:29.000
得到超越人類的結果。
link |
37:31.000
專業的聽打員做的語音辨識的錯誤率還要低。
link |
37:35.000
那這個是怎麼來的?
link |
37:37.000
那個其實就是做在benchmark的conference上面啦。
link |
37:42.000
那個其實是做在一個叫做switch4的benchmark的conference上面。
link |
37:47.000
那你說,
link |
37:48.000
那在benchmark conference上面得到一個非常好的超越人類的結果,
link |
37:51.000
在現實生活中,
link |
37:52.000
它真的有超越人類嗎?
link |
37:54.000
我想你不會相信對不對?
link |
37:56.000
你不是做語音辨識的研究人員,
link |
37:59.000
你光是有用過,
link |
38:01.000
今天語音辨識系統無所不在嘛,
link |
38:03.000
每個手機拿出來都有語音辨識,
link |
38:05.000
你其實不會相信說,
link |
38:06.000
機器在語音辨識的能力已經超越人類。
link |
38:10.000
所以這個就是在那些benchmark conference上,
link |
38:13.000
benchmark conference的testing set,
link |
38:15.000
就是public的testing set。
link |
38:17.000
但是你真的訓練出一個語音辨識系統上線給人用的時候,
link |
38:21.000
那這個是private的testing set。
link |
38:23.000
你有可能在public的testing set上面得到什麼超越人類的結果,
link |
38:27.000
但並不代表它在private的testing set上一定是好的。
link |
38:31.000
在那些benchmark conference上面,
link |
38:32.000
機器都說超越人類的語音辨識的正確率了,
link |
38:35.000
並不代表在日常生活中,
link |
38:37.000
它的語音辨識的正確率超越了人類。
link |
38:40.000
所以你知道說,
link |
38:41.000
那些說在benchmark conference上得到什麼超越人類的結果,
link |
38:44.000
那個都比較像是片片麻瓜的商業的辭令。
link |
38:49.000
不過我覺得說,
link |
38:50.000
有benchmark conference做出結果來,
link |
38:53.000
還算是已經是很優品的了。
link |
38:55.000
我聽過更優品的是怎樣呢?
link |
38:57.000
就是有一個不知道哪來的新創,
link |
39:01.000
去接了一個政府的計畫,
link |
39:03.000
然後說要做語音辨識,
link |
39:05.000
然後就拿那個data set,
link |
39:06.000
然後KPI就訂說,
link |
39:07.000
我們這個要做到90%以上的正確率,
link |
39:10.000
然後做完,
link |
39:11.000
哇,沒有得到90%,
link |
39:13.000
怎麼做都做不到90%,
link |
39:15.000
人家要來驗收怎麼辦呢?
link |
39:16.000
然後他們就說,
link |
39:17.000
跟驗收的人說,
link |
39:18.000
你這個testing set不好,
link |
39:20.000
你這個testing set裡面雜訊很多,
link |
39:22.000
我幫你把它清乾淨,
link |
39:23.000
我把有雜訊的那個句子拿掉,
link |
39:25.000
然後KPI就達到了正確率90%以上,
link |
39:29.000
就起飛了,
link |
39:30.000
就過了那個KPI了。
link |
39:32.000
而且還有更更沒品的啦,
link |
39:34.000
就是有人會,
link |
39:35.000
有怪怪的新創會拿出一個東西,
link |
39:37.000
拿出他自己的app來看,
link |
39:39.000
我自己做了一個語音辨識系統。
link |
39:41.000
你知道嗎?
link |
39:42.000
跟Google辨識出來的結果都一樣好喔。
link |
39:45.000
為什麼呢?
link |
39:46.000
就是因為他偷摳了Google的API這樣子。
link |
39:50.000
好,所以有各種各樣奇奇怪怪的東西啦,
link |
39:53.000
所以網路上奇奇怪怪的吹捧,
link |
39:56.000
大家有時候看看就好。
link |
39:58.000
好,所以講了這麼多,
link |
39:59.000
只是想要告訴大家說,
link |
40:01.000
我們為什麼要切public的testing set,
link |
40:05.000
我們為什麼要切private的testing set,
link |
40:08.000
然後你其實不要花,
link |
40:10.000
不要用你public的testing set去調你的模型,
link |
40:13.000
因為你可能會在private的testing set上面,
link |
40:16.000
得到很差的結果。
link |
40:18.000
那不過因為今年呢,
link |
40:20.000
你在public set上面的好的結果,
link |
40:22.000
也有算分數,
link |
40:23.000
所以怎麼辦呢?
link |
40:24.000
為了避免你,
link |
40:25.000
為了就你可能會說,
link |
40:26.000
好,那我放棄private set的結果,
link |
40:28.000
我就只拿public set的結果,
link |
40:29.000
然後不斷的產生隨機的結果,
link |
40:31.000
去上傳到Cartel,
link |
40:33.000
然後看看說能不能夠正好隨機出一個好的結果。
link |
40:36.000
為了避免浪費時間做這件事情,
link |
40:38.000
所以有每日上傳的限制,
link |
40:40.000
讓你不會說我拿很廢的模型,
link |
40:43.000
只產生隨機的結果,
link |
40:44.000
不斷的測試public的testing score。
link |
40:48.000
好,那到底要怎麼做,
link |
40:50.000
才選擇model,
link |
40:51.000
才是比較合理的呢?
link |
40:53.000
那建議的方法是這個樣子的,
link |
40:55.000
那其實助教程式裡面,
link |
40:57.000
也都幫大家做好了,
link |
40:58.000
你要把training的資料分成兩半,
link |
41:01.000
一部分叫做training set,
link |
41:03.000
一部分是validation set。
link |
41:06.000
剛才助教程式裡面已經看到說,
link |
41:08.000
有90%的資料放在training set裡面,
link |
41:12.000
有10%的資料會被拿來做validation set。
link |
41:16.000
那你在training set上訓練出來的模型,
link |
41:20.000
你在validation set上面去衡量他們的分數,
link |
41:25.000
你根據validation set上面的分數,
link |
41:28.000
去挑選結果,
link |
41:30.000
再把這個結果上傳到Cartel上面,
link |
41:34.000
去看看你得到的public的分數。
link |
41:37.000
那因為你在挑分數的時候,
link |
41:39.000
是用validation set來挑你的model,
link |
41:42.000
所以你的public testing set的分數,
link |
41:45.000
就可以反映你的private testing set的分數,
link |
41:49.000
就比較不會得到說,
link |
41:50.000
在public上面結果很好,
link |
41:52.000
但是在private上面結果很差,
link |
41:55.000
這樣子的狀況。
link |
41:57.000
但我知道說,
link |
41:59.000
其實你看到public的結果以後,
link |
42:03.000
你就會去想要挑他啦,
link |
42:05.000
就你看到你現在弄了一堆模型,
link |
42:08.000
然後用validation set檢查一下,
link |
42:10.000
找了一個模型放到public set上以後,
link |
42:12.000
發現結果不好,
link |
42:13.000
你其實不太可能不根據這一個結果,
link |
42:16.000
去調整你的模型。
link |
42:19.000
但是假設這一個loop做太多次,
link |
42:22.000
你根據你的public testing set上的結果,
link |
42:24.000
去調整你的model太多次,
link |
42:27.000
你就又有可能fit在你的public testing set上面,
link |
42:31.000
然後在private testing set上面得到差的結果。
link |
42:33.000
不過還好反正我們有限制上傳的次數,
link |
42:36.000
所以這個loop呢,
link |
42:37.000
你也沒有辦法走太多次,
link |
42:39.000
可以避免你太多fit在public testing set上面的結果。
link |
42:45.000
好,那我知道說,
link |
42:48.000
今天因為public testing set上面的結果,
link |
42:51.000
是大家都可以看到的,
link |
42:52.000
然後很多人都會,
link |
42:53.000
然後名字你又可以隨便亂取,
link |
42:56.000
所以假設有一個人洗到第一名的話,
link |
42:58.000
他就會非常的得意,
link |
42:59.000
他就會把自己的名字改成一些什麼,
link |
43:01.000
我第一次試就第一名了,
link |
43:03.000
或是我其實只是個旁聽,
link |
43:04.000
那其實他不是旁聽的,
link |
43:05.000
他改成說我其實只是個旁聽的,
link |
43:07.000
隨便做就第一名了。
link |
43:08.000
那這個時候你就會覺得很緊張,
link |
43:10.000
尤其他如果是你更認識的人,
link |
43:12.000
隔壁小毛得到第一名,
link |
43:13.000
到處耀武揚威的時候,
link |
43:15.000
你就會開始有點緊張,
link |
43:16.000
你就會說等一下,
link |
43:17.000
你不要得意,
link |
43:18.000
我等一下就去把你刷下來這樣。
link |
43:20.000
那這個時候,
link |
43:21.000
你要不要理他呢?
link |
43:22.000
你不要理他。
link |
43:23.000
根據過去的經驗,
link |
43:24.000
就在public leaderboard上排前幾名的,
link |
43:27.000
往往public是很容易剷掉這樣子,
link |
43:29.000
所以在public的testing上面得到太好的結果,
link |
43:32.000
也不用高興得太早。
link |
43:41.000
其實最好的做法,
link |
43:44.000
就是用validation log最小的直接挑就好了,
link |
43:48.000
就是你不要去管你的public testing set的結果。
link |
43:52.000
那我知道說在實作上,
link |
43:54.000
你不太可能這麼做,
link |
43:55.000
因為public set的結果你有看到,
link |
43:57.000
所以他對你的模型的選擇可能還是有一些影響的,
link |
44:01.000
但是你要越少去看public testing set的結果越好。
link |
44:06.000
這樣我回答到你的問題嗎?
link |
44:13.000
好,如果有其他問題,
link |
44:14.000
我等一下再回答。
link |
44:15.000
好,那這個是,
link |
44:18.000
剛才忘了附屬那個同學的問題啦。
link |
44:23.000
線上直播的同學,
link |
44:24.000
我附屬一下剛才那個同學的問題,
link |
44:26.000
他的問題是說,
link |
44:27.000
所以我們不能去看public testing set的結果嗎?
link |
44:30.000
理想上是,
link |
44:32.000
就理想上,
link |
44:33.000
你就用validation set挑就好,
link |
44:34.000
然後上傳以後,
link |
44:35.000
怎樣就是怎樣,
link |
44:36.000
有過那個strong baseline以後就不要再去動它了,
link |
44:40.000
那這樣子你比較不會,
link |
44:41.000
那這樣子可以避免你overfit在testing set上面。
link |
44:46.000
好,那但是這邊會有一個問題,
link |
44:49.000
就是怎麼分training set跟validation set呢?
link |
44:53.000
那如果在助教程式裡面,就是隨機分的。
link |
44:56.000
但是你可能會說,
link |
44:57.000
搞不好我這個分分的不好啊,
link |
44:59.000
搞不好我分到很奇怪的validation set啊,
link |
45:02.000
會導致我的結果很差啊。
link |
45:03.000
如果你有這個擔心的話,
link |
45:05.000
那你可以用N4的cross validation。
link |
45:09.000
那N4的cross validation是怎麼做的呢?
link |
45:11.000
就是你先把你的訓練資料切成N等份,
link |
45:15.000
在這個例子裡面呢,我們切成3等份。
link |
45:19.000
切完以後,
link |
45:20.000
你拿其中一份當作validation set,
link |
45:23.000
另外兩份當training set。
link |
45:26.000
然後這件事情,你要重複三次。
link |
45:29.000
也就是說,
link |
45:30.000
你先第一份第二份當training,
link |
45:32.000
第三份當validation,
link |
45:34.000
然後第一份第三份當training,
link |
45:35.000
第二份當validation,
link |
45:36.000
第一份當validation,
link |
45:37.000
第二份第三份當training。
link |
45:38.000
然後接下來,你有三個模型,
link |
45:41.000
你不知道哪一個是好的,
link |
45:43.000
你就把這三個模型,
link |
45:45.000
在這三個setting下,
link |
45:47.000
這三個training跟validation的data set上面,
link |
45:52.000
通通跑過一次。
link |
45:54.000
然後把這三個模型,
link |
45:56.000
在這三種狀況的結果都平均起來。
link |
46:00.000
把每一個模型,
link |
46:01.000
在這三種狀況的結果都平均起來。
link |
46:04.000
再看看誰的結果最好。
link |
46:07.000
再看看誰的結果最好。
link |
46:09.000
那假設現在model 1的結果最好,
link |
46:12.000
你用這三個fold,
link |
46:15.000
得出來的結果是model 1最好,
link |
46:18.000
然後你再把model 1
link |
46:20.000
用在全部的training set上,
link |
46:23.000
然後訓練出來的模型,
link |
46:24.000
再用在testing set上面。
link |
46:27.000
這個是M4的cross-validation。
link |
46:31.000
那這個就是這門課前期的攻略,
link |
46:35.000
它可以帶你打贏前期所有的部分。
link |
46:38.000
那接下來,也許你要問的一個問題是,
link |
46:42.000
上週結束的時候,
link |
46:44.000
不是講到預測2月26號,
link |
46:47.000
也就是上週五的觀看人數嗎?
link |
46:50.000
到底結果做得怎麼樣?
link |
46:54.000
好,那這個就是我們要做的結果啦。
link |
46:56.000
上週比較多人選了三層的network,
link |
46:59.000
所以我們就把三層的network
link |
47:01.000
拿來測試一下。
link |
47:03.000
以下是測試的結果,
link |
47:06.000
我們就沒有再調參數了,
link |
47:08.000
大家決定用三層的就是下好離手了,
link |
47:10.000
就直接用上去了。
link |
47:11.000
好,得到的結果呢,是這個樣子了。
link |
47:14.000
這個圖上呢,這個橫軸啊,
link |
47:16.000
就是從2021年的1月1號開始,
link |
47:20.000
一直往下。
link |
47:22.000
然後紅色的線是真實的數字,
link |
47:25.000
藍色的線是預測的結果。
link |
47:28.000
2月26號在這邊啦。
link |
47:30.000
這個是今年2021年觀看人數最高的一天啦。
link |
47:39.000
那機器的預測怎麼樣呢?
link |
47:41.000
哇,非常的慘,差距非常的大,
link |
47:44.000
差距有2.58K,這麼多。
link |
47:48.000
感謝大家,為了讓這個模型不準,
link |
47:51.000
上週我花了很多力氣去點了這個video,
link |
47:55.000
所以這一天是今年觀看人數最多的一天。
link |
48:00.000
那你可能會想說,那別的模型怎麼樣呢?
link |
48:03.000
其實我也跑了一層、二層跟四層的看看啦,
link |
48:06.000
所有的模型都會慘掉。
link |
48:09.000
兩層跟三層的錯誤率都是2點多K,
link |
48:12.000
其實四層跟一層比較好,都是1.8K左右。
link |
48:17.000
但是這四個模型不約而同的,
link |
48:20.000
覺得2月26號應該是個低點,
link |
48:23.000
但實際上2月26號是一個峰值。
link |
48:27.000
那模型其實會覺得它是個低點,
link |
48:29.000
也不能怪它,因為根據過去的資料,
link |
48:31.000
禮拜五就是沒有人要學機器學習,
link |
48:34.000
禮拜五晚上大家出去玩了,
link |
48:36.000
禮拜五觀看的人數是最少的,
link |
48:39.000
但是2月26號出現了反常的狀況。
link |
48:43.000
那這個就不能怪模型了,
link |
48:46.000
我覺得出現這種狀況應該算是另外一種錯誤的形式,
link |
48:50.000
這種錯誤的形式我們這邊叫做Mismatch。
link |
48:54.000
也有人會說Mismatch也算是一種Overfitting,
link |
48:57.000
這樣也可以啦,這都只是名詞定義的問題。
link |
49:00.000
那我這邊想要表達的事情是,
link |
49:02.000
Mismatch它的原因跟Overfitting其實不一樣,
link |
49:07.000
一般的Overfitting你可以用收集更多的資料來克服,
link |
49:12.000
但是Mismatch意思是說,
link |
49:14.000
你今天的訓練資料跟測試資料,
link |
49:17.000
它們的分佈是不一樣的,
link |
49:19.000
在訓練資料跟測試資料分佈是不一樣的時候,
link |
49:21.000
你訓練資料再增加,其實也沒有幫助了。
link |
49:26.000
那其實在多數的作業裡面,
link |
49:28.000
我們不會遇到這種Mismatch的問題,
link |
49:31.000
我們都有把題目設計好了,
link |
49:34.000
訓練資料跟測試資料的分佈差很多。
link |
49:37.000
舉例來說,以剛才作業一的COVID-19為例的話,
link |
49:41.000
假設我們今天資料在分訓練資料跟測試資料的時候,
link |
49:45.000
我們說2020年的資料是訓練資料,
link |
49:48.000
2021年的資料是測試資料,
link |
49:51.000
那Mismatch的問題可能就很嚴重了,
link |
49:53.000
這個我們其實有試過了,
link |
49:55.000
試了一下,如果今天用2020年當訓練資料,
link |
49:58.000
2021年當測試資料,你就怎麼做都是慘的,
link |
50:01.000
做不起來,你訓練什麼模型都會慘掉。
link |
50:04.000
因為2020年的資料跟2021年的資料,
link |
50:07.000
他們的背後的分佈其實就是不一樣的。
link |
50:10.000
所以你拿2020年的資料來訓練,
link |
50:12.000
在2021年的作業一的資料上你根本就預測不準,
link |
50:16.000
所以後來助教是用了別的方式來分割訓練資料跟測試資料。
link |
50:22.000
所以我們多數的作業都不會有這種Mismatch的問題,
link |
50:27.000
那除了作業十一,因為作業十一就是針對Mismatch的問題來設計的,
link |
50:32.000
作業十一也是一個影像分類的問題,
link |
50:35.000
這是他的訓練資料,看起來蠻正常的,
link |
50:38.000
但他測試資料就是長這樣子,
link |
50:41.000
所以你知道這個時候增加資料哪有什麼用呢?
link |
50:45.000
增加資料你也沒有辦法讓你的模型做得更好,
link |
50:48.000
所以這種問題要怎麼解決,留待作業十一的時候再講。
link |
50:55.000
那你可能會問說,我怎麼知道現在到底是不是Mismatch呢?
link |
51:00.000
那我覺得要不知道是不是Mismatch,
link |
51:03.000
那就要看你對這個資料本身的理解了。
link |
51:06.000
你可能要對你的訓練資料跟測試資料的產生方式有一些理解,
link |
51:10.000
才能判斷說他是不是遇到了Mismatch的狀況。
link |
51:15.000
好,那這個就是我們作業的攻略,
link |
51:19.000
那我們在這邊停下來,看看大家有沒有問題要問的。