原創:語義類似度(理論篇)

  若是本文觀點有不對的地方,歡迎指正! author:佟學強 html

開場白:對於事物的理解,通常分3個層次:①看山是山,看水是水②看山不是山,看水不是水③看山是山,看水是水。對AI和nlp的理解,一樣會有這三個層次。好比,剛畢業的碩士或者畢業1~2年的,會熱衷於研究GAN,seq2seq,甚至包括nlp剛起步的一些公司。這類羣體對nlp的理解處於第一層次,後面還有不少雷區要踩,要付出必定的試錯代價,成長的代價。等到有必定的積累了,對nlp的理解有必定的理解功底了,會逐漸修正研究路線和方向,這個時候比第一階段有更多的疑惑,由於隨着研究的深刻,發現nlp和圖像機制存在很大的不一樣,不能照搬,認知智能好像不是那麼容易,由感知智能到認知智能的跨越,是這一階段的一大進步,這是第二個層次,各個派別有爭論,看山不是山,看水不是水。最高境界,返璞歸真,擁有行業20年及以上的研究人員,對nlp看的比較透,目前的Ai基本上陷入了統計建模,機率的漩渦之中,還不是真正的智能。僅僅從數據中挖掘線性關係還遠遠不夠,應該讓機器具備認知能力,挖掘因果關係。致力於推動nlp認知智能的進步,加大力度研究知識圖譜,包括知識圖譜的向量化,與深度學習的融合,讓神經網絡學習規則等等。能夠這樣說,目前從感知智能到認知智能的跨越,纔剛剛開始,知識工程的復甦勢不可擋。本人接觸過許多剛入門的人,基本上對seq2seq和GAN比較狂熱,對nlp缺少完整系統的認知。對於GAN在nlp中不work以及爲什麼不適用於nlp,可能沒有深刻的思考,甚至圖像處理機制和nlp文字理解的神經元機制,到底存在哪些不一樣,目前須要深刻探討。好比動物神經元對圖像的識別,第一層神經元是保角映射,那麼nlp中是否須要這種機制?把CNN照搬到nlp中,爲什麼會出現語義丟失問題?word2vector對於訓練語料中未出現的詞,如何更好地表達語義?它與TF_IDF存在着怎樣的聯繫?LSTM一樣存在語義丟失問題,如何解決?知識圖譜的異構性和不均衡性給其向量化帶來了挑戰,在什麼樣的場景下須要向量化?把CRF神經網絡化的必要性和場景又是什麼?挖掘因果關係,好比:李娜爲何是最好的網球運動員?這種簡單的因果關係推理,知識圖譜是如何發揮做用的?再好比,一我的從非洲回來了,發高燒了。這件事情背後,非洲,發高燒和瘧疾存在線性關係,那麼因果關係是什麼?因此總結起來,nlp同時須要聯結主義和符號主義,對於研究人員來講,我的認爲目前nlp的研究整體上應該朝着如下方向進行:①聯結主義在nlp中的主要做用是語義表示,語義丟失問題必需要解決②由感知到認知的跨越:知識圖譜,而後結合聯結主義,其中一個方向是transD向量化,而後融入到深度學習模型中。寫這篇文章不是爲了發論文,也不是探討基礎的公式推導,主要目的是擴大傳播面,點到爲止,讓一些剛入門的研究人員多一些思考,擴大知識面,甚至幫助其矯正研究方向。前面本人提到的問題,後面會部分有解答,可是大多數還須要坐冷板凳深刻研究。多與業內大咖探討,共同推動nlp的進步。下面進入正文。數組

  nlp中語義理解一直是業內的難題。漢語不一樣於英語,一樣一個意思,能夠有不少種說法,好比你是誰的問題,就能夠有以下幾種:①你是誰?②你叫什麼名字?③您貴姓?④介紹一下你本身 等等。這些句子在語義上是十分接近的,若是作一個智能音響,對音響說出上述任何一句,其結果不該該由於句子形式的不一樣而不一樣,也就是說訓練出的模型不能對同義語句太敏感。在神經機率語言模型,也就是深度學習引入到nlp中以後,word2vector,lstm,cnn開始逐步佔據主導。在最開始的由word2vector表達詞向量,擴展到目前的用LSTM表達句子的向量,還有RCNN應用於NLP能夠抽取出一個句子的高階特徵,這幾年熱度一直居高不下。網絡

  然而聯結主義只是解決了人的感知能力,還不具有邏輯推理。衆所周知,人類有兩種智能,一個是概括總結,另外一個是邏輯推理,前者屬於感知層面,後者屬於認知層面。從感知到認知的跨越,知識圖譜是必不可少的!深度學習目前在語義表示上最大的問題是太機械化了,自適應能力太差,相比之下的統計機率語言模型能夠平滑,靈活度高一些。好比用w2v訓練出的詞語義表示就很機械化,對於漢語中的一詞多義現象,他沒法作到上下文重疊。lstm用最後的壓縮向量來表示一個句子的語義也很機械化,不能照顧到上下文的語境問題,同一句話在不一樣的語境或者上下文中其語義或者語義貢獻度是不一樣的,因此語義表示也應該不一樣。甚至同一句話用不一樣的語氣說,語義也是不一樣的,機器如何感知?如何讓現有的模型訓練出的語義更加靈活是一個重要的研究課題。框架

  word2vector的語言模型有CBOW和Skip_gram,核心思想是:相同語境出現的詞語義相近。這個思想在nlp語義上佔據重要位置。用word2vector訓練出的詞表達具有語義關聯,同時兼顧了上下文。w2v能夠解決詞級別的語義類似度問題。本人以word2vector爲核心進行了延伸,以下:函數

  本人所畫的圖,對w2v進行了深刻的分析以及拓展,其中上下文交叉,詞語歧義還屬於空白。w2v的底層原理沒必要多說,可是有不少的文章關於他的公式推導是不正確的,包括skip_gram的優化。tensorflow的nce(negative constantive estimate)源代碼必定要完整地閱讀一遍。關於w2v存在的問題,以前博客裏有部分論述,這裏不討論他的缺陷了。詞向量屬於序列化問題,知識圖譜的向量化是圖結構的,把他碾平了能夠當作是序列化的,其語言模型核心思想與w2v一模一樣。有一個重要的須要討論的問題是它與TF_IDF的關係,在SIF這篇論文裏會有一些論述,把二者結合起來是有必要的,可是要看場景!!w2v從語義層面,TF_IDF從字面層面,二者結合能夠更加靈活,能夠解決w2v訓練過程當中的部分高頻詞的語義傾斜,尤爲是在out of context的場景下,這點從skip_gram的NEG底層公式推導中能夠得出結論。更深一步地講,w2v獲取的詞向量與頻率有着密不可分的關聯。能夠把每一個句子看做是一篇沒有重複詞的DOC,那麼訓練語料中詞的頻率能夠看做是TF_IDF中的IDF。在衆多相同或者相近的上下文中,每一個詞出現的頻率不一樣,直接致使每一個詞與其上下文的語義關聯程度不一樣,最後形成的結果是高頻詞的語義向量相對於低頻詞更加稠密,與上下文關聯更加緊密。從頻率角度來看,高頻詞確實應該向量更加稠密一些,可是也會有部分高頻詞的語義傾斜是無心義的(在特定的場景下),好比and ,or等詞語,而這些詞在情感分析中卻又是必要的。而針對out of context的場景,也就是這個詞的上下文在訓練語料中並無出現過,進行語義平滑是最恰當不過的了。圖中出現了句子embedding表示,基於非監督學習的思想,每句話會有一個隱含的embedding表示,而句子中的每一個詞會有訓練好的embedding(w2v),由句子embedding進行發射,映射到每一個詞的embedding,會有發射權重,加權求和後獲得句子向量。這個向量與隱含的embedding的距離應該最小。這是SIF的思想精髓。而國外一些文獻中,會有研究未登陸詞的embedding,運用詞形態學把詞拆分,相似於character_cnn,可是很遺憾不適用於漢語。深刻研究w2v有助於利用非監督學習方法作語義層面的運算,包括詞語,句子,文章摘要,甚至將來的歧義詞。研究簡單實用的方案,永遠是工業界的使命。w2v的應用場景:①給機器一個簡短語句,機器生成類似度比較高的句子,方案具體細節能夠詢問張俊林博士②運用SIF解決句子類似度問題(非監督學習)③結合pagerank作文章摘要④最廣泛的,做爲RNN的輸入。最後強調一句,必定要對TF_IDF以及w2v深刻研究,發現二者的優缺點,學會在適當的場景下結合二者,可是不是絕對的,再強調一遍,學習Ai不要停留在套模型的原始思惟階段。好比IDF的演化推導,能夠從信息論的角度來理解。學習

  另外w2v訓練過程的優化,若是優化效果不錯的話,會提高LSTM,CNN等模型的效果。w2v須要改進,CNN一樣也須要改進,尤爲是max pooling,在nlp中不能照搬圖像處理的機制,不然會丟失語義信息。關於丟失語義信息問題,是深度學習在nlp中必需要解決的問題。解決途徑:①self_attention②k_max pooling或者動態池化層。本人比較青睞於self-attention,它主要與BiLSTM結合,更加符合nlp規律。還有,LSTM和CNN獲取的語義表示,其實屬於語言模型層面的,這一點能夠本身體會。大數據

  在word2vector產生後,情感分析便由word2vector和svm主導,先獲取到用戶評價句子的每一個詞的表示,對每一個詞打分,而後加權求和得出一句話的得分,來判斷這句話是好評,中評仍是差評。很顯然,這種方法只是從詞這個局部單元考慮出發,並無考慮到整句話所表達的意思,很容易陷入局部最優解。lstm產生後,便摒棄了這個方案,先由lstm訓練出這句話的向量,而後進入到迴歸層進行打分。這樣就能從整句話出發來判斷用戶的評價了。優化

  儘管如此,研究人員並無中止語義分析研究的步伐。如何作句子級別的語義類似度?在nlp中,文章摘要或者信息抽取一直是沒有突破的課題,深度學習引入以後,便有了一些改進。文章摘要,無論採用什麼樣的手段,都離不開三個核心問題:①句子類似度的計算②文摘句抽取③文摘句排序。運用siamese lstm,訓練的時候,輸出爲兩個句子向量的一階範數的指數函數,表明兩個句子的差別程度,讓這個值與真實的打分值的損失函數最小。這樣訓練得出的兩個句子的向量與普通的標準的LSTM訓練出來的向量是有區別的。標準的lstm單獨訓練出來的每一個句子向量只能表明一個句子,句子之間是獨立的。這個方案能夠解決句子的語義類似度。搜索引擎

  如何獲取整篇文章的語義表示?能夠把每一個句子的向量累加成文章向量,而後用元智或者元積衡量每一個句子和文章向量的差別,選出k個類似度最高的句子做爲文章摘要句。關於如何獲取整篇文章的語意表達,這裏有一個比較low的方案,呵呵:翻譯

 

   feature1:一篇文章包括A,B,C三段,每段有a,b,c……句子,先用siamese lstm獲取到每一個句子的語義表示,而後把每一個句子做爲基本輸入單元,輸入到siamese lstm中,再把每段做爲基本單輸入到siamese lstm。這裏的每一個siamese lstm是不同的,須要單獨訓練好,好比第二個能夠衡量段落之間的語義類似性。

  這個方案很明顯是不切實際的,只是粗糙地累加並且訓練時間複雜度過高,運行效率明顯存在問題,訓練的模型太多。有沒有更好的方案呢?本人認爲,一個比較好的方案是能夠抽取出文章的中心句做爲整篇文章的語義表示。而這個中心句的語義表示很顯然與他的上下文存在着密切的語義關聯,訓練過程當中必須照顧到這一點。咱們能夠先談一下人腦對於一篇文章的語義理解。給你一篇文章,從第一句話順序閱讀,直到文章結束,咱們會抽取出其中的中心句或者總結出中心思想來表明這個文章。從第一句話開始,咱們的大腦就開始猜想他是否是中心句,而後看下面的內容是否圍繞着它來展開論述的,若是不是,繼續猜想後面的句子,執行相同的邏輯推理,主要看上下文與這個句子的語義關聯程度。而在閱讀的過程當中,大腦的高級中樞會指揮注意力分配機制,具體來講,上下文的每句話中的每一個詞對中心句的語義貢獻度是不一樣的,這些詞隨着時間的推移,有些給咱們留下了深入的印象,有些則遺忘了。這種注意力分配會致使新的句子的造成,而到達下一個句子時,前面新造成的句子一樣存在着這樣的現象。

  其實上面描述的過程明顯涉及到了hierarchical attention,並且是兩個級別的attention:詞級別的和句子級別的。詞級別的attention負責把上下文中的每一個句子的詞從新組合成一個新的句子,句子級別的attention在此基礎上把這些新造成的句子再次從新組合成一個新的句子,這就是最終的上下文。若是這個最終的上下文語義表示和咱們猜想的中心句語義類似度很高,那麼他就是中心句,若是不是,前向搜索繼續執行這個邏輯。這個方案是本人首次提出的siamese lstm + hierarchical attention組合而成的,用以模擬人腦在抽取文章中心句的過程。具體訓練的語料格式能夠以下:【文章,中心句,1.0】後面是類似度得分,用目前計算語義類似度最好的模型siamese lstm。(2017年有學者提出了非監督學習的SIF,可是本人認爲應用場景很受限,僅供借鑑)上下文的每一個句子的詞序列輸入到siamese lstm中的第一個lstm中,中心句輸入到另外一個lstm中,而後用中心句的語義表示對齊第一lstm中的每一個詞語義表示,累加成新的句子語義存儲起來,然後作句子級別的attention對齊,使用中心句的語義表示對存儲的全部上下文新句子的語義表示進行對齊操做,而後求加權平均值獲得最後的上下文語義表示,最後輸出打分值:exp(-||x1 - x2||1),而後用MSE做爲損失函數開始訓練。

  預測的時候,模擬人腦抽取中心句的過程,從第一句開始,時間序列t0,後面的語句全是下文,用訓練好的模型獲得最終的語義,而後運行exp(-||x1 - x2||)節點,而後把第一句的編號和類似度得分封裝成一個對象,存儲在一個數組裏面,增長時間序列到t1,計算他的上下文語義,把第二句話編號和類似度得分存儲在數組裏,以此類推。最後用本人設計的優先級隊列(優於jdk底層的優先級隊列,要求兼顧時間空間最優)推薦出top K,K通常很是小,好比2,3。

  計算句子語義類似度在nlp中不只限於文章摘要。他能夠加強nlp的語義理解能力,在機器翻譯中也有重要的應用甚至在nlp的挑戰性的場景,好比給你一段話,要求不改變文章思想的狀況下把這段話拆分紅兩段,也就是文章斷句分段。這個問題的解決方案可能複雜一些,siamese lstm只是一個基礎性的支撐。解決語義問題,首先要解決的是獲取語義的表示,一般狀況下用dense向量來表達。可是標準的lstm最大的意義是提供了基礎學術研究,由於他獲取到的語義表達是獨立的,不具有語義關聯,重要的事情重複三遍,不具有語義關聯,不具有語義關聯,不具有語義關聯!!考察語義類似度,要考慮單個句子或者整篇文檔的上下文。

  目前,計算語義關聯,或者計算語義類似度,有衆多學者探索瞭如下方案:①convnet,cnn引入到nlp中②skip_thought,改進型的w2v③tree_lstm。基於ma結構的siamese lstm已經超越了當下的state of the art,效果已經擊敗了上述三個方案。他的最大亮點是exp(-||x1 - x2||1),爲何不用L2範數衡量獲取到的句子向量的差別,一方面用w2v訓練出的詞,存在大量的歐氏距離相同的狀況,若是用L2範數衡量,效果很不穩定,存在語義丟失現象,而cos類似度適用於向量維度特別大的場景。用ma距離來衡量是最恰當的。另外一方面,BPTT提及,用L2範數會存在梯度消失的問題。由於最終獲取的向量其實是兩個句子向量的差值,能夠當作是一個向量,上述的函數能夠看做是激活函數,進行梯度訓練時,因爲L2函數的特性,只能衡量較短句子的差別,也就是說,當句子很長時,原本語義類似度很低,他卻衡量不出來,認爲是類似度很高。這一點也體現了標準的LSTM的能力是有限的,超過30步數記憶能力直線降低,一個長句子經過模型訓練獲得的final_state.h,佔據比重最大的是後面的詞語,前面的基本消失,所以須要attention model。

  再強調一下,衡量特徵向量差別的指標一般有歐式距離,曼哈頓距離和餘弦類似度。若是一對兒向量在空間的絕對距離相等的狀況下用歐式距離衡量效果是不好的,這個時候有曼哈頓距離效果會很好,曼哈頓距離會比歐氏距離穩定。用W2V訓練出的詞embedding在VSM中的歐式距離相等或者相近的狀況是很常見的,因此用曼哈頓距離會穩定一些。餘弦類似度適用於特徵向量維度有不少的狀況。

  Simase LSTM指的是具備simase結構的LSTM網絡,由兩個平行雙向LSTM構成,結構參考下面兩張圖:

  連體(雙胞胎)LSTM輸入爲句子對兒,分別是上圖中的左邊和右邊的。經過final state獲取兩個句子的向量,而後經過指數函數衡量差別,因爲指數函數的指數爲一階範數的負數,因此取值範圍爲(0,1]。在構建樣本的時候,通常狀況給句子對兒打分都是1~5分,因此再經過一個非參數化的迴歸層映射到這個區間,用MSE做爲損失函數,梯度優化方法爲AdaDelta。一個典型的樣本輸入:[「I like playing basketball.」,」My favourite sports is basketball.」, 3.4]。按照做者在論文中提出的,連體的LSTM權重參數不該該同樣,由於句子對兒長度是有差別的。另外做者在論文中提出了訓練細節問題,通過試驗驗證,這個模型的準確度對參數初始化很是敏感。做者建議,權重參數初始化爲隨機的高斯分佈參數,而後cell中忘記門的偏置值初始化爲2.5,是爲了訓練更長的記憶能力。  

  siamese lstm方案的缺陷,有兩個:①衡量長句子的語義類似度時候,效果比較差②沒有融入外部知識。對於第一個缺陷,論文做者並無進行深刻的研究,本人通過摸索認爲,不只是長句子,即便對於短句子,若是裏面涉及到了大量entity和relation的話,效果也並非最優的。對於聯結主義在語義理解上的貢獻,本人認爲第一個要突破的就是如何獲取語義表示的多維度,而目前都是用LSTM的最後一個時間序列的out來壓縮成一個向量來表示,這種表示不能捕捉多維度的語義。因此咱們須要用一個矩陣權重參數來表示句子的語義權重,這個矩陣的每一行,應該都是一個機率和爲1的機率分佈,而後每個機率分佈應該捕捉語義的不一樣維度,最後concate來表示這個句子的語義。所以,在此基礎上融合self_attention(2017年句子語義表示的baseline),尤爲在情感分析中,效果很是好。 

  對於融合知識圖譜和深度學習好比CNN作語義類似度,一個很是重要的場景就是新聞標題的推薦。新聞標題裏每每包含大量的entity,識別出來後能夠查詢知識圖譜獲得one hot的entity,在其餘標題中出現這些entity的新聞,用戶每每也是感興趣的,但不是絕對的。沿着知識圖譜的路徑,用戶的興趣會進行傳播,這樣的傳播會有權重,這就是著名的用戶興趣傳播,會造成必定的漣漪效應。把知識圖譜的entity進行向量化,而後擴展標題中的詞嵌入,在原來的詞embedding基礎上concate entity的embedding,而後用CNN捕捉標題的語義表示,與候選新聞作語義類似度運算。以前的博客提到過,個性化推薦的本質是語義理解中的語義類似度問題,這個定位很是重要,結合知識圖譜,場景切入更天然,更加接近真實的效果,並且能夠處理小數據。相比於傳統的基於用戶瀏覽數據的行爲挖掘,更加符合實際,更加深刻。

       語義類似度是nlp中的一個難題,若是突破了,會有一些改變,好比目前的問答,進展非常緩慢,爲了節約成本或者前期缺乏大數據,在垂直領域,不少公司用基於規則來作,召回率過低。問答,最初的時候,好比暢捷通的會計家園,使用的是基於語義類似度的方案,效果還能夠。case by case。當用戶常常提出一些比較長的問題,又不是BFQ的狀況,好比,用戶提問,我想知道註冊會計師證考下來後,對就業到底有沒有實質性的幫助,薪資能提高多少,好考嗎?對於這類問題,用模板匹配顯然是不合適的,向量建模更不合適。因此說,知識圖譜的問答不是萬能的。可是若是業內在語義類似度上突破了的話,那麼這種方案,在垂直領域的問答,無疑是很好的。只要語料充足,遇到用戶提出的問題,咱們先進行語義類似度的計算,選出得分最高的問答的答案,直接呈現出來,若是類似度得分低於人工設定的閾值,進入seq2seq模塊兒。這個方案,應該比目前的基於模板匹配要好一些。可是對於複雜的推理問題,好比梁啓超的兒子的情人是誰這類問題,仍然須要語義解析,並且這樣的場景,並無多少實際意義。

  更深刻地講,若是以前接觸過垂直搜索lucene的話,咱們會發現,問答和搜索的本質是一致的,都是減小用戶需求不肯定的過程。這樣的過程,是靠系統的語義解析來完成的,好比lucene,用戶輸入"蘋果",系統根本不知道用戶的需求,須要額外添加約束,好比商品分類:電腦,這樣通過lucene的詞法處理(好比分詞),句法分析(好比造成一顆查詢語法樹,典型的Boolean query)後,搜索引擎可以理解這樣的查詢語言,最後呈現出結果來。而問答呢,兩個問題:①question的語義表示②把語義表示映射成知識圖譜能夠理解的查詢語言。典型的core inferential chain,就是把這個過程一步一步分解,在查詢的過程當中不斷施加約束,最後得出答案。目前的問答,大概有以下方案:①檢索+seq2seq,適用於比例不高的自由聊天,並且seq2seq的場景比例很小②基於模板匹配:本質上是獲取問題的模板表示後,訓練模板與知識圖譜predicate的映射機率,屬於統計建模範疇,並且限制較多,不能處理multi hot推理③基於語義解析的方案④基於向量建模的方案⑤信息抽取的方案。信息檢索裏面,比較重要的一個場景是排序,好比著名的BM25排序,是用樸素貝葉斯推導出來後簡化的。基於檢索+seq2seq的自由聊天,排序用的就是BM25,question和answer的語義類似度得分用的是seq2seq框架,而後計算匹配度。對於multi hot的問答,我的認爲,應該借鑑檢索的核心思想,把知識圖譜的搜索過程分解,逐步施加約束,融合語義解析,向量建模,基於規則等多種手段。基於規則在問答當中的做用每每是對檢索施加約束,是輔助手段,而核心每每是語義類似度計算,question的語義表示。

        因此,問答,必定要case by case 。對於BFQ的問答,模板無疑是比較好的,向量建模也能夠。記住,場景是AI第一要素,切不可一味奉行拿來主義,先把本身的需求和場景研究明白了,纔是關鍵。深度學習的研究方向,必定先把人類自身對於特定場景的邏輯搞明白了,才能少走彎路。

下一篇博客,繼續介紹語義類似度:http://www.cnblogs.com/txq157/p/8656856.html

關於self_attention在語義表示中的做用:http://www.cnblogs.com/txq157/p/8445513.html

相關文章
相關標籤/搜索