Chapter7-11_Deep Learning for Question Answering (2/2)
文章目錄
- 1 Simple Question: Match & Extract
- 2 Complex Question: Reasoning
- 3 Dialogue QA
本文為李弘毅老師【Deep Learning for Question Answering (2/2)】的課程筆記,課程視頻youtube地址,點這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權,必定刪除。
文章索引:
上篇 - 7-10 Deep Learning for Question Answering (1/2)
下篇 - 7-12 Controllable Chatbot
總目錄
1 Simple Question: Match & Extract
Simple Question指的就是可以從給定的source中通過Match和Extract的方法找到答案的問題。比如SQuAD中的問題就是Simple Question。下圖中的第一個問題,我們可以通過"precipitation"和"fall"這兩個關鍵詞定位到答案在source中的第一句話中(Match),然后從中抽取出答案"gravity"(Extract)。
解決這樣的問題的模型架構如下圖所示,通常被稱為"Query-to-context Attention"。我們自底向上來看,首先我們會把source輸入到"module for source"中,然后輸出每個token對應的embedding,這里每個token會輸出兩個embedding,一個相當于attention中的key,另一個相當于attention中的value。同時,也會把問題輸入到"module for answer"中,得到一個embedding,這個就相當于attention中的query。我們會把右下角得到的黃色的query和左下角得到的藍色的key進行match,歸一化后,每個綠色的value會得到一個權重。加權求和得到上方深藍色的特征向量,將其輸入到"module for answer"當中,得到最終的結果。如果答案只有一個token,就是一個分類問題;如果答案是其中的一串span,那就預測頭尾token的位置。
這種架構最經典的模型就是2015年的End-To-End Memory Networks。
上面的架構可以做一個變形。就是當"module for question"輸出的embedding有多個的時候,也就是有多個query的時候,我們該怎么辦?我們可以把每個query和key去做一個match,那樣每個value就會得到多個權重,我們取其中最大的那個就可以了。
這種方法的一個典型例子就是2016年的Ask, Attend and Answer: Exploring Question-Guided
Spatial Attention for Visual Question Answering。
還有一種架構,叫做"context-to-query attention"。這種attention是把source每個token對應的embedding當作query,question每個token對應的embedding當作key,然后這兩者做attention。最后會得到一個向量,再把這個向量和query時的attention結合,變成下圖中綠色的向量,每個藍色的token都會得到一個綠色的向量,然后把所有綠色的向量輸入"module for answer"中,得到答案。
上圖的架構在實際操作時,可能還會對context做self-attention,比較經典的有Gated Self-Matching Networks for Reading Comprehension and Question Answering
那么query-to-context和context-to-query這兩者到底是誰好呢?既然分不清楚,我們不妨兩者都用。Bidirectional Attention Flow for Machine Comprehension, Dynamic Coattention Networks
For Question Answerin,QANet: Combining Local Convolution
with Global Self-Attention for Reading Comprehension這幾篇文章都是兩者都用的。
不過在今天看來,上面講到的一切,BERT里都有了,這也是BERT強大的原因,我們只要一個BERT就夠了。
2 Complex Question: Reasoning
complex question的問題在今天看來也是一個尚未找到合適的辦法的問題,所以這里只是大概介紹一下什么是complex question以及現有的解決辦法。
complex question和simple question的區別在于,simple question的答案必然在source的某一段話中可以直接找到,而complex question需要在多個source之間反復跳躍,綜合多個信息來得出答案。Qangaroo就是一個complex question的數據集。比如下面圖中的這個問題是問"Hanging gardens of Mumbai"在哪個國家,根據第一個source只能知道在"Arabian Sea",但Arabian Sea并不是國家,我們還要再根據后面的source才能知道在India。
屬于complex question的數據集還有Hoppot QA,DROP等等。其中的一些問題甚至需要機器根據source的內容去做加減乘除的操作。
這種在source之間跳來跳去的做法可以表示成下圖這樣。先根據問題match到一句話,然后根據extract的內容更新query,再進行一次match和extract以及更新,直到找到我們需要的答案為止。一般跳幾次是人為預先設定好的超參數。
在網絡架構中,就可以表示成下圖這樣。source中的每個token可以變成兩個embedding(藍和橙),分別表示key和value。用query的embedding去做attention,結合之前的query得到新的query。如此反復,反復次數由人預先設定。
當然也有讓模型自己去學習要跳多少次的模型,可參見ReasoNet。
這種跳躍的方式非常適合用圖網絡來做,于是也有人做了用圖網絡來解決complex question的嘗試,可參見 Dynamically Fused Graph Network for Multi-hop Reasoning。但也有人發現,當在訓練時,把BERT也進行finetune時,用不用圖網絡的效果時差不多的,因為BERT里的self-attention就是一個密集的圖網絡,可參見Is Graph Structure Necessary for Multi-hop Reasoning?。
3 Dialogue QA
Dialogue QA與之前兩類問題的區別在于,Dialogue QA會會有多個連續的問題,當前問的問題會需要用到之前問的問題的信息,比較典型的有CoQA。答案必然是在source當中的。
也有問問題的人完全沒有看過source的情況,這種情況下,可能就會問到一些沒有答案的問題,可參見QuAC。
解這類問題的時候,問題的embedding通常需要對之前的問題的embedding也做attention。
目前針對Dialogue QA各個模型在SQuAD上的效果如下圖所示,最上面一行時人類的表現,下面的時排名前5的模型的表現,可以看見前5的模型都超過了人類。但是,模型真的已經這么厲害了嗎?
事實并非如此,模型的泛化能力非常差,在SQuAD上訓練的模型,在bAbI上的表現非常差。
甚至有人發現,當把問題從"What did Tesla spend Astor’s money on"縮減為"did"時,模型竟然也能答對,而且置信度還變高了。可見模型并不是真正學到了語義,只是訓練集和驗證集的分布很像,模型學到了某個分布而已。
當有人把訓練集和驗證集的分布改了一下之后,模型就慘敗了。
看來在研究QA的地方,人類還有很長的路要走。
總結
以上是生活随笔為你收集整理的Chapter7-11_Deep Learning for Question Answering (2/2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git 提交文件_git原理与实战
- 下一篇: 三十、PHP框架Laravel学习笔记—