文本匹配利器:從孿生網絡到Sentence-BERT綜述

2021-03-01 機器學習算法與自然語言處理

轉載自 | NLP情報局

大家好,我是Giant,這是我的第4篇文章。

文本匹配是自然語言處理領域一個基礎且重要的方向,一般研究兩段文本之間的關係。文本相似度、自然語言推理、問答系統、信息檢索都可以看作針對不同數據和場景的文本匹配應用。

本文總結了文本匹配任務中的經典網絡Siamse Network,它和近期預訓練語言模型的組合,一些調優技巧以及在線下數據集上的效果檢驗。

Siamese 孿生網絡

在正式介紹前,我們先來看一個有趣的故事。

孿生網絡的由來

「Siamese」中的「Siam」是古時泰國的稱呼,中文譯作暹羅,所以「Siamese」就是指「暹羅」人或「泰國」人。「Siamese」在英語中同時表示「孿生」,這又是為什麼呢?

十九世紀,泰國出生了一對連體嬰兒「恩」和「昌」,當時的醫學技術無法使他們分離出來,於是兩人頑強地生活了一生。

1829年他們被英國商人發現,進入馬戲團,在全世界各地演出。1839年他們訪問美國北卡羅萊那州成為「玲玲馬戲團」 的臺柱,最後成為美國公民。1843年4月13日跟英國一對姐妹結婚,恩生了10個小孩,昌生了12個。1874年,兩人因病均於63歲離開了人間。他們的肝至今仍保存在費城的馬特博物館內。

從此之後,「暹羅雙胞胎」(Siamese twins)就成了連體人的代名詞,也因為這對雙胞胎全世界開始重視這項特殊疾病。

孿生網絡

由於結構具有鮮明的對稱性,就像兩個孿生兄弟,所以下圖這種神經網絡結構被研究人員稱作「Siamese Network」,即孿生網絡。

其中最能體現「孿生」的地方,在於網絡具有相同的編碼器(sentence encoder),即將文本轉換為高維向量的部分。網絡隨後對兩段文本的特徵進行交互,最後完成分類/相似預測。「孿生網絡」結構簡單,訓練穩定,是很多文本任務不錯的baseline模型。

孿生網絡的具體用途是衡量兩個輸入文本的相似程度。

例如,現在我們有文本1和2,首先把它們分別輸入 sentence encoder 進行特徵提取和編碼,將輸入映射到新的空間得到特徵向量u和v;最終通過u、v的拼接組合,經過下遊網絡來計算文本1和2的相似性。

整個過程有2個值得關注的點:

在訓練和測試中,模型的編碼器是權重共享的(「孿生」);編碼器的選擇非常廣泛,傳統的CNN、RNN和Attention、Transformer都可以得到特徵u、v後,可以直接使用cosine距離、歐式距離得到兩個文本的相似度;不過更通用的做法是,基於u和v構建用於匹配兩者關係的特徵向量,然後用額外的模型學習通用的文本關係映射;畢竟我們的場景不一定只是衡量相似度,可能還有問答、蘊含等複雜任務‍‍‍‍‍‍‍‍三連體網絡‍‍‍‍‍‍‍‍

基於孿生網絡,還有人提出了 Triplet network 三連體網絡。顧名思義,輸入由三部分組成,文本1,和1相似的文本2,和1不相似的文本3。

訓練的目標非常樸素,期望讓相同類別間的距離儘可能的小,讓不同類別間的距離儘可能的大,即減小類內距,增大類間距。

Sentence-BERT

自從2018年底Bert等預訓練語言模型橫空出世,NLP屆的遊戲規則某種程度上被大幅更改了。在計算資源允許的條件下,Bert成為解決很多問題的首選。甚至有時候拿Bert跑一跑baseline,發現問題已經解決了十之八九。

但是Bert的缺點也很明顯,1.1億參數量使得推理速度明顯比CNN等傳統網絡慢了不止一個量級,對資源要求更高,也不適合處理某些任務。

例如,從10,000條句子中找到最相似的一對句子,由於可能的組合眾多,需要完成49,995,000次推理;在一塊現代V100GPU上使用Bert計算,將消耗65小時

考慮到孿生網絡的簡潔有效,有沒有可能將它和Bert強強聯合呢?

當然可以,這正是論文《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》的工作,首次提出了Sentence-Bert模型(以下簡稱SBert)。

SBert在眾多文本匹配工作中(包括語義相似性、推理等)都取得了最優結果。更讓人驚訝的是,前文所述的從10,000條句子尋找最相似pair任務,SBert僅需5秒就能完成!

基於BERT的文本匹配

讓我們簡短回顧此前Bert是怎麼處理文本匹配任務的。

