back to index

[DLHLP 2020] Non-Autoregressive Sequence Generation (由助教莊永松同學講授)


link |
00:01.000
好,那今天要講的題目是
link |
00:03.420
關於non-auto-regressive的sequence generation。
link |
00:08.320
好,那我們在作業1裡面
link |
00:10.400
大家都已經做過一個Second-to-Second的語音辨識。
link |
00:14.440
那其實這種語音辨識的模型就是一個
link |
00:17.960
conditional的sequence generation。
link |
00:21.080
那你的condition就是input的語音訊號。
link |
00:24.840
然後你的output的句子就是你要generate的sequence,
link |
00:30.080
那它是對應到這段語音的文字。
link |
00:35.040
好,那除了語音辨識之外呢,
link |
00:38.880
我們假如input是一張圖片,
link |
00:41.160
然後output是對應那張圖片的圖說文字,
link |
00:44.680
那這個這個task也是conditional sequence generation,
link |
00:48.680
那它叫做image caption generation。
link |
00:51.360
那如果你input的是一段英文,
link |
00:55.120
output的是對應那段英文的中文,
link |
00:58.480
那這個就是machine translation。
link |
01:01.360
那今天我們要探討的這個non-auto-regressive model的主題,
link |
01:06.360
通常都會用sequence generation,
link |
01:08.880
通常都會用machine translation來做它的task,
link |
01:12.560
所以等一下我們都是討論翻譯的這個任務。
link |
01:16.760
好,那我們平常在做翻譯的時候都是用auto-regressive的model,
link |
01:25.760
那假如你用的是RNN,
link |
01:27.760
那你會把input的sequence丟進一個RNN裡面,
link |
01:32.360
然後encode成向量,
link |
01:34.360
那再交給decoder,
link |
01:36.360
decoder在每一個時間點都吐出一個字,
link |
01:39.360
那吐出來的這個字再拉到第二個位置,
link |
01:42.960
然後再吐出下一個字。
link |
01:45.360
那這個就是auto-regressive的decode,
link |
01:49.360
所以你在decode每一個字的時候都會depend on你剛剛decode出來的字。
link |
01:55.360
那但是這樣的方法有一點缺點就是,
link |
02:00.360
假如你要decode的句子很長,
link |
02:02.360
你需要花的時間就跟你decode的句子的長度乘正比。
link |
02:07.360
那現在我們有了transformer之後,
link |
02:11.360
能不能對這件事情做改善呢?
link |
02:14.360
有了transformer之後我們就不需要像RNN一樣,
link |
02:18.360
在吃了前一個時間點的東西之後,
link |
02:21.360
才能吃下一個時間點的東西,
link |
02:23.360
所以它在encode的速度是加快的。
link |
02:27.360
我們可以用平行的方法把這個句子encode起來,
link |
02:32.360
可是在decode的時候還是會遇到一樣的問題,
link |
02:35.360
我們必須要等第一個位置的字吐完之後,
link |
02:40.360
再把它拉到第二個位置的input,
link |
02:44.360
然後吐出第二個字。
link |
02:46.360
所以說auto-regressive的model在當decode做使用的時候,
link |
02:52.360
還是會跟RNN一樣,
link |
02:54.360
需要跟句子長度乘正比的時間才能把整句話decode出來。
link |
03:02.360
那所以說既然transformer都已經可以平行運算了,
link |
03:07.360
那我們就有一個想法是,
link |
03:10.360
能不能讓transformer一口氣把整句話吐出來?
link |
03:14.360
那這樣的話時間上就可以節省很多。
link |
03:19.360
那這個model你可能會有點納悶,
link |
03:23.360
就是我們要怎麼決定到底要一口氣吐出來的句子是要多長?
link |
03:29.360
那這邊我們可以先讓encoder隨意predi一個長度,
link |
03:35.360
那decoder的output我就放position embedded。
link |
03:40.360
這個是最簡單的想法,
link |
03:42.360
就是我們想要讓decoder可以吐出一整個句子,
link |
03:47.360
在一個time state的時間內。
link |
03:50.360
但是這個model如果照這樣運作的話,
link |
03:55.360
其實會遇到一個很大的問題。
link |
03:58.360
那要講這個問題之前可以先看一下在影像上面的例子。
link |
04:03.360
那這個投影片是老師在MLDS這門課裡面教conditional game的投影片。
link |
04:11.360
那那個時候是在講說,
link |
04:14.360
假如我們不要用game的方法,
link |
04:16.360
我們用純粹數位白紙的方法,
link |
04:19.360
要訓練一個text to image的model。
link |
04:23.360
那這個model會吃一個文字,
link |
04:25.360
假如這邊是chain,
link |
04:27.360
那這個chain我們把它丟到model裡面。
link |
04:30.360
model會output出一張圖片。
link |
04:33.360
那因為我們是數位白紙的方法,
link |
04:35.360
我們就直接把這個output的圖片跟DLC裡面火車的圖片,
link |
04:41.360
算L2 distance,然後去minimize L2 distance。
link |
04:46.360
那這個方法有什麼缺陷呢?
link |
04:49.360
這個方法做出來的model最後都會output一張比較模糊的圖片,
link |
04:55.360
因為它會是每一張圖片的平均。
link |
04:59.360
假如說你的data set裡面有70%是往左邊的火車,
link |
05:04.360
有30%是往右邊的火車,
link |
05:06.360
那model為了要去minimize這兩種火車的L2 distance,
link |
05:12.360
最後它是會output出一張雙頭的火車,
link |
05:16.360
然後它是很模糊的。
link |
05:18.360
那這顯然就不是我們要的結果。
link |
05:22.360
那為什麼我們會遇到這個問題呢?
link |
05:26.360
那第一個,因為這個model的output是沒有任何dependency關係的。
link |
05:33.360
也就是說,這個model在output第二個位置的時候,
link |
05:38.360
它不知道第一個位置到底output了什麼東西,
link |
05:41.360
所以它們沒辦法有dependency的關係。
link |
05:45.360
那假如我們用auto-regressive model,
link |
05:48.360
當然就會避開這個問題,
link |
05:49.360
因為你在output第二個位置的時候,
link |
05:52.360
可以看到第一個位置的output。
link |
05:55.360
那另外還有一個方法是,
link |
05:58.360
我用game來解這個問題。
link |
06:01.360
我在訓練這個model的時候,
link |
06:03.360
用game的方法來做訓練的話,
link |
06:05.360
model就可以學會output一個有structure的東西。
link |
06:10.360
為什麼會這樣呢?
link |
06:11.360
因為game的訓練方法是discriminator給整張圖打一個分數,
link |
06:18.360
然後把這個分數feedback給generator去做訓練。
link |
06:24.360
所以說,最後generator會學到的是,
link |
06:27.360
我要output一個完整的structure,
link |
06:29.360
然後可以讓discriminator分不出來哪一張圖片是真的。
link |
06:35.360
那所以說,game是一個可以output完整structure的,
link |
06:42.360
讓generator學會output完整structure的方法。
link |
06:46.360
那除了這個問題之外,
link |
06:49.360
還有另外一個問題是,
link |
06:51.360
這個model的內部沒有任何的隨機的機制。
link |
06:55.360
它沒有一個later variable,
link |
06:57.360
讓這個model去決定說,
link |
06:59.360
它到底要output左邊的火車還是右邊的火車。
link |
07:04.360
雖然說這個model在training的時候,
link |
07:07.360
它可能已經知道,
link |
07:09.360
它已經知道有70%都是左邊的火車,
link |
07:13.360
有30%都是右邊的火車。
link |
07:16.360
但是這個model它在,它內部沒有任何隨機的機制。
link |
07:22.360
所以即使你到了最後一個hidden state,
link |
07:26.360
它還是這兩種火車的結合狀態,
link |
07:30.360
疊加的狀態,
link |
07:32.360
所以它最後還是只能output一張模糊的圖片。
link |
07:36.360
那auto regression model為什麼沒有這個問題呢?
link |
07:40.360
因為auto regression model在每一個時間點的output,
link |
07:44.360
就會做一個sample的動作。
link |
07:46.360
它會挑一個可能機率比較大的,
link |
07:49.360
然後把其他的可能性都排除掉。
link |
07:52.360
所以auto regression model它的later variable就是,
link |
07:56.360
我在每一個time statesample的那個時候。
link |
08:00.360
那如果是game的話,
link |
08:02.360
大家應該,假如大家有看過老師game的課程應該都知道,
link |
08:07.360
不管是conditional game或是一般的game,
link |
08:10.360
你在input的時候都要input一個noise。
link |
08:13.360
那這個noise其實就是,
link |
08:16.360
讓model事先決定好生存的方向。
link |
08:20.360
所以這兩個方法其實都會避開這兩個問題。
link |
08:25.360
但是我們的auto regression的方法,
link |
08:28.360
就會遇到這兩個問題。
link |
08:31.360
那現在講完圖片的例子,
link |
08:35.360
我們回來看一下文字上面的例子。
link |
08:38.360
那現在你想要train一個auto regression的model,
link |
08:43.360
那你有一句英文,
link |
08:45.360
那你想要翻成它的中文,
link |
08:47.360
可是中文有很多種不同的講法,
link |
08:49.360
hello可以翻成你好,或是hello,或是hi。
link |
08:53.360
那假如說你的training set裡面有50%是hello,
link |
08:59.360
50%是你好,
link |
09:01.360
那這個auto regression model,
link |
09:06.360
它最後就會學到說,
link |
09:08.360
我在看到英文的hello的時候,
link |
09:11.360
我第一個字要output他或是你,
link |
09:15.360
然後這兩個字的機率是差不多大。
link |
09:18.360
那第二個字呢,要outputlow或是好,
link |
09:22.360
那這兩個機率也是差不多大。
link |
09:25.360
那可是這樣最後的結果就是,
link |
09:28.360
有一個錯誤的翻譯叫做你low,
link |
09:31.360
然後它的機率也是非常大,
link |
09:33.360
它非常有可能被sample出來。
link |
09:35.360
然後還有一個是ha好,也是一個錯誤的翻譯,
link |
09:39.360
可是它也是可能被sample出來。
link |
09:43.360
那這個問題我們就叫做multi-modality問題,
link |
09:48.360
就是說因為同一個input,
link |
09:51.360
可能對應到很多不同模式的output,
link |
09:54.360
那假如我的decoder是non-auto regression,
link |
09:58.360
那它會把各種可能的模式連加在一起,
link |
10:02.360
然後當成output。
link |
10:04.360
所以這個是我們在這一次的主題裡面,
link |
10:10.360
主要要解決的問題。
link |
10:14.360
那這邊小小總結一下,
link |
10:17.360
假如你要用model去生一張圖片,
link |
10:22.360
然後用最簡單的方法,
link |
10:25.360
就是minimize L2 rows,
link |
10:27.360
那你可能會生出很模糊的圖片,
link |
10:30.360
它是每一張圖片的平均。
link |
10:32.360
那對應到文字上的狀況,
link |
10:36.360
就是你用non-auto regression的decoder,
link |
10:39.360
要一次突出整句話,
link |
10:41.360
那它突出來的東西可能就是各種可能的output疊加的狀態。
link |
10:48.360
那假如你用auto regression的方法,
link |
10:51.360
在圖片上其實auto regression的方法,
link |
10:54.360
就可以生出品質很好的圖片。
link |
10:57.360
那對應到文字上,
link |
10:59.360
就是用一般的auto regression decoder來生文字。
link |
11:05.360
那圖片其實我們都知道,
link |
11:07.360
game也可以生出很高品質的圖片。
link |
11:11.360
那我們在做game的時候,
link |
11:13.360
其實你model的架構可以用一般第一個方法裡面的model架構,
link |
11:18.360
我可以用簡單的decomposition layer來做,
link |
11:21.360
我不需要用auto regression model,
link |
11:24.360
但是它就是可以生出很好的圖片。
link |
11:27.360
但是目前文字上是沒有人這樣做的,
link |
11:31.360
因為文字用game來做目前還沒有非常成熟,
link |
11:36.360
因為文字是一個discrete的東西,
link |
11:39.360
然後用game做訓練的話,
link |
11:41.360
目前的研究都還沒有得到很好的結果,
link |
11:45.360
所以目前game的研究都還是做在auto regression的model上面。
link |
11:50.360
好,那所以說對文字來說,
link |
11:56.360
唯一能達成now auto regression的model,
link |
11:59.360
還是要回到第一個方法。
link |
12:01.360
那所以接下來要介紹的東西,
link |
12:04.360
就是針對第一個model做改良。
link |
12:09.360
那這個是第一篇做now auto regression翻譯的paper。
link |
12:14.360
那等一下都會把now auto regression translation簡稱到nat。
link |
12:22.360
那這篇的概念還蠻簡單的,
link |
12:25.360
它提出幾個方法可以改良我們的now auto regression model。
link |
12:29.360
那第一個方法是,
link |
12:31.360
我們在encoder的地方,
link |
12:33.360
每一個字去predict一個數字,
link |
12:37.360
這個數字代表的意義是,
link |
12:39.360
這一個input的字對應到output的幾個字。
link |
12:45.360
那像是這個字是hello,
link |
12:47.360
那它對應到output的你好。
link |
12:51.360
那所以說我們預測完這個數字之後,
link |
12:56.360
就把input copy兩次,
link |
13:00.360
然後放到decoder的input。
link |
13:03.360
所以說它predict出2121,
link |
13:06.360
那我就copy兩次一次兩次一次這樣子。
link |
13:11.360
所以最後它predict出來的這些數字的總和,
link |
13:17.360
就是決定了你的句子長度。
link |
13:23.360
那這個為什麼我們要predict這個數字呢?
link |
13:26.360
其實它是代表了你的decoder,
link |
13:30.360
對這個output的規劃的事前規劃。
link |
13:34.360
也就是說,
link |
13:37.360
假如你的decoder,
link |
13:39.360
它吃的input是2121,
link |
13:42.360
就是hello複製兩次,
link |
13:44.360
逗聯複製一次,
link |
13:46.360
world複製兩次,
link |
13:47.360
驚嘆號複製一次。
link |
13:49.360
那它就可能predict出這樣的output。
link |
13:53.360
那如果它的hello只複製了一次,
link |
13:56.360
它可能就發現我不能翻成你好,
link |
13:59.360
因為你好有兩字,
link |
14:01.360
那我就翻成嗨世界。
link |
14:03.360
所以說這一個fertility,
link |
14:06.360
就是有一個latent variable的功能,
link |
14:12.360
然後事先幫decoder決定好它要生成的方向。
link |
14:18.360
那我們要怎麼訓練這個fertility呢?
link |
14:21.360
我們可以直接用一個外部的alignment的工具,
link |
14:26.360
然後去對說一個input的這段話,
link |
14:31.360
它的每一個字會對應到output的幾個字。
link |
14:34.360
所以這個其實是可以輕鬆的得到答案。
link |
14:39.360
那除此之外,
link |
14:41.360
我們也可以直接train一個
link |
14:43.360
secant-to-secant的auto-regressing model,
link |
14:46.360
然後直接去看它的attention位是怎麼分佈的。
link |
14:50.360
像是我們在作業儀裡面就會看說,
link |
14:54.360
哪一段影音訊號會對應到output的哪一個字,
link |
14:58.360
就是有一個對角線。
link |
15:00.360
那這裡用的事情是一樣的,
link |
15:03.360
只是它是做在翻譯上面。
link |
15:08.360
但是我們假如都是從外部得到答案,
link |
15:13.360
然後來train這個fertility的prediction的話,
link |
15:16.360
它跟最後model要output一句不錯的句子,
link |
15:21.360
它的目標是不一致的。
link |
15:23.360
所以我們在model熟練之後,
link |
15:26.360
會做一個fine-tune的動作,
link |
15:28.360
就是用reinforced learning的rows
link |
15:33.360
加在fertility上面,
link |
15:35.360
然後去optimize fertility。
link |
15:41.360
好,那剛剛講fertility是第一招,
link |
15:44.360
那第二招是sequence level的knowledge distillation。
link |
15:49.360
那knowledge distillation呢,
link |
15:51.360
老師在去年的NL這門課上面應該都有介紹過。
link |
15:55.360
就是假如你想要train一個小model,
link |
15:58.360
然後你又希望這個小model的performance
link |
16:01.360
可以跟大model一樣好,
link |
16:03.360
那你現在就把這個小model當成student,
link |
16:06.360
大model當成teacher,
link |
16:08.360
那小model在訓練的時候,
link |
16:11.360
先把它的input丟給大model,
link |
16:13.360
讓大modeloutput出它predicted的機率分布,
link |
16:17.360
那我們讓小model直接去學
link |
16:20.360
這個predicted出來的機率分布,
link |
16:23.360
那這樣小model就會學得比較好。
link |
16:26.360
那這個是knowledge distillation在做的事情。
link |
16:31.360
那我們這邊的case呢,
link |
16:33.360
就是teacher model是autoregressive model,
link |
16:38.360
那student model就是non-autoregressive model。
link |
16:42.360
但是後面的事情有一小點不一樣,
link |
16:45.360
我沒有要去學這個teacher model
link |
16:49.360
output出來的機率,
link |
16:53.360
我們是讓這個teacher model
link |
16:56.360
把corpus裡面的每一句話
link |
16:58.360
用它自己modelpredicted出來,
link |
17:01.360
用query decode的方式
link |
17:03.360
decode出來一個句子,
link |
17:05.360
然後讓student model把那一句
link |
17:07.360
decode出來的話當成正確答案,
link |
17:09.360
然後做訓練。
link |
17:12.360
所以就是跟一般的knowledge distillation
link |
17:16.360
有一小點不一樣。
link |
17:18.360
那為什麼我們可以解決
link |
17:22.360
為什麼knowledge distillation可以解決
link |
17:25.360
我們想要解決的那個multimodality問題呢?
link |
17:29.360
那我們剛剛說multimodality問題就是
link |
17:32.360
output之間沒有dependency,
link |
17:34.360
所以錯誤的翻譯的機率也會很大。
link |
17:39.360
那假如你的data set
link |
17:42.360
有先給autoregressive的teacher model
link |
17:46.360
做decode的話呢?
link |
17:48.360
因為它是autoregressive model,
link |
17:50.360
所以它在生出第二個字的時候,
link |
17:53.360
假如它已經看到第一個字是生米,
link |
17:56.360
那它第二個字就會傾向生成好,
link |
17:59.360
它就不會把肉生出來。
link |
18:02.360
所以說你假如讓autoregressive model
link |
18:06.360
去decode你的整個corpus的話呢,
link |
18:09.360
你就會去掉某些可能,
link |
18:13.360
你的正確答案裡面就不會有hello這個可能,
link |
18:17.360
就只會留下你好這個可能。
link |
18:20.360
所以這樣做之後,你的data set就變乾淨了,
link |
18:24.360
就是更容易讓autoregressive model去學習,
link |
18:27.360
因為就不會有多種的可能。
link |
18:33.360
那這個是第二招,
link |
18:35.360
那第三招是叫做noisy parallel decoding,
link |
18:40.360
那它的概念就是,
link |
18:43.360
我圈好我的autoregressive model,
link |
18:46.360
那我在decode的時候,
link |
18:48.360
其實是可以sample不同的fertility,
link |
18:52.360
所以sample出一個不同的fertility,
link |
18:55.360
就會output出不同的句子,
link |
18:57.360
那我可以做很多次,
link |
18:59.360
然後output出一大堆的不同的句子,
link |
19:02.360
那這些句子再交給autoregressive model來打分數,
link |
19:07.360
然後選一個最好的句子當成答案。
link |
19:11.360
那大家可能覺得有點奇怪,
link |
19:14.360
因為這樣我不就使用了autoregressive model,
link |
19:17.360
這樣不就變慢了嗎?
link |
19:19.360
那但是,
link |
19:21.360
其實如果你要讓autoregressive model,
link |
19:24.360
去算一個已經生出來的句子出現的機率,
link |
19:29.360
你是只需要一個step就可以完成。
link |
19:32.360
假如你用的是transformer的decoder,
link |
19:35.360
那你就用teacher forcing的方式,
link |
19:38.360
然後你會在這個decoder裡面做mask,
link |
19:41.360
做mask就是讓這個字不能attain到後面的字。
link |
19:47.360
所以說,
link |
19:49.360
它就可以output出,
link |
19:51.360
看到begin of sentence,
link |
19:54.360
然後要生出你的機率,
link |
19:56.360
然後看到begin of sentence跟你要生出好的機率,
link |
19:59.360
所以這整排機率就是,
link |
20:02.360
乘起來就是這整句話被sync出來的機率。
link |
20:06.360
然後這樣的過程是不需要autoregressive的時間的,
link |
20:11.360
我只需要一個step就可以算出這句話的機率。
link |
20:16.360
所以說,
link |
20:19.360
我們就有三個方法可以加強這個model。
link |
20:23.360
那這裡是實驗的結果,
link |
20:26.360
那autoregressive model,
link |
20:29.360
我們用bin search size是1跟bin search size是4來decode,
link |
20:34.360
然後它的performance是這樣。
link |
20:36.360
那它的時間,
link |
20:37.360
我假如說bin search size是4的速度是1,
link |
20:44.360
那現在用autoregressive model來做,
link |
20:47.360
發現它可以加速到15.6倍,
link |
20:51.360
可是它的performance就差了很多。
link |
20:54.360
那我們現在加上fine-tune的機制,
link |
20:57.360
就是fertility check完之後要做fine-tune的動作,
link |
21:01.360
那performance就會往上漲。
link |
21:04.360
那接下來再加上noisy pile decoding,
link |
21:08.360
那performance就會再進步,
link |
21:10.360
可是進步的同時你的速度也會變慢一點。
link |
21:16.360
那這邊要來看說,
link |
21:18.360
我做distillation跟做fertility,
link |
21:22.360
跟做fertility的fine-tune,
link |
21:24.360
這三件事情到底對model帶來多大的幫助。
link |
21:29.360
那大家可以看到第一行,
link |
21:31.360
第一行是沒有distillation也沒有fertility,
link |
21:35.360
也沒有做fine-tune,
link |
21:37.360
那這個時候model基本上是勸不起來的,
link |
21:40.360
它的blue score只有2,
link |
21:43.360
blue score就是我們在做翻譯的時候常常用的一個指標,
link |
21:48.360
然後它是越高越好。
link |
21:50.360
那如果我們用了fertility的話,
link |
21:55.360
就會進步到18.8,
link |
21:58.360
但是如果我們fertility不要用predi的,
link |
22:01.360
我們是直接看input跟output的對應的長度,
link |
22:05.360
然後直接決定每一個字要copy幾次,
link |
22:09.360
那這個叫uniform的copy,
link |
22:12.360
那如果是這樣做的話其實也有16.0。
link |
22:15.360
那現在把這一行,
link |
22:18.360
加上distillation,
link |
22:20.360
之後就可以一口氣進步到25.2,
link |
22:25.360
那如果再加上fertility的fine-tune,
link |
22:28.360
就可以再進步到26點多。
link |
22:31.360
那自從這一篇,
link |
22:34.360
這篇第一篇nautoregressive的翻譯出來之後,
link |
22:38.360
後面就冒出來一系列的不同的做法,
link |
22:42.360
就是在2018之後到現在,
link |
22:48.360
幾乎每個月都有不止一個新的model出來這樣子。
link |
22:54.360
那第一個方法就是剛剛介紹的,
link |
22:56.360
這個第一篇的native model。
link |
22:58.360
那第二個出來的方法呢,
link |
23:01.360
是iterative refinement。
link |
23:04.360
那iterative refinement的概念就是,
link |
23:08.360
如果我們想要讓model一口氣output整段的話,
link |
23:12.360
好像太勉強,
link |
23:13.360
那我們能不能讓他output出一句話之後,
link |
23:17.360
把這句話拉到input,
link |
23:19.360
然後再decode一次,
link |
23:21.360
然後修正剛剛的錯誤。
link |
23:25.360
那除了iterative refinement之外,
link |
23:28.360
還有一個方法是insertion-based。
link |
23:31.360
那insertion-based它也很像iterative refinement,
link |
23:36.360
只是它refinement的方式是透過插入的方法,
link |
23:40.360
就是有一句比較爛的句子,
link |
23:43.360
那我決定說,
link |
23:44.360
每兩個字之間要不要插入一個新的字。
link |
23:49.360
那為什麼要這樣做?
link |
23:51.360
因為原本的iterative refinement,
link |
23:54.360
它的句子長度是固定的,
link |
23:56.360
只是你在第一個time state decode出來的句子是多長,
link |
24:00.360
那我refine之後,
link |
24:02.360
句子還是那麼長,
link |
24:03.360
所以它的長度是不會改變的。
link |
24:06.360
但是如果用insertion-based,
link |
24:08.360
我們可以自由的讓model決定句子的長度,
link |
24:13.360
然後我也可以同時insert,
link |
24:16.360
所以它也是有一定的平行化。
link |
24:20.360
但是這樣還是會比較慢一點,
link |
24:23.360
假如最快最快,
link |
24:25.360
我想要生成一句話是abcdefg,
link |
24:29.360
那最快的方法就是,
link |
24:31.360
我先生出最中間那個字,
link |
24:33.360
然後再生出旁邊這兩個subsequence的最中間那個字,
link |
24:39.360
然後最後再把剩下的字補完。
link |
24:42.360
所以最快的話,
link |
24:44.360
就是log n的時間可以生完這個句子。
link |
24:49.360
所以insertion-based的方法是,
link |
24:51.360
比較偏向partially autoregressive,
link |
24:54.360
就不是很純正的non-autoregressive。
link |
24:58.360
那有了insertion之後,
link |
25:02.360
我們又想到說,
link |
25:04.360
假如它insert了一個錯字,
link |
25:06.360
它就不能再修改了。
link |
25:08.360
不像剛剛我們做iterative refinement的時候,
link |
25:11.360
假如你有一個字是錯的,
link |
25:13.360
可以拉回來再做一次修正。
link |
25:16.360
所以我們後來又有一個新的model,
link |
25:19.360
它是insertion加deletion,
link |
25:21.360
那delete就是去預測每一個字要不要被刪掉,
link |
25:25.360
所以假如它有一個錯字是可以被model刪掉的。
link |
25:31.360
那最後就是,
link |
25:33.360
大家在老師講語音辨識這堂課裡面有介紹的CTC。
link |
25:38.360
那其實CTC也是可以應用在文字上面的,
link |
25:41.360
那等一下會介紹它要怎麼應用。
link |
25:43.360
那這個就是第一篇做iterative refinement的NAT的model。
link |
25:53.360
那它的方法,
link |
25:55.360
它的概念就是,
link |
25:57.360
當你一個句子X,
link |
26:00.360
你要翻譯成Y,
link |
26:02.360
之後還可以做很多次的refinement,
link |
26:04.360
然後翻譯成一個更好的Y。
link |
26:07.360
所以它的模型,
link |
26:09.360
一開始也是一個encoder,
link |
26:11.360
然後去predict target的長度,
link |
26:14.360
然後就把input的句子做copy,
link |
26:18.360
做copy之後呢,
link |
26:20.360
decode出第一版的翻譯。
link |
26:22.360
那其實這邊做的事情跟第一篇的NAT是差不多的事情。
link |
26:29.360
那只是後面又多加了第二個decoder,
link |
26:32.360
這個decoder會把上一個時間的Y,
link |
26:35.360
拉到input,
link |
26:37.360
然後做refinement,
link |
26:38.360
然後refinement好幾次,
link |
26:40.360
這樣子。
link |
26:42.360
那我要怎麼訓練這個decoder2呢?
link |
26:45.360
那其實我們除了可以直接拿Y0,
link |
26:49.360
然後放進來,
link |
26:50.360
然後讓它跟正確答案算loss之外,
link |
26:54.360
我們也可以把正確答案,
link |
26:56.360
加一些noise丟到input,
link |
26:59.360
然後讓decoder去學denoise的過程。
link |
27:04.360
那加noise我們可以直接把一個字重複兩次啊,
link |
27:08.360
或是把字換成一個random的字,
link |
27:11.360
或是把兩個字交換,
link |
27:13.360
等等。
link |
27:15.360
那所以最後,
link |
27:17.360
就會讓model去學這兩種不同的loss,
link |
27:21.360
要去minimize這些loss。
link |
27:25.360
那這個方法的performance其實,
link |
27:28.360
也沒有特別好,
link |
27:30.360
就是跟NAT的第一篇是差不多的,
link |
27:35.360
好像只有在這個data set是有贏過它的。
link |
27:41.360
那接下來這篇就比較強一點,
link |
27:44.360
它是在BERT出來之後才做的,
link |
27:48.360
那它就是有用到BERT的概念,
link |
27:51.360
那BERT就是我們一句話,
link |
27:54.360
把一些字換成max的token,
link |
27:57.360
那BERT就會知道要在output,
link |
28:00.360
把那個被max掉的字做reconstruction。
link |
28:03.360
那現在我們把這個BERT,
link |
28:06.360
加上一個encoder,
link |
28:08.360
然後把BERT當decoder來用。
link |
28:11.360
所以它在做max.ln的時候,
link |
28:14.360
是可以看到對應的,
link |
28:17.360
就是翻譯之前的句子。
link |
28:21.360
那假如我們將訓練好了一個,
link |
28:24.360
這樣的conditional的max language model之後,
link |
28:28.360
我們要怎麼使用它呢?
link |
28:30.360
那我們使用的時候,
link |
28:33.360
我們會先讓encoder去predict一個長度,
link |
28:36.360
然後predict出來是6,
link |
28:38.360
那我們就把max的token複製6次,
link |
28:41.360
然後丟到我們的BERT的裡面。
link |
28:46.360
那BERT就會output出第一版的翻譯,
link |
28:50.360
那這個翻譯可能是比較爛的,
link |
28:52.360
因為它只有一個state就要output出來。
link |
28:55.360
那沒關係,我們把這個比較爛的翻譯,
link |
28:59.360
拉到input,
link |
29:00.360
然後我們去看說,
link |
29:02.360
哪一些字在剛剛的generation裡面,
link |
29:05.360
機率是比較低的。
link |
29:07.360
我們把機率最低的n個字,
link |
29:09.360
換成max的token。
link |
29:13.360
那換完之後呢,
link |
29:15.360
再讓model重新output一次,
link |
29:17.360
被max掉的字。
link |
29:19.360
那這樣model的output就會比較好,
link |
29:21.360
因為它可以看到旁邊,
link |
29:23.360
已經生出來的字長什麼樣子。
link |
29:26.360
那我要怎麼決定每次要max掉幾個字呢?
link |
29:31.360
那它是用一個linearly decay的strategy,
link |
29:35.360
也就是說最開始要max多一點字,
link |
29:40.360
那假如你decode10次,
link |
29:43.360
那到第9次的時候就不要max太多字,
link |
29:46.360
它是用這樣的strategy去做max。
link |
29:52.360
那這邊可以看一個example,
link |
29:55.360
假如它的input是這句話,
link |
29:57.360
那它output的第一個step,
link |
30:00.360
它一口氣就吐出了這段文字。
link |
30:04.360
但是因為它是一口氣吐出來的,
link |
30:07.360
所以沒有很好,
link |
30:09.360
像這裡有兩個重複的字。
link |
30:11.360
但是沒關係,
link |
30:13.360
我們就把這些機率比較低的黃色的字,
link |
30:16.360
把它max了起來,
link |
30:18.360
然後再讓model吐出來一次。
link |
30:21.360
那這個時候就會做一些修正。
link |
30:25.360
那我們再把機率低的字再max掉,
link |
30:28.360
然後再吐一次,
link |
30:29.360
然後這句話的品質就會更好一點。
link |
30:34.360
那max predict的這個方法,
link |
30:37.360
其實還蠻厲害的,
link |
30:39.360
就是它跟前面兩個方法比起來,
link |
30:42.360
performance進步非常多。
link |
30:44.360
那甚至這個大的model,
link |
30:48.360
它的performance快要接近auto regression的transformer。
link |
30:54.360
接下來,介紹完max predict,
link |
30:57.360
就要講insertion的方法。
link |
31:01.360
那第一篇就是這個insertion transformer。
link |
31:04.360
那insertion transformer的概念就是,
link |
31:07.360
你有一句殘缺的句子,
link |
31:10.360
那這是你生成到一半的句子。
link |
31:14.360
那你是去predict說,
link |
31:16.360
每兩個字之間要不要插入一個字,
link |
31:19.360
然後它要插入什麼樣的字。
link |
31:22.360
那我們要怎麼做這件事情呢?
link |
31:25.360
因為你的decoder,
link |
31:27.360
假如input有六個字,
link |
31:28.360
那output就會有六個vector。
link |
31:31.360
那我們先把相鄰的兩個vector都接起來,
link |
31:37.360
做concatenate。
link |
31:39.360
那這樣就會得到,
link |
31:41.360
每兩個字中間就會有一個representation。
link |
31:45.360
那我們把每兩個字中間的representation,
link |
31:48.360
拿來predict它要插入的字。
link |
31:52.360
那假如那一個地方已經沒有要插入的字,
link |
31:55.360
model就會predict end of slot,
link |
31:58.360
代表說那一個slot是不需要插入的。
link |
32:02.360
那假如它是有predict數字的,
link |
32:05.360
我們就把它插回去原本的句子。
link |
32:11.360
那可是這個model我要怎麼訓練它呢?
link |
32:14.360
那這邊我們講一下我們要怎麼製造example,
link |
32:17.360
讓model去學。
link |
32:19.360
那你在data set裡面可能會有一段話,
link |
32:23.360
然後它是十個字的。
link |
32:25.360
我們就先把這十個字做shuffle,
link |
32:28.360
然後讓它打亂順序。
link |
32:32.360
然後我們從0到10之間,
link |
32:36.360
uniform隨便挑一個數字。
link |
32:39.360
那假如我挑5,
link |
32:40.360
那我就只取前五個字,
link |
32:43.360
那這五個字就是被我drop掉的字。
link |
32:46.360
那我們先把這個句子還原回來,
link |
32:49.360
那剛剛被drop掉的字就會形成一個slot,
link |
32:53.360
等一下就是要插入字的位置。
link |
32:58.360
所以說我們現在得到一個training example,
link |
33:01.360
那我們只留下我們剛剛挑的那五個字。
link |
33:06.360
那在每一個兩個字的中間的這個slot,
link |
33:11.360
我們會去predict說那個slot,
link |
33:14.360
原本被drop掉的是什麼字。
link |
33:18.360
但假如剛剛drop掉連續兩字,那要怎麼辦呢?
link |
33:22.360
那其實我們就是兩個的rows都要算。
link |
33:26.360
那假如這兩個字中間本來就沒有字的話,
link |
33:29.360
就是predict n of slot。
link |
33:35.360
好,那剛剛說假如有一個slot是很多個字的話,
link |
33:40.360
我們就直接把全部的rows都要計算。
link |
33:45.360
那這邊其實還有一個策略就是,
link |
33:48.360
原本我們可能就是把這些rows都平均起來,
link |
33:53.360
但是有一個更好的策略是,
link |
33:55.360
我們讓model傾向生出這個slot靠中間的字。
link |
34:00.360
為什麼要這樣做呢?
link |
34:02.360
那大家可以想像,
link |
34:04.360
假如你要生出一句話,
link |
34:06.360
假如你希望生出來的step越短越好,
link |
34:10.360
那我們會希望它是用binary tree的方法做decode。
link |
34:14.360
那假如你每次都是decode最中間的那一個字,
link |
34:18.360
那假如你的話你decode的那個數,
link |
34:22.360
就會越接近一顆balance的binary tree。
link |
34:25.360
那所以說我們也可以讓這一堆slot裡面的字的rows,
link |
34:32.360
在加的時候,靠中間的字做一個比較大的微體,
link |
34:38.360
然後靠旁邊的字做一個比較小的微體。
link |
34:41.360
那這樣model就會學到說,
link |
34:43.360
我在insert的時候要優先insert靠中間的字。
link |
34:53.360
那這邊可以看一個example,
link |
34:56.360
就是model在學過binary tree的rows之後呢,
link |
35:01.360
他在decode這句話的時候,
link |
35:03.360
就先decode了最中間的那個字。
link |
35:05.360
那第二步的時候,
link |
35:07.360
他就去decode這兩個slot最中間的那個字。
link |
35:13.360
所以每一個timestamp其實都是pd靠中間的字,
link |
35:17.360
那最後他五個step就可以pd出很長的一個句子。
link |
35:25.360
那如果你是用innerform的rows去做訓練的話,
link |
35:30.360
其實第一個timestamp他也是pd中間,
link |
35:33.360
但是後面的次序就比較亂一點,
link |
35:36.360
model就沒有照著binary tree的方法去做decode。
link |
35:43.360
那這個models除了可以parallel decode之外,
link |
35:47.360
其實我們也可以每次選一個機率最大的,
link |
35:50.360
直接做decode,
link |
35:52.360
但是這樣花的時間就跟auto regression model會是一樣。
link |
35:56.360
那我們就可以比較一下說,
link |
36:01.360
到底每次decode一個字還是parallel decode哪一個比較好。
link |
36:06.360
其實他們的performance沒有差非常多。
link |
36:09.360
但是他們的performance其實都贏過原本的auto regression的方法,
link |
36:15.360
甚至跟auto regression的方法是差不多的。
link |
36:20.360
這邊是27.4,然後這邊是27.3。
link |
36:24.360
所以這邊其實已經算是小小贏過的auto regression model。
link |
36:32.360
那insertion transform出來之後,
link |
36:37.360
又出來一篇叫做Kermit。
link |
36:39.360
這個Kermit其實又是芝麻街裡面的人物。
link |
36:43.360
他為了湊梗,他為了湊出Kermit這個字,
link |
36:48.360
他把第一個contextual,原本是英文是c title,
link |
36:52.360
他把它換成德文的contextual,
link |
36:54.360
所以開頭就是K,然後就可以湊出Kermit。
link |
36:58.360
那這個Kermit的概念其實跟insertion transform是一模一樣的。
link |
37:05.360
那唯一的不同就是insertion transform有encoder加decoder,
link |
37:10.360
那他把encoder跟decoder合在同一個model裡面,
link |
37:15.360
就像BERT一樣。
link |
37:17.360
那假如我要中繁音,我就把中文跟英文接在一起,
link |
37:21.360
然後插入英文的這半邊就好。
link |
37:24.360
那為什麼需要這樣做呢?
link |
37:26.360
為什麼不能乖乖用encoder加decoder呢?
link |
37:30.360
那他這樣做是有一個好處的。
link |
37:33.360
我們在做音繁中的話,就把英文跟中文接起來,
link |
37:38.360
然後在中文這邊做insert的動作。
link |
37:42.360
那這個model,同一個model其實也可以訓練中繁音,
link |
37:47.360
我們就把後面的中文放完整的中文,
link |
37:51.360
然後英文的部分做插入。
link |
37:54.360
那這樣他就可以同時訓練中繁音的任務。
link |
37:58.360
那我們還可以訓練中文英文的joint probability。
link |
38:04.360
那什麼意思呢?
link |
38:05.360
就是我們把中文跟英文接在一起,
link |
38:08.360
那中文有jump掉一些字,英文也有jump掉一些字。
link |
38:13.360
那英文要predi的時候,他要predi word這個字的時候,
link |
38:18.360
他就會去看一下中文那邊有什麼字。
link |
38:22.360
那你要predi中文的時候一樣,
link |
38:25.360
他要輸出好這個字的時候,
link |
38:27.360
他可能是看到hello,所以他才輸出好。
link |
38:30.360
所以這樣的訓練會讓他去optimize英文中文的joint probability。
link |
38:37.360
那同時我們也可以只放中文然後做insertion的training,
link |
38:44.360
或是只放英文做insertion的training。
link |
38:47.360
所以這個model是同時可以學五件事情的。
link |
38:51.360
那可是為什麼我們要同時學五件事情,
link |
38:54.360
這樣真的有好處嗎?
link |
38:55.360
那我們可以看他實驗結果。
link |
38:57.360
第一個他是做單向的翻譯,
link |
39:00.360
那他是做英文翻德文,或是德文翻英文。
link |
39:04.360
那如果我們只有勸單向的翻譯是27.8,
link |
39:09.360
那如果同時勸英文翻德文跟德文翻英文,
link |
39:14.360
兩個方向我勸在同一個model裡面,
link |
39:17.360
其實performance是往下掉。
link |
39:19.360
因為model要學的事情變多了,
link |
39:21.360
反而他performance是往下掉的。
link |
39:23.360
那如果我在學joint probability,
link |
39:26.360
performance又往下掉了。
link |
39:29.360
那這個時候再去學純英文或是純德文的modular,
link |
39:36.360
那這個時候performance也沒有起來很多。
link |
39:39.360
但是他在學完這一系列這五個task之後,
link |
39:43.360
最後再做一個fine-tune。
link |
39:45.360
fine-tune原本你要做英文翻德文的task,
link |
39:49.360
然後performance就突然暴衝了一波。
link |
39:53.360
所以說他同時勸五個task是有道理的。
link |
39:58.360
那最後你再做一下fine-tune,
link |
40:01.360
就可以超過原本只勸一個task的performance。
link |
40:08.360
那這個Kermit這個model,
link |
40:10.360
他之所以用芝麻街的人物來命名,
link |
40:14.360
其實因為他可以跟Bert扮演同樣的角色。
link |
40:18.360
就是他也可以像Bert一樣,
link |
40:21.360
當成betrayed model,
link |
40:22.360
然後我用來抽feature,
link |
40:24.360
或是用來fine-tune,
link |
40:25.360
然後直接做downstream task。
link |
40:27.360
那Guru就是我們常常拿來讓Bert跑的一個benchmark。
link |
40:34.360
那我們發現拿Kermit來跑Guru這個benchmark,
link |
40:38.360
得到的performance竟然跟Bert是不相上下的。
link |
40:42.360
那Bert本身不能做generation,
link |
40:46.360
但我們的Kermit又同時可以做generation,
link |
40:49.360
又可以做Guru這個benchmark。
link |
40:52.360
那Kermit還有一個神奇的功用,
link |
40:58.360
就是他可以解zero-shot的克洛茲QA。
link |
41:02.360
那這個克洛茲QA的意思就是,
link |
41:05.360
我有一個QA的段落,
link |
41:08.360
然後中間有一個空格,
link |
41:10.360
這個空格我們要pre-d它的正確答案是什麼?
link |
41:14.360
那假如你用GPV2,
link |
41:16.360
也就是從左邊到右邊的那種benchmark,
link |
41:19.360
來做pre-d的話呢,
link |
41:21.360
你就會有一個問題,
link |
41:23.360
你沒辦法看到空格右邊的東西。
link |
41:27.360
那如果你用Bert的話呢,
link |
41:29.360
雖然他可以看到左邊跟右邊的東西,
link |
41:32.360
可是這個空格到底要填入幾個mask token,
link |
41:36.360
你是不知道的。
link |
41:38.360
所以Bert會有一點小問題。
link |
41:41.360
但是Kermit他可以非常自然的,
link |
41:44.360
在這個空格的地方插入新的字。
link |
41:48.360
所以最後在這個example裡面,
link |
41:50.360
它的output的結果是最接近正確答案。
link |
41:54.360
那他測了整個squat的zero-shot克洛茲的test,
link |
42:01.360
那發現說Kermit的performance,
link |
42:04.360
是贏過GPV2跟Bert。
link |
42:07.360
那但是這個是zero-shot的setting,
link |
42:10.360
就是這些model都沒有在,
link |
42:12.360
都沒有在training的時候看過任何,
link |
42:15.360
克洛茲的QA的題目。
link |
42:21.360
那後面,
link |
42:24.360
Kermit又有一個新版本,
link |
42:26.360
這個新版本叫做multi-win過Kermit。
link |
42:29.360
他就是把各種pair的翻譯的data,
link |
42:33.360
全部chained在同一隻Kermit上面。
link |
42:36.360
那大家有興趣的話,
link |
42:38.360
可以去看一下這個paper。
link |
42:42.360
那我們這邊就是,
link |
42:45.360
現在要把insertion加上deletion的操作。
link |
42:48.360
那這邊叫做latex-transformer。
link |
42:52.360
那要怎麼加上deletion的操作呢?
link |
42:55.360
我們一樣有一句中文,
link |
42:58.360
我們要把它翻成英文。
link |
43:00.360
那encoder encode完句子之後,
link |
43:03.360
decoder會分成三個部分。
link |
43:06.360
那首先你會有一句是,
link |
43:09.360
翻到一半的句子,它還不是很完整。
link |
43:12.360
那我們把它丟進decoder,
link |
43:15.360
然後在decoder出來之後,
link |
43:17.360
再過一個deletion的classifier。
link |
43:20.360
然後去預測說,
link |
43:22.360
這一個字要不要被刪掉。
link |
43:25.360
那像在這個例子裡面,
link |
43:29.360
這個字就被刪掉了,
link |
43:31.360
所以句子就變成這樣。
link |
43:34.360
那在第二步的時候,
link |
43:36.360
我們再把這個句子丟到decoder裡面,
link |
43:39.360
最後過一個insertion的classifier。
link |
43:43.360
那它就會去preview說,
link |
43:45.360
每兩個字之間到底要插入多少個字。
link |
43:50.360
那像這裡要插入一個字,
link |
43:53.360
它就放一個placeholder。
link |
43:55.360
這裡要插入三個字,
link |
43:56.360
它就放三個placeholder。
link |
43:59.360
那最後一步,
link |
44:00.360
我們再把這個已經插入placeholder的句子,
link |
44:04.360
丟到decoder裡面,
link |
44:06.360
再過一個token的classifier。
link |
44:08.360
那去預測說,
link |
44:10.360
每一個placeholder,
link |
44:11.360
到底要翻譯成,
link |
44:13.360
到底要replace成什麼樣的字。
link |
44:17.360
那最後我們就會得到一個完整的句子。
link |
44:21.360
那這就是renaissance transformer在
link |
44:24.360
做influence的時候的步驟。
link |
44:28.360
但是我們要怎麼去train這個model呢?
link |
44:31.360
那它是用imitation learning的方法。
link |
44:35.360
那要做imitation learning的話,
link |
44:38.360
你需要有一個模仿的對象,
link |
44:41.360
就是有一個expert。
link |
44:42.360
那這個expert呢,
link |
44:43.360
就跟他們的名字有關,
link |
44:45.360
就是levens-transistence演算法。
link |
44:48.360
那這個演算法大家在作業一,
link |
44:52.360
在玩kaggle的時候,
link |
44:53.360
應該都有用過,
link |
44:54.360
就是它會算兩個sequence之間的編輯距離。
link |
45:00.360
像這兩個sequence之間的編輯距離是3。
link |
45:05.360
那我們也可以讓機器直接幫我們算出,
link |
45:09.360
我們要怎麼把第一個sequence編輯成第二個sequence。
link |
45:13.360
像這裡是我們要在第三個地方insert,
link |
45:16.360
在第七個地方delete,
link |
45:17.360
然後在第八個地方做replacement。
link |
45:22.360
不過在這篇paper裡面,
link |
45:24.360
它把replacement這個動作,
link |
45:27.360
就把它拆解成先delete再insert,
link |
45:30.360
這樣它比較好處理。
link |
45:35.360
好,那接下來要怎麼訓練呢?
link |
45:38.360
首先我們會在dataset裡面,
link |
45:40.360
製造一些需要被delete字的句子。
link |
45:45.360
像是我們假如有一個完整的句子,
link |
45:47.360
我們就insert一些錯的字進去,
link |
45:51.360
那它就需要被delete。
link |
45:53.360
那同時我們也會製造一些,
link |
45:55.360
需要被insert字的句子。
link |
45:58.360
像是有一句完整的句子,
link |
46:00.360
我們把一些字drop掉,
link |
46:02.360
那它就會變成一句需要被insert字的句子。
link |
46:07.360
那有了這兩種example之後呢,
link |
46:10.360
我們就讓,
link |
46:12.360
首先先讓這個需要被delete字的句子,
link |
46:15.360
這裡舉個例子,假如說是this is is a pen,
link |
46:19.360
那它的意思重複了,
link |
46:21.360
所以它需要被delete字。
link |
46:23.360
那我們把這句話,
link |
46:25.360
跟原本的正確答案,
link |
46:27.360
丟到lensing算法裡面。
link |
46:30.360
那它就會output出,
link |
46:32.360
哪一個字需要被delete。
link |
46:35.360
像這裡它會output出,
link |
46:37.360
第三個字需要被delete。
link |
46:39.360
所以你現在就得到一個training example,
link |
46:42.360
這training example就是,
link |
46:44.360
看到this is is a pen這句話,
link |
46:47.360
我要output出0010000。
link |
46:51.360
那這個example就交給,
link |
46:53.360
deletion的classifier去學。
link |
46:57.360
那再來insertion的狀況也是一樣,
link |
47:00.360
我會有一句需要被insert字的句子,
link |
47:04.360
那假如是this is a pen,
link |
47:06.360
那lensing的演算法在看了正確答案之後,
link |
47:10.360
就會告訴你說,
link |
47:11.360
這邊要插入兩個字。
link |
47:13.360
所以你現在又得到一個example,
link |
47:16.360
那這個example我們再交給,
link |
47:18.360
insertion的classifier去學。
link |
47:21.360
那最後呢,我們把原本這句話,
link |
47:24.360
插入placeholder之後,
link |
47:26.360
去看一下原本這些placeholder,
link |
47:29.360
是對應到什麼樣的字。
link |
47:31.360
那這件事情就交給,
link |
47:33.360
我們的token classifier去學。
link |
47:36.360
所以這樣就可以訓練出我們的,
link |
47:39.360
lensing transformer。
link |
47:41.360
那lensing transformer在decode的時候,
link |
47:44.360
到底是什麼樣的情況呢?
link |
47:46.360
假如我們有一句英文,
link |
47:48.360
要翻成日文,
link |
47:50.360
那它在第一個時間點,
link |
47:52.360
它句子是空的,一開始是空的,
link |
47:54.360
所以沒有東西要比例。
link |
47:56.360
那在第一個時間點,
link |
47:58.360
它一口氣就insert了這麼多個字。
link |
48:00.360
但是因為這些字是一口氣生出來的,
link |
48:03.360
所以有一些錯誤,
link |
48:05.360
它把這兩個字重複了。
link |
48:08.360
那在第二步的時候,
link |
48:10.360
它就把其中一個字刪掉,
link |
48:12.360
然後insert的時候又加了新的字。
link |
48:15.360
所以它短短的三步,
link |
48:17.360
就decode出一句完整的話。
link |
48:24.360
好,那這是它的結果。
link |
48:26.360
這個如果你用,
link |
48:28.360
autoregressive transformer的話,
link |
48:31.360
表現是這樣。
link |
48:33.360
那如果你用lavenson transformer,
link |
48:35.360
其實它performance並沒有差非常多。
link |
48:39.360
那如果你是用lavenson transformer,
link |
48:43.360
加上knowledge distillation,
link |
48:46.360
那就發現它performance是可以超過transformer。
link |
48:52.360
那如果是看decode的速度,
link |
48:55.360
我們一般的autoregressive model
link |
48:58.360
要300毫秒才可以decode出句子。
link |
49:02.360
但lavenson transformer就只需要100毫秒附近,
link |
49:07.360
就可以decode出句子。
link |
49:09.360
那它所需要花的decode step,
link |
49:13.360
大概只要2點多個step,
link |
49:15.360
就可以decode出整句話。
link |
49:17.360
所以其實還蠻有效率的。
link |
49:22.360
好,那以上就是有insertion跟insert加delete的方法。
link |
49:29.360
那最後講一下ctc-based的方法。
link |
49:33.360
那ctc大家在老師之前語音辨識的課都有學過了。
link |
49:38.360
就是你的encoder可以直接output出一個word sequence,
link |
49:43.360
那對每一個frame就output出一個token,
link |
49:47.360
那這個token是可以包含blank token的。
link |
49:51.360
所以最後model output出這句話之後呢,
link |
49:55.360
你就把blank token拿掉,
link |
49:57.360
然後把重複的字也縮成一個字,
link |
50:00.360
最後就會生出你好棒這個句子。
link |
50:03.360
那ctc通常我們是用在語音辨識上面比較多。
link |
50:09.360
那其實語音辨識,
link |
50:11.360
我們平常比較少看到有人在討論nautoregressive的model,
link |
50:16.360
因為ctc本身就已經是個不錯的nautoregressive model。
link |
50:22.360
那而且就是對語音辨識來說,
link |
50:26.360
其實我們在做nautoregressive的語音辨識的時候,
link |
50:30.360
不會遇到很嚴重的multimodality問題。
link |
50:34.360
因為同一段語音所對應的output的文字,
link |
50:39.360
都是有一個正確答案的,
link |
50:41.360
它不會有各種可能的說法。
link |
50:44.360
通常一段語音就是搭配一種可能的說法,
link |
50:49.360
所以它比較不會遇到multimodality的問題。
link |
50:54.360
那ctc有幾個小缺點,
link |
50:59.360
第一個就是雖然它performance其實還不錯,
link |
51:02.360
但是還是會輸給second to second的las model。
link |
51:07.360
那第二個是,
link |
51:09.360
ctc雖然是一個nautoregressive model,
link |
51:13.360
可是它沒辦法做refinement的動作。
link |
51:16.360
就是說,
link |
51:18.360
因為input是語音,output是文字,
link |
51:21.360
那文字不能再拿來input,
link |
51:25.360
然後當成下一個時間點的input,
link |
51:29.360
然後做refinement,不行,沒有這種用法。
link |
51:31.360
它就只能decode一次。
link |
51:33.360
那所以說,
link |
51:35.360
假如說我要put出一個錯字,
link |
51:39.360
那這個錯字是沒有機會被修正的。
link |
51:43.360
它不能說因為它看到旁邊已經生出bump了,
link |
51:48.360
然後它才發現這個字生錯了,
link |
51:50.360
然後它把這個字刪掉,
link |
51:52.360
是沒有這種機制的。
link |
51:54.360
所以說,
link |
51:56.360
為了改良這些問題,
link |
51:59.360
就有一個新的model叫repeater,
link |
52:02.360
那它的概念就是ctc加max的普遞,
link |
52:06.360
那這個是非常新的配合。
link |
52:09.360
那它的model跟ctc很像,
link |
52:12.360
可是我在input的地方,
link |
52:15.360
同時把token sequence也加進來。
link |
52:19.360
那在時間為零的時候,
link |
52:21.360
我們的token sequence就是,
link |
52:24.360
全部都是max的token,
link |
52:26.360
就跟我們在做max的普遞的時候,
link |
52:28.360
一開始都放max的token是一樣的道理。
link |
52:32.360
那第一個time state,
link |
52:35.360
它就會把一些字換成真的字,
link |
52:38.360
那也可以直接要put一個blank token,
link |
52:42.360
blank token跟max的token是不一樣的,
link |
52:45.360
max的token是最後都會被換掉,
link |
52:47.360
可是blank token是ctc用的那個,
link |
52:51.360
之後要被reduction掉的東西。
link |
52:55.360
那在時間為一的時候,
link |
52:57.360
它就把剛剛output出來的那句話,
link |
53:01.360
在跟雲訊號同時丟進encoder裡面,
link |
53:06.360
那這時候又會把一些max的token換掉,
link |
53:10.360
所以最後就會得到一句更好的translation,
link |
53:14.360
不是translation,是speech recognition。
link |
53:19.360
那這邊還有一個技巧就是,
link |
53:23.360
我讓input的feature有一個block,
link |
53:28.360
就是像這裡我假裝block size是3,
link |
53:32.360
所以我把input的feature每三個分成一塊,
link |
53:36.360
那在每一個時間點,
link |
53:39.360
我都限制model至少要把其中一個token換成真的字。
link |
53:47.360
所以這樣做之後呢,
link |
53:49.360
這個model在三步之內一定可以decode完整個句子,
link |
53:53.360
第一次decode一個字,第二次decode另一個,
link |
53:57.360
第三次就可以全部decode完。
link |
54:01.360
那這裡可以看一個example,
link |
54:04.360
它的block size是8,
link |
54:07.360
所以它每一個裡面就有8個feature,
link |
54:10.360
那這些feature原本對應的token都是max的token,
link |
54:15.360
都是max的token,
link |
54:17.360
那它在第一個state就會挑一個字,
link |
54:20.360
換成真的token,
link |
54:23.360
那每一個state都會挑一個字換成token,
link |
54:27.360
然後也可以換成blank token,
link |
54:29.360
那最後第八個state的時候就所有字都已經變成真的token,
link |
54:35.360
就沒有max的token。
link |
54:39.360
那它的結果還算不錯,
link |
54:42.360
就是前面這些是autoregressive的secant to secant,
link |
54:48.360
那secant to secant在這個data set上面的order rate
link |
54:52.360
其實可以壓到非常低,
link |
54:54.360
那如果你用ctc的話,
link |
54:57.360
沒辦法壓到那麼低。
link |
54:59.360
那但是用了imputer之後是可以贏過ctc的。
link |
55:10.360
那這個ctc或是imputer有沒有辦法用在文字的生成上面呢?
link |
55:18.360
那其實有兩篇paper都在做這件事情,
link |
55:22.360
那我們想要做一個翻譯的test,
link |
55:25.360
就跟剛剛討論的test是一樣的,
link |
55:29.360
可能是中文翻成英文。
link |
55:31.360
那我們直接讓input的句子經過encoder之後,
link |
55:37.360
做一個upsampling的動作,
link |
55:40.360
就是把每一個feature分裂成多個feature,
link |
55:44.360
那這樣你的句子就變長了,
link |
55:47.360
然後變得有點像語音訊號的感覺。
link |
55:50.360
那我們再對這個變長的sequence去change ctc,
link |
55:55.360
那這樣就可以用ctc來做翻譯,
link |
55:58.360
然後是純文字的。
link |
56:00.360
那imputer也是一樣,
link |
56:02.360
imputer原本左邊這裡是要放語音訊號進去的,
link |
56:08.360
但是我們現在放成source sentence的upsampling,
link |
56:13.360
那後面的事情都是跟原本一樣。
link |
56:16.360
那這個方法拿來做純文字的翻譯效果好不好呢?
link |
56:22.360
我們可以看到它跟其他所有只要一個time state decode出句子的方法做比較,
link |
56:30.360
那我用ctc來做翻譯的話,
link |
56:36.360
performance可以贏過之前所有的model,
link |
56:39.360
那imputer又可以再更好一點。
link |
56:42.360
那再來我們跟其他的autoregressive model做比較,
link |
56:48.360
或是non-autoregressive model,
link |
56:50.360
可是需要iterative refine的model,
link |
56:53.360
那就發現我們的imputer在decode的iteration多一點的時候,
link |
57:01.360
已經可以贏過autoregressive model,
link |
57:04.360
然後贏過之前所有的insertion或是refine的model。
link |
57:09.360
所以這個方法其實還蠻強的,
link |
57:12.360
然後概念也蠻簡單的。
link |
57:17.360
那最後再提一個東西,
link |
57:20.360
就是knowledge distillation到底為什麼有用?
link |
57:25.360
這是一篇蠻新的paper,
link |
57:29.360
那他做了一個實驗,
link |
57:32.360
就是我讓一個data set,
link |
57:35.360
同時具有英文翻德文,英文翻西班牙文,英文翻法文,
link |
57:42.360
這三種翻譯全部混合在同一個data set裡面,
link |
57:47.360
然後讓我們的翻譯的model去選,
link |
57:51.360
那如果說你的翻譯的model是autoregressive的話,
link |
57:55.360
model其實也分不清到底每次要吐出德文,
link |
57:59.360
還是吐出西班牙文,還是吐出法文,
link |
58:02.360
可是他每次假如是只要一吐出德文,
link |
58:07.360
他的整個句子裡面所有的字都會是德文的字彙,
link |
58:12.360
這裡的每一個點就是他拗不出來的一句話,
link |
58:16.360
然後他的那句話裡面的西班牙文跟德文跟法文所佔的比例,
link |
58:23.360
所以我們可以發現,
link |
58:25.360
要嘛那句話整句話都是德文,
link |
58:28.360
要嘛整句話都是西班牙文,
link |
58:30.360
要嘛整句話都是西班牙文,
link |
58:32.360
要嘛整句話都是法文,
link |
58:34.360
就不太會出現同一句話有三種不同的文字的狀況,
link |
58:42.360
但是如果我們用NAT的model去硬學這個data set,
link |
58:48.360
就發現說他常常會output出同一句話裡面有德文,
link |
58:54.360
也有西班牙文,也有法文,
link |
58:56.360
所以這個就是我們剛剛講multimodality的問題,
link |
58:59.360
那現在只是他把modality這件事情用不同語言來做呈現,
link |
59:04.360
然後更好地更容易去做分析,
link |
59:08.360
那假如說我們把data set裡面,
link |
59:11.360
原本是一句英文會對應到德文西班牙文法文,
link |
59:16.360
那我們把這三個翻譯隨便drop掉其中兩個,
link |
59:21.360
那這一個multimodality的問題就會減輕一些,
link |
59:26.360
可是我們發現更有效的是,
link |
59:29.360
我們直接讓NAT model去學auto-evasive model的output,
link |
59:35.360
就是做distillation,
link |
59:37.360
那這個狀況可以減輕得更多,
link |
59:40.360
所以說knowledge distillation的效果,
link |
59:44.360
就是在這個實驗裡面有一個很好的呈現,
link |
59:48.360
那後面還有做一個分析,
link |
59:51.360
就是說我在不同的t-shirt model的size之下,
link |
59:56.360
像這個是大model的t-shirt model,
link |
59:59.360
這是中的,這是小的,這是很小的,
link |
01:00:03.360
那讓這個我的auto-evasive model去學,
link |
01:00:07.360
不同的t-shirt model的output,
link |
01:00:10.360
那不管你跟哪一個t-shirt學,
link |
01:00:13.360
都會贏過不做distillation,
link |
01:00:16.360
就是用real data去train的結果,
link |
01:00:20.360
但是對這一篇,這個是最開始那篇NAT,
link |
01:00:26.360
那它是跟小model學的效果是最好的,
link |
01:00:30.360
那可是如果是iterative refinement,
link |
01:00:33.360
是跟中model學的比較好,
link |
01:00:36.360
那如果是mass predict,
link |
01:00:38.360
是跟大model學的比較好,
link |
01:00:40.360
那Levenson成熟門也是跟大model學會比較好,
link |
01:00:45.360
那所以說每個model都有適合它的t-shirt model的tenacity的大小,
link |
01:00:53.360
那又可以發現說,其實Levenson成熟門已經跟
link |
01:00:57.360
它的t-shirt model performance都差不多了,
link |
01:01:04.360
那這邊其實就講完了,
link |
01:01:07.360
後面就是一些reference,
link |
01:01:09.360
就是其實裡面這三篇paper,
link |
01:01:12.360
包括第一篇NAT跟Levenson成熟門,
link |
01:01:16.360
跟最後那篇分析,
link |
01:01:18.360
都是Facebook AI Research的這個人做的,
link |
01:01:23.360
那今天講的有成熟門,
link |
01:01:27.360
insertion成熟門,
link |
01:01:29.360
kernit,
link |
01:01:30.360
imputer,
link |
01:01:31.360
都是這個人做的,
link |
01:01:32.360
這個人其實是Eason Attensville的第一作者,
link |
01:01:37.360
他同時又最近又在做這個Nautilus的東西,
link |
01:01:43.360
好,這最後是剩下的四篇的reference,
link |
01:01:48.360
其實就講完了,不知道大家有沒有問題。