第一篇: 詞向量之Word2vector原理淺析
一、概述
本文主要是從deep learning for nlp課程的講義中學習、總結google word2vector的原理和詞向量的訓練方法。文中提到的模型結構和word2vector的程式碼實現並不一致,但是可以非常直觀的理解其原理,對於新手學習有一定的幫助。(首次在簡書寫技術部落格,理解錯誤之處,歡迎指正)
二、詞向量及其歷史
1. 詞向量定義
詞向量顧名思義,就是用一個向量的形式表示一個詞。為什麼這麼做?機器學習任務需要把任何輸入量化成數值表示,然後通過充分利用計算機的計算能力,計算得出最終想要的結果。詞向量的一種表示方式是one-hot的表示形式:
首先,統計出語料中的所有詞彙,然後對每個詞彙編號,針對每個詞建立V維的向量,向量的每個維度表示一個詞,所以,對應編號位置上的維度數值為1,其他維度全為0。這種方式存在問題並且引發新的質疑:
1)無法衡量相關詞之間的距離
從語義上講,hotel 和motel 更相關,和cat更不相關,但是無法表示這種差異。
2)V維表示語義空間是否有必要
one-hot的每一維度表示具體的詞,我們假設存在更加抽象的維度能夠表示詞和詞之間的相似性和差異性,並且詞向量的維度遠遠小於V。例如,這些維度可以是時態,單複數等
2.詞向量獲取方法
1)基於奇異值分解的方法(奇異值分解)
a、單詞-文件矩陣
基於的假設:相關詞往往出現在同一文件中,例如,banks 和 bonds, stocks,money 更相關且常出現在一篇文件中,而 banks 和 octous, banana, hockey 不太可能同時出現在一起。因此,可以建立詞和文件的矩陣,通過對此矩陣做奇異值分解,可以獲取詞的向量表示。
b、單詞-單詞矩陣
基於的假設:一個詞的含義由上下文資訊決定,那麼兩個詞之間的上下文相似,是否可推測二者非常相似。設定上下文視窗,統計建立詞和詞之間的共現矩陣,通過對矩陣做奇異值分解獲得詞向量。
2)基於迭代的方法
目前基於迭代的方法獲取詞向量大多是基於語言模型的訓練得到的,對於一個合理的句子,希望語言模型能夠給予一個較大的概率,同理,對於一個不合理的句子,給予較小的概率評估。具體的形式化表示如下:
第一個公式:一元語言模型,假設當前詞的概率只和自己有關;第二個公式:二元語言模型,假設當前詞的概率和前一個詞有關。那麼問題來了,如何從語料庫中學習給定上下文預測當前詞的概率值呢?
a、Continuous Bag of Words Model(CBOW)
給定上下文預測目標詞的概率分佈,例如,給定{The,cat,(),over,the,puddle}預測中心詞是jumped的概率,模型的結構如下:
如何訓練該模型呢?首先定義目標函式,隨後通過梯度下降法,優化此神經網路。目標函式可以採用交叉熵函式:
由於yj是one-hot的表示方式,只有當yj=i 時,目標函式才不為0,因此,目標函式變為:
代入預測值的計算公式,目標函式可轉化為:
b、Skip-Gram Model
skip-gram模型是給定目標詞預測上下文的概率值,模型的結構如下:
同理,對於skip-ngram模型也需要設定一個目標函式,隨後採用優化方法找到該model的最佳引數解,目標函式如下:
分析上述model發現,預概率時的softmax操作,需要計算隱藏層和輸出層所有V中單詞之間的概率,這是一個非常耗時的操作,因此,為了優化模型的訓練,minkov文中提到Hierarchical softmax 和 Negative sampling 兩種方法對上述模型進行訓練,具體詳細的推導可以參考文獻1和文獻2。
三、參考文獻
9.霍夫曼編碼