本文主要用于記錄騰訊微信團隊于2020年提出的一種深度語義匹配方法的論文。該文提出的模型架構和各種訓練模型的小技巧,非常值得我們這種奮斗在一線的NLPer參考。本筆記主要為方便初學者快速入門,以及自我回顧(個人特別喜歡這篇論文,文中的很多方法都用于了實際工作中,所以將會對這篇論文通篇進行詳細的解讀)
論文鏈接:https://arxiv.org/pdf/2003.11516.pdf
github地址:https://github.com/DataTerminatorX/Keyword-BERT
論文相關博客:https://mp.weixin.qq.com/s/_QY2EhB-TiBcb5q0379McQ
(原博客寫的生動有趣,值得好好品一下~)
基本目錄如下:
- 摘要
- 核心思想
- 總結
------------------第一菇 - 摘要------------------
1.1 論文摘要
在各種各樣的自然語言處理任務中都繞不開的一個核心問題就是,深度語義匹配任務。比如,在QA檢索問題中,新輸入的一個問法,就需要與語料庫中的所有問題-答案對(QA對)進行語義相關性匹配。但是在開放領域的場景下,由于在“問法-問題”對中會存在各式各樣不同表達的詞匯,導致衡量新問法與候選QA對的相似性就變的富有挑戰(zhàn)性。我們提出了一種“關鍵詞-注意力機制”的方法來改進深度語義匹配任務。我們首先從海量的語料中按領域劃分來生成領域相關的關鍵詞字典。在基于BERT原有架構的基礎之上,我們再堆疊一層“關鍵詞注意力”層來強調在“問法-問題”對中出現的關鍵詞。在模型的訓練過程中,我們提出了一種新的,基于輸入問法對中的關鍵詞重合度的負樣本采樣方法。我們在中文QA語料上利用多種評估指標對模型進行了驗證,包括召回候選數據的精確率,語義匹配的準確率。實驗表明,我們的方法表現超過了現有的其他基線模型。我們的方法也是通用的,只需要做一點修改,就可以被運用在其他文本匹配任務中。
------------------第一菇 - 核心思想------------------
2.1 背景介紹
開放領域的問題答案匹配(QA對)可以被應用于多個場景之中,包括,網頁搜索,智能助理等。其中一個比較重要的應用就是問答數據庫檢索。 為了提高搜索速度,問答數據庫基本都是用問題來建立索引的。因此,我們要計算輸入問法與候選問題組中每個問題的相似度,從而檢索出答案。計算QQ相似度的任務傳統上來說可以基于TF-IDF分數。最近基于深度神經網絡的語義匹配方法,引起了業(yè)界很大的關注。深度語義匹配問題通常會被轉化為二分類問題。比如一個句子對,如果他們語義相似,則給這對的標簽就是,“正例”;反之則是,“負例”。
然而,我們認為模型僅僅通過這個二分類標簽并不能很好的學習到句子深層次的語義表征。舉個例子,對于一個被標記為“負例”的句子對,“Which city is the capital of China?”,“Could you tell me the capital of America?”,模型應該區(qū)分出這兩句話的核心區(qū)別點在于“China”和“America”。但是對于一個開放領域場景,讓模型去學會甄別句子對中真正體現出語義差別的關鍵詞/詞組(通常還是能夠復雜組合的),是一個巨大的挑戰(zhàn),而且很多新詞/詞組,是模型在訓練語料中從來沒有見過的。
另一個在訓練語義相似模型的難點在于如何構建正例和負例。構建正例是很簡單的,通常我們只需要從同一組召回的問句中去選擇即可;同理,我們也可以從其他組中去召回句子(理論上有 O(|Q|*|Q|))來構建負例。但是如果考慮到計算資源和正負樣本的平衡,那么不可能所有的負例組我們都能拿來做負例。
在本篇論文中,我們設計了一種“關鍵詞-注意力”模型和其他的支撐性模塊,包括,關鍵詞抽取系統和負樣本生成策略,用來解決我們上面提到的問題。我們發(fā)現“關鍵詞”是一種很有用的額外信息,能夠用來提升模型的表現,即使那些新增的關鍵詞從未出現在訓練數據之中。我們本篇論文的主要貢獻包括,
1)“關鍵詞-注意力”BERT模型:我們的深度語義匹配模型是基于最近流行的BERT來構建的。我們在BERT的最后一層,額外引入添加了一層“關鍵詞-注意力”層。我們的目標就是要通過注意力機制,來加強關鍵詞和非關鍵詞之間的交互。通過直接告訴模型,哪一個詞才是真正重要的關鍵的詞匯,我們實驗證明,我們提出的這種BERT模型變體要好于原生態(tài)的BERT。
2)利用更好的負樣本生成策略訓練出更加魯棒的模型:為了訓練出更具魯棒性的模型,我們提出了一種新的負樣本生成方法。該方法利用了關鍵詞之間的重合度分數來選擇出負樣本對。另外,我們還采用了實體替換技巧來生成更加多樣的負樣本(比如,將“China”替換成“America”)。我們會實驗證明,利用這部分數據增強的數據,我們的模型會更加魯棒。
3)關鍵詞抽取策略:我們提出了一種簡單有效的關鍵詞抽取算法用于提煉領域關鍵信息。抽取出來的關鍵詞可以被運用于3個方面,
1)用于構建“關鍵詞-注意力”深度語義匹配模型
2)用于提高QA搜索引擎的召回檢索質量
3)用于提高負樣本質量,從而更好的訓練語義匹配模型。
2.2 問題定義
在介紹我們的方法之前,我們先明確一下我們需要解決的問題。
假定我們有一個query和一組候選問題組。對于每一組問題對(q, Qi),我們需要計算(q,Qi)的相似性分數用于后續(xù)的排序。為了計算(q,Qi),我們需要考慮2個問題,
1)如何方便快捷的獲取優(yōu)質的句向量表征。
2)如何把句向量表征融入到匹配模型中。
2.3 方法實現
2.3.1 領域關鍵詞抽取
傳統的檢索召回方法包括ES,BM25,Lucene等,這些方法都是利用了句子的表面統計特征來衡量句子對之間的相似度。然而,這些方法經常會因為給一些不重要的“關鍵詞”分配了過高的權重而導致了錯誤的召回結果。舉個例子,如Table1所示,從直覺我們就能判斷,query的重要部分其實是,“中國”和“GDP”,我們的搜索引擎往往會召回一些看起來相似的問法(下表中的,Similar Q1和Similar Q2),他們看起來跟原句真的很相似,但是他們卻忽視那些重要關鍵詞的匹配(比如,在這句話中,真正的關鍵是,中國的GDP~??)

