Open-domain question answering (QA)QA可以分為Close-domain QA和Open-domain QA,,前者一般限制在某個特定領(lǐng)域,有一個給定的該領(lǐng)域的知識庫,,比如醫(yī)院里的問答機器人,,只負責回答醫(yī)療相關(guān)問題,甚至只負責回答該醫(yī)院的一些說明性問題,,再比如我們在淘寶上的智能客服,,甚至只能在它給定的一個問題集合里面問問題;而Open-domain QA則是我們可以問任何事實性問題,,一般是給你一個海量文本的語料庫,,比方Wikipedia/百度百科,讓你從這個里面去找回答任意非主觀問題的答案,,這顯然就困難地多,。總結(jié)一下,,Open-domain QA的定義:
注意,,是回答factoid questions,即一個很客觀的問題,,不能問一些主觀的問題,。 這就類似于我們只在在搜索引擎里搜索某個問題的答案,我們希望搜索引擎能直接告訴我們答案,,而不單單是找到一篇文章,,然后我們需要自己找答案。 舉個例子,,正好我前幾天搜索triplet loss的時候印象深刻: 我在Google里面直接搜triplet loss: 首先,,排在第一的結(jié)果就是Wikipedia的link,同時上面顯示了一段話,,讓我不用點開Wikipedia,,就能直接知道triplet loss是什么,有什么用,,另外,,仔細看的話,發(fā)現(xiàn)它把具體定義的那句話給我加粗了,,就是我上面高亮的部分,。 如果我繼續(xù)點擊進入Wikipedia,會更清楚的看到搜索引擎幫我把我想要的答案給高亮了(下圖中的紫色部分是瀏覽器自動顯示的,不是我選擇的): 我想這就是個很好的例子,,告訴我們open-domain QA想要做的是什么事,。 當然,搜索引擎返回答案,,還涉及到其他技術(shù),,比如有一些事實性問題,比如“姚明比奧尼爾高多少”,,就需要借助知識圖譜等技術(shù)來實現(xiàn)了,。 Open-domain QA的兩個步驟我們這里講深度學習時代的Open-domain QA,傳統(tǒng)的方法往往涉及到十分復(fù)雜的組件,,而隨著基于深度學習的閱讀理解(reading comprehension)模型的興起,,我們現(xiàn)在可以把Open-domain QA給簡化成兩個步驟:文本檢索與閱讀理解。 ① 文本檢索:需要一個retriever,,從海量文本中,,找到跟question最相關(guān)的N篇文檔,這些文檔中包含了該問題的答案,; ② 閱讀理解:需要一個reader,,從上面抽取出來的文檔中,找到具體答案,。 文本檢索對于文本的檢索,,目前最常用的方案就是基于倒排索引(inverted index)的關(guān)鍵詞檢索方式,例如最常用的ElasticSearch方案,,就是基于倒排索引的,,簡言之,這是一種關(guān)鍵詞搜索,,具體的匹配排序規(guī)則有TF-IDF和BM25兩種方式,。這種文本檢索的方式,是一種文本的bag-of-words表示,,通過詞頻,、逆文檔頻率等統(tǒng)計指標來計算question和document之間的相關(guān)性,可參考BM25的wiki,。 這種方式,,是比較“硬”的匹配,當你搜索的關(guān)鍵詞準確,、明確時,,搜索結(jié)果會非常好,但是當你只知道大概意思,,搜索的結(jié)果可能就很差,,因為bag-of-words的表示,,無法認識到詞語之間的相似性關(guān)系,,因此就只能搜索到你輸入的關(guān)鍵詞,,卻無法找到詞語不同但意思相近的結(jié)果。 一般的Open-domain QA都會直接使用這種基于TF-IDF或者BM25的匹配方式來進行檢索,,本論文則是提出,,我們可以使用語義的匹配來達到更好的效果,彌補硬匹配的不足,,這也是本論文的主要關(guān)注點,。具體地,我們可以訓練一個語義表示模型,,賦予文本一個dense encoding,,然后通過向量相似度來對文檔進行排序。 其實向量搜索也很常見了,,像以圖搜圖就是典型的向量相似度搜索,,常用的開源引擎有Facebook家的FAISS. 閱讀理解閱讀理解一般指的是,給定一個問題(question)和一段話(passage),,要求從這段話中找出問題的答案,。訓練方式一般是我們計算passage中每個token是question的開頭s或者結(jié)尾t的概率,然后計算正確答案對應(yīng)start/end token最大似然損失之和,。具體咱們可以參考BERT論文中對fine-tuning QA模型中的方法介紹: 即,,通過BERT encoder,我們可以得到每個token的一個representation,,然后我們再額外設(shè)置一個start vector和一個end vector,,與每個token的representation計算內(nèi)積,再通過softmax歸一化,,就得到了每個token是start或者end的概率,。 我在一個博客上看到了一個畫的更清楚的圖: 關(guān)于閱讀理解的具體內(nèi)容,這里也不贅述,,這也不是今天這篇論文的重點,。 Dense Passage Retriever (DPR)本文最重要的就是這個DPR了,它解決的就是open-domain QA中的檢索問題,,目標是訓練一個文本表示模型,,可以對question和passage進行很好的語義向量表示,從而實現(xiàn)高精度的向量搜索,。 DPR是一個retriever,,實際上分兩塊,首先我們需要得到文檔的向量表示,,然后我們需要一個向量搜索工具,,后者本文中直接使用著名的FAISS向量搜索引擎,,所以重點就是訓練一個文本表示模型。 Dual-encoder本文使用了一個dual-encoder的框架,,可以理解為一個雙塔結(jié)構(gòu),,一個encoder 專門對passage進行表示,另一個encoder 專門對question進行表示,,然后我們使用內(nèi)積來表示二者的相似度: 損失函數(shù)設(shè)計我們首先構(gòu)造訓練樣本,,它是這樣的形式: $$D = \{即,每個訓練樣本,,都是由1個question,,1個positive passage和n個negative passage構(gòu)成的。positive就是與問題相關(guān)的文本,,negative就是無關(guān)的文本,。 用一個樣本中每個passage(n+1個)和當前question的相似度作為logits,使用softmax對logits進行歸一化,,就可以得到每個passage與當前question匹配的概率,,由此就可以設(shè)計極大似然損失——取positive passage的概率的負對數(shù): 上面的公式里,為方便看清楚,,我省去了樣本的下標,。可以看到,,這就相當于一個cross-entropy loss,。而這樣的設(shè)計,跟現(xiàn)在遍地的對比學習的loss非常像,,例如知名的SimCSE也引用了本文: 負樣本選擇在上面的損失函數(shù)中,,我們發(fā)現(xiàn)負樣本起著重要的作用。另外,,正樣本一般都是確定的,,而負樣本的選擇則是多種多樣的,所以負樣本怎么選,,對結(jié)果應(yīng)該有很大的影響,。 作者設(shè)計了三種負樣本(negative passage)選擇的方式:
既然都命名為Gold了,,那說明作者對它給予了厚望,肯定是主要的負樣本來源,。 論文最終的最佳實踐,,就是主要采用同一個mini-batch中的Gold passages,配合上一個BM25 passage(以及同batch內(nèi)其他question的BM25),。 關(guān)鍵的Trick——In-batch negatives假設(shè)我們的batch size為B,,每個question有1個positive和n個negative,,那么一個batch內(nèi)就有個passages要經(jīng)過encoding,,而一般我們都需要比較多的negatives才能保證較好的效果,所以光是encoding,,這個計算開銷就很大,。 于是,有人就想出了一個辦法,,我們只需要B個questions和其對應(yīng)的B個positives,,形成兩個矩陣和,然后“我的positive,,可以當做你的negative”,,這樣我們就不需要額外再找negative了,然后直接算一個就可以得到計算損失函數(shù)所需要的所有pair的相似度,,這就使得整個過程變得高效又簡潔,。由于不需要額外找negatives,所以一個batch內(nèi)只有個positive passages需要經(jīng)過encoding,,這比前面的方法減少了倍,,干凈又衛(wèi)生啊兄弟們。 上面說的方式,,相當于只使用Gold負樣本,,實際上作者在最佳方案中還使用了BM25負樣本,但也是采用的in-batch training的策略,,即,,我每個question都找一個BM25負樣本, 然后,,該BM25樣本也會作為同batch內(nèi)所有其他question的負樣本,,這相當于再增加一個矩陣,總共有個passages進行encoding,,然后多計算一個矩陣乘法得到相似度,。 最后注意,in-batch training并不是DPR論文首創(chuàng),,前面很多工作中已經(jīng)得到成功應(yīng)用,。 實驗設(shè)置&數(shù)據(jù)集Knowledge Source知識庫,,就是我們open-domain QA使用什么語料庫來進行問答。本文選用Wikipedia,,這也是最常用的設(shè)定,。當然,Wikipedia是一篇篇文章,,通常是十分長,,模型不便處理,因此這里作者將所有文本,,都繼續(xù)劃分成100個詞長度的passages,,這些length=100的passages就是本文做檢索的基本單元。另外,,每個passage還在開頭拼接上了對應(yīng)Wikipedia page的title,。 QA Datasets我們還需要有<問題,答案>這樣的數(shù)據(jù)集,,來讓我們訓練retriever和reader,。 具體數(shù)據(jù)集有:
這些數(shù)據(jù)集中,,對于TriviaQA,WQ和TREC,,由于沒有給相關(guān)的context,,沒法直接那answer當做positive passages,所以作者選擇在Wikipedia passages中使用BM25來檢索包含answer的passage來作為positive passage(雖然這種做法我感覺不一定好,,因為匹配上的,,不一定就能回答你的問題,比如你問“阿里巴巴誰創(chuàng)辦的”,,答案是“馬云”,,但包含“馬云”的句子可能是“馬云在達沃斯論壇演講”,這顯然不能回答該問題),。 對于SQuAD和NQ,,由于這些數(shù)據(jù)集提供的passage跟作者自己的預(yù)處理方式不一樣,所以作者用這些passage在前面對Wikipedia預(yù)處理后的passages pool中去匹配得到positive passage,。 Baselines對于retrieval任務(wù),,baseline就是BM25算法,同時作者還對比了BM25+DPR的效果,,即將二者的得分進行加權(quán)平均:,,其中作者發(fā)現(xiàn)效果較好。 另外對于DPR來說,,越多的訓練樣本肯定越好,,所以除了在單個數(shù)據(jù)集上訓練測試外,,作者還嘗試了使用所有數(shù)據(jù)集的訓練樣本來訓練DPR然后測試。而BM25也是純統(tǒng)計方法,,所以不存在使用訓練數(shù)據(jù)一說,。 Retrieval任務(wù)實驗結(jié)果Main Results:結(jié)果見下表: 可以發(fā)現(xiàn),除了SQuAD數(shù)據(jù)集,,其他的數(shù)據(jù)集上,,DPR的表現(xiàn)都不錯,都大幅超越了BM25算法,,而結(jié)不結(jié)合BM25,,其實影響不是很大,但使用更多的訓練數(shù)據(jù)集,,總體上肯定更好些,。 在精確匹配上效果并不好:在SQuAD上,效果很差,,這一點很有意思。關(guān)于這一點,,作者給出的解釋是: 即 1.這個數(shù)據(jù)集的question跟passage再語言上高度重合,,所以BM25天然有優(yōu)勢;2. 這個數(shù)據(jù)集采樣是有偏的,。 其實這也告訴我們,,你DPR也不是萬能的,天下沒有免費的午餐,,在那種“精確匹配”的場景下,,相似度搜索一般不會比bag-of-words硬匹配更好。 訓練好的DPR需要多少數(shù)據(jù)量:然后我們看看使用多少數(shù)據(jù)量,,DPR就超過了BM25: 可見,,僅僅使用1k的數(shù)據(jù)量,DPR這種語義匹配的方式,,就超越了BM25這種硬匹配,。 In-batch negatives:然后再看看negative樣本的選擇的影響,也看看in-batch training這種方式怎么樣: 這個表初次讀的時候一直搞不懂,,文中也沒寫明白,,后來請教了同學才搞明白: 第一個block,batch size不太清楚,,有可能是128,,但不使用in-batch的策略,每個question都自帶7個negatives參與訓練,。這個block是為了對比不同的negative的效果,,發(fā)現(xiàn)其實差不多,,各有優(yōu)劣。 第二個block,,batch size分別是8,,32,128,,采用的in-batch策略,,使用同batch內(nèi)的其他positive作為negative,所以batch越大,,可以使用的negatives就越多,,因此效果就越好,效果比第一個block好了很多,。 第三個block,,batch size分別是32,32,,128,,除了Gold,每個樣本還帶了1-2個BM25樣本,,且這些樣本在整個batch內(nèi)共享(參考上文中“負樣本選擇”一節(jié)的介紹),,發(fā)現(xiàn),帶一個BM25樣本就有明顯提高,,再多了就沒效果了,。 總之,這個實驗說明,,in-batch training是很高效,、有效的一種方法,然后負樣本我們可以主要使用batch內(nèi)的那些positives(即Gold passages),,再配上一個額外的BM25 passage即可取得很好的效果,。 Similarity和loss的選擇本文采用的是dot product作為相似度度量,作者還測試了L2距離和cosine similarity,,發(fā)現(xiàn)最差的是cosine similarity,。(這一點有意思,可探究一下為什么) 關(guān)于loss,,除了本文的NLL loss,,作者還嘗試了在similarity任務(wù)中常用的triplet loss,發(fā)現(xiàn)效果差別不大,,但還是NLL loss更好一點,。 Cross-dataset generalization這里文中也是一筆帶過,所以我也不贅述,我只是很高興在論文中看到了這樣的實驗,,cross-dataset generalization是大多數(shù)人不會去考慮的一個實驗,,但對于驗證泛化性能是很重要的。 End-to-End QA實驗結(jié)果這部分并不是本文的重點,,前面講了,,除了訓練一個retriever(對應(yīng)本文的DPR),完成open-domain QA還需要一個reader,。之前的sota工作都涉及到復(fù)雜的預(yù)訓練,,但是本文重點在于搞一個很好的retriever——DPR,從而只需要簡單訓練一個reader就夠了,,下面是實驗結(jié)果: 最后再貼一段作者自己的評論: 總結(jié)這篇文章最大的亮點在于在訓練學習text representation的時候如何選擇negative samples,,其中的Gold和BM25對學習一個好的表示起到了重要的作用,因此僅僅使用1k個訓練樣本,,就可以訓練一個超越BM25算法的文本檢索工具,。本文也為后續(xù)的一些對比學習工作,例如SimCSE等產(chǎn)生了啟發(fā),,作為文本相似度匹配的重要工作,,本文還是很值得一讀的。 以上,,這篇文章就解讀完畢了,,其實我之前怎么了解過QA,而本文對于QA小白來說也是一個絕佳的教材,,所以這篇文章除了讓我了解DPR這個工作之外,也讓我學習了很多關(guān)于QA的相關(guān)知識,,收獲頗豐,。 推薦資料: [1]Wikipedia: Question Answering https://en./wiki/Question_answering 最后,特別感謝MSRA張航同學給予的答疑,,解決了本文理解上的幾個關(guān)鍵問題 :) 如果覺得有所收獲的話 大家就點一個贊吧 :) 2022年的第5/52篇原創(chuàng)筆記 近期文章: |
|