1. 程式人生 > >基於word2vec訓練詞向量(一)

基於word2vec訓練詞向量(一)

1.回顧DNN訓練詞向量

上次說到了通過DNN模型訓練詞獲得詞向量,這次來講解下如何用word2vec訓練詞獲取詞向量。

回顧下之前所說的DNN訓練詞向量的模型:

DNN模型中我們使用CBOW或者Skip-gram模式結合隨機梯度下降,這樣每次都只是取訓練樣本中幾個詞訓練,每完成一次訓練就反向傳播更新一下神經網路中W和W’。

我們發現其中DNN模型仍存在兩個缺點:

首先,每次我們只是使用了幾個單詞進行訓練,但是在計算梯度的過程卻要對整個引數矩陣進行運算,這樣計算效率低下。

更重要的一個缺點是在輸出層中用softmax時,需要對輸出層中每個位置求其概率,sotfmax函式如下圖:

這裡u_0是W’的一個神經元的引數向量,v_c對應的是訓練樣本與隱藏層引數W相乘啟用後得到的向量。可以發現,為了得到輸出層的每個位置的概率,我們需要求得所有單詞的得分,如果一個詞彙表很龐大的話,這是很耗資源的。

2.Word2vec

2.1 前瞻

針對DNN模型訓練詞向量的缺點,2013年,Google開源了一款用於詞向量計算的工具–word2vec,引起了工業界和學術界的關注。Word2vec採用了Hierarchical Softmax或Negative Sampling兩種技術來提高訓練詞向量效能,由於篇幅較長,本次只講解基於Hierarcical Softmax優化的CBOW模型。

2.2 霍夫曼樹

在介紹word2vec的網路結構之前這裡需要簡短的回顧下霍夫曼樹,輸入不同的權值的w節點,將其看作是n棵森林,先選取這些節點中最小兩個權值w_i,w_j節點進行合併,得到一棵新的樹,原來的w_i,w_j成為這個新樹的左右子樹。新樹的權值是w_i和w_j節點對應的權值之和,將新樹作為新加入的一棵樹,刪除原來的w_i,w_j樹,重新選取兩棵最小的樹合併,以此類推直到所有的樹都合併了。舉個例子,假如有(a,b,c,d,e,f)共6個點,節點權值分佈是(16,4,8,6,20,3)。規定左分支為0,右分支為1。

其中所有的詞都是葉子結點,霍夫曼樹的好處就是權值較大的詞(即頻率較大的詞)會在深度更小的葉子處,獲得更短的編碼。這樣頻率更高的詞會以更小的代價被發現。

2.3 Hierarcical Softmax網路結構

Word2vec有兩種優化加速模型,一種是基於Hierarcical Softmax優化,另一種是基於Negative Sampling優化,本次只講解基於Hierarcical Softmax優化。下圖是Word2vec基於Hierarcical Softmax優化的模型,訓練模式選用CBOW模型:

該網路結構包含了三層,輸入層,投影層(即原來的隱藏層)和輸出層,假設存在樣本(Context(w),w),Context(w)是由w前後各c個詞構成作輸入樣本train_X,w作輸出值train_y。

  1. 輸入層:

包含Context(w)中2c個詞向量v(Context(w)_1),v(Context(w)_2),……,v(Context(w)_2c)組成,詞向量長度相同。

  1. 投影層:

將輸入層2c個詞向量累加後求平均作為X_w。

  1. 輸出層:

輸出層是對應一棵霍夫曼樹,其中葉子節點就是對應詞彙表中的詞,非葉子節點即(黃色節點)等價於原來DNN模型中隱藏層到輸出層的引數W’,用θ_i表示該節點的權重,是一個向量,根節點是投影層的輸出X_w。

2.4 基於Hierarcical Softmax優化的Word2vec優點:

Word2vec相比較於DNN訓練詞向量,其網路結構有兩點很大的不同:

  • 捨去了隱藏層,在CBOW模型從輸入層到隱藏層的計算改為直接從輸入層將幾個詞的詞向量求和平均作為輸出。
  • 捨去了隱藏層到輸出層的全連線結構,換成了霍夫曼樹來代替隱藏層到輸出層的對映。

第一個改進在於去除了隱藏層,Word2vec訓練詞向量的網路結構嚴格上來說不算是神經網路的結構,因為其整個網路結構是線性的,沒有啟用函式並且取消了隱藏層。這麼做對於訓練詞向量反而是極好的,我們在神經網路中使用啟用函式,是因為我們處理的問題很多不是線性相關的,輸入的樣本之間一般也不是線性相關的。但處理詞的問題時,我們知道一個詞與其上下文是相關的,也就是說輸入的上下文幾個詞也應該是線性相關的。取消了隱藏層沒有了啟用函式也就意味著承認了輸入的幾個上下文詞的關係也是呈線性相關的。Google的Tomas Mkolov就發現瞭如果將DNN模型中的隱藏層移除,訓練出來的詞向量就會成大量線性相關,於是就有了我們在上一篇開頭所說的神奇的地方:

第二個改變是為了針對降低原來DNN的softmax的計算量,我們把softmax計算改成了沿著一棵霍夫曼樹找葉子節點的計算,這裡霍夫曼樹德非葉子節點相當與DNN中隱藏層到輸出層的權重,在霍夫曼樹中不需要計算所有的非葉子結點,只需要計算找尋某個葉子結點時經過的路徑上存在的節點,極大的減少了計算量。

2.5 Hierarcical Softmax優化原理

上圖是一個根據詞頻構建好的霍夫曼樹,各葉子節點代表詞彙表中的所有詞,在計算之前引入一些符號:

假設w使我們要求的目標詞,Context(w)是該目標詞的上下文片語,一共有c個,x_w是投影層的輸出。

在word2vec中使用了二元邏輯迴歸的方法,這時候從根節點到葉子節點的過程是一個二分類問題,規定當前節點走到下一個節點,沿著左右子樹走的概率分別為:

…(1)

使用了sigmoid函式來計算選取當前節點的概率,因為只存在0,1兩種取值,我們可以用指數形式寫在一起:

…(2)

因為計算每一個非葉子是相互獨立的,所以在從根節點到找到葉子節點對應的詞w的概率可以寫成,就是我們的目標函式,我們希望最大化這個目標函式:

…(3)

這裡我們的目標函式可以去對數似然:

…(4)

將(2)帶入(4),得:

…(5)

為了方便理解,將(5)改成c項之和:

…(6)

我們的目標是最大化對數似然函式(5),等效成最大化每一項(6)即可。這時對(6)每個變數(X_w,θ_j-1)求偏導,對每一個樣本,帶入偏導數表示式得到在該函式上增長的梯度,然後讓對應的引數加上這個梯度,函式就在偏導數對應的維度上增長了,這就是梯度上升法。

於是可以得到引數更新的虛擬碼,在訓練開始前要把詞彙表放入,統計每個詞頻構建好霍夫曼樹,然後開始進行訓練:

如果梯度收斂,則結束梯度迭代,演算法結束。

3.總結

基於Hierarcical Softmax優化的Word2vec,相對於DNN,使用霍夫曼樹網路結構不需要計算所有非葉子節點,每次只會反向對路徑上的引數求偏導更新路徑上的節點引數,提高了詞向量訓練效率。但是仍存在一些問題,比如霍夫曼樹的結構是基於貪心的思想,這樣訓練頻率很大的詞很有效,但是對詞頻很低的詞很不友好,路徑很深。在基於Negative Sampling 的word2vec可以很高效率對詞頻很低的詞訓練,下次會繼續講解最後一篇基於Negative Sampling 的word2vec,學習路漫漫,和大家一起分享學得的東西,自己對於word2vec的一些拙見,如有不足或理解錯誤的地方,望各位指點!