事實上,開放領域問題的關鍵詞是與這些問題的所屬領域(比如,經濟,政治,體育等)高度相關的?;谶@些觀察,我們提出了一種基于領域的關鍵詞抽取技術用來生成領域相關的關鍵詞,流程如下圖1所示。我們收集了千萬級的屬于特定領域的中文語料,并每天同步更新用于覆蓋新的關鍵詞/詞組,

在中文的NLP場景中,1個中文“詞”會包含各種各樣的中文字符,但是卻沒有空白格作為邊界來區(qū)分每個“詞”,因此中文的分詞在中文NLP的應用場景中絕對是一個最基礎的問題。本論文作者也沒有嘗試去提出一種最新的分詞算法,而是基于一些統計特征來作為新詞發(fā)現。
2.3.1.1 關鍵詞發(fā)現方法
逐點互信息(PMI,Pointwise mutual information)是一種常用的方法用來衡量字符與字符之間的“牢固度(stickiness)”,從而用來發(fā)現中文的詞匯,具體的公式如下,
2.3.1.2 領域詞權重計算方法
在第二步中,我們通過計算某個詞在各個領域信息中的作用來衡量其對于該領域的重要性。首先,我們針對每一個詞來計算出IDF值。其次,我們引入了“diff-idf”的計算方式來衡量某個領域關鍵詞的重要性,其計算方法如下所示,
其中 ^domain 表示“其他領域”的語料。舉個例子,比如我們計算,“杠桿”這個詞在金融領域中的重要性,那么“其他領域”就指,非金融類的語料。這里,我們用“df”來替代“tf”,是因為我們認為評估一個詞匯在這個領域的重要性,在篇章(document-level)中的頻次,比在詞組(term-level)中的頻次更為重要。而減去“其他領域”中的idf值能夠確保計算出的值,是具有區(qū)分度的,能夠真正代表該詞在目標領域的重要性。從直覺上來說,如果一個詞,在每一個領域的文章中都比較平均的出現,那么它的“diff-idf”分值會變小,因為需要同時減去,“其他領域”的idf值。我們最終就利用,“diff-idf”值來排序候選詞并剔除那些低于閾值的噪聲詞匯。
我們針對每一個領域的語料,重復進行了上述步驟來生成領域關鍵詞詞典,最終,我們把所有的領域詞典合并為一個來生成最終的關鍵詞字典,并且運用于我們的搜索引擎。相比與其他的非監(jiān)督或監(jiān)督的關鍵詞生成方法, 我們的方法有如下優(yōu)勢,
1)可以利用領域信息來提取語料中的關鍵詞。
2)不需要人為介入來標注關鍵詞,沒有什么大的模型架構。
2.3.2 語義匹配模型
我們的語義匹配模型是基于BERT來搭建的,輸入就是一組問題對,另外額外添加了一層“關鍵詞-注意力”層。
在關鍵詞從問法對中被抽取出來以后,我們就會把關鍵詞信息通過額外添加的一層“關鍵詞-注意力”層注入到模型之中,該層與BERT的最后一層是平行的,如下圖2所示。

