back to index

【機器學習2021】Transformer (上)


link |
00:00.000
好,那接下來呢,我們要講這個作業五呢,
link |
00:06.960
大家會用上的 Transformer
link |
00:09.400
那我們其實在之前已經提了 Transformer 提了不下 N 次
link |
00:13.400
那如果你還不知道 Transformer 是什麼的話
link |
00:15.800
Transformer 其實就是那個變形金剛,知道嗎?
link |
00:18.800
變形金剛的英文呢,就是 Transformer
link |
00:21.800
那 Transformer 呢,也跟我們之後會提到的 BERT 有非常強烈的關係
link |
00:28.400
所以這邊呢,有一個 BERT 探出頭來
link |
00:31.200
代表說 Transformer 跟 BERT 是很有關係的
link |
00:35.200
那 Transformer 是什麼呢?
link |
00:37.000
Transformer 呢,就是一個 Sequence-to-Sequence 的 Model
link |
00:42.400
那 Sequence-to-Sequence 的 Model 呢,它的縮寫啊,我們會寫作 Seq-to-Seq
link |
00:47.600
那 Sequence-to-Sequence 的 Model 又是什麼呢?
link |
00:50.400
我們之前呢,在講 Input 是一個 Sequence 的 Case 的時候
link |
00:54.200
我們說 Input 是一個 Sequence,那 Output 呢,有幾種可能
link |
00:58.400
一種是 Input 跟 Output 的長度一樣
link |
01:01.200
那這個是在作業二的時候做的
link |
01:04.200
那有一個 Case 是這個 Output 只 Output 一個東西
link |
01:07.800
那這個是在作業四的時候做的
link |
01:10.000
那接下來作業五的 Case 是
link |
01:12.000
我們不知道應該要 Output 多長
link |
01:15.600
由機器自己決定 Output 的長度
link |
01:20.200
好,那有什麼樣的例子,有什麼樣的應用
link |
01:22.800
是我們需要用到這種 Sequence-to-Sequence 的 Model
link |
01:26.200
也就是 Input 是一個 Sequence, Output 是一個 Sequence
link |
01:28.600
但是我們不知道 Output 應該有的長度
link |
01:31.200
應該要由機器來自己決定 Output 長度有什麼樣的應用呢?
link |
01:35.600
舉例來說,一個很好的應用就是語音辨識
link |
01:39.200
在做語音辨識的時候,輸入是聲音訊號
link |
01:42.600
那我們在這門課裡面已經看過好多次說
link |
01:45.200
輸入的聲音訊號其實就是一串的 Vector
link |
01:49.200
輸出是什麼?輸出是語音辨識的結果
link |
01:53.400
也就是輸入的這段聲音訊號所對應的文字
link |
01:56.800
我們這邊用圈圈來代表文字
link |
02:00.200
每一個圈圈就代表比如說中文裡面的一個方塊字
link |
02:05.400
那今天輸入跟輸出的長度
link |
02:08.800
當然是有一些關係,但是卻沒有絕對的關係
link |
02:12.800
我們說輸入的聲音訊號它的長度是大T
link |
02:15.800
我們並沒有辦法知道說根據大T
link |
02:19.400
輸出的這個長度N一定是多少
link |
02:22.600
那怎麼辦呢?由機器自己決定
link |
02:25.600
由機器自己去聽這段聲音訊號的內容
link |
02:28.400
自己決定它應該要輸出幾個文字
link |
02:31.600
它輸出的語音辨識結果
link |
02:33.400
輸出的句子裡面應該包含幾個字
link |
02:36.800
由機器自己來決定
link |
02:39.000
這個是語音辨識
link |
02:40.800
還有很多其他的例子
link |
02:42.400
比如說做業務我們會做機器翻譯
link |
02:45.200
讓機器讀一個語言的句子
link |
02:47.600
輸出另外一個語言的句子
link |
02:50.800
那在做機器翻譯的時候
link |
02:52.600
輸入的文字的長度是N
link |
02:55.000
輸出的句子的長度是N'
link |
02:57.800
那N跟N'之間的關係也要由機器自己來決定
link |
03:03.000
我們說輸入機器學習這個句子
link |
03:05.400
輸出是Machine Learning
link |
03:07.200
那這個輸入是有四個字
link |
03:10.600
輸出有兩個英文的詞彙
link |
03:13.200
但是並不是所有中文跟英文的關係
link |
03:15.800
都是輸出就是輸入的二分之一
link |
03:19.000
到底輸入一段句子
link |
03:21.000
輸出英文的句子要多長
link |
03:23.200
由機器自己決定
link |
03:25.600
甚至你可以做更複雜的問題
link |
03:27.800
比如說做語音翻譯
link |
03:30.200
什麼叫做語音翻譯
link |
03:31.600
語音翻譯就是你對機器說一句話
link |
03:34.800
比如說Machine Learning
link |
03:36.200
它輸出的不是英文
link |
03:38.400
它直接把它聽到的英文的聲音訊號
link |
03:41.600
翻譯成中文
link |
03:43.000
所以它說Machine Learning
link |
03:44.600
它輸出的是機器學習
link |
03:47.600
那你可能會問說
link |
03:48.800
為什麼我們要做Speech Translation這樣的任務呢
link |
03:52.000
為什麼我們不說
link |
03:53.000
我們直接做一個語音辨識
link |
03:54.800
再做一個機器翻譯
link |
03:56.400
把語音辨識系統跟機器翻譯系統接起來
link |
04:00.200
就直接是語音翻譯呢
link |
04:02.800
那是因為其實世界上有很多語言
link |
04:05.200
它根本連文字都沒有
link |
04:07.400
世界上有超過七千種語言
link |
04:10.400
那其實在這七千種語言有超過半數
link |
04:13.600
其實是沒有文字的
link |
04:16.000
對這些沒有文字的語言而言
link |
04:18.200
你要做語音辨識
link |
04:20.000
可能根本就沒有辦法
link |
04:21.000
因為它沒有文字啊
link |
04:22.200
所以你根本就沒有辦法做語音辨識
link |
04:25.000
但我們有沒有可能對這些語言做語音翻譯
link |
04:29.400
直接把它翻譯成我們有辦法閱讀的文字呢
link |
04:34.600
一個很好的例子
link |
04:35.800
也許就是台語的語音辨識
link |
04:38.400
但我不會說台語沒有文字啦
link |
04:40.000
很多人覺得台語是有文字的
link |
04:41.800
但台語的文字並沒有那麼普及
link |
04:43.800
如果現在聽說小學都有教台語的文字了
link |
04:47.600
但台語的文字並不是一般人能夠看得懂的
link |
04:51.600
所以如果你做語音辨識
link |
04:53.600
你給機器一段台語
link |
04:56.200
然後它可能輸出是母湯
link |
04:58.800
那你根本就不知道這個段話在說什麼對不對
link |
05:01.400
所以我們期待說機器也許可以做翻譯
link |
05:04.200
做語音的翻譯
link |
05:05.600
跟對它講一句台語
link |
05:07.200
它直接輸出的是同樣意思的中文的句子
link |
05:11.400
那這樣一般人就可以看懂
link |
05:14.600
那有沒有可能做到這件事呢
link |
05:16.600
有沒有可能訓練一個類神經網路
link |
05:18.800
這個類神經網路聽某一種語言的聲音訊號
link |
05:21.800
輸出是另外一種語言的文字呢
link |
05:24.400
其實是有可能的
link |
05:26.800
那對於台語這個例子而言
link |
05:28.800
我們知道說今天你要訓練一個Neural Network
link |
05:31.600
你就需要有Input跟Output的Pair
link |
05:34.600
你需要有台語的聲音訊號
link |
05:36.600
跟中文文字的對應關係
link |
05:39.200
那這樣的資料好不好收集呢
link |
05:42.000
這樣子的資料並不是沒有可能收集的
link |
05:45.200
比如說YouTube上面有很多的鄉土句
link |
05:47.800
那叫鄉土句就是台語語音中文字幕
link |
05:51.800
所以你只要把它的台語語音載下來
link |
05:54.000
中文字幕載下來
link |
05:55.400
你就有台語聲音訊號跟中文直接的對應關係
link |
05:58.200
你就可以硬Train一個模型
link |
06:00.000
你就可以Train我們剛才講
link |
06:01.400
我們等一下要講的Transformer
link |
06:03.200
然後叫機器直接做台語的語音辨識
link |
06:07.000
輸入台語輸出中文
link |
06:10.600
那你可能會覺得這個想法很狂
link |
06:12.400
而且好像聽起來有很多很多的問題
link |
06:14.600
那我們實驗室就載了1500個小時的鄉土句的資料
link |
06:18.800
然後就真的拿來訓練一個語音辨識系統
link |
06:21.800
那你可能會覺得說這聽起來有很多的問題
link |
06:23.600
舉例來說這個鄉土句有很多的雜訊
link |
06:26.600
有很多的音樂
link |
06:28.000
就不要管它這樣子
link |
06:29.600
然後這個鄉土句的字幕不一定跟聲音有對起來
link |
06:33.800
就不要管它這樣子
link |
06:36.800
你可能會想說台語不是還有一些
link |
06:39.200
比如說台羅拼音
link |
06:40.800
台語也是有類似音標這種東西
link |
06:42.600
也許我們可以先辨識成音標
link |
06:44.800
當作一個中介
link |
06:45.800
然後再從音標轉成中文
link |
06:47.600
也沒有這樣做
link |
06:48.600
直接訓練一個模型
link |
06:50.000
輸入是聲音訊號
link |
06:51.200
輸出直接就是中文的文字
link |
06:53.400
這種沒有想太多
link |
06:55.600
直接資料倒進去
link |
06:56.800
就訓練一個模型的行為
link |
06:58.400
就叫做硬勸一發
link |
07:00.000
知道嗎
link |
07:03.400
那你可能會想說
link |
07:04.400
這樣子硬勸一發
link |
07:06.000
到底能不能夠做一個台語語音辨識系統呢
link |
07:09.600
其實還真的是有可能的
link |
07:12.400
以下是一些真正的結果啦
link |
07:15.800
那機器在聽了1500個小時的鄉土句以後
link |
07:19.800
你可以對它輸入一句台語
link |
07:21.400
然後它就輸出一句中文的文字
link |
07:23.200
以下是真正的例子啦
link |
07:24.600
機器聽到的聲音是這樣子的
link |
07:26.000
那你可以做一下台語的語音聽力測驗
link |
07:28.600
看看你辨識出來的
link |
07:29.800
跟機器是不是一樣的
link |
07:31.400
機器聽到這樣的句子
link |
07:33.400
你身體不堪
link |
07:35.000
機器輸出是什麼呢
link |
07:36.200
它的輸出是你的身體撐不住
link |
07:39.200
這個聲音訊號是你身體不堪
link |
07:41.600
但機器並不是輸出無堪
link |
07:43.600
而是它就輸出撐不住
link |
07:45.800
或者是機器聽到的是這樣的聲音訊號
link |
07:48.600
沒帶沒錢你為什麼要勤工
link |
07:50.600
沒帶沒錢你為什麼要勤工
link |
07:53.000
機器聽到沒帶沒錢
link |
07:54.600
它並不是輸出沒帶沒智
link |
07:56.800
它是輸出沒事這樣
link |
07:58.400
只要聽到四個音節沒帶沒錢
link |
08:00.800
但它知道說台語的沒帶沒錢
link |
08:02.800
翻成中文也許應該輸出沒事
link |
08:05.600
所以機器的輸出是沒事你為什麼要請假
link |
08:08.800
但機器其實也是蠻容易犯錯的啦
link |
08:11.000
以下特別找幾個犯錯的例子給你聽一下
link |
08:13.400
譬如說你聽聽這段聲音訊號
link |
08:15.400
沒聲喔
link |
08:16.800
它說沒聲喔
link |
08:18.200
我自己聽到的時候我覺得
link |
08:19.600
我跟機器的答案是一樣
link |
08:20.800
就是說要生了嗎
link |
08:23.400
但其實這句話正確的答案就是
link |
08:25.600
沒聲喔
link |
08:27.400
不會膩嗎
link |
08:29.000
但機器在倒裝
link |
08:30.800
你知道有時候你從
link |
08:32.200
台語轉成中文句子需要倒裝
link |
08:34.600
在倒裝的部分感覺就沒有太學起來
link |
08:38.000
舉例來說它聽到這樣的句子
link |
08:40.600
我有跟廠長拜託
link |
08:44.600
那機器的輸出是
link |
08:46.000
我有幫廠長拜託
link |
08:48.000
但是你知道說這句話其實是倒裝
link |
08:50.600
我有跟廠長拜託是我拜託廠長
link |
08:54.400
但機器對它來說
link |
08:55.800
如果台語跟中文的關係卻需要倒裝的話
link |
08:58.200
看起來學習起來還是有一點困難的
link |
09:01.000
那這個例子想要告訴你說
link |
09:02.600
直接台語聲音訊號轉繁體中文
link |
09:05.600
不是沒有可能
link |
09:07.000
是有可能可以做得到的
link |
09:09.000
那其實台灣有很多人都在做台語的語音辨識啦
link |
09:12.000
如果你想要知道更多關台語語音辨識的事情的話
link |
09:15.000
可以看一下下面這個網站
link |
09:18.400
好那台語語音辨識反過來
link |
09:20.800
就是台語的語音合成
link |
09:23.800
對不對
link |
09:24.400
我們如果是一個模型
link |
09:25.800
輸入台語聲音
link |
09:27.400
輸出中文的文字
link |
09:28.800
那就是語音辨識
link |
09:30.600
反過來輸入文字
link |
09:32.400
輸出聲音訊號
link |
09:34.000
就是語音合成
link |
09:36.400
好那這邊呢
link |
09:37.400
就是demo一下台語的語音合成啦
link |
09:40.200
那這個資料用的是台灣水蝦的資料
link |
09:43.000
那你只要google台灣水蝦就可以找到這個資料集
link |
09:46.000
裡面就是台語的聲音訊號
link |
09:48.600
那聽起來像是這個樣子
link |
09:50.400
比如說你跟他說
link |
09:51.600
歡迎來到台灣台大語音處理實驗室
link |
09:54.600
不過這邊是需要跟大家說明一下
link |
09:56.400
現在還沒有真的做end-to-end的模型啦
link |
09:59.000
這邊模型還是分成兩節
link |
10:00.400
他會先把這個中文的文字
link |
10:02.800
轉成台語的台羅拼音
link |
10:05.200
就像是台語的KK音標
link |
10:07.200
再把台語的KK音標轉成聲音訊號
link |
10:10.200
不過從台語的KK音標轉成聲音訊號這一段
link |
10:12.800
就是一個像是transformer的network
link |
10:15.800
其實是一個叫做Tagotron的model
link |
10:18.200
他本質上就是一個sequence-to-sequence的model
link |
10:21.000
大概長的是這個樣子
link |
10:22.800
好所以你輸入文字
link |
10:24.600
歡迎來到台大語音處理實驗室
link |
10:27.000
機器的輸出是這個樣子的
link |
10:28.800
歡迎來到台大語音處理實驗室
link |
10:33.000
或者是你對他說這一句中文
link |
10:35.600
然後他輸出的台語是這個樣子的
link |
10:38.400
最近肺炎很嚴重
link |
10:40.600
會常常嘴暗常常洗手
link |
10:43.400
不然就要看醫生
link |
10:45.200
所以你真的是可以
link |
10:46.800
合出台語的聲音訊號的
link |
10:49.400
就用我們在這一門課裡面學到的
link |
10:52.200
transformer或者是sequence-to-sequence的model
link |
10:56.400
好那剛才講的是跟語音比較有關的
link |
10:59.800
那在文字上
link |
11:01.200
也可以很廣泛的使用了sequence-to-sequence的model
link |
11:05.800
舉例來說你可以用sequence-to-sequence的model
link |
11:08.800
來訓練一個聊天機器人
link |
11:11.400
那你知道聊天機器人
link |
11:12.600
就是你對他說一句話
link |
11:14.200
他要給你一個回應
link |
11:16.200
輸入輸出都是文字
link |
11:19.000
文字就是一個factor sequence
link |
11:21.600
所以你完全可以用sequence-to-sequence的model
link |
11:24.800
來做一個聊天機器人
link |
11:27.600
那怎麼訓練一個聊天機器人呢
link |
11:29.800
你就要蒐集大量人的對話
link |
11:31.800
那像這種對話你可以蒐集那個
link |
11:34.000
電視劇、電影的台詞等等
link |
11:36.200
你可以蒐集到一堆人跟人之間的對話
link |
11:39.200
那假設在對話裡面有出現
link |
11:41.000
某一個人說hi
link |
11:42.200
那另外一個人說hello, how are you today
link |
11:44.600
那你就可以教機器說
link |
11:46.400
看到輸入是hi
link |
11:48.000
那你的輸出就要跟
link |
11:49.800
hello, how are you today
link |
11:51.200
越接近越好
link |
11:52.600
那就可以訓練一個sequence-to-sequence的model
link |
11:55.400
然後跟他說一句話
link |
11:56.400
他就會給你一個回應
link |
11:59.000
那事實上sequence-to-sequence的model
link |
12:01.600
在NLP的領域
link |
12:02.800
在natural language processing的領域的使用
link |
12:06.000
是比你想像的更為廣泛
link |
12:09.400
那其實很多natural language processing的任務
link |
12:13.000
都可以想成是
link |
12:15.400
question answering QA的任務
link |
12:18.400
怎麼說呢
link |
12:19.400
所謂的question answering就是
link |
12:21.200
給機器讀一段文字
link |
12:23.200
然後你問機器一個問題
link |
12:25.200
希望他可以給你一個正確的答案
link |
12:28.200
而很多你覺得跟question answering
link |
12:30.600
沒什麼關係的任務
link |
12:32.600
都可能可以想像成是QA
link |
12:36.200
怎麼說呢
link |
12:37.200
舉例來說假設你今天想做的是翻譯
link |
12:39.800
那機器讀的文章就是一個英文的句子
link |
12:42.800
問題是什麼
link |
12:43.600
問題就是這個句子的德文翻譯是什麼
link |
12:46.800
然後輸出的答案就是德文
link |
12:49.200
或者是你想要叫機器自動做摘要
link |
12:51.800
摘要就是給機器讀一篇長的文章
link |
12:54.000
叫他把長的文章的重點節錄出來
link |
12:57.000
那你就是給機器一段文字
link |
12:58.400
然後問題是這段文字的摘要是什麼
link |
13:01.200
然後期待他就可以輸出一個摘要
link |
13:04.000
或者是你想要叫機器做sentiment analysis
link |
13:06.800
什麼是sentiment analysis呢
link |
13:08.400
就是機器要自動判斷
link |
13:09.600
一個句子是正面的還是負面的
link |
13:11.800
那像這樣子的應用在
link |
13:13.400
假設你有做了一個產品
link |
13:14.800
然後上線以後你想要知道網友的評價
link |
13:17.200
但是你又不可能一直找人在ptp上
link |
13:19.000
把每篇文章都讀過
link |
13:20.500
所以怎麼辦
link |
13:21.500
你就做一個sentiment analysis的model
link |
13:23.900
看到有一篇文章裡面有提到你的產品
link |
13:26.500
然後就把這篇文章丟到你的model裡面
link |
13:28.600
去判斷說這篇文章是正面還是負面
link |
13:31.800
那怎麼把sentiment analysis這個問題
link |
13:33.900
看成是QA的問題呢
link |
13:35.500
你就給機器你要判斷正面還是負面的文章
link |
13:39.000
那你的問題就是
link |
13:40.100
這個句子是正面還是負面的
link |
13:41.800
然後希望機器可以告訴你答案
link |
13:43.900
所以各式各樣的NLP的問題
link |
13:46.600
往往都可以看作是QA的問題
link |
13:50.300
而QA的問題
link |
13:51.800
又可以用sequence to sequence的model來解
link |
13:56.100
那QA的問題
link |
13:57.500
怎麼用sequence to sequence的model來解呢
link |
14:00.800
就是有一個sequence to sequence的model
link |
14:02.900
輸入就是問題跟文章把它接在一起
link |
14:06.700
輸出就是問題的答案
link |
14:08.600
就結束了
link |
14:09.400
有問題加文章合起來
link |
14:11.200
是一段很長的文字嘛
link |
14:12.700
答案是一段文字嘛
link |
14:14.700
那sequence to sequence的model
link |
14:16.200
只要是輸入一段文字輸出一段文字
link |
14:18.300
只要是輸入一個sequence
link |
14:19.600
輸出一個sequence就可以解
link |
14:21.300
所以你可以把QA的問題
link |
14:23.200
硬是用sequence to sequence的model解
link |
14:25.300
叫他讀一篇文章讀一個問題
link |
14:27.400
然後就直接輸出答案
link |
14:29.200
所以這樣子的
link |
14:30.400
所以各式各樣的NLP的任務
link |
14:32.300
其實都有機會使用sequence to sequence的model
link |
14:37.400
但是我這邊必須要強調一下
link |
14:39.300
對多數NLP的任務
link |
14:41.100
或對多數的這個語音相關的任務而言
link |
14:45.400
往往為這些任務特製化模型
link |
14:49.400
你會得到更好的結果
link |
14:51.700
就什麼問題都用sequence to sequence的model
link |
14:53.900
就好像說你不管是做什麼事情
link |
14:56.200
都用瑞士刀一樣
link |
14:57.500
對不對
link |
14:57.900
瑞士刀可以做各式各樣的問題
link |
14:59.700
砍柴也可以用瑞士刀
link |
15:01.400
切菜也可以用瑞士刀
link |
15:02.400
但是他不見得是一個最好用的
link |
15:04.900
所以如果你為各式各樣不同的任務
link |
15:07.500
客製化各式各樣的模型
link |
15:09.700
往往可以得到比單用sequence to sequence的model
link |
15:13.600
更好的結果
link |
15:15.000
但是各個任務客製化的模型
link |
15:16.900
就不是我們這一門課的重點了
link |
15:19.300
如果你對這個人類語言處理
link |
15:22.500
包括語音
link |
15:23.300
包括自然語言處理
link |
15:24.700
這些相關的任務有興趣的話
link |
15:26.700
可以參考一下以下課程網頁的連結
link |
15:29.500
就是去年上的這個深度學習
link |
15:32.100
與人類語言處理這一門課的內容
link |
15:34.800
裡面就會教你各式各樣的任務
link |
15:37.100
最好的模型應該是什麼
link |
15:39.300
舉例來說在做語音辨識
link |
15:41.700
我們剛才講的是一個sequence to sequence的model
link |
15:44.700
輸入一段聲音訊號
link |
15:46.000
直接輸出文字
link |
15:47.800
今天Google的Pixel 4
link |
15:50.100
Google官方也告訴你說
link |
15:52.900
Pixel 4也是用一個end-to-end的neural network
link |
15:56.500
Pixel 4裡面就是有一個neural network
link |
15:58.600
輸入聲音訊號
link |
15:59.900
輸出就直接是文字
link |
16:01.900
但它其實用的不是sequence to sequence的model
link |
16:05.900
它用的是一個叫做RNN transducer的model
link |
16:09.800
那像這些模型
link |
16:10.900
它就是為了語音的某些特性所設計
link |
16:14.200
所以其實可以表現得更好
link |
16:16.400
那至於每一個任務
link |
16:17.700
有什麼樣客製化的模型
link |
16:19.600
那這個就是另外一門課的主題
link |
16:22.400
就不是我們今天想要探討的重點
link |
16:26.500
好 那我剛才講了很多sequence to sequence的model
link |
16:29.200
在語音還有自然語言處理上的應用
link |
16:31.800
那其實有很多應用
link |
16:34.100
你不覺得它是一個sequence to sequence的model的問題
link |
16:37.900
但你都可以應用sequence to sequence的model的問題
link |
16:42.000
硬解它
link |
16:43.100
舉例來說 文法剖析
link |
16:45.600
文法剖析要做的事情就是
link |
16:47.600
給機器一段文字
link |
16:48.800
比如說deep learning is very powerful
link |
16:51.000
機器要做的事情
link |
16:52.200
是產生一個文法的剖析術
link |
16:54.400
告訴我們說deep加learning合起來
link |
16:57.400
是一個名詞片語
link |
16:59.600
然後very加powerful合起來
link |
17:01.800
是一個形容詞片語
link |
17:03.300
這個形容詞片語加意思以後
link |
17:05.000
會變成一個動詞片語
link |
17:06.300
動詞片語加名詞片語合起來
link |
17:08.300
是一個句子
link |
17:09.700
那文法剖析要做的事情
link |
17:12.500
就是產生這樣子的一個parsing trick
link |
17:15.700
所以在文法剖析的任務裡面
link |
17:18.100
假設你想要deep learning解的話
link |
17:20.200
輸入是一段文字
link |
17:22.100
它是一個sequence
link |
17:23.500
但輸出看起來不像是一個sequence
link |
17:26.200
輸出是一個樹狀的結構
link |
17:29.600
但事實上一個樹狀的結構
link |
17:32.200
可以硬是把它看作是一個sequence
link |
17:36.700
怎麼說呢
link |
17:37.700
這個樹狀結構
link |
17:39.200
可以對應到一個這樣子的sequence
link |
17:42.800
從這個sequence裡面
link |
17:44.300
你也可以看出這個樹狀的結構
link |
17:46.200
有一個S
link |
17:47.300
有一個左括號
link |
17:48.200
有一個右括號
link |
17:49.400
然後S裡面有一個nonphrase
link |
17:51.800
有一個左括號一個右括號
link |
17:53.500
NP裡面有一個
link |
17:55.000
NP也有一個左括號一個右括號
link |
17:56.900
然後NP裡面有ease
link |
17:58.400
然後有這個形容詞片語
link |
18:00.800
它有一個左括號右括號
link |
18:02.200
這一個sequence
link |
18:03.400
它就代表了這一個tree的structure
link |
18:06.700
你先把tree的structure
link |
18:08.100
轉成一個sequence以後
link |
18:10.400
你就可以用sequence to sequence的model
link |
18:13.100
硬解它
link |
18:14.100
你就train一train一個sequence to sequence的model
link |
18:16.700
讀這個句子
link |
18:17.700
然後直接輸入這一串文字
link |
18:19.500
再把這串文字轉成一個樹狀的結構
link |
18:22.700
你就可以硬是用sequence to sequence的model
link |
18:25.400
來做文法剖析這件事
link |
18:28.700
這個概念聽起來非常的狂
link |
18:31.500
但這還是
link |
18:32.400
這是真的可以做得到
link |
18:34.200
你可以讀一篇文章叫做
link |
18:36.000
Grammar as a Foreign Language
link |
18:38.600
那這篇文章其實不是太新的文章
link |
18:40.700
你會發現它放到archive上面的時間
link |
18:43.100
是14年的年底
link |
18:44.800
所以其實也是一個
link |
18:46.100
上古神獸等級的文章
link |
18:48.400
那在這篇文章問世的時候
link |
18:50.000
那個時候sequence to sequence model還不流行
link |
18:52.600
那時候sequence to sequence model
link |
18:54.200
主要只有被用在翻譯上
link |
18:57.100
所以這篇文章的title才會取說
link |
18:59.200
Grammar as a Foreign Language
link |
19:01.400
就是說它把文法剖析這件事情
link |
19:04.800
當作是一個翻譯的問題
link |
19:07.500
把文法當作是另外一種語言
link |
19:10.100
直接套用一個當時人們認為
link |
19:12.300
只能用在翻譯上的模型
link |
19:14.200
硬做
link |
19:14.900
結果它得到state of the art的結果
link |
19:17.900
那我其實在國際會議的時候
link |
19:19.100
其實有遇過這個第一作者
link |
19:21.600
也其實有遇過這個Oreal Vineyard
link |
19:24.300
然後那個時候sequence to sequence model
link |
19:25.800
還是一個非常潮的東西
link |
19:27.200
然後那時候在我的認知裡面
link |
19:28.600
我覺得這個模型應該是挺難train的
link |
19:30.400
我問他說
link |
19:32.200
train這種sequence to sequence model
link |
19:34.000
有沒有什麼tips啊
link |
19:36.700
沒想到你這個做個文法剖析
link |
19:39.100
用sequence to sequence model
link |
19:40.200
居然可以硬做到state of the art
link |
19:41.800
這應該有什麼很厲害的tips吧
link |
19:44.100
他說沒有什麼tips
link |
19:45.600
他說我連add-on都沒有用
link |
19:47.500
我直接gradient descent就train起來了
link |
19:49.900
我第一次train就成功了
link |
19:51.700
只是我要train到state of the art
link |
19:54.000
還是稍微調了一下參數而已
link |
19:58.500
我也不知道是真的還假的啦
link |
19:59.900
不過今天sequence to sequence model
link |
20:02.100
真的是已經被很廣泛的
link |
20:03.800
在應用在各式各樣的應用上了
link |
20:07.800
那還有一些任務
link |
20:09.000
可以用sequence to sequence model
link |
20:11.000
舉例來說multi-label classification
link |
20:14.900
什麼是multi-label classification呢
link |
20:17.400
這邊你要比較一下
link |
20:18.700
multi-class classification
link |
20:20.700
跟multi-label classification
link |
20:23.200
multi-class classification
link |
20:24.700
跟multi-label classification
link |
20:26.200
聽起來名字很像
link |
20:27.500
但他們其實是不一樣的事情
link |
20:29.300
multi-class classification
link |
20:30.900
意思是說我們有不只一個class
link |
20:34.200
機器要做的事情
link |
20:35.400
是從數個class裡面
link |
20:37.100
選擇某一個class出來
link |
20:40.000
但是multi-label classification
link |
20:42.200
意思是說同一個東西
link |
20:44.400
它可以屬於多個不只一個class
link |
20:48.400
舉例來說
link |
20:49.300
你來做文章分類的時候
link |
20:50.800
可能這篇文章屬於class 1跟3
link |
20:53.500
這篇文章屬於class 3、9、10、11等等
link |
20:58.100
那你可能會說
link |
20:59.200
這種multi-label classification的問題
link |
21:01.700
要怎麼解呢
link |
21:02.800
能不能直接把它當作一個
link |
21:04.400
multi-class classification的問題來解呢
link |
21:06.900
舉例來說
link |
21:08.200
我把這些文章丟到一個classifier裡面
link |
21:11.000
那本來classifier只會輸出一個答案
link |
21:13.500
輸出分數最高的那個答案
link |
21:15.400
我現在就輸出分數最高的前三名
link |
21:18.400
看看能不能解multi-label classification的問題
link |
21:21.800
但這種方法呢
link |
21:23.100
可能是行不通的
link |
21:24.400
為什麼
link |
21:25.200
因為每一篇文章
link |
21:27.200
對應的class的數目根本不一樣啊
link |
21:29.700
有些文章對應的class的數目是兩個
link |
21:33.600
有的是一個有的是三個
link |
21:35.100
所以如果你說
link |
21:36.100
我直接取一個threshold
link |
21:37.600
我直接取分數最高的前三名
link |
21:40.200
classifier output的分數最高的前三名
link |
21:42.300
來當作我的輸出
link |
21:43.700
顯然不一定能夠得到好的結果
link |
21:46.000
那怎麼辦呢
link |
21:47.100
這邊可以用sequence to sequence
link |
21:49.400
映作
link |
21:50.100
你知道嗎
link |
21:51.000
輸入一篇文章
link |
21:52.300
輸出就是class
link |
21:53.500
就結束了
link |
21:54.300
機器自己決定
link |
21:55.500
它要輸出幾個class
link |
21:57.700
我們說sequence to sequence model
link |
21:59.500
就是說機器自己決定
link |
22:01.100
輸出幾個東西
link |
22:02.400
輸出的output sequence的長度是多少
link |
22:04.900
那既然你沒有辦法決定class的數目
link |
22:07.100
怎麼辦
link |
22:07.900
機器幫你決定
link |
22:09.500
它自己決定
link |
22:10.400
每篇文章要屬於多少個class
link |
22:14.600
或者是object detection
link |
22:16.500
這個看起來跟sequence to sequence model
link |
22:18.500
應該八竿子打不著的問題
link |
22:20.500
它也可以用sequence to sequence model
link |
22:22.400
硬解
link |
22:23.500
object detection就是給機器一張圖片
link |
22:26.500
然後它要把圖片裡面的物件框出來
link |
22:29.100
它要框出說這個是斑嘛
link |
22:30.800
這個也是斑嘛
link |
22:31.600
這個也是斑嘛
link |
22:32.800
但這種問題
link |
22:34.000
可以用sequence to sequence映作
link |
22:36.600
那至於怎麼做
link |
22:37.500
我們這邊就不細講
link |
22:39.600
那我這邊放了一篇文件
link |
22:41.200
放一個連結給大家參考
link |
22:43.700
好那講這麼多
link |
22:44.600
就是要告訴你說sequence to sequence model
link |
22:47.100
它是一個很powerful的model
link |
22:48.800
它是一個很有用的model
link |
22:50.800
那我們現在就是要來學
link |
22:52.800
怎麼做sequence to sequence這件事
link |
22:56.300
好那一般的sequence to sequence model
link |
22:58.800
它裡面會分成兩塊
link |
23:01.700
一塊是encoder
link |
23:04.200
另外一塊是decoder
link |
23:06.900
你inbringer sequence
link |
23:08.200
由encoder負責處理這個sequence
link |
23:10.700
再把處理好的結果丟給decoder
link |
23:13.000
由decoder決定
link |
23:14.300
它要輸出什麼樣的sequence
link |
23:16.800
那等一下我們都還會再細講
link |
23:19.000
encoder跟decoder內部的架構
link |
23:22.500
那sequence to sequence model的起源
link |
23:24.800
其實非常的早
link |
23:25.800
在14年的9月
link |
23:28.600
就有一篇sequence to sequence model
link |
23:31.000
用在翻譯的文章
link |
23:32.900
被放到archive上
link |
23:34.800
那你可以想像
link |
23:35.800
當時的sequence to sequence model
link |
23:37.400
看起來還是比較陽春的
link |
23:39.200
那今天講到sequence to sequence model的時候
link |
23:41.400
大家第一個會浮現在腦中的
link |
23:43.800
可能都是我們今天的主角
link |
23:46.300
也就是transformer
link |
23:47.800
它有一個encoder架構
link |
23:49.400
有一個decoder架構
link |
23:50.600
那裡面有很多花花綠綠的block
link |
23:53.200
那等一下就會講一下
link |
23:54.600
這裡面每一個花花綠綠的block
link |
23:56.800
分別在做的事情是什麼
link |
23:59.600
好那接下來呢
link |
24:00.800
我們就來講encoder的部分
link |
24:03.800
那sequence to sequence model
link |
24:05.400
encoder要做的事情
link |
24:07.100
就是給一排向量
link |
24:10.000
輸出另外一排向量
link |
24:13.400
那給一排向量
link |
24:14.900
輸出一排向量這件事情
link |
24:17.000
很多模型都可以做到
link |
24:19.300
那可能第一個想到的是
link |
24:20.400
我們剛講完的self-attention
link |
24:22.300
那其實不只是self-attention
link |
24:24.000
RNN CNN
link |
24:25.700
其實也都能夠做到
link |
24:27.200
input一排向量
link |
24:28.600
output另外一個同樣長度的向量
link |
24:33.000
好那在transformer裡面
link |
24:34.800
transformer的encoder
link |
24:36.400
用的就是self-attention
link |
24:39.200
那這邊看起來有點複雜
link |
24:40.700
我們用另外一張圖呢
link |
24:42.200
來仔細的解釋一下
link |
24:43.800
這個encoder的架構
link |
24:45.100
等一下呢
link |
24:45.900
再來跟這個原始的
link |
24:47.700
transformer的論文裡面的圖呢
link |
24:49.800
進行比對
link |
24:51.900
好那現在的encoder裡面
link |
24:53.900
會分成很多很多的block
link |
24:57.200
每一個block
link |
24:58.200
都是輸入一排向量
link |
25:00.200
輸出一排向量
link |
25:01.900
輸入一排向量到第一個block
link |
25:03.700
第一個block輸出另外一排向量
link |
25:05.500
再輸給另外一個block
link |
25:07.000
到最後一個block
link |
25:08.100
會輸出最終的vector sequence
link |
25:11.300
那每一個block
link |
25:12.300
其實並不是neural network的一層
link |
25:14.500
這邊之所以不稱說
link |
25:16.200
每一個block是一個layer
link |
25:17.800
是因為每一個block裡面做的事情
link |
25:20.000
是好幾個layer在做的事情
link |
25:22.700
在transformer的encoder裡面
link |
25:24.700
每一個block做的事情
link |
25:26.300
大概是這樣子的
link |
25:27.500
先做一個self-attention
link |
25:29.700
input一排vector以後呢
link |
25:31.400
做self-attention
link |
25:32.600
考慮整個sequence的資訊
link |
25:34.500
output另外一排vector
link |
25:36.400
接下來這一排vector
link |
25:38.100
會再丟到
link |
25:39.300
fully connected的free-forward network裡面
link |
25:41.800
丟到fully connected的network裡面
link |
25:43.900
再output另外一排vector
link |
25:45.500
那這一排vector就是block的輸出
link |
25:48.900
那事實上在原來的transformer裡面呢
link |
25:51.900
它做的事情是更複雜的
link |
25:54.200
實際上做的事情是這個樣子的
link |
25:56.300
這是self-attention的layer
link |
25:58.000
在我們剛才講self-attention的時候
link |
25:59.900
我們說輸入一排vector
link |
26:01.500
就輸出一排vector
link |
26:02.900
這邊的每一個vector
link |
26:04.300
它是考慮了所有的input以後
link |
26:07.300
所得到的結果
link |
26:09.000
在transformer裡面呢
link |
26:10.500
它加入了一個設計
link |
26:12.200
是說我們不只是輸出這個vector
link |
26:15.900
我們還要把這個vector呢
link |
26:17.700
加上它的input
link |
26:19.300
它要把input拉過來
link |
26:21.600
直接加給輸出
link |
26:23.700
得到新的output
link |
26:26.300
也就是說這邊假設這個vector叫做A
link |
26:28.700
這個vector叫做B
link |
26:29.900
你會把AB加起來
link |
26:31.900
當作是新的輸出
link |
26:34.100
那這件事情
link |
26:35.300
這樣子的network架構
link |
26:36.900
叫做residual的connection
link |
26:39.500
那其實這種residual的connection
link |
26:41.100
在deep learning的領域用的是非常的廣泛
link |
26:43.600
之後如果我們有時間的話
link |
26:45.200
再來詳細介紹
link |
26:46.500
為什麼要用residual的connection
link |
26:48.500
那你現在就先知道說
link |
26:50.000
有一種connection
link |
26:51.000
有一種network的設計的架構
link |
26:52.800
叫做residual的connection
link |
26:54.500
它會把input直接跟output加起來
link |
26:58.600
得到新的vector
link |
27:00.900
得到這個residual的結果以後
link |
27:04.000
再把它做一件事情
link |
27:05.800
叫做normalization
link |
27:08.000
那這邊用的不是batch normalization
link |
27:11.500
這邊用的叫做layer normalization
link |
27:15.800
那layer normalization做的事情
link |
27:18.300
比batch normalization更簡單一點
link |
27:20.400
layer normalization做的事情是這個樣子的
link |
27:23.100
輸入一個向量
link |
27:24.600
輸出另外一個向量
link |
27:25.800
這邊不需要考慮batch
link |
27:26.900
剛才在講batch normalization的時候
link |
27:28.600
需要考慮batch
link |
27:29.500
但這邊這個layer normalization
link |
27:31.400
不用考慮batch的資訊
link |
27:33.200
輸入一個向量
link |
27:34.400
輸出另外一個向量
link |
27:36.000
那這個layer normalization
link |
27:37.400
做的事情是什麼呢
link |
27:38.500
它會把輸入的這個向量
link |
27:40.500
計算它的mean跟standard deviation
link |
27:44.100
但是要注意一下
link |
27:45.500
剛才在講batch normalization的時候
link |
27:47.700
我們是對同一個dimension
link |
27:50.000
不同的feature
link |
27:51.600
我們是對不同example
link |
27:53.200
不同feature的同一個dimension
link |
27:55.500
去計算mean跟standard deviation
link |
27:58.200
但layer normalization
link |
27:59.700
它是對同一個feature
link |
28:02.400
同一個example裡面
link |
28:04.000
不同的dimension
link |
28:05.600
去計算mean跟standard deviation
link |
28:09.200
那計算出mean跟standard deviation以後
link |
28:11.800
你就可以做一個normalize
link |
28:13.600
output這邊的每一個vector
link |
28:15.500
就是把原來input的vector
link |
28:19.400
我發現這邊有一個bug
link |
28:20.900
這個bug是什麼呢
link |
28:22.000
這個bug就是這邊不需要prime
link |
28:23.800
不好意思記得把這個prime拿掉
link |
28:26.100
這邊不需要prime
link |
28:27.600
就是把input的vector
link |
28:29.500
input的這個vector裡面
link |
28:30.900
每一個dimension減掉end
link |
28:32.900
減掉mean
link |
28:33.800
再處理standard deviation以後
link |
28:35.700
得到x'
link |
28:36.600
就是layer normalization的輸出
link |
28:40.800
那得到layer normalization的輸出以後
link |
28:43.600
它的這個輸出
link |
28:44.900
才是Fully Connected Network的輸入
link |
28:48.100
而Fully Connected Network這邊
link |
28:50.100
也有residual的架構
link |
28:52.200
所以我們會把Fully Connected Network的input
link |
28:55.400
跟它的output加起來
link |
28:57.400
做一下residual得到新的輸出
link |
29:00.100
這個才是transformer encoder裡面
link |
29:03.500
一個bug的輸出
link |
29:05.700
這邊還有一件事情是漏講了
link |
29:07.900
這個Fully Connected Network做完residual以後
link |
29:10.400
還不是結束
link |
29:11.500
你要把這個residual的結果
link |
29:13.500
再做一次layer normalization
link |
29:16.100
這邊已經做過一次了
link |
29:17.200
這邊還要再做一次
link |
29:18.700
得到的輸出
link |
29:19.800
才是residual network裡面
link |
29:22.100
一個bug的輸出
link |
29:23.800
所以這個是挺複雜的
link |
29:27.000
所以我們這邊講的這一個圖
link |
29:29.200
其實就是我們剛才講的那件事情
link |
29:32.300
首先你有self-attention
link |
29:34.500
其實在input的地方
link |
29:36.100
還有加上positional encoding
link |
29:39.600
我們之前已經有講過
link |
29:40.900
如果你只光用self-attention
link |
29:43.000
你沒有位置的資訊
link |
29:44.300
所以你需要加上positional information
link |
29:47.200
在這個圖上
link |
29:48.400
有特別畫出positional information
link |
29:51.700
這一塊這邊寫一個multi-head attention
link |
29:54.900
這個就是self-attention的bug
link |
29:56.900
這邊有特別強調說
link |
29:58.500
它是multi-head self-attention
link |
30:01.900
那這邊有一個add and none
link |
30:04.400
是什麼意思呢
link |
30:05.400
就是residual加layer normalization的意思
link |
30:09.200
我們剛才有說
link |
30:10.500
self-attention有加上residual的connection
link |
30:13.400
接下來還要過layer normalization
link |
30:16.300
這邊這個圖上的add and none
link |
30:18.200
就是residual加layer none的意思
link |
30:22.100
然後接下來呢
link |
30:23.200
這邊要過Free Forward Network
link |
30:25.300
Fully Connected的Free Forward Network
link |
30:26.800
以後再做一次add and none
link |
30:29.600
再做一次residual加layer none
link |
30:33.000
才是一個bug的輸出
link |
30:35.000
然後這個bug會重複N次
link |
30:38.400
那這個複雜的bug
link |
30:40.100
其實在之後會講到的
link |
30:42.000
一個非常重要的模型BERT裡面
link |
30:44.800
會再用到
link |
30:46.100
BERT它其實就是Transformer的encoder
link |
30:50.900
那講到這邊呢
link |
30:52.000
你心裡一定充滿了問號
link |
30:54.500
就是為什麼這個Transformer的encoder
link |
30:57.500
要這樣設計呢
link |
30:58.400
不這樣設計行不行呢
link |
30:59.900
行!不一定要這樣設計
link |
31:02.200
這個encoder的Neural架構
link |
31:04.200
現在的這個設計的方式
link |
31:05.700
我是按照原始的論文講給你聽的
link |
31:08.500
但原始論文的設計
link |
31:10.300
並不代表它是最好的
link |
31:12.600
最optimal的設計
link |
31:14.300
舉例來說有一篇文章叫
link |
31:16.200
On Layer Normalization in the Transformer Architecture
link |
31:19.600
他問的問題就是
link |
31:21.500
為什麼Layer Normalization是放在那個地方呢
link |
31:24.700
為什麼我們是先做residual
link |
31:27.400
再做Layer Normalization呢
link |
31:29.500
能不能夠把Layer Normalization
link |
31:31.800
放到每一個block的input
link |
31:33.800
也就是你做residual以後
link |
31:37.400
再做Layer Normalization再加進去
link |
31:40.000
你可以看到說左邊這個圖
link |
31:41.700
是原始的Transformer
link |
31:43.900
右邊這個圖是稍微把block
link |
31:46.600
更換一下順序以後的Transformer
link |
31:48.800
然後更換一下順序以後
link |
31:50.200
結果是會比較好的
link |
31:52.100
所以這就代表說
link |
31:53.300
原始的Transformer的架構
link |
31:55.100
並不是一個最optimal的設計
link |
31:57.000
你永遠可以思考看看
link |
31:58.700
有沒有更好的設計方式
link |
32:01.200
那再來還有一個問題就是
link |
32:03.000
為什麼是Layer None
link |
32:04.300
為什麼是別的
link |
32:05.200
不是別的為什麼不做Batch Normalization
link |
32:07.900
那也許這篇文章可以回答你的問題
link |
32:10.500
這篇文章是Power None
link |
32:12.000
Rethinking Batch Normalization in Transformer
link |
32:14.600
他首先告訴你說
link |
32:16.500
為什麼Batch Normalization
link |
32:18.100
不如Layer Normalization在Transformer裡面
link |
32:20.600
為什麼Batch Normalization
link |
32:22.000
不如Layer Normalization
link |
32:23.700
那接下來再說
link |
32:24.700
他提出來一個Power Normalization
link |
32:26.800
一聽就是很power的意思
link |
32:28.400
就可以比這個Layer Normalization
link |
32:30.600
還要就是performance差不多
link |
32:32.100
或甚至好一點
link |
32:34.800
link |
32:37.000
因為已經快六點了
link |
32:38.300
我想Decoder的部分呢
link |
32:39.600
我們是不太可能講完啦
link |
32:41.300
所以也許我們先停在這邊好了
link |
32:43.600
那看看大家有沒有問題想要問的