漫談語義相似度

2021-02-23 機器學習算法與自然語言處理

轉載自 | 李rumor

語義相似度是自然語言理解(NLU)裡面一大核心拼圖,無論是機器翻譯、搜索、對話等,都有很大的應用空間。

語義相似度,顧名思義,主要是為了衡量兩個句子之間的相似度,來自天池新冠疫情相似句判定大賽的例子:

相似句:肺部發炎是什麼原因引起的-肺部發炎是什麼引起的不相似句:肺部發炎是什麼原因引起的-肺部炎症有什麼症狀

一般都會有非常明確的案例告訴我們,什麼叫做相似,什麼叫做不相似,這個有非常明顯的場景願意,還是上面那句話,在判斷query意圖上,如果是判斷大粒度意圖的話(是否是醫療問句)那就是相似句了,如果是小粒度(症狀意圖、病因意圖)那這兩句就不相似。

常規的語義相似度架構

語義相似度架構其實非常簡單,簡單地說就是兩個句子進去,進行特徵抽取,簡單到BOW、TF-IDF,複雜的就是bert(跳過word2vector、elmo???),然後進行相關性匹配計算,這塊也花樣繁多,簡單的就是餘弦相似、歐氏距離等,複雜的可以矩陣相乘等,最終到達標籤,完成一次語義相似度評估計算。OK,上圖:

孿生網絡

孿生網絡本身是CV領域的東西,後來被NLP領域拿來直接用了,生根發芽,發揚光大,最經典的使用要數DSSM了。其實孿生網絡的核心思想還是藏在訓練方式上,一般的語義相似度我們都是用比較簡單二分類來訓練了,說白了就是預測出一個相似度概率和實際標籤算交叉熵,而孿生網絡,顧名思義,就是要考慮兩個網絡,具體考慮的思路,就非常像LTR裡面的pair wise,但是更為暴力一些,pairwise是兩者PK,而在DSSM裡,會給到一個正樣本(與原句相似)和N個負樣本(與原句不相似)來共同構造成一個樣本,具體的圖就長這樣:

這種方式的核心在於,以一個句子為核心來進行對比,能精準告訴模型「什麼是對的,什麼是錯的」,邊界清楚能讓模型分的更好(SVM的思想),舉個例子,我們都再說「人工智慧」,我們不知道的一切都可以被戴上這個帽子,但是邊界非常模糊,這讓人容易被忽悠,這就是因為我們不知道什麼不是「人工智慧」,模型也是一樣,給到清晰的邊界,模型能分得更好,這個是「主動學習」的一大初衷。

表徵的優化

DSSM終究試一次簡單的嘗試,但以這個為出發點,大家又圍繞著DSSM做了很多工作,其中一大重點就是把DSSM這種base line級別的操作(文章用的是word hashing)升級為一些效果更好的操作:

CNN-DSSM:也被叫做CLSM,把全連接層換成了CNN。LSTM-DSSM:把全連接層換成了LSTM,嚴謹的應該說是peephole LSTM。比較新潮的Attention操作也偶有見到。self-attention和co-attention都有,attention能夠一定程度的充當「關鍵詞抽取」的作用,因此在特定場景(例如信息冗餘較多的對話場景)效果提升有些明顯。

有關attention的使用,推薦一篇論文Attention-Based Convolutional Neural Network for Modeling Sentence Pairs,也就是所謂的ABCNN,感覺把attention在這塊的使用講的比較好:

BCNN(basic cnn)其實就是用cnn作為特徵提取的關鍵步驟,只不過這裡的卷積參數是雙塔共享的。ABCNN-1針對兩個句子的原始表徵(沒有進行CNN時),構造了attenton矩陣作為卷積輸入的另一個通道。ABCNN-2在1的基礎上,把attention的步驟放在了池化之前,該attention用來對卷積的結果進行reweight,然後再做池化。

換積木這種事情姑且只能算小打小鬧,我們的目標不止於此,而是會——換大積木,BERT,它具有更為強力的BERT能力,效果自然也越好,sentence-bert就是對bert在語義相似度上的一個重要的使用。

向量化表徵

語義相似度能讓我們衡量兩個句子的語義相似度,但是實際上我們的應用場景更多是「在句子庫裡面找到最接近給定句子的句子」,例如一個句子「明天天氣」,我要找到整個庫裡面最接近的那個句子,例如「明天的天氣」、「明天下雨嗎」、「天氣之子」等,如果簡單的一個一個匹配去找,複雜度就是O(N),這個數字無疑非常可怕,當庫是千萬級別大小的時候,這個搜索就變得非常低效,因此我們是需要特定的手段來解決這個問題的,這套解決方案就是——最近鄰召回檢索,這裡依賴兩個技術點,一個是基於語義相似度的句子向量化表徵,另一個是最近鄰向量索引。

