這篇文章,專門講語義相似度問題。
先看場景:
scene(二):kb_qa的兩個問題:①獲取question的語義表示②把語義表示轉換成知識圖譜的能夠理解的語言邏輯形式。無論是核心推導鏈還是向量建模,核心都是question和answer的語義相似度問題。
雖然學術界對於語義相似度問題,都說是熱點和難點,但是他到底難在**?今天有必要**一下。首先,衡量兩個表達的之間的相似度,是通過語義級別,而語義屬於認知層面,這給研究帶來帶來了很大的難度。因為目前的聯結主義,僅僅能解決語義表示,無法學習邏輯推理。其次,理解一句話或者一段話的語義,不是單純靠歸納總結能力,還需要借助外部知識,就是說這句話表達了什麼樣的事件,這個事件可能會關聯到很多實體,關係,路徑。兩個句子之間的關係,路徑的交集一定程度上代表了語義的重合度。之前的研究,都是靠單純靠聯結主義,包括開頭的兩個場景,都是這個思路。
從演算法角度來看的話,探索基於知識圖譜的非監督學習是乙個方向,目前有學者在研究;另外乙個就是監督學習了,主要是借助深度學習。目前大部分的相似度改進,仍然是後者,前者的難度,對於工業界來說,非常大。從工業界的角度來看,最簡單的相似度當然是元積了,比如著名的word2vector可以做詞級別的語義相似度。通過簡單的dot問題,確實能解決一些相似度問題,但是對於高精度的場景,實在是太粗糙了。如果單純運用聯結主**決相似度的話,有三個個問題需要解決:①語義表示的豐富性②語義表示差異性的衡量以及打分函式,這影響到精準性以及語義消失問題③相似度的顆粒度問題。
以kb_qa作為切入點:場景是ai第一要素,之前有很多人拋開場景研究相似度問題,比如用深度學習總結出語義表示後直接用元積或者cos,存在這種想法的人不在少數。這樣的研究,沒有任何意義。既然涉及到相似度,一定是句子對兒,或者文件對兒,我們一定要考慮雙方的情況,不同的場景,不同的分析。那麼kb_qa,涉及到question和answer,我們需要單獨研究每乙個物件。首先看question,舉個例子:whtat's the name of obama's wife?先用資訊抽取的方法分析這句話,如果熟悉資訊抽取的話,可以忽略以下。乙個問題,涉及到問題詞qword,焦點詞qfocus,主題詞topic和中心動詞qverb。其中qword比如what,who,where代表了問題的型別,比如where對映為type.location。qfocus代表了答案的型別,這是非常重要的參考標準,比如問句中的name。topic代表了問句中的主題,或者說是知識圖譜中的推理的根節點,比如obama。然後qverb一定程度上表明了topic和answer之間的一種關係,或者說是約束,當然其他的短語關係,也可以對topic構成一定的約束,比如:who first voiced meg on family guy? meg on family guy這個短語中,meg對topic構成了一定的約束關係,包括出現of+topic短語,這在語言邏輯形式上往往是joint關係。明白了這些關係後,我們就知道衡量quesiton和anser之間的語義相似度,絕非是簡單的cos!我們一定兼顧到question和anser之間的約束關係,因為kb_qa,本質上就是知識圖譜的查詢問題,只不過這個查詢是通過一步步施加約束,縮小搜尋範圍最後得到答案。而每一步施加約束後,我們都會得到相應的獎勵得分。
what's the name of obama's wife?這句話得到了topic後,可以用multi-hot,也就是詞袋模型來表示他的語義。然後answer,我們考慮三方面的約束關係:answer type,answer path,answer context,同樣用multi-hot的詞袋模型來表示,最後用dot做相似度。這個想法非常簡單,但是缺陷非常多,語義相似度如果這麼做的話,效果一定非常差。第一,類似於word2vector的詞袋模型,在語義表示上不夠豐富,不能考慮到語言的順序;第二,在相似度顆粒度上,還是很粗糙,儘管考慮了answer的三個方面,但是這三個方面應該分開單獨和question做相似度得分。基於這兩個缺陷,我們改進為:用cnn抽取出question的三個方面的語義表示,然後答案的三種約束,單獨和question的語義求相似度得分:
這樣兼顧了語意表達的豐富性和相似度顆粒度問題。這個方案仍然有改進空間,方向就是語義表示的多維度問題。拋開場景,之前textcnn在文字分類中取得了成功,cnn抽取語義表示,類似於n-gram原理,比如過濾器設定為(2,3,4),分別代表2-gram,3-gram,4-gram。目前這個方案已經有了更好的,那就是bilstm+self_attention。self_attention在捕捉一句話語義的多維度方面,有著非常大的優勢,已經成為語義表示的baseline,所以把前面的方案替換為self_attention。(attention的型別很多,比如local,global,但是大多需要借助額外的語義表示,而且不能捕捉語義的多維度,self_attention是一種突破)
前面的基於向量建模的語義相似度方案,仍然存在缺陷,對於稍微複雜的問題,比如涉及到時序性的推理,或者multi-hot推理,顯得略微吃力一些。向量建模其實還沒有真正觸及語言邏輯問題,只有融合了深度學習,語言邏輯,向量建模,規則,問答才能真正強大起來。語**析的過程,我們換一種角度來研究。傳統的語**析,是一下子全部對映為查詢語言,先經過lexicon對映,然後構建語法樹。但是這個過程我們分解為多個步驟,不用一下子構建語法樹,分解的好處是可以融合向量建模,資訊抽取的思路,更方便地與深度學習,知識圖譜融合。它其實是query graph的過程,在query的過程中不斷施加約束,而每個環節施加的約束,或者說是action會有多個,我們可以從中選擇出與quesion相似度得分最高的那個action作為最優的action,如此不斷地施加約束,縮小範圍,得到最終的結果。這就是微軟著名的query graph,一下子提公升了7.5個f1_score,這個提公升在業內是比較罕見的。啟發式的搜尋演算法很簡單:
核心問題其實還是約束與question的語義相似度,在做core inferential chain與quesion的相似度時,顆粒度做的很細:
question和constraint,都是用cnn來抽取語義表示,然後dot。
從以上案例,我們看出,語義相似度,即使不考慮融合知識圖譜的情況下,也絕不是很多人想的那樣想當然。到現在為止還沒有解決大眾點評的問題,這個問題,明顯不同於kb_qa,是另乙個場景。
總結一下,語義相似度,在不考慮知識圖譜的情況下,核心問題:①獲取豐富的多維度的語義表示②語義表示做差後的打分函式對映,比如用ma距離衡量後用exp(-||x1 - x2||1)③顆粒度問題。另外非監督學習的方法,也可以探索,但是場景受限,準確度遭受工業界質疑。
到此為止了,今後的研究,會更多結合外部知識,融合知識圖譜做語義重合度,推進語義理解的進步。
關於語義相似度的更多細節,請看本人的這篇部落格:
短文本語義相似度計算
寫在開始之前 語義即聯絡。以下部分來自於我在公司內部的分享。在學術上,大致有以下三個概念和文字相似度相關 當我們在討論兩個短文本是不是相似 或者是不是表達同乙個意思 需要做兩件事 說它簡單,因為它是一種簡單的詞袋模型 說它重要,因為它很容易和倒排索引結合,正所謂 天下武功,無堅不摧,唯快不破!我會在...
實踐 SSDEEP相似度比較
2020 06 03 其實一開始的時候,我是想看看,他們都是使用什麼特徵來進行比較。首先是工具的安裝,然後通過自己編寫的幾個c原始碼,編譯之後進行比較。他的結果說明,能夠有相似度出來 然後又對比了這個影象的相似度,發現這個工具並不支援。我估計是因為他是使用線性滑動視窗來進行比較的吧。ssdeep的使...
演算法 入門篇(余弦相似度)
數學模型 計算公式 一般來講最終資料越接近於1,表示分子與分母部分的夾角越小 用途 使用余弦相似度的場景一般用在判斷兩條資料的相似程度上,常見使用在,風控系統中對密碼驗證的場景等。當相似度即最終值越接近於1時,表示密碼的相似度越高。本文將根據密碼相似度驗證簡單介紹此演算法的使用。但是,現實往往是存在...