word2vec
word2vec 是Mikolov 在Bengio Neural Network Language Model(NNLM)的基礎上構建的一種高效的詞向量訓練方法。
詞向量
詞向量(word embedding ) 是詞的一種表示,是為了讓計算機能夠處理的一種表示。 因為目前的計算機只能處理數值, 諸英文,漢字等等它是理解不了的, 最簡單地讓計算機處理自然語言的方式就是為每個詞編號, 每個編號就代表其對應的詞, 這就是one-hot編碼(或稱one-hot前身,因為one-hot 一般以向量形式呈現, 向量維度是詞典的詞數量, 每個詞的one-hot詞向量只在編號位置取1,其余維度只取0)。但很明顯,one-hot編碼是不能表示詞與詞之間的(隱含)關系的。 基於Markov 性質構建的n-gram模型,隨着 n 的增大,詞與詞之間的關系的表達更清晰,但計算量卻呈可怕的指數級增長。除了巨無霸企業,很少有公司或個人用得來。 所以需要一種可以表示詞與詞之間內在聯系的並且獲得還相對容易的詞向量。
在此方向做出努力的人有很多, 但真正給人留下印象的首推NNLM。
NNLM
Bengio的NNLM如下圖所示, 是這樣的一種三層網絡結構: 第一層是投影層, 即將每個詞投影成一個具有固定維度的向量,一個序列的所有詞向量都進入下一層, 所有的詞向量首尾順次相接構成一個大的向量, 最后經過一個全連接層再加上softmax 來預測下一個詞的詞向量(圖上的虛線表示第一層的數據與第三層也是連通)。
公平的說,這樣的結構已經夠簡單,夠高效了。但竟還有優化空間,而且還是更加高效的優化。這就是Mikolov的word2vec.
word2vec
word2vec 是在NNLM的基礎上做的大量優化。word2vec的建模方式,有兩個版本, 一個是Continuous bag of words (cbow), 另一個是 skip-gram. 實現方式也有兩個方式: 一個是 Hierarchical softmax 另一個是Negative Sampling.
word2vec 結構
首先來看cbow, 對比NNLM, 可以發現, 其實結構是差不多的,也是三層結構, 只不過, 在第二層中, 序列中的所有詞向量不再是首尾順次相接構成一個大的向量, 而所有向量相加,結果還是一個與每個詞向量相同維度的向量。另一個優化即是在預測的方法上, 這個具體在講實現方式時再說。
然后再看skip-gram, 這個與cbow有點不同, cbow是用(幾個)周圍詞來預測中心詞, 而skip-gram則是用中心詞來預測周圍詞。另外,skip-gram嚴格來說只是兩層, 上圖其實只為了與cbow的結構類比,skip-gram的第一層與第二層是一樣的, 沒做任何變化。
實現方式
word2vec的實現方式有兩種, 一種是Hierarchical Softmax,另一種是Negative Sampling.
回想word2vec的目的,是找出一種可以表達詞與詞之間隱含的相互關聯的信息的詞表示。那如何捕捉這些信息呢? 記得有個人說過:詞是沒有意義的,除非它在語境之中。 也就是說,我們要找出想要的信息,需要從詞及其語境信息中得到。從概率的角度,也就是說我們要建模,使:
或者:
其中\(s(a,b)\) 表示a,b的某各關系函數。
Hierarchical Softmax
這里用到了一個很重要的概念叫Huffman樹,以及Huffman編碼。
Huffman 樹
在數據結構中, 樹是一種很重要的非線性數據結構。二叉樹又是其中很重要部分。 下面要介紹的Huffman樹是所謂的最優二叉樹。
這里帶着問題,采用一種反向的方式來了解Huffman樹。既然Huffman樹是所謂的最優二叉樹,那么最優體現在哪里呢? 最優的標准:二叉樹的帶權路徑長度最小。 那什么是帶權路徑呢?
在樹結構中, 從(根)節結點到其子孫結點所經過的分支數量稱為路徑長度;在樹中, 為每個結點賦予某種意義的數值, 稱為該結點的權重。帶權路徑長度為某結點的路徑長度與其結點的乘積。對於整棵樹來說, 帶權路徑長度為所有結點的帶權路徑之和。Huffman為在所有可能的建樹方案中,帶權路徑長度最小的那棵樹。
Huffman建樹過程,首先是以某種標准為每個數據點分配權值,然后,選出兩個權值最小的數據點, 權值相加,構成一個新的(虛擬的)數據點,放回到數據集合中, 重復此組合過程,直到最終數據集只剩下一個點,樹即建成。
如果每個數據點是一個詞, 並且以每個詞出現的頻率為權值建樹,並且在二叉樹中,在左分支標記為1,右分支標記為0,最終每個詞都可由0,1 二進制數來編碼表示,即為Huffman編碼。
HS cbow
從cbow 的結構可知, cbow 是在已知語境的情況下來預測中心詞, 則上述優化目標可進一步細化:
在cbow中,\(context(w_t)\) 所有詞的詞向量加和:
然后用\(x_t\) 來預測 \(w_t\).
在最后一層,以Huffman編碼的形式組織所有詞。如下圖所示:
如上圖所示, 用\(x_t\) 來預測\(w_t\), 要從根結點經過4個分支到達\(w_t\). 這里因為使用Huffman編碼, 原問題的最大化條件概率,轉化最大化到達\(w_t\) 路徑的概率.
而且可以發現, 在每個結點向下選擇分支時, 無非左右兩種, 也即左分支(1), 右分支(0). 完全類似於0,1 分類. 二分類, 最常見, 最簡單的,可以說是邏輯回歸了.
其中, y表示類別, x是數據, w是權重, b是偏置. 也可知道: \(P(y=0|x) = 1 - \sigma(x,\theta)\).
為將上述兩個公式合在一起,對於某個結點x:
因此, 最大化路徑可考慮成一系列二分類的連續決策過程.如上圖的\(w_t\) 可如下表示:
其中\(l_{w_t}\)表示\(w_t\)的路徑長度, i 表示到達\(w_t\)路徑上面的第 i 個結點(不包括根結點, 但包括\(w_t\)所在結點).
顯然上式是一個典型的最大似然函數. 優化方式就很常規了, 取對數,求偏導(對 \(w_t,\theta_i\)).
HS skip-gram
在最后一層的建樹邏輯與cbow是一樣的, 唯一的不同還是在於 skip-gram應用中心詞來預測周圍詞(語境):
一樣經典的似然函數.
Negative Sampling
另一種更加高效的方式是NCE(Noise Contrastive Estimation). NCE( GUtmann et al.) 被提出,原是為了估計非正則化的概率分布的. Mnih et al 隨后把它應用到神經概率語言模型當中. Mikolov把他引入到word2vec之中. NCE 是以二分類的方式將真實分布與負樣本分布區分開從而達到求解真實分布的目的, 邏輯其實是與Hierarchical softmax類似, 都是以二分類的形式替代預測問題. Mikolov 把其簡化成Negative sampling的方式. Negative sampling即負采樣, 負采樣如何采呢? 我們知道詞的出現頻率一般是不一樣的,有些幾乎總會出現,而且些詞在整個語料庫內都不見得出現幾次.因此,在考查某一個詞(\(w_t\))與其語境之間的關系,其負樣本應該是那種經常出現卻不在\(w_t\)語境出現的詞. 因此從這個邏輯出發, 負采樣應該是一個帶權采樣. 實現方式有多種, Mikolov 選擇的是這樣的, 上面是基於cbow來介紹的,那么這次就是skip-gram來介紹。
假設對某一詞語,負樣本集 NEG(w), 可定義如下的示性函數:
其中 \(\tilde w\in NEG(w)\cup w\) , 可知當 \(\tilde w\)等於 w 時, 為1, 當 \(\tilde w\) 屬於負樣本集時, 為0. 因此,在給定(w, context(w))( context(w)表示w 的語境, 也即其附近詞語的集合.) 優化目標為最大化如下:
其中\(Neg^{\tilde w}(w)\)表示在處理\(\tilde w\)時 生成的負樣本集, \(V(\tilde{w})\) 表示 w的向量表示. 另外:
上式可改寫為:
其中, \(\theta\) 為一在運算過程中的輔助變量, 我們真正想要的是 \(\tilde w\). 對於整個語料庫C:
對上式取對數, 並將\(g(w)\) 代入:
接下來即用其對 \(\tilde w ,\theta\)求偏導了.
化簡, 於是:
也可知:
上面加和符號是因為\(\mu \in Neg^{\tilde w}(w)\cup \{w\}\).
有了上面的鋪墊,cbow也會很容易:
同理:
代入並寫成全語料的形式:
后面的過程如上.