word2vec技術細節

embedding的中文爲詞嵌入,它可以將一些類別特徵、單詞、商品等用稠密的低維向量表示。embedding是基於分佈式假說:上下文相同的詞,也具有相同的語義。因此,embedding可使得單詞、或者具有相同屬性的商品在向量空間上有更近的距離(餘弦距離)。2013年的Tomas Mikolov推出了word2vec,使得embedding被廣泛的應用於各個領域,它始於NLP領域,但在推薦、搜索、廣告領域也應用廣泛。於是有了那句“萬物皆可embedding”。用一個含有大料單詞語料庫訓練word2vec,將語料庫中的單詞映射到低維空間,我們會發現Kobe詞向量的位置離basketball詞向量、Lakers詞向量比較近,而離baseball距離較遠。甚至經過embedding後的詞向量可以做運算:Vec(Russia) + Vec(river) \approx Vec(Volga River)Vec(China) + Vec(capital) \approx Vec(Beijing).這看起來挺不可思議,embedding是怎麼建立詞之間的語義聯繫的?詞的向量是怎麼表示的?詞向量之間的距離是如何度量的是用歐式距離、餘弦距離還是馬氏距離?這篇文章,將對這些技術細節一一進行解答。

word2vec有兩個模型:CBOW模型和Skip-gram模型。前者是由上下文預測當前詞,後者是由當前次預測上下文。本文將按照CBOW模型、Skip-gram模型、算法優化三個方面展開。

1. CBOW模型

1.1  one-word context

什麼是上下文,打個比方,“我要去___吃火鍋”,這裏的“我要去”和“吃火鍋”就是上下文,根據我要去,可以預測後邊應該是個地點,而吃火鍋前面應該是個有火鍋的餐館,比如海底撈。one-word context就是上下爲只有一個詞,此處“去”或吃”就是上下文。

CBOW是基於神經網絡的模型,其簡易模型圖如下:

                                          

可以看到,其是3層神經網絡,輸入層爲經過one-hot編碼的詞向量。詞典的大小爲V,隱藏層的大小爲N。輸入層和隱藏層之間是全連接的。輸入層和隱藏層之間的權重矩陣的維度爲V*N。

接下來關鍵點來了,如何去將一個詞用向量表示。我們假設輸入層爲第k個單詞,那麼該單詞的向量表示爲:,即除第k個位置處的元素爲1之外其它位置處的元素皆爲0.那麼第一層的輸出爲:

                                                                                                         (1)

首先看輸出h的維度,由於W的維度是V*N,那麼的維度爲N*V,而x的維度爲V*1,所以h的維度是N*1;然後看h代表的意義,由於列向量x中只有第k行元素爲1,所以h的其實就是權重矩陣W的第k行的元素。將其表示爲輸入詞向量。

也就是說k個輸入詞的向量表示就是權重矩陣的第k行,詞向量的維度爲N*1.一般情況下N的值遠小於詞典大小V的值。

式(1)可以說明隱藏層的激活函數是線性的,因爲它直接將輸入的加權和傳給了下一層。

接下來是隱藏層到輸出層,權重矩陣的維度爲N*V,用它我們能計算詞典中每個單詞的得分

                                                                                                                                (2)

其中'爲權重矩陣的第j列,它可以看做輸出詞的向量表示,其維度爲N*1那麼其轉置的維度爲1*Nh的維度爲N*1,所以得分爲一個數。“我要去____吃火鍋”,我們需要根據上下文預測當前詞,顯然這是一個多分類任務,___中可以是“海底撈”,也可以是“東來順”,也可以是“天台”、“操場”等,只是是沒個詞的概率不同而已,由於這是多分類任務,所以用softmax函數,如下:

                                                                                              (3)

得分實際上就是輸入詞和輸出詞的內積,可以表示兩個詞的語義的接近程度。條件概率就是輸出層的輸出,將(1)(2)式帶入(3)式,上面的條件概率可以寫爲:

                                                                                            (4)

 

更新隱藏層-->輸出層的權重:

接下來推導模型的權重更新,訓練目標是最大化條件概率,即

                                                                                    (5)

其中,其爲損失函數,最大化條件概率等價於最小化E。這可看做交叉熵的特殊情況。

損失函數E求導得:

                                                                                                                                   (6)

只有當第j個單元是實際的輸出單詞時,取值爲1。這個求導只是輸出層的預測誤差。通過對求導,得到隱藏層--->輸出層的權重梯度。

                                                                                                                          (7)

因此,使用SGD我們得到權重更新式:

                                                                                                          (8)

或者

                                                                   (9)

其中爲學習率,是隱藏層的第i個單元,'的輸出向量。上式意味着需要遍歷詞典中每個可能的單詞,檢驗輸出概率,然後比較和它的期望輸出