最近鄰向量索引

不知道大家對KNN有沒有了解,在統計學習方法中,第一個講的方法就是他,說白了就是找最接近給定樣本的N個訓練樣本,他們大部分屬於什麼什麼類,那這個給定樣本就是什麼類,而問題在於怎麼找到最接近的N個樣本,這實際上就是一個通過向量找向量的工作,在《統計學習方法》裡面提出的是kd tree,而現在比較流行的主要是兩個——同樣是基於樹的annoy和基於圖的hnsw,經過一些評測(https://zhuanlan.zhihu.com/p/152522906),這兩個方案都有比較領先的性能,網絡上有比較明確的原理和實現方案,此處就不贅述啦~

向量化表徵

向量化表徵對語義相似度有了更高的要求,它不僅僅要求我們要算出兩者的相似度,還要求在計算過程中,需要把句子表徵都需要降維到向量級別,因為後續下遊要通過最近鄰向量完成搜索,這個問題其實還是比較簡單的,常規的操作不外乎就是2種,平均池化和最大池化,在Sentence-BERT中又提到了一種,所以總共就是3種:

平均池化,對表徵的矩陣整體進行平均池化,mean/average pooling,得到向量。最大池化,對表徵的矩陣整體進行最大池化,max pooling,得到向量。更多前沿操作

上面應該都是業界比較公認的比較基本的操作和理解,在此基礎上帶大家看一些比較前沿的一些使用方案和方法。

機器之心-百度NLP

針對傳統匹配(如BM25)的多義同義詞處理、句子結構複雜、匹配非對稱等問題,在sim-net(即一一匹配計算相似度)的基礎上,做了多粒度切詞、高頻判斷語義引入等先驗信息的方式來對提升效果,並在實驗上針對正負樣本比例、閾值判斷等做了很多的嘗試(文章具體沒說)。

Facebook使用經驗

在KDD2020裡面facebook分享了自己在文本匹配方面的經驗:Embedding-based Retrieval in Facebook Search。

首先在訓練上,使用的是比較常見的三元組hinge loss。

至於模型,則是和DSSM類似的雙塔結構,query和doc分別表徵後進行相似度匹配,但是在特徵上花費了一些功夫,新增了位置特徵、社交特徵,後兩個都是個性化特徵,大家就根據實際情況選用即可。

在訓練上,負樣本的構建一直是語義相似度的一個老大難問題,根據他們的經驗,曝光未點擊和資料庫隨機抽取一起用的效果會更好。

至於服務上,即最近鄰召回,facebook則用的是自己開源的faiss引擎,內部搭載的是annoy索引機制。

另一方面,文章再提到了負樣本構建,即Hard negative mining問題,一般是通過在線曝光未點擊、離線相似度閾值範圍抽取的方式挖掘。

文章還提到一個很有意思的提升方案,就是模型融合,簡單地說就是模型預測的向量分別進行歸一化後進行concat,然後進行檢索。

螞蟻金服語義相似度競賽的經驗特徵工程的嘗試,除了語義向量外,還可以加入長度、編輯距離、n-gram相似度、詞彙統計特徵、關鍵詞、疑問詞相似度、主題意圖相似等。小結

小結幾個關鍵點吧

分別表徵後進行交互仍然是主流,但是由於向量召回的存在,歐氏距離餘弦距離仍然是主流,所以模型的優化核心就放在了如何更好地表徵句子上。訓練方式基本就固定在了DSSM或者是孿生網絡類似的聯合訓練上。負樣本的構造,HNM問題是提升效果的一個關鍵因素。業界的嘗試沒有想像中的複雜,而是在業務和實際的操作中尋找經驗和結論,這很大一部分原因和向量召回這一需求的約束有關。

相關焦點

  • 自然語言語義相似度計算方法
    由於文本相似度計算在文檔複製檢查、信息檢索和機器翻譯等領域都有十分廣泛的應用,所以,近年來有越來越多的學者致力於文本相似度算法的研究。總體來看,文本相似度的計算方法主要分為兩大類:一類是基於統計學的計算方法,此種方法需要大規模的語料庫,並且在計算時沒有考慮文本的句子結構信息和語義信息,計算的結果有時會與人對自然語言的理解不相符合;另一類是基於語義理解的計算方法,這種方法不需要大規模的語料庫,但需要依賴於具有層次結構關係的語義詞典,計算結果相對準確,與人對自然語言的理解較為符合。
  • 孿生網絡(Siamese Network)在句子語義相似度計算中的應用
    1、概述  在NLP中孿生網絡基本是用來計算句子間的語義相似度的。
  • 最先進的語義搜索句子相似度計算
    我們的大腦會執行語義搜索,我們會查看結果並找到與我們的搜索查詢相似的句子。在金融和法律行業尤其如此,因為文件越來越長,我們不得不搜索很多關鍵字來找到正確的句子或段落。時至今日,人類在探索上所付出的累積努力是驚人的。自NLP出現以來,機器學習一直試圖解決語義搜索的這個問題。
  • Kaggle文本語義相似度計算Top5解決方案分享
    今年和去年前後相繼出現了多個關於句子相似度判定的比賽,即得定兩個句子,用算法判斷是否表示了相同的語義或者意思。id=8問題相似度計算,即給定客服裡用戶描述的兩句話,用算法來判斷是否表示了相同的語義。智能客服聊天機器人場景中,待客戶提出問題後,往往需要先計算客戶提出問題與知識庫問題的相似度,進而定位最相似問題,再對問題給出答案。本次比賽的題目便是問 > 題相似度算法設計。數據集經過脫敏處理,問題由數字標示 為保護用戶隱私並保證比賽的公平公正,所有原始文本信息都被編碼成單字ID序列和詞語ID序列。
  • 【論文】文本相似度計算綜述
    文本相似度定義文本相似度在不同領域被廣泛討論,由於應用場景不同,其內涵有所差異,故沒有統一、公認的定義。Lin從資訊理論的角度闡明相似度與文本之間的共性和差異有關,共性越大、差異越小、則相似度越高;共性越小、差異越大、則相似度越低。相似度最大的情況是文本完全相同。
  • 計算文本相似度常用的四種方法
    在這篇博文中,作者比較了各種計算句子相似度的方法,並了解它們是如何操作的。詞嵌入(word embeddings)已經在自然語言處理領域廣泛使用,它可以讓我們輕易地計算兩個詞語之間的語義相似性,或者找出與目標詞語最相似的詞語。然而,人們關注更多的是兩個句子或者短文之間的相似度。如果你對代碼感興趣,文中附有講解細節的Jupyter Notebook地址。以下是論智的編譯。
  • 思必馳在中文文本相似度計算任務上的探索與進展
    文本相似度計算旨在識別兩段文本在語義上是否相似,是自然語言處理領域的一個重要研究方向,其在智能問答、信息檢索等領域都發揮重要作用,具有很高的商業價值。近期,思必馳知識服務團隊在中文文本相似度計算方向投入研究,並取得階段性成果:1)在第十四屆全國知識圖譜與語義計算大會(CCKS: China Conference on Knowledge Graph and Semantic Computing)[1]上發表相關論文一篇《Neural Fusion Model for Chinese Semantic Matching》
  • 機器不學習:基於深度學習CNN的短文本相似度計算方案
    機器學習深度學習乾貨棧 www.jqbxx.com基於CNN模型的短文本相似度的計算方法可以大致分為兩類:一類是基於Siamese結構的神經網絡模型,先分別學習輸入的文本對兒的句子向量表達,再基於句子向量計算相似度;另一類是直接以詞語粒度的相似度矩陣作為輸入,學習並計算文本相似度。
  • 自然語言處理之文本相似度計算
    人們能想到最簡單的方式就是統計一句話有多少個詞;然後很自然的比較兩句話的相似程度就看它們有多少個詞一樣就好了;再比上兩個句子的總詞數,就能得到一個 0-1 之間的相似度了。這就是 Jaccard 相似度計算方法:僅從一個詞語是否出現的角度,進行數學表示,進而進行相似度計算顯然是沒有充分利用文本中的信息的。
  • 指南 | 畢業論文相似度檢測
    2.在創作工具中找到「大雅相似度」(或者在首頁中找到「論文檢測」微應用)畢業論文相似度檢測對象上開本科畢業論文國開本科學位論文綜合檢測結果不高於30%*上開畢業論文在提交終稿前自查合格、國開畢業論文在答辯前自查合格提示:相似度檢測報告所列參考文獻中相似度佔比較高且與論文主題相關的文獻應增加列入論文的參考文獻中。
  • 前沿|通用句子語義編碼器,谷歌在語義文本相似性上的探索
    語義文本相似度在「Learning Semantic Textual Similarity from Conversations」這篇論文中,我們引入一種新的方式來學習語義文本相似的句子表示。直觀的說,如果句子的回答分布相似,則它們在語義上是相似的。例如,「你多大了?」以及「你的年齡是多少?」都是關於年齡的問題,可以通過類似的回答,例如「我 20 歲」來回答。相比之下,雖然「你好嗎?」和「你多大了?」包含的單詞幾乎相同,但它們的含義卻大相逕庭,所以對應的回答也相去甚遠。
  • BERT-Flow | 文本語義表示新SOTA
    「為什麼預訓練BERT句向量的cosine相似度不能很好地近似語義相似度?:」 SBERT沒有解釋為什麼沒有經過監督式微調的BERT生成的句向量不好用,是因為BERT句向量本身沒有包含足夠的語義相似度信息,還是因為簡單的cosine相似度無法準確刻畫語義相似度?
  • 指南 | 畢業論文相似度檢測(查重)
    提示:*學校將直接在不通知情況下對畢業設計平臺已上報的終稿進行查重檢測,請確保顯示為「已上報」狀態的終稿為正確文稿*相似度檢測報告所列參考文獻中相似度佔比較高且與論文主題相關的文獻應增加列入論文的參考文獻中*學校畢業論文相似度檢測系統不對個人開放,請勿輕信網絡渠道,謹防上當受騙上開本科畢業論文檢測平臺中國知網:答辯前一周可登陸畢業設計系統查看上開畢業論文相似度檢測結果及報告
  • AI科技:如何利用圖片像素之間的相似度進行圖像分割?
    自答:這篇文章是CVPR2018上一篇關於弱監督語義分割的文章,也就是,數據集告訴你一堆圖片以及這些圖片裡面有什麼,你使用深度學習的方法將圖片中每一個物體的區域分割出來。問題②:這篇文章主要思路是什麼?
  • 碩士論文知網檢測相似度後如何降重?
    對於碩士論文的相似度標準和碩士論文的寫作要求,每個學校大致相似,但也存在差異,那麼碩士論文相似度多少才算論文通過?碩士論文的降重過程中是否有特別注意的地方? 帶著這些問題,將由小編一一來告訴大家碩士論文查重相似度要低於多少學校才算論文通過?
  • 短文本相似度在金融智能客服中的應用 - 專注金融科技與創新 未央網
    短文本相似度,顧名思義是指長度較短文本(在中文中一般小於50個字符)的相似度計算,一般用於搜尋引擎、智能問答、知識檢索、信息流推薦等系統中的召回、排序等階段。1. 短文本相似度基本介紹短文本相似度的計算方式,最基本的分為無監督和有監督兩種方式。
  • NLP: 基於文本語義的智能問答系統
    項目核心技術點:通過深度學習模型判斷問題與答案的匹配得分使用BERT模型特徵提取並判斷問題相似度使用檢索引擎Faiss索引構建和檢索構建在線FAQ問答系統0-1 學什麼結合Faiss和bert提供的模型實現了一個中文問答系統。旨在提供一個用Faiss結合各種AI模型實現語義相似度匹配的解決方案。
  • 相似度算法
    相似度度量  相似度度量(Similarity),即計算個體間的相似程度,與距離度量相反,相似度度量的值越小,說明個體間相似度越小,差異越大。再用餘弦相似度計算,得到-0.8,相似度為負值並且差異 不小,但顯然更加符合現實。
  • 計算相似度
    在機器學習中,經常要度量兩個對象的相似度,例如k-最近鄰算法,即通過度量數據的相似度而進行分類。在無監督學習中,K-Means算法是一種聚類算法,它通過歐幾裡得距離計算指定的數據點與聚類中心的距離。在推薦系統中,也會用到相似度的計算(當然還有其他方面的度量)。
  • 百度NLP | 神經網絡語義匹配技術
    例如網頁搜索可抽象為網頁同用戶搜索 Query 的一個相關性匹配問題,自動問答可抽象為候選答案與問題的滿足度匹配問題,文本去重可以抽象為文本與文本的相似度匹配問題。傳統的文本匹配技術如信息檢索中的向量空間模型 VSM、BM25 等算法,主要解決詞彙層面的匹配問題,或者說詞彙層面的相似度問題。