文本匹配相關方向探討
前不久小夕在知乎上寫了一個回答《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跑了一下發現問題解決了)。
打卡的任務場景和數據集一、相似度計算&復述識別(textual similarity¶phrase identification)
這個可以說是文本匹配最典型最經典的場景了,也就是判斷兩段文本是不是表達了同樣的語義,即是否構成復述(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]
二、問答匹配(answer selection)
問答匹配問題雖然可以跟復述識別一樣強行建模成分類問題,但是實際場景往往是從若干候選中找出正確答案,而且相關的數據集也往往通過一個匹配正例+若干負例的方式構建,因此往往建模成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]
三、對話匹配(response selection)
對話匹配可以看作進階版的問答匹配,主要有兩方面升級。
一方面,對話匹配在問答匹配的基礎上引入了歷史輪對話,在歷史輪的限制下,一些本來可以作為回復的候選會因此變得不合理。比如,歷史輪提到過你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的匹配(只要你舍得砸資源部署),相關工作如
DSSM:CIKM2013 | Learning Deep Structured Semantic Models for Web Search using Clickthrough DataCDSSM:WWW2014 | Learning Semantic Representations Using Convolutional Neural Networks for Web Search
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等最好打卡一下的。
BiDAF:ICLR2017 | Bidirectional Attention Flow for Machine ComprehensionDrQA:ACL2017 | Reading Wikipedia to Answer Open-Domain Questions
PS:
上述各個場景的模型其實差不太多,甚至一些方法直接在多個匹配場景上進行實驗,近兩年的paper也大多claim自己是一個非常general的匹配框架/模型。因此下面介紹打卡paper的時候就不區分場景啦,而是分成基於表示和基於交互來介紹打卡點。
注意:雖然基於表示的文本匹配方法(一般為Siamese網絡結構)與基於交互的匹配方法(一般使用花式的attention完成交互)紛爭數年,不過最終文本匹配問題還是被BERT及其后輩們終結了。因此下面兩節請帶着緬懷歷史的心情來打卡,不必糾結paper的細節,大體知道劇情就好。
打卡的Siamese結構(基於表示)
這種結構就是本文開頭提到的,首先對兩段文本分別進行encoding進而得到各自的向量表示,然后通過相似度計算函數或相關結構來得到最終的匹配關系。
在baseline階段提到的SiameseCNN和SiameseLSTM的基礎上,這個方向往下做無非就是兩個方向:
1. 加強encoder,得到更好的文本表示
2. 加強相似度計算的函數建模
對於第一個方向,無非就是使用更深更強大的Encoder,代表性打卡工作如
InferSent:EMNLP2017 | Supervised Learning of Universal Sentence Representations from Natural Language Inference Data
SSE:EMNLP2017 | Shortcut-Stacked Sentence Encoders for Multi-Domain Inferenceps:雖然這篇paper的真正目的是遷移學習
對於第二個方向,則是使用更花哨的相似度計算函數或更花哨的用於學習相似度函數的網絡結構,可打卡的工作如
SiamCNN:ASRU2015 | Applying deep learning to answer selection: A study and an open taskSiamLSTM:AAAI2016 | Siamese Recurrent Architectures for Learning Sentence SimilarityMulti-view:2016 EMNLP | Multi-view Response Selection for Human-Computer Conversation
顯而易見,這個方向可玩性不強(雖然容易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]
打卡的pretrain models
雖然經過若干年的煉丹,靠model structure已經可以在非常多的文本匹配任務場景取得不錯的效果了,但是實驗證明,還是沒法跟海量語料上pretrain的模型比的,先上一張圖,問答數據集TrecQA上的實驗結果:
其中HCAN是EMNLP2019新提出的模型,雖然已經吊打了ESIM、DecAtt等老一代花哨模型,但是可以看到還是被BERT吊打了,更不必說跟XLNet、ERNIE2.0和RoBERTa等近期模型去對比了。所以真正大一統文本匹配任務的話,目前來看還是離不開大型預訓練模型的。
當然啦,非要用傳統的匹配模型的話,至少還有ELMo可以拿來強行續命【手動狗頭】
打卡的開源工具
雖然文本匹配baseline容易構造,不過要在具體場景搭建一個完整的系統還是工作量比較大的,借助一些好用的開源工具可以大大提升開發效率。
MatchZoo[20]:一個通用文本匹配工具包,囊括了非常多代表性的數據集、匹配模型和場景,接口友好,非常適合拿來跑baseline。AnyQ[21]:一個面向FAQ集和的問答系統框架,插件和配置機制做的很贊,集成了一堆代表性的匹配模型和一些檢索模型,完整涵蓋了Question Analysis、Retrieval、Matching和Re-Rank這4個做問答系統的全部必備環節。DGU[22]:一個bert-based通用對話理解工具,提供了一套simple but effective的對話任務解決方案,一鍵刷爆各個對話任務(包括多輪對話匹配)的SOTA也是一個神奇的體驗了。
參考文獻(正文中貼了的就不在下面寫啦)
[1] https://www.zhihu.com/question/335289475/answer/811315108[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[19] https://zhuanlan.zhihu.com/p/26539920
[20] https://github.com/NTMC-Community/MatchZoo.
[21] https://github.com/baidu/AnyQ
[22] https://github.com/PaddlePaddle/models