前不久小夕在知乎上寫了一個回答《NLP有哪些獨立研究方向》[1],於是有不少小夥伴來問分類和匹配的參考資料了,鑑於文字分類的資料已經超級多了,就不寫啦(不過分類相關的tricks可以看之前寫的這篇文章《文字分類重要tricks總結》)。匹配問題由於場景比較多,相關的文章不多,所以本文就致力於總結一下文字匹配問題上可以打卡的相關資料啦。
文字匹配是一個很寬泛的概念,只要目的是研究兩段文字之間的關係,基本都可以把這個問題看作是文字匹配問題。由於在不同的場景下對”匹配“的定義可能非常不同,因此文字匹配並不是一個完整獨立的研究方向。不過有相當多的NLP任務可以建模成文字匹配問題,當它們建模成文字匹配問題時,當然會發現模型結構、訓練方法等是高度高度相似的,卻又有著微妙的不同。所以這個問題雖然跑個baseline簡單,但是把具體的匹配問題中做好卻並不容易(尤其是在有BERT之前)。
下面就來具體說說可以打卡的內容。
打卡的baseline模型
打卡的任務場景和資料集
a. 相似度計算&複述識別
b. 問答匹配
c. 對話匹配
d. 自然語言推理/文字蘊含識別
e. 資訊檢索中的匹配
f. 機器閱讀理解問題
打卡的Siamese結構(基於表示)
打卡的花式attention結構(基於互動)
打卡的學習方法
打卡的預訓練模型
打卡的開源工具
無論具體的匹配問題是什麼,有一些很好實現的baseline是可以不管三七二十一的直接跑一下的。
我自己最喜歡用的baseline是SiameseCNN這種結構的模型,畢竟從頭手擼一遍非常快的,跑的又很快,效果又不錯,訓練又比較穩定,受超引數的影響相對較小。
模型大體結構如圖所示,這裡一般沒必要實現的太花哨,一般就用一層CNN來分別encoding一下需要匹配的textA和textB,然後max pooling一下或再concat一個mean pooling得到兩個文字的向量表示vecA和vecB(上圖中的u和v)。
這之後可以直接套用一些公式如cosine距離、L1距離、歐式距離等得到兩個文字的相似度,不過我們做文字匹配並不一定是希望判斷這兩個文字是否相似,除了相似關係外,還可以有問答關係、對話回覆關係、文字蘊含關係等,因此更通用的做法是基於u和v構建用於建模兩者匹配關係的特徵向量,然後用額外的模型(比如MLP)來學習通用的文字關係函式對映。
這個特徵向量可以像上圖一樣包括vec1, vec, |vec1-vec2|, vec1*vec2,也可以包括一些更加fancy的features,比如小夕常加的max(vec1, vec2)^2等,在一些匹配場景下有奇效。當然啦,更加靠譜的還是根據實際匹配場景的(bad)case來精心構造features。
如果對LSTM有執念,完全可以用lstm替代cnn來當sentence encoder,也就是使用SiameseLSTM結構,同樣這裡的encoder可以搭配各種預訓練模型強化一下文字的向量表示。
燃鵝,其實有了BERT之後,我就更喜歡拿BERT來當baseline了╮( ̄▽ ̄"")╭,畢竟連程式碼都不用寫了,更方便(經常baseline跑了一下發現問題解決了)。
這個可以說是文字匹配最典型最經典的場景了,也就是判斷兩段文字是不是表達了同樣的語義,即是否構成複述(paraphrase)關係。有的資料集是給出相似度等級,等級越高越相似(這種更合理一些),有的是直接給出0/1匹配標籤。這一類場景一般建模成分類問題。
SemEval STS Task:從2012年開始每年都舉辦的經典NLP比賽。這個評測將兩段文字的相似度程度表示為0.0~5.0,越靠近0.0表示這兩段文字越不相關,越靠近5.0表示越相似。使用皮爾遜相關係數(Pearson Correlation)來作為評測指標。連結[2]
Quora Question Pairs (QQP):這個資料集是Quora釋出的。相比STS,這個資料集規模明顯大,包含400K個question-question pairs,標籤為0/1,代表兩個問句的意思是否相同。既然建模成了分類任務,自然可以使用準確率acc和f1這種常用的分類評價指標啦。(知乎什麼時候release一個HuQP資料集( ̄∇ ̄))連結[3]
MSRP/MRPC:這是一個更標準的複述識別資料集。在QQP資料集中文字都是來自使用者提問的問題,而MRPC裡的句子則是來源於新聞語料。不過MRPC規模則要小得多,只有5800個樣本(畢竟是2005年release的資料集,而且人工標註,所以可以理解╮( ̄▽ ̄"")╭)。跟QQP一樣,MRPC一般也用acc或f1這種分類指標評估。連結[4]
PPDB:這個paraphrase資料集是透過一種ranking方法來遠端監督[]做出來的,所以規模比較大。文字粒度包含lexical level(單詞對)、phrase level(短語對)和syntactic level(帶句法分析標籤)。而且不僅包含英文語料,還有法語、德語、西班牙語等15種語言(為什麼沒有中文!)。語料庫規模從S號、M號一直到XXXL號讓使用者選擇性下載也是很搞笑了,其中短語級就有7000多萬,句子級則有2億多。由於語料規模太大,標註質量還可以,因此甚至可以拿來訓練詞向量[5]。連結[6]
問答匹配問題雖然可以跟複述識別一樣強行建模成分類問題,但是實際場景往往是從若干候選中找出正確答案,而且相關的資料集也往往透過一個匹配正例+若干負例的方式構建,因此往往建模成ranking問題。
在學習方法上,不僅可以使用分類的方法來做(在ranking問題中叫pointwise learning),還可以使用其他learning-to-rank的學習方法,如pairwise learning(”同question的一對正負樣本”作為一個訓練樣本)和listwise learning(”同question的全部樣本排好序“作為一個訓練樣本) 。因此,相應的評價指標也多使用MAP、MRR這種ranking相關的指標。
注意:這並不代表pointwise matching這種分類做法就一定表現更弱,詳情見相關papers
TrecQA:包含56k的問答對(但是隻有1K多的問題,負樣本超級多),不過原始的資料集略dirty,包含一些無答案樣本和只有正樣本以及只有負樣本的樣本(什麼鬼句子),所以做research的話注意一下,有些paper是用的clean版本(濾掉上述三類樣本),有的是原始版本,一個資料集強行變成了兩個track。連結[7]
WikiQA:這也是個小資料集,是微軟從bing搜尋query和wiki中構建的。包含10K的問答對(1K多的問題),樣本正負比總算正常了些。連結[8],paper[9]
QNLI:總算有大規模資料集了,這個是從SQuAD資料集改造出來的,把context中包含answer span的句子作為匹配正例,其他作為匹配負例,於是就有了接近600K的問答對(包含接近100K的問題)。連結[10]
對話匹配可以看作進階版的問答匹配,主要有兩方面升級。
一方面,對話匹配在問答匹配的基礎上引入了歷史輪對話,在歷史輪的限制下,一些本來可以作為回覆的候選會因此變得不合理。比如,歷史輪提到過你18歲了,那麼對於query”你今天在家做什麼呢“,你就不能回覆“我在家帶孫子”了。
ps:一個價值五毛錢的例子(¬_¬)
另一方面,對於一個query,對話回覆空間要遠比問題答案空間大得多,對於問答類query,正確答案往往非常有限,甚至只有一個,但是對話類query卻往往有一大串合理的回覆,甚至有一大堆的萬能回覆比如“哦”,“好吧”,“哈哈哈”。很多時候的回覆跟query在lexical level上基本沒有交集,因此對話匹配模型更難訓一些,資料質量稍差就難以收斂。因此做夠了問答匹配,來做做對話匹配還是比較意思滴。
該問題一般使用Recall_n@k(在n個候選中,合理回覆出現在前k個位置就算召回成功)作為評價指標,有時也會像問答匹配一樣使用MAP、MRR等指標。
UDC:Ubuntu Dialogue Corpus是對話匹配任務最最經典的資料集,包含1000K的多輪對話(對話session),每個session平均有8輪對話,不僅規模大而且質量很高,所以近些年的對話匹配工作基本都在這上面玩。連結[11],paper[12]
Douban Conversation Corpus:硬要給UDC挑毛病的話,就是UDC是在ubuntu技術論壇這種限定域上做出來的資料集,所以對話topic是非常專的。所以@吳俁 大佬release了這個開放域對話匹配的資料集,而且由於是中文的,所以case study的過程非常享受。連結[13],paper[14]
四、自然語言推理/文字蘊含識別(Natural Language Inference/Textual Entailment)
NLI,或者說RTE任務的目的就是判斷文字A與文字B是否構成語義上的推理/蘊含關係:即,給定一個描述「前提」的句子A和一個描述「假設」的句子B,若句子A描述的前提下,若句子B為真,那麼就說文字A蘊含了B,或者說A可以推理出B;若B為假,就說文字A與B互相矛盾;若無法根據A得出B是真還是假,則說A與B互相獨立。
顯然該任務可以看作是一個3-way classification的任務,自然可以使用分類任務的訓練方法和相關評價指標。當然也有一些早期的資料集只判斷文字蘊含與否,這裡就不貼這些資料集了。
SNLI:Stanford Natural Language Inference資料集是NLP深度學習時代的標誌性資料集之一,2015年的時候釋出的,57萬樣本純手寫和手工標註,可以說業界良心了,成為了當時NLP領域非常稀有的深度學習方法試驗場。連結[15],paper[16]
MNLI:Multi-Genre Natural Language Inference資料集跟SNLI類似,可以看做SNLI的升級版,包含了不同風格的文字(口語和書面語),包含433k的句子對,連結[17]
XNLI:全稱是Cross-lingual Natural Language Inference。看名字也能猜到這個是個多語言的資料集,XNLI是在MNLI的基礎上將一些樣本翻譯成了另外14種語言(包括中文)。連結[18]
五、資訊檢索中的匹配
除上述4個場景之外,還有query-title匹配、query-document匹配等資訊檢索場景下的文字匹配問題。不過,資訊檢索場景下,一般先透過檢索方法召回相關項,再對相關項進行rerank。對這類問題來說,更重要的是ranking,而不是非黑即白或單純的selection。ranking問題就不能僅僅依賴文字這一個維度的feature了,而且相對來說判斷兩個文字的語義匹配的有多深以及關係有多微妙就沒那麼重要了。
從純文字維度上來說,q-a、q-r匹配和NLI相關的方法在理論上當然可以套用在query-title問題上;而query-doc問題則更多的是一個檢索問題了,傳統的檢索模型如TFIDF、BM25等雖然是詞項(term)level的文字匹配,但是配合下查詢擴充套件,大部分case下已經可以取得看起來不錯的效果了。如果非要考慮語義層次的匹配,也可以使用LSA、LDA等主題模型的傳統方法。當然啦,強行上深度學習方法也是沒問題的,例如做一下query理解,甚至直接進行query-doc的匹配(只要你捨得砸資源部署),相關工作如
HCAN:EMNLP2019 | Bridging the Gap between Relevance Matching and Semantic Matching for Short Text Similarity Modeling
六、機器閱讀理解問題
同時,還有一些不那麼直觀的文字匹配任務,例如機器閱讀理解(MRC)。這是一個在文字段中找答案片段的問題,換個角度來說就可以建模成帶上下文的問答匹配問題(雖然候選有點多╮( ̄▽ ̄"")╭)。代表性資料集如SQuAD系列、MS MARCO、CoQA、NewsQA,分別cover了很多典型的NLP問題:MRC任務建模問題、多文件問題、多輪互動問題、推理問題。因此做匹配的話,相關的代表性工作如BiDAF、DrQA等最好打卡一下的。
上述各個場景的模型其實差不太多,甚至一些方法直接在多個匹配場景上進行實驗,近兩年的paper也大多claim自己是一個非常general的匹配框架/模型。因此下面介紹打卡paper的時候就不區分場景啦,而是分成基於表示和基於互動來介紹打卡點。
注意:雖然基於表示的文字匹配方法(一般為Siamese網路結構)與基於互動的匹配方法(一般使用花式的attention完成互動)紛爭數年,不過最終文字匹配問題還是被BERT及其後輩們終結了。因此下面兩節請帶著緬懷歷史的心情來打卡,不必糾結paper的細節,大體知道劇情就好。
打卡的Siamese結構(基於表示)
這種結構就是本文開頭提到的,首先對兩段文字分別進行encoding進而得到各自的向量表示,然後透過相似度計算函式或相關結構來得到最終的匹配關係。
在baseline階段提到的SiameseCNN和SiameseLSTM的基礎上,這個方向往下做無非就是兩個方向:
1. 加強encoder,得到更好的文字表示
2. 加強相似度計算的函式建模
對於第一個方向,無非就是使用更深更強大的Encoder,代表性打卡工作如
ps:雖然這篇paper的真正目的是遷移學習
對於第二個方向,則是使用更花哨的相似度計算函式或更花哨的用於學習相似度函式的網路結構,可打卡的工作如
顯而易見,這個方向可玩性不強(雖然容易work但是paper寫出來不夠炫酷),所以不要問為什麼只更新到了2017年,因為2016年attention就遍地開花了,自然大家基本都跑去趕潮做花式互動結構了。
打卡的花式attention結構(基於互動)
顧名思義,這種思路就是首先透過attention為代表的結構來對兩段文字進行不同粒度的互動(詞級、短語級等),然後將各個粒度的匹配結果透過一種結構來聚合起來,作為一個超級特徵向量進而得到最終的匹配關係。
顯然這種思路下,除了讓文字對的互動更花哨以外,就是考慮讓模型變得更深(從而建模更高level的匹配關係)。
不過個人經驗來說,這種思路下雖然可以玩的花樣很多,一些論文argue的點也看似有一些道理,不過實際很多模型都是在廖廖一兩個資料集上瘋(暴)狂(力)改(搜)進(索)各種structure才把分數刷上去的,導致這種structure看似在某個場景甚至僅僅是某些資料集上work,實際上這個structure可能僅僅迎合了特定資料分佈或特定場景的一些特性,導致很多工作放到一個新場景下就效果翻車了,甚至努力調參都調不動太多。
因此在BERT之前這類論文提出的模型雖然看起來高大上,不過可能換個資料集後還不如稍微調調參拍拍腦袋的SiameseCNN好用。所以在刷這類論文時,千萬不要被蜜汁花哨的模型結構迷惑了雙眼噢~相關工作很多,從中挑選了幾篇比較有代表性或比較有資訊量或容易閱讀的。
MatchCNN:AAAI2016 | Text Matching as Image Recognition
DecAtt:EMNLP2016 | A Decomposable Attention Model for Natural Language Inference
CompAgg:ICLR2017 | A COMPARE-AGGREGATE MODEL FOR MATCHING TEXT SEQUENCES
ESIM:ACL2017 | Enhanced LSTM for Natural Language Inference
2018 COLING | Neural Network Models for Paraphrase Identification, Semantic Textual Similarity, Natural Language Inference, and Question Answering
ps:這篇paper其實可以看做是對前面各模型的實驗和分析大總結
DAM:ACL2018 | Multi-Turn Response Selection for Chatbots with Deep Attention Matching Network
HCAN:EMNLP2019 | Bridging the Gap between Relevance Matching and Semantic Matching for Short Text Similarity Modeling
此外,這裡尤其要注意一下模型對稱性的問題,像文字相似度計算/q-q匹配/title-title匹配這類場景下的匹配是對稱的,即match(a,b)=match(b,a),但是模型不對稱後,就會讓模型自己額外的學習這個先驗知識,除非資料集很大,或者已經預訓練過了,否則效果很容易翻車。當然了,也有一些tricks可以強行使用不對稱模型,即在這類場景下對每個樣本都跑一遍match(a,b)和match(b,a)然後取平均,不過相比天然對稱的模型效果如何就要看各位煉丹師的水平啦
pointwise/pairwise/listwise learning這三種方法已經資料滿天飛了,這裡就不贅述了。這裡給還不熟悉的小夥伴們推薦一篇文章[19]
雖然經過若干年的煉丹,靠model structure已經可以在非常多的文字匹配任務場景取得不錯的效果了,但是實驗證明,還是沒法跟海量語料上pretrain的模型比的,先上一張圖,問答資料集TrecQA上的實驗結果:
其中HCAN是EMNLP2019新提出的模型,雖然已經吊打了ESIM、DecAtt等老一代花哨模型,但是可以看到還是被BERT吊打了,更不必說跟XLNet、ERNIE2.0和RoBERTa等近期模型去對比了。所以真正大一統文字匹配任務的話,目前來看還是離不開大型預訓練模型的。
當然啦,非要用傳統的匹配模型的話,至少還有ELMo可以拿來強行續命【手動狗頭】
打卡的開源工具
雖然文字匹配baseline容易構造,不過要在具體場景搭建一個完整的系統還是工作量比較大的,藉助一些好用的開源工具可以大大提升開發效率。
PS:訂閱號後臺回覆「文字匹配」可領取小夕打包好的論文大禮包噢~(包括正文中的papers)
參考文獻(正文中貼了的就不在下面寫啦)
[2] http://ixa2.si.ehu.es/stswiki/index.php/STSbenchmark
[3] https://www.quora.com/q/quoradata/First-Quora-Dataset-Release-Question-Pairs
[4] https://www.microsoft.com/en-us/download/details.aspx?id=52398
[5] 2015TACL | From Paraphrase Database to Compositional Paraphrase Model and Back
[6] http://paraphrase.org/#/download
[7] https://trec.nist.gov/data/qa.html
[8] https://www.microsoft.com/en-us/download/details.aspx?id=52419
[9] Yang Y, Yih W, Meek C. Wikiqa: A challenge dataset for open-domain question answering[C]//Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing. 2015: 2013-2018
[10] https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FQNLIv2.zip?alt=media&token=6fdcf570-0fc5-4631-8456-9505272d1601
[11] http://dataset.cs.mcgill.ca/ubuntu-corpus-1.0/
[12] Lowe R, Pow N, Serban I, et al. The ubuntu dialogue corpus: A large dataset for research in unstructured multi-turn dialogue systems[J]. arXiv preprint arXiv:1506.08909, 2015.
[13] https://archive.org/details/DoubanConversaionCorpus
[14] Wu Y, Wu W, Xing C, et al. Sequential matching network: A new architecture for multi-turn response selection in retrieval-based chatbots[J]. arXiv preprint arXiv:1612.01627, 2016.
[15] https://nlp.stanford.edu/projects/snli/
[16] Bowman S R, Angeli G, Potts C, et al. A large annotated corpus for learning naturallanguage inference[J]. arXiv preprint arXiv:1508.05326, 2015
[17] http://www.nyu.edu/projects/bowman/multinli
[18] https://www.nyu.edu/projects/bowman/xnli
[20] https://github.com/NTMC-Community/MatchZoo.
[21] https://github.com/baidu/AnyQ
[22] https://github.com/PaddlePaddle/models