常規做法是將匹配轉換成二分類任務。輸入的兩個文本拼接成一個序列(中間用特殊符號「SEP」分割),經過12層或24層Transformer模塊編碼後,將輸出層的字向量取平均或者取「CLS」位置的特徵作為句向量,經softmax完成最終分類。

但是論文作者 Nils Reimers 在實驗中指出,這樣的做法產生的結果並不理想(至少在處理語義檢索和聚類問題時是如此),甚至比Glove詞向量取平均的效果還差。

基於S-BERT的文本匹配

為了讓Bert更好地利用文本信息,作者們在論文中提出了如下的SBert模型。是不是非常眼熟?對,這不就是之前見過的孿生網絡嘛!

SBert沿用了孿生網絡的結構,文本Encoder部分用同一個Bert來處理。之後,作者分別實驗了CLS-token和2種池化策略(Avg-Pooling、Mean-Pooling),對Bert輸出的字向量進一步特徵提取、壓縮,得到u、v。關於u、v整合,作者提供了3種策略:

針對分類任務,將u、v拼接,接入全連接網絡,經softmax分類輸出;損失函數用交叉熵直接計算、輸出餘弦相似度;訓練損失函數採用均方根誤差

總的來說,SBert直接用Bert的原始權重初始化,在具體數據集上微調,訓練過程和傳統Siamse Network差異不大。

但是這種訓練方式能讓Bert更好的捕捉句子之間的關係,生成更優質的句向量。在測試階段,SBert直接使用餘弦相似度來衡量兩個句向量之間的相似度,極大提升了推理速度。

實驗為證

作者在7個文本匹配相關的任務中做了對比實驗,結果在其中5個任務上,SBert都有更優表現。

作者還做了一些有趣的消融實驗。

使用NLI和STS為代表的匹配數據集,在分類目標函數訓練時,作者測試了不同的整合策略,結果顯示「(u, v, |u-v|)」的組合效果最好。這裡面最重要的部分是元素差:(|u - v|)。句向量之間的差異度量了兩個句子嵌入維度間的距離,確保相似的pair更近,不同的pair更遠。

文章最後,作者將SBert和傳統方‍‍‍‍法做了對比。

SBert的計算效率要更高。其中的smart-batching是一個小技巧。先將輸入的文本按長度排序,這樣同一個mini-batch的文本長度更加統一,padding時能顯著減少填充的token。

線下實測

我們將SBert模型在天池—新冠疫情相似句對判定比賽數據集上做了測試。經數據增強後,線下訓練集和驗證集分別是13,500和800條句子組合。預訓練模型權重選擇BERT_large。

最終SBert單模型在驗證集上的準確率是95.7%。直接使用Bert微調準確率為95.2%

小結

本文介紹了文本匹配任務中常用的孿生網絡,和在此基礎上改進而來的Sentence-BERT模型。

Siamse Network 簡潔的設計和平穩高效訓練非常適合作為文本匹配任務的baseline模型。SBert則充分利用了孿生網絡的優點和預訓練模型的特徵抽取優勢,在眾多匹配任務上取得了最優結果。

拋開具體任務,SBert 可以幫助我們生成更好的句向量,在一些任務上可能產生更優結果。在推理階段,SBert直接計算餘弦相似度的方式,大大縮短了預測時間,在語義檢索、信息搜索等任務中預計會有不錯表現。同時,得益於生成的高質量句嵌入特徵,SBert也非常適合做文本聚類、新FAQ發現等工作

下載1:四件套

在機器學習算法與自然語言處理公眾號後臺回復「四件套」

即可獲取學習TensorFlow,Pytorch,機器學習,深度學習四件套!


下載2:倉庫地址共享

在機器學習算法與自然語言處理公眾號後臺回復「代碼」

即可獲取195篇NAACL+295篇ACL2019有代碼開源的論文。開源地址如下:https://github.com/yizhen20133868/NLP-Conferences-Code

重磅!機器學習算法與自然語言處理交流群已正式成立

群內有大量資源,歡迎大家進群學習!

額外贈送福利資源!深度學習與神經網絡,pytorch官方中文教程,利用Python進行數據分析,機器學習學習筆記,pandas官方文檔中文版,effective java(中文版)等20項福利資源

獲取方式:進入群後點開群公告即可領取下載連結

注意:請大家添加時修改備註為 [學校/公司 + 姓名 + 方向]

例如 —— 哈工大+張三+對話系統。

號主,微商請自覺繞道。謝謝!

推薦閱讀:

Tensorflow 的 NCE-Loss 的實現和 word2vec

多模態深度學習綜述:網絡結構設計和模態融合方法匯總

awesome-adversarial-machine-learning資源列表