接下來,就要說到爲什麼embedding可以讓上下文相似的詞,在embedding空間離的更近了(這裏的距離是餘弦距離,離得近表示兩個詞向量之間的夾角小)

假設有兩個向量uv以及標量k>0,如下圖:

                                                                           

從上圖中可以看到,兩個向量相加得到的新向量與原來兩個向量的夾角更小了,也就是餘弦距離更近了;而兩個向量相減得到的新向量與原來兩個向量的夾角更大了,餘弦距離更遠了。

在式(9)中,當時(實際上大多數情況下不等式是成立的,因爲爲概率,其取值範圍爲 ,而只有當第j個單元是實際的輸出單詞時,取值爲1,其他時候爲0),預測誤差,又因爲學習速率,所以(')爲向量和向量h()的差,輸入向量和更新後的輸出向量距離更遠了;反之,當時,預測誤差,所以爲向量和向量h的和,輸入向量和更新後的輸出向量距離更近了。

更新輸入層--->隱藏層的權重:

損失函數E求導得:

                                                                                  (10)

EHN維向量,它是字典中所有單詞輸出向量的和,其權重爲預測誤差。接下來對W求導,由式(1)可以得到:

                                                                                                                               (11)

故,EW的導數爲:

                                                                                                        (12)

EW的導數可以看做是xEH的張量積,即:

                                                                                                                       (13)

因爲向量x中只有一個元素非0,所以的維度爲N*1,且其值爲。所以有:

                                                                                                                   (14)

在迭代之後,W的其它行不會發生改變,因爲其它行的導數爲0由於EH是詞典中所有單詞輸出向量的加權和,權重爲預測誤差。所以式(14)可以理解爲將詞典中每個輸出向量的一部分添加到上下文單詞的輸入向量中。我們通過迭代的更新context-target對,對向量的影響會累積。

1.2 Multi-word context

給出多個context去預測一個target word

隱藏層的輸出爲上下文單詞的輸入向量的均值與輸入層--->隱藏層權重矩陣的乘積。即:

                                                                                  (15)

其中C是上下文的單詞數,爲上下文單詞。是單詞的輸入向量。損失函數爲:

                                                                                    (16)

contextCBOW模型如下:

                                                                  

隱藏層--->輸出層權重迭代更新公式和one-word context是相同的,即:

                                                                                  (17)

輸入層--->隱藏層權重迭代更新公式如下:

                                                                           (18)

其中,是上下文中的第c個單詞的向量表示。

2. Skip-gram模型

與CBOW模型相反,Skip-gram模型是給出當前詞,預測上下文。“我要去海底撈____”,“吃火鍋”可以視爲上下文,顯然“吃火鍋”要比“打籃球”更合適。

Skip-gram的模型如下:

                                                               

同樣以表示輸入向量,因爲輸入層只有一個詞,那麼h的定義和式(1)是相同的,那麼詞向量爲輸入層à隱藏層權重矩陣W的某一行。

                                                                                                                                   (19)

輸出層不是輸出一個多項分佈,而是輸出C個多項分佈,每個輸出用相同的隱藏層-->輸出層的權重矩陣計算,即:

                                                                                                     (20)

其中是輸出層第c個塊的第j個詞。w_{O,c}是輸出上下文單詞中第c個詞。爲輸入詞。y_{c,j}是輸出層中第c塊的第j個單元。因爲輸出層的C個塊有相同的權重,所以:

                                                                                                     (21)

是詞典中的詞的輸出向量,它是隱藏-->輸出層權重矩陣的第j.

損失函數如下

                                                                                                          (22)

損失函數還是條件概率的log對數,只不過概率變成了聯合條件概率。因爲上下文中的C個詞之間是獨立的,所以,每一個乘子都是和one-word context中的條件概率是一樣的。所以,損失函數可以整理成式(22)。權重更新過程和上面兩個模型類似。不再贅述。

3. 算法優化

(17)可以看到,當更新輸出向量時,需要迭代詞典中的每一個單詞,然後計算每一個單詞的輸出概率,計算預測誤差,然後更新詞向量'.如果訓練集很大時,遍歷訓練集中的所有單詞,這無疑是計算效率非常低的。

word2vec的作者提出了兩種優化方法:分層softmax和負樣本採樣。

3.1 分層softmax

分層softmax是計算softmax的有效方式,它使用二叉樹(word2vec中使用的是哈夫曼樹)表示詞典中的所有詞。V個詞必須爲二叉樹的葉子節點,那麼有V-1個內部節點。對每個葉子節點(詞)存在唯一的從根節點到葉子節點的路徑,這條路徑可以估算詞表示的概率。二叉樹如下:

                                                                

分層softmax模型的二叉樹例子。白色節點表示詞典中的詞,黑色節點表示內部節點。黑色加粗的線表示從根節點到w2的路徑,n(w,j)表示從根節點到詞w的路徑中的第j個節點。

在每一個內部節點有一個輸出向量',詞被定義爲輸出詞的概率如下:

                                                                            (23)

其中ch(n),表示節點n的左孩子節點;L(w)表示路徑長度;h爲隱藏層的輸出(在skip-gram模型中,,在CBOW模型中,);'表示內部節點n(w,j)的向量表示。定義如下:

                                                                                                                            (24)

爲了更直觀的理解式(23),以上圖二叉樹爲例,計算輸出詞爲的概率。

假設內部節點n的子節點爲左孩子的概率爲:

                                                                                                                                       (25)

那麼,爲輸出詞的概率爲: 

                                                                      (27)

式(27)是式(23)的展開形式。

現在推導內部節點向量參數更新方程式,爲了簡化表示,令:

                                                                                                                 (28)

                                                                                                                                                          (29)

所以,損失函數爲:

                                                                                                        (30)

那麼損失函數E對求偏導爲:

                                                                                                                     (31)

推導過程省略。若爲1,爲1,否則爲0.

進一步,求E對輸出詞向量的 的偏導:

                                                                                                              (32)

所以更新公式爲:

                                                                                                           (33)

可看做預測誤差,而爲預測結果,在訓練過程中,如果內部節點的預測非常接近實際情況,那麼向量表示'將會有非常小的移動;否則,'將移動到一個合適的方向(離h或近或遠)以減少預測誤差。

接着對隱藏層的輸出求偏導:

                                                                                                                                (34)

通過使用分層softmax,算法複雜度由O(V)降爲O(log(V)).

3.2 負採樣

未經優化的模型迭代更新系數的時候,需要遍歷計算詞典中每一個輸出向量,而負採樣的思想就是:迭代更新時,減小遍歷詞的數量,只更新少數樣本。簡單說,負採樣就是把softmax多分類轉換爲二分類。

這個新的詞典如何創建?需要一些詞作爲負樣本(‘負採樣’)。採樣過程需要一個概率分佈,它可以隨機選擇,我們成這種分佈爲噪聲分佈,用表示。

採用負採樣技術的word2vec模型的損失函數爲

                                                                                                             (35)

其中是輸出詞(即正樣本),'是輸出詞對應的輸出向量;h是隱藏層的輸出值;在CBOW模型中,在skip-gram模型中是基於分佈採樣的詞集,即負樣本。 

通常,一個正樣本(target)和k個負樣本組成一個小的詞集 。那麼負採樣中的噪聲分佈該選取什麼分佈呢?是均勻分佈採樣還是高斯分佈採樣。word2vec的作者建議,將unigram分佈U(w)的四分之三次方,即\frac{U(w)^{\frac{3}{4}}}{Z}作爲噪聲分佈的效果會更好。

有關負採樣損失函數的詳細推導分析,請查看參考文獻中的第4篇論文。                                                                                          首先損失函數E對神經網絡輸出向量與輸入詞向量距離求導:

                                                                                                                   (36)

其中可看做是詞的標籤,當爲正樣本時,;否則

接下來對詞的輸出向量求導:

                                                                                                             (37)

進而得到詞的迭代更新公式:

                                                                                                                        (38)

如此一來,每次迭代只需要計算相關的參數,而不是整個詞典中的每個詞。

爲了進行BP,我們需要對隱藏層的輸出求導,即:

                                                                                                           (39)

3.3 對高頻詞進行下采樣

在語料庫中,難免會有一些出現頻率較高的詞語如:“the”、“and”、“a”等。從熵的角度看,這類高頻詞攜帶的信息比較少。舉個簡單的例子,當“China”和“Beijing”同時出現時,我們可以對這二者建立關係,Beijing是China的首都;但是當“China”和“the”同時出現時,我們獲得的信息很有限,只是知道你在說China。同時,語料庫中也會有很多低頻詞,爲了平衡低頻詞和高頻詞,word2vec的作者提出了一種下采樣方法:

                                                                                                                                                           (40)

P(w_{i})爲語料庫中詞w_{i}被捨棄的概率,f(w_{i})爲詞w_{i}出現的頻率;t爲一個閾值,通常取值爲10^{-5}。當某個詞出現的頻率大於t時,概率P(w_{i})就會大於0,詞頻越高,詞被丟棄的概率越高,從而有效的對高頻詞進行了採樣。

參考文獻:

1. Efficient Estimation of Word Representations in Vector Space

2. Distributed Representations of Words and Phrases and their Compositionality

3. word2vec Parameter Learning Explained

4. word2vec Explained: Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method

發佈了44 篇原創文章 · 獲贊 26 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章