注意力機制對于語義匹配來說是非常重要的,然而,因為缺少額外的監(jiān)督信息,深度模型往往不能夠準確捕獲在句子對中的關鍵信息,從而對這兩句話做準確的相似度區(qū)分。從pair2vec受到的啟發(fā),我們提出的模型更加會關注到那些包含關鍵詞的詞組對。具體如下圖3所示,在句子A中的每一個字符,只會與句子B中的關鍵詞的字符做點乘。

如上圖所示,句子A和B是負樣本(就是不相似的),但是他們看上去卻很相似,因為他們都包含了,“如何掃碼”,但是他們的語義顯然是不一樣的,A是想說怎么加入微信群,而B是想說,添加一個微信好友。我們的“關鍵詞-注意力”機制會強迫我們的模型去關注這兩句話的關鍵詞的差異,從而來學習到這兩句話的本質差異。這個機制的實現也比較簡單,只需要在,transformer層中多乘一個,自監(jiān)督的蒙版(mask)即可。緊跟著最后會加一層平均池化層,用來生成句子的隱藏向量,作為句子對的另2個向量表征維度。同時,為了模型這兩種表征的差異,我們還同時引入了關鍵詞差異向量,k-diff,如下所示,

有了“關鍵詞-注意力”層,關鍵詞信息就會被注入到離輸出目標更近的地方,而不是隨著原始問句一起注入到BERT中。最后,我們把這幾個特征向量的表征給連接了起來,接了一層全連接層,并輸出結果。
總的來說,這一套網絡架構的設計是比較討巧的,從論文的作者博客我們也能看出這個架構是經過多種實驗之后,得出來的最好的架構,具體的實現有興趣的同學可以直接看相關的代碼。
2.3.3 負樣本生成策略
當我們把語義匹配問題轉化為二分類問題的時候,就會碰到如何構建負樣本的問題。其中一個比較簡單的方法就是通過隨機選擇來生成負樣本對。然后,這種方法肯定是盲目的并且會忽視一些有用的信息,更糟糕的是,經常性的會生成一些簡單的負樣本(可以理解為區(qū)分度非常大)用于模型的訓練。因此,我們的目標就是通過更好的樣本來生成更加魯棒的模型。
受到支持向量的啟發(fā),我們希望去生成一些具有迷惑性的負樣本(就是那種sim(q,Q)分值看上去比較合理的)。第一步,我們首先利用搜索引擎去召回一批數據(利用關鍵詞增強策略生成的問法)。具體來說,我們利用關鍵詞來對原始問法來做增強操作并作為召回候選源,比如,一個原始,query可以被表示為,{x1,x2,...xn},那么其對應的關鍵詞是,{k1,k2,...,km},那么我們用于搜索的問法,就可以被表示為,{x1,x2,...,xn,k1,k2...,km}。
另一個問題就是,在沒有人工參與的前提下,如何從召回的數據中去挑選合適的負樣本數據。其中一個指標就是通過搜索引擎返回的相似性分數來判斷。如果相似性分數低于閾值,那么召回的候選問句就有可能是負樣本。另外,我們還引入了一種輸入問法query和候選Q之間的關鍵詞重合率指標。直覺上來說,一個好的負樣本會在非重合和重合部分之間有很好的平衡。最終,我們會結合兩種評估標注來篩選出我們的候選負樣本,如下所示,

另外一種生成負樣本的方法就是通過隨機的實體替換。舉個例子,“What factors will affect China’s GDP?”,可以被重寫為,“What factors will affect America’s GDP?”。這個過程生成的問法對看上去會非常相似,但其本質的意義卻是相反的。因此,對于在數據庫中的每一個問句,我們都會按照一定的比例隨機替換其中的一個實體。
至此,本論文提出的3個核心思想理念已經全部闡述完畢了。
剩下的一些實驗過程及相關的結論有興趣的同學可以直接翻閱原始論文。
本文不再作更多的解讀。
------------------第三菇 - 總結------------------
3.1 總結
到這里,整篇論文的核心思想已經說清楚了。本論文主要是提出了一種基于關鍵詞的深度語義匹配模型,其中涵蓋了領域關鍵詞抽取系統,基于BERT改造的“關鍵詞-注意力”語義匹配模型和負樣本生成策略。
簡單總結一下本文就是先羅列了一下該論文的摘要,再具體介紹了一下本文作者的思路,也簡單表述了一下,自己對作者提出方法的理解。希望大家讀完本文后能進一步加深對該論文的理解。有說的不對的地方也請大家指出,多多交流,大家一起進步~??