back to index

[DLHLP 2020] Deep Learning for Question Answering (1/2) (重新上傳)


link |
00:00.720
好,我們就來講Question Answering
link |
00:03.880
那你可能會想說,這邊怎麼這麼吵
link |
00:06.720
有一個會動的封面
link |
00:09.920
其實這個圖是那個Office 365自動配的啦
link |
00:13.480
我也不知道他為什麼配這個圖就是了
link |
00:15.480
我現在很厲害了,都會自動配這個會動的圖,太厲害了
link |
00:19.880
好,那這個是Question Answering
link |
00:22.560
好,那我們接下來呢,就來進入Question Answering這個主題
link |
00:27.400
那Question Answering裡面呢,有兩個input跟一個輸出
link |
00:33.640
這兩個input分別是,一個是問題
link |
00:37.120
那問題可以有很多種不同的類型,從最簡單的到最難的
link |
00:42.520
最簡單的,舉例來說,有些問題啊,我們叫做Factoid的問題
link |
00:47.360
有這些問題有標準答案,那答案就是一個詞彙
link |
00:51.200
他有標準答案,他的答案沒有什麼爭議
link |
00:53.200
舉例來說,誰現在是美國總統,大家都知道是川普
link |
00:57.480
所以沒有什麼特別的爭議
link |
00:59.480
你只要找到有提到川普的文章,可能就可以告訴你這個問題的答案
link |
01:03.960
好,那有一些問題可能稍微難一點
link |
01:07.120
你需要從好幾個不同的來源,去多方找尋資訊
link |
01:11.800
再進行彙整,才有辦法得到正確的答案
link |
01:15.080
比如說,川普跟歐巴馬誰年紀比較大
link |
01:18.360
你可能可以找到川普的年紀,你可能可以找到歐巴馬的年紀
link |
01:22.560
但是你要把他們兩個的年紀都找出來以後,再進行比對
link |
01:26.200
你才能夠得到正確答案
link |
01:28.200
也有一些問題是沒有標準答案的
link |
01:31.800
舉例來說,約會的時候誰應該付錢
link |
01:35.760
不過像這種問題,在八卦版是有標準答案的
link |
01:38.960
有關感情的問題,我一律建議分手
link |
01:42.080
好,那這個問題的答案的來源,這個叫做Knowledge Source
link |
01:48.800
這個Knowledge Source有很多種不同的來源
link |
01:52.280
比如說,可以是一篇文章,可以是整個網路
link |
01:57.520
甚至也可以是多媒體的資訊,比如說影音,比如說影像或者是圖片
link |
02:05.000
然後接下來,你就把這個Knowledge Source丟到一個module裡面做一下process
link |
02:11.560
那你完全可以想像說,如果這個是文字的話
link |
02:14.640
就是丟到一個BERT裡面,把每個token的embedding都抽出來
link |
02:18.960
然後question的話,也是丟到BERT裡面,把每一個token的embedding都抽出來
link |
02:25.680
然後這兩邊可能互相要做一些attention
link |
02:31.400
然後接下來,你把這個source encode以後的結果
link |
02:36.680
跟question處理以後的結果,丟到一個找answer的module
link |
02:40.920
接下來就把answer吐出來
link |
02:44.280
那answer有幾種不同的型態
link |
02:47.280
有時候可能你的回答就是單一個詞彙
link |
02:50.680
有時候你的回答可能是你的source裡面的一個片段
link |
02:55.160
也有可能你現在要做的是選擇題,所以machine要做的事情是從數個選項裡面選出正確的那一個
link |
03:01.560
也有可能你的answer是沒有任何限制的,它是一段話,甚至是一個段落
link |
03:08.120
那有關這個QA的研究
link |
03:12.200
今天QA有人會說,那等一下是不是會講各式各樣神奇的QAmodel呢?
link |
03:21.360
各式各樣network的架構呢?
link |
03:23.360
如果是在一兩年前講QA的主題
link |
03:26.360
那確實可能focus在各式各樣神奇的attention架構
link |
03:30.960
但是今天,基本上BERT可以打趴過去所有各式各樣奇妙的架構了
link |
03:37.040
所以今天QA的研究,基本上變成有點像是
link |
03:40.480
誰先找到一個比較大的BERT,誰就贏了
link |
03:43.840
就跟大家作業4-3的時候發表感覺差不多
link |
03:47.120
誰找到一個比較大的BERT,誰就贏了
link |
03:50.880
這個像是風神演義一樣,誰先使用翻天印,誰就贏了
link |
03:55.800
通常風神演義裡面,兩個人物出來要打架的時候
link |
03:59.800
都會先用冷兵器對砍幾個回合
link |
04:02.800
然後接下來其中一個人就會想要放法寶,比如說翻天印
link |
04:06.720
通常誰放法寶,誰就贏了,就是這個樣子
link |
04:10.720
我們今天就來講一下,介紹一下
link |
04:14.480
question answering各種不同的型態
link |
04:18.240
那我們就從答案開始講起
link |
04:22.120
最簡單的形式是輸出的答案就是一個詞彙
link |
04:29.040
那在QA裡面,最早的一個QA的benchmark corpus叫做baby
link |
04:36.480
那它甚至可以說是QA的admiss
link |
04:39.680
我們知道在做影像的時候,你會用admiss來測試所有的東西
link |
04:43.760
那過去在做QA的時候,往往會用baby來測試所有的東西
link |
04:49.280
那baby它有20個不同的任務,它有20種不同的類型
link |
04:56.960
不過baby裡面的文章跟問題,它是合成出來的
link |
05:02.160
它是用某一個template產生出來的
link |
05:04.880
那我這邊就舉了Task 5、Task 10、Task 15給大家看看這個baby的感覺
link |
05:10.960
舉例來說Task 5,它裡面的文章是Mary把蛋糕給了Fred
link |
05:15.920
Fred再把蛋糕給了Bill
link |
05:18.400
然後呢,這個Bill把牛奶給了Jeff
link |
05:23.280
然後接下來它的問題就是,誰把蛋糕給了Fred呢?
link |
05:26.800
誰把蛋糕給了Fred呢?是Mary,Mary把蛋糕給了Fred
link |
05:32.080
然後這個Fred把蛋糕給了誰呢?
link |
05:38.240
給了Bill,Fred把蛋糕給了Bill
link |
05:40.720
然後這個baby呢,大概就是這種感覺
link |
05:43.920
那baby當然在今天看起來,已經有點太過簡單了
link |
05:48.240
所以今天很多QA的文章,往往不是用baby來當作它的testing set
link |
05:54.000
通常現在可能用squat還比較多,比較不會用baby當作你的benchmark
link |
05:59.520
不過當年創造baby的時候,其實也是有很大的野心的
link |
06:03.440
當時創造baby的時候,你看那個文章的title還說
link |
06:06.800
To work AI-complete question answer
link |
06:10.640
它希望可以制定出20個任務來測試機器的能力
link |
06:15.120
來general的測試機器,連結不同的資訊
link |
06:19.760
還有做歸納,還有做推理的能力
link |
06:23.680
那期待有這20個任務,我們可以從20個不同的面向來檢視機器
link |
06:30.160
20種不同的AI的能力
link |
06:33.360
當時創造baby的時候,是有這樣子的野心的
link |
06:37.760
當然baby是比較早的文章,是15年的時候proposed的
link |
06:42.240
那今天看來,其實是有點太簡單了
link |
06:44.720
當時剛剛提出來的時候,我們人們並不覺得說
link |
06:48.720
這種簡單的用template產生的文章跟問題
link |
06:53.680
可以輕易的讓machine抓到這種pattern,然後輕易的就回答出來
link |
06:58.160
不過今天這20個不同的問題,基本上都已經被deep learning破了
link |
07:03.360
所謂破了就是正確率都達到95%以上了
link |
07:06.800
所以基本上這20個問題,都算是用deep learning解掉了
link |
07:11.760
當然用deep learning解掉,並不代表machine真的學到了推理、歸納
link |
07:18.480
他真的可以讀懂一篇文章,這是另外一回事
link |
07:21.520
我們之後會再回來看這個問題
link |
07:24.240
總之,有baby這個corpus、有baby這個benchmark
link |
07:28.160
他要繼續做的事情就是,回答一個答案,這個答案就是一個對
link |
07:32.960
那怎麼做呢?簡單來講就是,把它看作是一個分類的問題
link |
07:38.400
對你的answer module來說,他要解的就是一個分類的問題
link |
07:42.560
哪些類別呢?所有可能的答案都是一個類別
link |
07:47.040
jones是一個類別,mary是一個類別,kitchen是一個類別,no是一個類別,maybe是一個類別
link |
07:52.800
然後你的answer module就是會assign一個confident score,assign一個分數給每一個類別
link |
07:58.960
接下來看哪一個類別分數最高,分數最高的那個類別,也就是分數最高的那個詞彙
link |
08:03.760
就是答案,所以baby通常就是這麼解的
link |
08:08.640
那有另外一種類型的問題,是multiple choice的問題,是這個選擇題的問題
link |
08:16.720
那在選擇題裡面通常就是你有文章,有問題,然後數個選項,希望機器從數個選項裡面選出正確的答案
link |
08:25.840
怎麼讓機器進行選項的選擇呢?那這邊你除了要去處理source跟question以外
link |
08:33.520
你可能也要有一個module去處理選項,比如說把某一個選項選項A丟到這個module
link |
08:39.760
你會得到選項裡面的token的embedding
link |
08:42.640
接下來呢,這三個module間可能互相都要做一些attention
link |
08:47.440
這個我們沒有把它畫出來,這三個module間互相做一些attention
link |
08:51.600
然後answer的module就把這個問題當作是一個二元分類的問題
link |
08:56.960
決定說輸入這個選項,這個選項到底是對的還是錯的
link |
09:01.440
那這邊假設有四個選項,你就把四個選項通通都拿來跑一遍
link |
09:06.560
那也有另外一個解法是說,我們把這四個選項通通都丟到module裡面
link |
09:12.880
把ABCD通通丟到module裡面,然後接下來對answer的module來說呢
link |
09:19.360
就是變成一個分類的問題,有四個類別
link |
09:22.400
我們現在要決定說ABCD四個類別裡面,哪一個才是對的
link |
09:26.960
希望它可以吐出正確的類別
link |
09:28.960
不過把它formulate成binary classification的problem可能是比較有彈性
link |
09:34.880
因為你可能不同的選擇題,它的選項根本就不一樣多啊
link |
09:39.280
所以如果你把它當作一個分類的問題
link |
09:41.280
這樣會變成你分類的問題裡面的類別斷的在改變
link |
09:45.120
這樣你可能不太好處理
link |
09:46.640
所以如果把它當作是一個二元分類的問題
link |
09:49.680
每次只丟一個選項進來,然後得到一個信心分數
link |
09:53.440
得到yes或no,或者是一個信心分數
link |
09:55.680
最後再看說四個選項裡面,哪一個選項的信心分數最高的
link |
09:59.200
就選信心分數最高的那個選項
link |
10:01.520
那可能是比較有彈性的做法
link |
10:03.840
這樣你這個模型可以用在選項數量不固定的狀況下
link |
10:10.640
好,那接下來呢,就進入大家最常見的SQUAD跟DRCD
link |
10:18.240
其實大家這個作業裡面用的就是DRCD啦
link |
10:22.080
好,那SQUAD呢,是EMNLP16的paper
link |
10:28.640
那SQUAD要做的事情,就是從輸入的文章裡面去找出來
link |
10:33.680
你要今天要門訊輸出的答案,一定是輸入文章裡面的其中一段
link |
10:40.080
那這樣子的東西,這樣子的QA的類型,又叫做Exception Based QA
link |
10:46.480
那最知名的、最具代表性的,就是SQUAD
link |
10:50.640
那這個是英文的
link |
10:51.840
那如果是中文一個比較具有代表性的,就是DRCD
link |
10:55.280
DRCD是台達電做的,當初做DRCD就是仿造SQUAD的格式
link |
11:00.400
做一個中文版的SQUAD
link |
11:03.360
那怎麼解這種Exception Based QA的問題呢?
link |
11:07.120
這個是你輸入的文章,它是一堆的token
link |
11:11.040
那你的model要做的事情就是,你的model要給每一個token一個作為起始的分數
link |
11:19.600
然後也要給每一個token一個作為結尾的分數
link |
11:24.800
接下來,你再看說哪一個token作為起始的分數最大
link |
11:29.840
比如說第三個token作為起始的分數最大
link |
11:34.000
再看哪一個token作為結尾的分數最大
link |
11:37.440
比如說第五個token,它作為結尾的分數最大
link |
11:40.960
那你就知道說現在的答案就是
link |
11:43.840
把第三個token當作開頭,把第五個token當作結尾
link |
11:47.840
所以你現在輸出的答案就是W3、W4、W5
link |
11:51.920
這個是今天常見的解這種Exception Based QA的方法
link |
11:56.320
那我第一次看到這樣的解法的時候,我覺得
link |
11:59.520
這個真的train得起來嗎?
link |
12:01.040
當然現在Squash就是這麼做的啦,大家都知道說這個方法
link |
12:04.400
做得起來就是這樣子
link |
12:06.960
其實在過去的文獻裡面,最常見的做法其實是這個樣子
link |
12:12.800
就是我們現在有一個Knowledge Source,有一個Question
link |
12:18.400
當然這個Knowledge Source跟Question,它們互相在process的時候
link |
12:23.200
它們在process的過程中,互相會有Attention
link |
12:27.360
那接下來呢,這個Knowledge Source被process以後
link |
12:32.320
就變成一個Vector Sequence
link |
12:34.800
通常每一個Vector或每一個Embedding就代表Input的一個token
link |
12:40.640
那接下來你會有一個Answer的Module
link |
12:44.640
這個Answer的Module做的事情就是把這一排Embedding把它吃進去
link |
12:51.040
那每一個Embedding都給它兩個數字
link |
12:55.040
一個數字就代表這個Embedding是問答案的起始的機率
link |
13:02.480
然後另外一個數字就代表這個Embedding是答案結束的機率
link |
13:08.880
所以你的Answer Module會把這個Knowledge Source的每一個token的Embedding讀進去
link |
13:17.280
然後根據每一個token的Embedding會給它兩個數值
link |
13:22.240
其中一個數值代表這個token是Start的機率
link |
13:26.640
另外一個數值代表這個token是End的機率
link |
13:30.480
那再來你可能會問說,那這個Answer Module它裡面的內容是什麼呢?
link |
13:37.280
在還沒有BERT的年代,通常你這個Answer Module就是好幾層的LSTM
link |
13:43.520
你要好幾層的LSTM,把這個Input的Vector Sequence讀進去
link |
13:48.240
然後每一個Vector就給它兩個數值
link |
13:51.280
那這其實是一個很Typical的Sequence Labeling的問題
link |
13:55.120
那在有了BERT的年代,因為這個Source的Module已經很複雜了
link |
14:01.920
所以這個Answer Module往往就不需要做太多事,就可以正確的找出答案
link |
14:07.680
那在有BERT的年代,這個Answer Module往往裡面就只有兩個Vector
link |
14:12.720
一個是代表Start的Vector,一個是代表End的Vector
link |
14:16.880
你把這個代表Start的Vector跟每一個Embedded去做搭乎搭
link |
14:22.240
就得到代表起始的分數
link |
14:25.360
你把End的Vector跟每一個Embedded做搭乎搭
link |
14:29.120
就可以得到代表End的分數
link |
14:32.560
那接下來還有一種比Expression Based QA更General的Case
link |
14:39.760
就是Free Answer的Generation
link |
14:42.800
也就是我們現在要產生的答案是沒有任何限制的
link |
14:46.080
這個產生出來的答案,它可能在文章裡面,也可能不在文章裡面
link |
14:52.480
那具有代表性的Corpus,舉例來說英文有MS Markle
link |
14:57.360
這個是Microsoft做的,中文有Dew Reader,這個是百度做的
link |
15:02.880
那像在MS Markle裡面,它的問題就有幾種類型,它的答案有幾種類型
link |
15:09.360
比如說有一種Case是,答案裡面有出現的詞彙,在文章裡面都找得到
link |
15:15.840
但是這些詞彙沒有連在一起,它是出現在文章的不同的位置
link |
15:22.560
所以像剛才那種Spam Based的方法,那種Extraction Based的方法,其實也沒辦法解這種問題
link |
15:28.320
在Extraction Based的方法裡面,你的答案一定是文章裡面的連續幾個詞彙
link |
15:34.240
如果你的答案是分佈在文章裡面不同的位置
link |
15:38.720
那像剛才講的那種Extraction Based的方法,是沒有辦法解的
link |
15:43.360
或者是有另外一種可能是,答案的文字一部分出現在文章裡面,一部分出現在問題裡面
link |
15:53.600
或還有一種可能是答案裡面有一些關鍵的詞彙出現在文章裡面,但也有一些詞彙沒有出現在文章裡面
link |
16:02.560
也有可能遇到一個Case是說,答案沒有出現在文章的任何地方
link |
16:09.440
那這時候特別容易出現這種狀況的是那種Yes、No的Question
link |
16:14.000
就是你今天的答案是Yes或No,但是Yes或No這兩個字眼可能根本就沒有出現在文章裡面
link |
16:21.280
不過像這種Yes或No的問題,有一個特殊的解法,有人會說
link |
16:26.400
那我就在文章裡面通通都加上Yes或No,不管是哪一篇文章,我都在它結尾放個Yes、放個No
link |
16:34.080
那這樣我就可以把Yes、No的Problem把它Reduce成Expression-based的Problem,可以這麼做,也有人這麼做
link |
16:42.160
當然還有另外一種做法是說,我今天事先對問題做一些分類
link |
16:46.880
Yes、No的Question這麼特別,它的答案一定不在文章裡面,但是它其實又是一個簡單的二元分類的問題
link |
16:53.600
那我就先用一個分類器,決定一個問題是不是Yes、No Question,決定一個問題它的答案是不是應該要輸出
link |
17:01.760
這種分類器,你如果只是要把答案是Yes、No的Question找出來,那是正確率可以做到很高啦,做到99什麼都是很有可能的
link |
17:10.080
你先做一個問題的分類器,找出那些答案就是Yes、No的Question
link |
17:13.920
然後這些Question特別把它拿出來當作是一個Binary Classification,當作是一個二元分類的問題,直接給它做下去就結束了
link |
17:25.280
事實上像NS Markle這種Corpus,很多時候有人會把它,很多時候就是直覺上想起來,你要怎麼解這種問題呢?
link |
17:36.640
直覺上想法就是Chain個Sequence-to-Sequence Model,用個Sequence-to-Sequence Model來產生答案
link |
17:44.640
比如說一個特別具有代表性的,叫做SNAT,SNAT怎麼做的呢?
link |
17:50.320
你會發現說,我們有Question的Encoder,有Passage,就是文章的Encoder,然後把文章跟問題讀過,接下來有個Decoder,Decoder就會把答案輸出來
link |
18:03.120
就是一個Sequence-to-Sequence Model,用Sequence-to-Sequence Model來產生各種不同的答案,當然可以這樣解
link |
18:11.680
不過很多時候我看這個NS Markle的解法,很多人都是用這種偷吃步的解法,怎麼偷吃步呢?
link |
18:18.160
把整個NS Markle當作是一個Extraction-based的問題來做,因為Extraction-based的QA絕對比你用什麼Sequence-to-Sequence Model容易
link |
18:28.080
所以把它硬當作Extraction-based的問題來做,那種答案不在文章裡面的不是會很慘嗎?
link |
18:37.360
可是因為答案的那些文字,往往在文章裡面還是有出現幾個嘛,那你有Extraction-based的方法,你還是可以抽出一段
link |
18:44.720
那一段裡面雖然跟正確答案不是一模一樣的,但跟正確答案有好幾個相似的詞彙
link |
18:51.200
然後在NS Markle的Evaluation裡面,只要你跟正確答案相似的詞彙一樣的詞彙越多,你的分數就越高,這樣至少可以蒙到一堆分數
link |
19:00.400
所以很多人在解NS Markle的時候,都是當作Extraction-based的QA來做
link |
19:04.960
那有人可能會問一個問題,如果把NS Markle當作Extraction-based的QA,可是正確答案在哪裡不知道啊?
link |
19:12.000
如果你今天你的答案根本就不在文章裡面,那你根本就不知道,如果要從文章裡面訓練一個Extraction-based的model,從文章裡面抽個段落的時候,根本不知道要抽哪裡嗎?
link |
19:23.360
這個早就有人解了,這個怎麼解呢?你就印在文章裡面,找一段文字,看看哪一段文字跟你的答案的overlap最大
link |
19:35.120
那一段文字就當作Extraction-based QA的quantum,當作正確答案,給它train下去,然後你就可以把整個NS Markle通通當作Extraction-based的QA來硬解
link |
19:46.080
好,那到目前為止,我們已經講了好幾種QA的型態,但是有一種例外的狀況是我們需要考慮的,因為並不是所有的問題都有答案
link |
19:59.600
這就讓我想到獵人試驗,獵人試驗裡面有一個關卡,就是會有一個攔路的老婆婆,那攔路的老婆婆會問你一個問題,回答了你才能夠通過
link |
20:12.320
比如說她問的問題是,你母親和女友被壞人抓住了,你只能救一個人出來,那你會救母親還是救女友呢?
link |
20:20.720
那有一個人就回答說,我也想要順著老婆婆的喜好回答,所以我就回答了母親,那老婆婆就說,過去吧!她就通過了這個關卡,就往前走了
link |
20:33.840
接下來就輪到主角群,然後老婆婆就問說,你兒子跟女兒被綁架了,你只能救回其中一個人,你會救女兒還是兒子呢?
link |
20:44.320
主角群裡面有一個人叫雷歐莉,就是這個人,她就生氣了,她就說,死老太婆,你還玩吶?
link |
20:50.960
她就抽起了一個木棒,就說,你玩上癮了,你的壽命就只剩下你倒數的那幾秒了,她就準備打那個老人
link |
20:58.640
這時候就被她的隊友,另外一個叫庫拉皮卡的人阻止了。庫拉皮卡說,我們其實已經答對了
link |
21:06.800
為什麼?因為沒有正確答案,評審又說我們只能回答一或二,也就是不回答,沉默才是正確答案
link |
21:16.640
那剛才那個回答母親的人是怎麼回事呢?評審並沒有說他答對,評審只是叫他過去而已
link |
21:24.720
剛才聽到一聲慘叫,剛才通過的人已經被魔獸吃掉了,所以那一條路不是正確的路
link |
21:32.640
所以看看這個多可怕,今天一個問題,如果沒有答案,你硬是回答的話,你就會被魔獸吃掉啊
link |
21:39.440
但是今天的QA的系統,它沒有這種能力啊,你問它什麼問題,它都一定會給你一個答案啊,所以它很容易被魔獸吃掉啊
link |
21:48.880
所以怎麼辦?我們需要有機器,不回答沒有答案的問題的能力,這樣可以避免機器被魔獸吃掉
link |
21:58.400
所以怎麼讓機器看到一個問題如果沒有答案的時候,就保持沉默,就選擇不回答呢?
link |
22:07.360
有一個benchmark corpus叫做SQUAD 2.0,就是想要測驗機器不回答的能力
link |
22:14.720
SQUAD 2.0裡面有很多假的問題,那些問題是沒有答案的,如果你回答的話就是錯了,就會被魔獸吃掉
link |
22:23.600
這些問題正確的答案就是沒有答案或者是選擇不回答或者拒答才是正確的
link |
22:30.640
舉例來說,這邊有一篇文章,然後它有一個問題,這個問題是說,有哪些法案遭逢到了巨大的反對
link |
22:41.600
但是在這篇文章裡面,沒有任何法案被反對,它雖然有提到opposition這個字眼,但它是說這些法案很少被反對
link |
22:51.120
但是對一般的機器來說,它可能就很愚蠢的隨便拿一些法案的名字就當作答案,那它就錯了,它就會被魔獸吃掉
link |
23:00.560
機器要知道說,這個問題是沒有答案的,或者它問你說,1937年的合約這個treaty是什麼名字呢?
link |
23:10.960
但是這文章裡面根本就沒有提到1937年treaty的名字,那一般的model可能就很憨的隨便找一個條約的名字出來當作答案
link |
23:21.040
那它就會被魔獸吃掉,那這個時候我們需要一個聰明的機器,跟庫拉皮卡一樣,它要知道說這一題的答案就是沉默
link |
23:30.560
那我們怎麼讓機器做到這件事情呢?其實在最原始的BERT的paper裡面,它就有試圖解釋過這個問題了
link |
23:41.040
在原版的BERT裡面,是怎麼讓機器選擇不回答的呢?它的做法是這樣,在文章裡面加入一個特別的token,這個特別的token我們這邊就叫做NOR
link |
23:54.880
然後接下來呢,就跟一般attraction-based QA一樣,每一個token,包括NOR這個token,都會得到一個作為初始的分數跟作為結束的分數
link |
24:06.800
如果最後你的machine發現說,NOR初始的分數最大,結束的分數也最大,代表說今天model覺得NOR才是答案,那model就會保持沉默,沒有答案才是正確的答案
link |
24:24.080
那在原始BERT裡面呢,其實它就是把CLS token當作NOR,如果你的model今天它的答案是CLS token,它給CLS token最大的初始分數跟最大的結束分數,那BERT就會回答說這個問題是沒有答案的
link |
24:42.960
那其實在實作的時候,這邊還有很多小細節要調啦,舉例來說,因為你很難遇到說這個NOR同時得到初始答案分數最高,作為結束分數最高的狀況
link |
24:57.440
所以怎麼辦呢?其實很多時候都是只要這兩個分數超過某一個threshold,就算是NOR了,它不需要是全部最大的,它不需要全部最大,只要超過某一個threshold就當作是沒有答案
link |
25:11.760
但是那個threshold就變成你需要自己用手來調一下就是了
link |
25:15.920
那還有很多其他的做法,舉例來說,一個直覺的做法就是,我們另外再train一個決定問題能不能被回答的module
link |
25:27.280
這個module可能會看question的embedding,可能會看你的文章的embedding,接下來它會回答yes或no
link |
25:36.240
這個問題可以回答還是不能回答,這是一個二元分類的問題
link |
25:41.920
那還有另外一種做法是說,因為像這種answerable module,它只看了文章,它只看了問題,它還沒有看machine的答案呢
link |
25:51.280
也許machine的答案可以告訴我們這個問題能不能夠被回答,舉例來說,也許machine的答案非常荒謬,它根本就找不出一個好的答案,所以硬是答了一個非常荒謬的答案
link |
26:02.160
那如果這個答案跟這個問題不匹配,這個答案跟這個問題答非所問的話,那這個問題可能就是不能回答的
link |
26:10.800
所以另外一個做法是,另外再train一個answer verifier,這個answer verifier把文章問題跟現在你的model得到的答案,這三個東西都當作輸入
link |
26:22.000
然後接下來回答yes或no,那跟這個answerable module不一樣的地方是,answerable module只看了問題跟文章,它還沒有看答案
link |
26:30.320
answer verifier可以再把答案也考慮進來,然後決定yes或no
link |
26:36.080
好,那接下來呢,我們就來講knowledge source的部分,講到這邊我們再稍微停一下,看看大家有沒有問題要問的
link |
26:47.200
我再下課,好,那我們接下來呢,講一下knowledge的source,我們有哪些可能的knowledge source呢?最常見的就是給你一篇文章當作knowledge source
link |
27:01.920
像我們在作業4-3做的,就是給你一篇文章叫你找出答案,但是這個setup其實有點不切實際,對不對?
link |
27:12.880
因為你可能會覺得說,這個看一篇文章找答案的實際應用是什麼啊?就是一篇文章給我,我自己不會看嗎?我一眼就看完啦,那我就得到答案了啊,我幹嘛還要問機器呢?
link |
27:25.360
所以真正使用這種question answering的狀況可能像是這樣,這個scenario這張圖是來自於doc.qa這篇paper
link |
27:37.040
就人提出來一個問題,但我們不是只要從某一篇文章找答案,我們根本不知道那篇文章在哪裡,整個internet就是我們的knowledge source
link |
27:50.960
在doc.qa這篇paper裡面它是沒有用整個internet啦,但它把整個wikipedia就當作是knowledge source
link |
27:57.920
所以我們會需要先有一個搜尋的系統,根據這個問題找出一些有可能有包含答案跟問題比較相關的文章,比如說抽個十篇出來
link |
28:09.440
然後你的QA model再去閱讀那十篇文章,決定最終的答案是什麼
link |
28:16.800
所以實際上在做QA的時候,我們可能會把從問題到答案的過程拆成兩個步驟,第一個步驟可能是從一個很大的資料庫裡面找出相關的文章
link |
28:28.640
第二個步驟才是根據這些相關的文章去找出問題的答案
link |
28:34.800
其實剛才有提到的nsmarkle還有due reader都是這樣子的設計,在nsmarkle跟due reader裡面,每一個問題其實都提供了數篇的文章
link |
28:47.600
你要從那數篇的文章裡面去找出正確答案,其實那些文章是哪來的呢?比如說在nsmarkle裡面,那些文章就是bin這個搜尋引擎的搜尋結果
link |
29:00.640
就是你輸入一個問題,然後這個搜尋引擎會回傳一大堆的文章,把前十名拿出來,然後要求你的QA model在那前十名的文章裡面找出正確答案
link |
29:13.760
那這樣會遇到的問題是什麼呢?因為不是所有你的搜尋引擎找出來的文章都是有關係的,不是所有你的搜尋引擎裡面的文章都有正確答案
link |
29:27.680
所以對你的QA model來說,它需要做一個額外的判斷,這額外的判斷是現在讀的這篇文章到底可不可信
link |
29:36.640
它應該只要相信那個可信的文章,把那個無關的可能會得到錯誤答案的文章把它濾掉
link |
29:43.600
當然怎麼把這些比較無關的文章,比較沒有包含正確答案的文章濾掉,是一個還值得研究上代研究的問題
link |
29:53.920
舉例來說,這邊舉一個例子,叫做VNET,我們看這個圖,你就可以大概知道說它在做什麼,它有輸入一個問題
link |
30:03.120
那這邊有很多passage,就是很多篇文章,那每一篇文章都給了一個答案
link |
30:10.880
有N篇文章,我們就有A1到AN這N個答案,到底哪一個答案才是正確的呢?
link |
30:19.200
我們就需要想一些方法來評估每一個答案的可信度,選出正確的答案
link |
30:26.640
比如說在VNET裡面,它比較有趣的想法是說,它覺得今天多數文章其實都有正確答案
link |
30:35.440
所以我們可以用一個類似投票的概念,來看說現在假設有十篇文章,如果有八篇都得到一樣的答案,那這個答案可能就是正確的
link |
30:46.240
那假設有某一篇文章,它得出來的答案跟別人都不一樣,那這篇文章的答案很有可能就是錯誤的
link |
30:54.080
它在VNET的paper裡面就舉了一個這樣的例子,這邊有個問題,這個問題是說mix跟pure culture它們的差異是什麼?
link |
31:02.400
我本來以為這個culture是指的是文化,就是純文化跟混雜文化它們的差異是什麼
link |
31:09.040
後來我發現這個culture不是指文化,這好像是跟生物比較有關係的,跟培養細菌什麼比較有關係
link |
31:15.920
我也搞不太清楚是什麼的,總之它不是指的文化
link |
31:19.120
現在這邊有六篇文章,根據這六篇文章我們會得到六個答案,你的QA model會給你六個答案,就是這邊的這六個有標出題字的部分
link |
31:31.440
但是我們會發現說,其實第一篇文章給我們答案跟其他篇文章特別的不一樣
link |
31:38.640
正確答案是第六篇文章提供的這個,pure culture是什麼,mix culture是什麼
link |
31:47.360
而第三篇文章、第四篇文章、第五篇文章得到的答案也跟第六篇差不多
link |
31:53.360
而第一篇文章它的答案是很奇怪,它就是在解釋跟文化有關的東西,那這不是錯的
link |
31:59.120
它解釋的是文化,不是pure culture跟mix culture這邊指的culture,這邊的culture不是文化
link |
32:04.720
所以第一題是錯的,就算是這一個答案的線性分數再高,但是因為其他passage得到的答案是不一樣的,所以1就會被看作是錯的
link |
32:15.280
而因為第六題的這個答案跟三四五題都像,所以第六題的這個答案可能比較是正確的答案,那這個就是VNET的基本想法
link |
32:27.760
好,那我們剛才講的都是拿文字當作輸入,那有沒有可能有其他種類類型的輸入呢?
link |
32:36.800
有可能的,你可能可以拿圖片當作輸入,可能可以拿影片當作輸入
link |
32:44.000
舉例來說,你可以給Machine看這張圖片,然後問它一些跟這個圖片有關的問題
link |
32:49.520
比如說這群人在幹嘛,穿藍色球衣的人在幹嘛,或場上有幾個球員等等
link |
32:56.400
那怎麼處理這樣子的圖片呢?其實一個常見的做法就是把一個圖片裡面丟到CNN裡面,然後CNN就會給這個圖片的每一小塊一個向量
link |
33:07.680
所以一張圖片也是表示成一堆向量,就好像對Bert而言,一篇文章輸進去就是一堆的embedding
link |
33:16.720
那現在你會有一個CNN,一個pre-trained好的model,然後你把一張圖片丟進去,它也會產生一堆embedding
link |
33:24.320
然後接下來用的QA的方法就跟文字上沒什麼差別,反正今天你的source都是一堆embedding嘛
link |
33:31.840
不管你的source是文字還是影像,通通都會變成一堆embedding,所以接下來回答問題的方法在文字上跟在影像上其實是沒有那麼大的差異的
link |
33:43.840
那我們實驗室嘗試做了很多以audio當作輸入的QA,因為你知道說網路上不是只有文字,不是只有影像,還有很多聲音
link |
33:59.520
聲音裡面往往包含了很重要的資訊,比如說這些聲音可能是新聞,可能是線上課程,它們裡面會包含了非常豐富的資訊
link |
34:08.880
我們也許可以從這些線上課程或者是新聞裡面擷取出重要資訊來當作問題的答案
link |
34:17.520
那怎麼做語音的QA呢?也許最簡單的想法就是先做語音辨識,把聲音訊號辨識成文字,然後根據這些語音辨識的結果來回答問題
link |
34:29.040
那我們實驗室最早嘗試讓機器去做托福的聽力測驗,這個文章其實蠻早的,這個是16年的文章
link |
34:39.680
我們在做這個研究的時候,那個時候連squat都還沒有,那個時候沒有squat,那個時候只有baby
link |
34:46.800
但我就想說,我們能不能夠讓machine去聽一段聲音,比如說線上的課程回答問題呢?
link |
34:54.720
那要怎麼開始做呢?我就想到托福的聽力測驗,當時有一個很強的同學叫做曾博祥,他去網路上收集了很多托福聽力測驗的問題
link |
35:05.120
他去考滿分的網站,爬了好幾百題,好幾百題今天聽起來怎麼那麼少,但當年會覺得不錯不錯,我們有快一千題的問題,應該是可以訓練一個模型的
link |
35:15.440
爬了近千題的托福聽力測驗的考古題,然後我們就用考古題來訓練一個模型,看看能不能讓機器去回答托福聽力測驗的問題
link |
35:27.280
托福聽力測驗大概像這個樣子,就是你有一段聲音,給機器聽,問機器一個問題,然後揭曉四個選項,希望機器可以選出正確的答案
link |
35:38.800
當然當年沒有BERT,不過沒有關係,反正就是train一個recurrent network,把語音的辨識結果讀過,把問題的辨識結果讀過,然後把這四個選項讀過,從四個選項裡面選一個正確的答案
link |
35:53.120
當然今天看起來就是一個一般的QA的問題,不過在當年連SQUAD都還沒有的年代,那個時候可以讓機器回答托福聽力測驗的問題是非常讓人興奮的
link |
36:05.200
後來有了SQUAD以後,我們就想說,那我們來做一個語音版的SQUAD吧,SQUAD就是有文章、有問題、有答案
link |
36:16.080
那我們就找人來念一些文章,找人來念一些問題,然後我們就有語音版的SQUAD就可以做Audio QA相關的研究
link |
36:27.280
本來在把這篇paper發表之前,在把Audio版本的SQUAD發表之前,我們把這篇Corpus的名字取叫Spoken Open Domain Question Answering,縮寫就是SODQA
link |
36:44.240
我是不知道SODQA是什麼,我不知道SOD是什麼,不過我覺得這個名字太棒了,太好了,我們就用這個名字來發表文章
link |
36:52.880
然後如果發表的時候,有人露出了奇怪的笑容,就像現在螢幕前的你一樣,我就要斥責他說,我根本不知道你在笑什麼
link |
37:01.360
但是學生後來覺得心裡過不去,還是把這個SOD改了,就把本來Spoken Open Domain改成Open Domain Spoken Question Answering
link |
37:12.240
這個同學是嘉軒,嘉軒後來覺得心裡過不去,就把SODQA改成ODSQA
link |
37:19.600
剛才我們講說怎麼做Audio的Question Answering,很簡單就是先做語音辨識,但是語音辨識會遇到什麼問題呢?就是語音辨識會有錯誤
link |
37:33.200
所以我們需要想一些辦法來讓我們的QA model處理語音的錯誤,我們這邊就列一些文獻給大家參考
link |
37:41.680
舉例來說,一個思考的方向是,也許今天語音的QA,它不一定要讀文字,它也許可以讀subword的unit
link |
37:51.920
比如說以中文為例,如果你單純看中文的字,比如說我說城市,你可能很難正確辨識說城市是city還是program
link |
38:02.160
如果你看字的層級,有比較大的辨識錯誤
link |
38:06.000
但是如果你在降一階,看注音符號的層級,那個也許就不會有錯了
link |
38:13.040
反正我說城市,注音符號辨識出來可能是正確的,雖然機器不知道是哪一個字
link |
38:17.600
但也許發音是對的,就可以正確的辨識出這段聲音的注音符號是什麼
link |
38:24.320
所以也許可以讓機器在注音符號的那個level去做Question Answering
link |
38:30.080
這樣可能可以得到不一樣的答案,可能可以得到跟用文字做Question Answering互補的結果
link |
38:38.000
另外一個我們發展的技術是使用了Adversarial Learning來做Domain Adaptation
link |
38:46.400
為什麼今天做語音的QA會需要Domain Adaptation呢?
link |
38:50.400
因為在做語音QA的時候,我們這個語音的訓練資料很少
link |
38:54.720
所以我們期待其實文字的資料是可以幫一些忙的
link |
38:59.200
因為文字的QA的Data很多嘛,語音QA的Data就一點點嘛
link |
39:03.360
所以我們期待文字QA是可以幫忙的
link |
39:06.000
但是文字QA的那些文章是沒有語音辨識錯誤的
link |
39:09.520
所以他們跟有語音辨識錯誤的語音QA中間就是有一個Mismatch
link |
39:16.320
那怎麼辦?我們期待用Domain Adversarial Training的方法來解這個問題
link |
39:22.400
但是更進一步,我們真的一定要做語音辨識嗎?
link |
39:28.400
有沒有可能跳過語音辨識這個問題?
link |
39:32.240
做一個真正的End-to-End的語音QA
link |
39:37.200
反正這個是莊永松助教做的啦,他Train了一個Speech Bird
link |
39:41.600
這個Speech Bird吃問題、吃聲音、沒做語音辨識
link |
39:46.720
直接告訴你答案落在聲音訊號的哪裡到哪裡
link |
39:50.480
End-to-End硬Train下去,然後就可以讓機器回答問題了
link |
39:56.080
當然你直接這樣做,你得到的正確率不可能跟有做語音辨識一樣高
link |
40:01.360
還是比有做語音辨識稍微差一點
link |
40:03.760
但是我們發現說,首先這個直接End-to-End做的Speech Bird
link |
40:08.240
它跟有做語音辨識的狀況是互補的
link |
40:11.680
就是你把有做語音辨識的模型跟沒有做語音辨識的模型的結果
link |
40:16.080
Ensemble起來還是有進步的
link |
40:18.400
然後在語音辨識錯誤率特別大的那些語音檔裡面
link |
40:24.720
Speech Bird的Performance甚至是可以比有做語音辨識的Performance還要稍微再好一點的
link |
40:31.120
好,那剛才講的都是從單一的來源來回答問題
link |
40:38.560
那有沒有可能從多個不同的來源來回答問題呢?
link |
40:42.400
是有可能的,比如說有一個比賽叫做Movie QA的比賽
link |
40:48.000
它是期望機器看一個電影的片段,然後回答問題
link |
40:52.240
而一部電影其實包含了不同的資訊
link |
40:56.320
比如說有影像的資訊,還有文字,比如說字幕的資訊
link |
41:02.160
還有一些對於劇情的文字的資訊
link |
41:05.840
所以在Movie QA這個比賽裡面,回答一個問題
link |
41:10.160
其實是提供了各種不同來源的資訊,有影像的也有文字的
link |
41:16.560
不過後來實際上比賽發現說文字的資訊有點太強了啦
link |
41:21.040
單用影像就是幾乎沒辦法回答問題,而且影像對文字幾乎沒有幫助
link |
41:28.080
如果你要做出最好的結果,都用文字就嚇嚇叫了,用文字的結果其實是最好的
link |
41:34.480
然後之前我們實驗室這個吳宥學、劉子健同學
link |
41:38.720
他們大學的時候有去參加這個比賽啦
link |
41:40.960
而且他們當時在比賽結束的時候還排名第二
link |
41:43.280
那個時候他們其實就只有用文字的資訊
link |
41:45.760
那個時候他們就設計了一個很複雜的模型叫QACNN
link |
41:49.440
那我們這邊就沒有細講,只是放在這邊告訴你說
link |
41:52.160
很複雜,那個還沒有BERT的年代
link |
41:54.400
就是都流行疊這種很複雜的模型去處理文章跟問題
link |
41:59.680
然後讓他得到正確的答案
link |
42:03.360
好,那接下來是有關問題的部分
link |
42:05.600
那我想講到這邊正好告一個段落
link |
42:07.600
那我們就停在這邊,看看大家有沒有問題要提出來的