相關焦點

  • 【孿生網絡】文本蘊含之孿生網絡(Siamese Network)
    這次分享一下最經典的文本蘊含模型,也就是孿生網絡(Siamese Network)。從圖1中,我們可以看到,其實每張圖片是經過了各自的卷積神經網絡,但是兩個卷積神經網絡的所有權值(所有參數)都是共享的,這就像一對雙胞胎一樣,因此我們管這種權值共享的網絡稱之為孿生網絡。而權值共享的目的有兩個:(1)減少參數量,減小模型的複雜度;(2)將兩個不同空間維度的向量映射到同一個空間維度上,使其數據分布保持一致,在同一空間維度上對不同向量進行編碼。
  • 【BERT】如何訓練並使用Bert【持續更新】
    因為我們其實是想要獲取到長文本的。二、Transformer 結構複習三、Bert的論文解讀這個的主要參考文獻是論文,說的清楚又不清楚,需要有一些transformer的知識作為背景。什麼叫做finetuning,什麼叫做feature-based。
  • NLP: 基於文本語義的智能問答系統
    OneHot 、N-Gram 、TFIDF等詞袋模型、Word2Vec、Doc2Vec、GloveBert(本案例文本向量化表示選擇bert) 、XLNet等神經網絡模型3、文本相似度計算(項目中:我們採用餘弦相似度,計算得分)餘弦相似度、歐式距離
  • 文本挖掘從小白到精通(十六)--- 像使用scikit-learn一樣玩轉BERT
    為此,我們要不厭其煩的嘗試各種文本特徵抽取方法:TF-IDF、n-gram、word2vec、將其連結到外部知識庫、詞幹化、歸一化乃至分詞。。。自從有了BERT,文本特徵抽取的手工活就少多了!但是,總覺得少了些啥~本教程的目的是用BERT和Sci-kit Learn建立一個最簡單的句子級分類的例子。
  • 2018年的一篇NER綜述筆記
    分布式文本表示分布式文本表示,說白了就是word2vector、glove之類的預訓練方法。另外,作者把bert的方法也歸於此處,主要原因是他在預訓練的時候使用了大量外部語料信息。上下文編碼架構上下文編碼是文本表示之後的操作,作者分為了4種情況,CNN、RNNs、遞歸神經網絡和transformer,另外還單獨提到了神經網絡語言模型。CNN和RNNs的情況其實比較常規了,不做太多解釋,文章中其實更多的也是論文的解釋。
  • 文本匹配相關方向打卡點總結
    匹配問題由於場景比較多,相關的文章不多,所以本文就致力於總結一下文本匹配問題上可以打卡的相關資料啦。文本匹配是一個很寬泛的概念,只要目的是研究兩段文本之間的關係,基本都可以把這個問題看作是文本匹配問題。由於在不同的場景下對」匹配「的定義可能非常不同,因此文本匹配並不是一個完整獨立的研究方向。
  • 如何用 Python 和 BERT 做多標籤(multi-label)文本分類?
    10餘行代碼,藉助 BERT 輕鬆完成多標籤(multi-label)文本分類任務。疑問之前我寫了《如何用 Python 和 BERT 做中文文本二元分類?》一文,為你講解過如何用 BERT 語言模型和遷移學習進行文本分類。不少讀者留言詢問:王老師,難道 BERT 只能支持二元分類嗎?
  • 基於Bert和通用句子編碼的Spark-NLP文本分類
    如果你正在構建聊天機器人、搜索專利資料庫、將患者與臨床試驗相匹配、對客戶服務或銷售電話進行分級、從財務報告中提取摘要,你必須從文本中提取準確的信息。文本分類是現代自然語言處理的主要任務之一,它是為句子或文檔指定一個合適的類別的任務。類別取決於所選的數據集,並且可以從主題開始。
  • 科普丨一文看懂數字孿生—應用發展綜述(四)
    數字孿生應用發展綜述隨著物聯網的應用更加廣泛,各個領域越來越多的企業開始計劃數字孿生的部署。▲中國城市智慧化細分市場佔比數字孿生城市則是數字孿生技術在城市層面的廣泛應用,通過構建城市物理世界及網絡虛擬空間一一對應、相互映射、協同交互的複雜系統,在網絡空間再造一個與之匹配、對應的孿生城市,實現城市全要素數位化和虛擬化
  • 內存用量1/20,速度加快80倍,QQ提全新BERT蒸餾框架,未來將開源
    另外,LTD-BERT 也被驗證在下遊任務可以保持與 BERT 近似的效果,包括相似度計算、短文本分類、短文本聚類等,其應用場景包括但不限於語義匹配、意圖識別、文本聚類分析等。另外,加權的方式另一種考量是對於具體的任務擁有足夠的適配能力,可以通過權重的調整來關注到具體任務更關心的詞語。 LTD-BERT 知識蒸餾是一種模型壓縮的常見方法,是 14 年 Hinton 提出的 [2]。其在 Teacher-Student 框架中,將一些複雜、學習能力強的網絡學到的特徵表示「知識」蒸餾出來,傳遞給參數量小、學習能力弱的網絡。
  • 教你用BERT進行多標籤文本分類
    我們將使用Kaggle的「惡意評論分類挑戰」來衡量BERT在多標籤文本分類中的表現。在本次競賽中,我們將嘗試構建一個能夠將給文本片段分配給同惡評類別的模型。uncased表示全部會調整成小寫,且剔除所有的重音標記;cased則表示文本的真實情況和重音標記都會保留下來。我們將使用較小的Bert-Base,uncased模型來完成此任務。Bert-Base模型有12個attention層,所有文本都將由標記器轉換為小寫。
  • 實用的AI:使用OpenAI GPT2,Sentence BERT和Berkley選區解析器從任何內容自動生成對或錯問題
    in filter_quotes_and_questions: print (each_sentence) print ("\n")匯總的輸出將只是從文本中選擇的4個句子。如果您注意到名詞短語中的John後面的撇號和「 s」之間有空格。如果只是嘗試從主句「 Mary ate John's apple pie 」中匹配字符串,並嘗試刪除「 John's apple pie」,那是不可能的。因此在上面編寫了一個輔助函數get_termination_portion,以添加自定義邏輯以匹配空間,並返回「 Mary ate」刪除名詞短語「ohn’s apple pie」。
  • 老周帶你讀Bert文本分類代碼 (pytorch篇一)
    這次想和大家一起讀的是huggingface的pytorch-pretrained-BERT代碼examples裡的文本分類任務run_classifier。關於原始碼可以在huggingface的github中找到。
  • 從 one-hot 到 BERT,帶你一步步理解 BERT
    而自google在2018年10月底公布BERT在11項nlp任務中的卓越表後,BERT(Bidirectional Encoder Representation from Transformers)就成為NLP一枝獨秀,本文將為大家層層剖析bert。NLP常見的任務主要有:中文自動分詞、句法分析、自動摘要、問答系統、文本分類、指代消解、情感分析等。
  • 大神教程乾貨:使用BERT的多類別情感分析!(附代碼)
    使用BERT輕鬆快速地實現針對Yelp評論的多類別文本情感分析。在本文中,我們將使用BERT在Yelp評論上開發多類文本分類。第1列:文本:這是要分類的文本。Vocab.txt使用BERT提供的vocab文件將單詞映射到索引。詞彙表中有119,547個單詞令牌6. bert_config_file:包含BERT模型的參數值。BERT預訓練模型具有此文件7.
  • Siamese network 孿生神經網絡--一個簡單神奇的結構
    1843年4月13日跟英國一對姐妹結婚,恩生了10個小孩,昌生了12個,姐妹吵架時,兄弟就要輪流到每個老婆家住三天。1874年恩因肺病去世,另一位不久也去世,兩人均於63歲離開人間。兩人的肝至今仍保存在費城的馬特博物館內。從此之後「暹羅雙胞胎」(Siamese twins)就成了連體人的代名詞,也因為這對雙胞胎讓全世界都重視到這項特殊疾病。
  • Keras-TextClassification 文本分類工具包
    ,word2vec,random樣例在test/目錄下, 注意word2vec(char or word), random-word,  bert(chinese_L-12_H-768_A-12)未全部加載,需要下載- multi_multi_class/目錄下以text-cnn為例進行多標籤分類實例,轉化為multi-onehot標籤類別,分類則取一定閥值的類- sentence_similarity
  • 文本挖掘從小白到精通(十二)--- 7種簡單易行的文本特徵提取方法
    |【文本挖掘系列教程】:文本特徵提取是文本挖掘中非常重要的一個環節,無論是聚類、分類還是相似度任務,都需要提取出較好的文本特徵,如此才能取得較好的結果。 iter:對於有的語料,在神經網絡上訓練多少輪。(就相當於神經網絡上的epoch參數。)可以通過增加iter來對小數據(即:樣本總數量少的時候)多進行幾次訓練。 window:在一個句子中,當前詞語和預測的詞語之間的最大距離可以多大。如果你的語料多,就可以設置的大一點。
  • 使用 keras-bert 實現文本多分類任務
    實現文本多分類任務,其中對BERT進行微調。項目結構keras-bert文本多分類項目結構其中依賴的Python第三方模塊如下:pandas==0.23.4Keras==2.3.1keras_bert==0.83.0numpy==1.16.4數據集本文採用的多分類數據集為sougou小分類數據集和THUCNews數據集,簡介如下:共有5個類別,分別為體育、健康、軍事、