天天看點

(一)了解word2vec:原理篇一、引言二、詞向量基礎三、 基于Hierarchical Softmax的模型四、基于Negative Sampling的模型五、Hierarchical Softmax和Negative Sampling的一些細節參考文獻

為什麼想起來學習word2vec呢?其實之前自己根本沒有接觸過NLP的知識和任務,隻是最近嘗試使用了embedding的方法去處理類别特征和用embedding去做推薦,發現有不錯的效果。同時,自己也感觸到了所掌握知識的匮乏,是以,決定好好學習一下word2vec。

最近幾天自己研讀了網上一些介紹word2vec原理的部落格,寫得非常得清晰和易懂。是以,自己也想做一個總結,關于word2vec的原理和實踐的一個總結。供自己和讀者們随時可以參看。

好了,廢話不多說了。本篇部落客要記錄word2vec的原理。關于實踐word2vec的部落格請參看這篇。

聲明:本篇部落客要借鑒了劉建平老師在部落格園的系列文章和皮國提在CSDN上的系列文章,在他們的基礎上,加入了一些自己的了解和感觸。非常感謝他們的文章帶領我這種小白入門。

文章目錄

  • 一、引言
    • 1.1 什麼是word2vec
    • 1.2 word2vec在工業界有什麼應用
      • 1.2.1 在社交網絡中的推薦
      • 1.2.2 計算商品的相似度
      • 1.2.3 作為另一個模型的輸入
  • 二、詞向量基礎
    • 2.1 CBOW與Skip-Gram用于神經網絡語言模型
    • 2.2 Hierarchical Softmax模型和Negative Sampling模型
    • 2.3 word2vec基礎之霍夫曼樹
  • 三、 基于Hierarchical Softmax的模型
    • 3.1 基于Hierarchical Softmax的模型概述
    • 3.2 基于Hierarchical Softmax的模型梯度計算
    • 3.3 基于Hierarchical Softmax的CBOW模型
    • 3.4 基于Hierarchical Softmax的Skip-Gram模型
  • 四、基于Negative Sampling的模型
    • 4.1 Hierarchical Softmax的缺點與改進
    • 4.2 基于Negative Sampling的模型概述
    • 4.3 基于Negative Sampling的模型梯度計算
    • 4.4 Negative Sampling負采樣方法
    • 4.5 基于Negative Sampling的CBOW模型
    • 4.6 基于Negative Sampling的Skip-Gram模型
  • 五、Hierarchical Softmax和Negative Sampling的一些細節
  • 參考文獻

一、引言

1.1 什麼是word2vec

word2vec是google在2013年推出的一個NLP工具,它的特點是将所有的詞向量化,這樣詞與詞之間就可以定量的去度量他們之間的關系,挖掘詞之間的聯系。原始論文《Exploiting Similarities among Languages for Machine Translation》。根據上面簡單的介紹,我們一句話來說明word2vec是什麼:word2vec就是把單詞轉換成向量。

我們知道one-hot編碼也可以将單詞轉換為向量,one-hot representation用來表示詞向量非常簡單,但是卻有很多問題。最大的問題是我們的詞彙表一般都非常大,比如達到百萬級别,這樣每個詞都用百萬維的向量來表示簡直是記憶體的災難。這樣的向量其實除了一個位置是1,其餘的位置全部都是0,表達的效率不高,能不能把詞向量的次元變小呢?

word2vec轉換的向量相比于one-hot編碼是低維稠密的。我們稱其為Dristributed representation,這可以解決one-hot representation的問題,它的思路是通過訓練,将每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關系。這個較短的詞向量次元是多大呢?這個一般需要我們在訓練時自己來指定。

有了用Dristributed representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關系了,比如我們将詞的次元降維到2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發現:

K i n g ⃗ − M a n ⃗ + W o m a n ⃗ = Q u e e n ⃗ \vec {King} - \vec {Man} + \vec {Woman} = \vec {Queen} King

​−Man

+Woman

=Queen

(一)了解word2vec:原理篇一、引言二、詞向量基礎三、 基于Hierarchical Softmax的模型四、基于Negative Sampling的模型五、Hierarchical Softmax和Negative Sampling的一些細節參考文獻

還比如,在一些介紹手機的語料庫中,我們可以找相關詞,注意是相關詞而不是同義詞。例如你輸入”雷軍”,計算出來的相關詞就會有:手機,小米,喬布斯等等。

那麼,word2vec是怎麼樣學會相關詞了呢?我這裡先給一個小小的例子,具體的細節後面會講。

word2vec的原理就是 一個詞預測 前後詞 或者 前後詞 預測 目前詞,使得機率最大化。

這會導緻2個結果:

  • 相似的句子,相同部位的詞會相關。

    比如 句子1 w1 w2 w3 w4 X w5 w6 w7.

    句子2 w1 w2 w3 w4 Y w5 w6 w7.

    因為 X 的向量 受 w1 w2 w3 w4 w5 w6 w7 向量影響決定, Y也是受這幾個詞影響決定。

    是以 X Y 是相關的。

  • 挨着近的詞,也是相關的。

    比如 句子 w1 w2 w3 w4 X Y w5 w6 w7. 這樣 X Y 都是受到 來自 w1 w2 w3 w4 w5 w6 w7

    向量影響決定。

    是以X Y是相關的。

1.2 word2vec在工業界有什麼應用

那麼,word2vec在工業中有什麼應用呢?我在這裡先介紹一些具體的應用,讓大家感受以下word2vec的強大作用。随後,我再介紹它的原理。

1.2.1 在社交網絡中的推薦

通過類似nearest neighbor原理,找意思相關的詞彙,段落或者文章比對,推薦排序。比如有一個個性化推薦的場景,給目前使用者推薦他可能關注的『大V』。對一個新使用者,此題基本無解。但如果在已知使用者關注了幾個『大V』之後,相當于知道了目前使用者的一些關注偏好,根據此偏好給他推薦和他關注過大V相似的大V,就是一個很不錯的推薦政策。是以,如果可以求出來任何兩個V使用者的相似度,上面問題就可以基本得到解決。

我們知道word2vec中兩個詞的相似度可以直接通過餘弦來衡量,接下來就是如何将每個V使用者變為一個詞向量的問題了。巧妙的地方就是如何定義doc和word,針對上面問題,可以将doc和word定義為:

1.word -> 每一個大V就是一個詞

2.doc -> 根據每一個使用者關注大V的順序,生成一篇文章

由于使用者量很大(大約4億),可以将關注word個數少的doc删掉,因為本身大V的種類是十萬級别(如果我沒記錯的話), 選擇可以覆寫絕大多數大V的文章數量就足夠了。

1.2.2 計算商品的相似度

在商品推薦的場景中,競品推薦和搭配推薦的時候都有可能需要計算任何兩個商品的相似度,根據浏覽/收藏/下單/App下載下傳等行為,可以将商品看做詞,将每一個使用者的一類行為序看做一個文檔,通過word2vec将其訓練為一個向量。

同樣的,在計算廣告中,根據使用者的點選廣告的點選序列,将每一個廣告變為一個向量。變為向量後,用此向量可以生成特征融入到rank模型中。

1.2.3 作為另一個模型的輸入

把word2vec生成的向量直接作為深度神經網絡的輸入。

二、詞向量基礎

那麼我們應該怎麼訓練得到合适的詞向量呢?一個很常見的方法是使用神經網絡語言模型。

2.1 CBOW與Skip-Gram用于神經網絡語言模型

在word2vec出現之前,已經有用神經網絡DNN來用訓練詞向量進而處理詞與詞之間的關系了。采用的方法一般是一個三層的神經網絡結構(當然也可以多層),分為輸入層,隐藏層和輸出層(softmax層)。

這個模型是如何定義資料的輸入和輸出呢?一般分為CBOW(Continuous Bag-of-Words)與Skip-Gram兩種模型。

CBOW模型的訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。比如下面這段話,我們的上下文大小取值為4,特定的這個詞是"Learning",也就是我們需要的輸出詞向量,上下文對應的詞有8個,前後各4個,這8個詞是我們模型的輸入。由于CBOW使用的是詞袋模型,是以這8個詞都是平等的,也就是不考慮他們和我們關注的詞之間的距離大小,隻要在我們上下文之内即可。

(一)了解word2vec:原理篇一、引言二、詞向量基礎三、 基于Hierarchical Softmax的模型四、基于Negative Sampling的模型五、Hierarchical Softmax和Negative Sampling的一些細節參考文獻

在我們這個CBOW的例子裡,我們的輸入是8個詞向量,輸出是所有詞的softmax機率(訓練的目标是期望訓練樣本特定詞對應的softmax機率最大),對應的CBOW神經網絡模型輸入層有8個神經元,輸出層有詞彙表大小個神經元。隐藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某8個詞對應的最可能的輸出中心詞時,我們可以通過一次DNN前向傳播算法并通過softmax激活函數找到機率最大的詞對應的神經元即可。

Skip-Gram模型和CBOW的思路是反着來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。還是上面的例子,我們的上下文大小取值為4, 特定的這個詞"Learning"是我們的輸入,而這8個上下文詞是我們的輸出。

在我們這個Skip-Gram的例子裡,我們的輸入是特定詞, 輸出是softmax機率排前8的8個詞,對應的Skip-Gram神經網絡模型輸入層有1個神經元,輸出層有詞彙表大小個神經元。隐藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某1個詞對應的最可能的8個上下文詞時,我們可以通過一次DNN前向傳播算法得到機率大小排前8的softmax機率對應的神經元所對應的詞即可。

以上就是神經網絡語言模型中如何用CBOW與Skip-Gram來訓練模型與得到詞向量的大概過程。但是這和word2vec中用CBOW與Skip-Gram來訓練模型與得到詞向量的過程有很多的不同。

word2vec為什麼 不用現成的DNN模型,要繼續優化出新方法呢?最主要的問題是DNN模型的這個處理過程非常耗時。我們的詞彙表一般在百萬級别以上,這意味着我們DNN的輸出層需要進行softmax計算各個詞的輸出機率的的計算量很大。有沒有簡化一點點的方法呢?

2.2 Hierarchical Softmax模型和Negative Sampling模型

為了加速訓練過程,Google論文裡真實實作的word2vec對模型提出了兩種改進思路,即Hierarchical Softmax模型和Negative Sampling模型。

Hierarchical Softmax是用輸出值的霍夫曼編碼代替原本的one-hot向量,用霍夫曼樹替代Softmax的計算過程。

Negative Sampling(簡稱NEG)使用随機采用替代Softmax計算機率,它是另一種更嚴謹的抽樣模型NCE的簡化版本。

關于Hierarchical Softmax和Negative Sampling的原理細節我将在第三章和第四章進行詳細地闡述。

将這兩種算法與前面的兩個模型組合,在Google的論文裡一共包含了4種Word2Vec的實作。

  • Hierarchical Softmax CBOW 模型
  • Hierarchical Softmax Skip-Gram 模型
  • Negative Sampling CBOW 模型
  • Negative Sampling Skip-Gram 模型

2.3 word2vec基礎之霍夫曼樹

我們已經知道word2vec也使用了CBOW與Skip-Gram來訓練模型與得到詞向量,但是并沒有使用傳統的DNN模型。在Hierarchical Softmax中,使用的資料結構是用霍夫曼樹來代替隐藏層和輸出層的神經元,霍夫曼樹的葉子節點起到輸出層神經元的作用,葉子節點的個數即為詞彙表的小大。 而内部節點則起到隐藏層神經元的作用。

具體如何用霍夫曼樹來進行CBOW和Skip-Gram的訓練我們在第三章裡講,這裡我們先複習下霍夫曼樹。

    

霍夫曼樹大家都很熟悉,建立其實并不難,過程如下:

  • 輸入:權值為 ( w 1 , w 2 , . . . w n ) (w_1,w_2,...w_n) (w1​,w2​,...wn​)的 n n n個節點
  • 輸出:對應的霍夫曼樹

    1)将 ( w 1 , w 2 , . . . w n ) (w_1,w_2,...w_n) (w1​,w2​,...wn​)看做是有 n n n棵樹的森林,每個樹僅有一個節點。

    2)在森林中選擇根節點權值最小的兩棵樹進行合并,得到一個新的樹,這兩顆樹分布作為新樹的左右子樹。新樹的根節點權重為左右子樹的根節點權重之和。

    3) 将之前的根節點權值最小的兩棵樹從森林删除,并把新樹加入森林。

    4)重複步驟2)和3)直到森林裡隻有一棵樹為止。

下面我們用一個具體的例子來說明霍夫曼樹建立的過程,我們有(a,b,c,d,e,f)共6個節點,節點的權值分布是(16,4,8,6,20,3)。

首先是最小的b和f合并,得到的新樹根節點權重是7.此時森林裡5棵樹,根節點權重分别是16,8,6,20,7。此時根節點權重最小的6,7合并,得到新子樹,依次類推,最終得到下面的霍夫曼樹。

(一)了解word2vec:原理篇一、引言二、詞向量基礎三、 基于Hierarchical Softmax的模型四、基于Negative Sampling的模型五、Hierarchical Softmax和Negative Sampling的一些細節參考文獻

那麼霍夫曼樹有什麼好處呢?一般得到霍夫曼樹後我們會對葉子節點進行霍夫曼編碼,由于權重高的葉子節點越靠近根節點,而權重低的葉子節點會遠離根節點,這樣我們的高權重節點編碼值較短,而低權重值編碼值較長。這保證的樹的帶權路徑最短,也符合我們的資訊論,即我們希望越常用的詞擁有更短的編碼。如何編碼呢?一般對于一個霍夫曼樹的節點(根節點除外),可以約定左子樹編碼為0,右子樹編碼為1.如上圖,則可以得到c的編碼是00。

在word2vec中,約定編碼方式和上面的例子相反,即約定左子樹編碼為1,右子樹編碼為0,同時約定左子樹的權重不小于右子樹的權重。

三、 基于Hierarchical Softmax的模型

3.1 基于Hierarchical Softmax的模型概述

我們先回顧下傳統的神經網絡詞向量語言模型,裡面一般有三層,輸入層(詞向量),隐藏層和輸出層(softmax層)。裡面最大的問題在于從隐藏層到輸出的softmax層的計算量很大,因為要計算所有詞的softmax機率,再去找機率最大的值。這個模型如下圖所示。其中 V V V是詞彙表的大小,

(一)了解word2vec:原理篇一、引言二、詞向量基礎三、 基于Hierarchical Softmax的模型四、基于Negative Sampling的模型五、Hierarchical Softmax和Negative Sampling的一些細節參考文獻

word2vec對這個模型做了改進,首先,對于從輸入層到隐藏層的映射,沒有采取神經網絡的線性變換加激活函數的方法,而是采用簡單的對所有輸入詞向量求和并取平均的方法。比如輸入的是三個4維詞向量:(1,2,3,4),(9,6,11,8),(5,10,7,12),那麼我們word2vec映射後的詞向量就是(5,6,7,8)。由于這裡是從多個詞向量變成了一個詞向量。

第二個改進就是從隐藏層到輸出的softmax層這裡的計算量改進。為了避免要計算所有詞的softmax機率,word2vec采樣了霍夫曼樹來代替從隐藏層到輸出softmax層的映射。我們在上一章已經介紹了霍夫曼樹的原理。如何映射呢?這裡就是了解word2vec的關鍵所在了。

由于我們把之前所有都要計算的從輸出softmax層的機率計算變成了一顆二叉霍夫曼樹,那麼我們的softmax機率計算隻需要沿着樹形結構進行就可以了。如下圖所示,我們可以沿着霍夫曼樹從根節點一直走到我們的葉子節點的詞 w 2 w_2 w2​。

(一)了解word2vec:原理篇一、引言二、詞向量基礎三、 基于Hierarchical Softmax的模型四、基于Negative Sampling的模型五、Hierarchical Softmax和Negative Sampling的一些細節參考文獻

和之前的神經網絡語言模型相比,我們的霍夫曼樹的所有内部節點就類似之前神經網絡隐藏層的神經元,其中,根節點的詞向量對應我們的投影後的詞向量,而所有葉子節點就類似于之前神經網絡softmax輸出層的神經元,葉子節點的個數就是詞彙表的大小。在霍夫曼樹中,隐藏層到輸出層的softmax映射不是一下子完成的,而是沿着霍夫曼樹一步步完成的,是以這種softmax取名為"Hierarchical Softmax"。

如何“沿着霍夫曼樹一步步完成”呢?在word2vec中,我們采用了二進制邏輯回歸的方法,即規定沿着左子樹走,那麼就是負類(霍夫曼樹編碼1),沿着右子樹走,那麼就是正類(霍夫曼樹編碼0)。判别正類和負類的方法是使用sigmoid函數,即:

P ( + ) = σ ( x w T θ ) = 1 1 + e − x w T θ P(+) = \sigma(x_w^T\theta) = \frac{1}{1+e^{-x_w^T\theta}} P(+)=σ(xwT​θ)=1+e−xwT​θ1​

其中 x w x_w xw​是目前内部節點的詞向量,而 θ \theta θ則是我們需要從訓練樣本求出的邏輯回歸的模型參數。

使用霍夫曼樹有什麼好處呢?首先,由于是二叉樹,之前計算量為 V V V現在變成了 l o g 2 V log_2V log2​V。第二,由于使用霍夫曼樹是高頻的詞靠近樹根,這樣高頻詞需要更少的時間會被找到,這符合我們的貪心優化思想。

容易了解,被劃分為左子樹而成為負類的機率為 P ( − ) = 1 − P ( + ) P(−)=1−P(+) P(−)=1−P(+)。在某一個内部節點,要判斷是沿左子樹還是右子樹走的标準就是看 P ( − ) P(−) P(−), P ( + ) P(+) P(+)誰的機率值大。而控制 P ( − ) P(−) P(−), P ( + ) P(+) P(+)誰的機率值大的因素一個是目前節點的詞向量,另一個是目前節點的模型參數 θ \theta θ。

對于上圖中的 w 2 w_2 w2​,如果它是一個訓練樣本的輸出,那麼我們期望對于裡面的隐藏節點 n ( w 2 , 1 ) n(w_2,1) n(w2​,1)的 P ( − ) P(−) P(−)機率大, n ( w 2 , 2 ) n(w_2,2) n(w2​,2)的 P ( − ) P(−) P(−)機率大, n ( w 2 , 3 ) n(w_2,3) n(w2​,3)的 P ( + ) P(+) P(+)機率大。

回到基于Hierarchical Softmax的word2vec本身,我們的目标就是找到合适的所有節點的詞向量和所有内部節點 θ \theta θ, 使訓練樣本達到最大似然。那麼如何達到最大似然呢?

3.2 基于Hierarchical Softmax的模型梯度計算

我們使用最大似然法來尋找所有節點的詞向量和所有内部節點 θ \theta θ。先拿上面的 w 2 w_2 w2​例子來看,我們期望最大化下面的似然函數:

∏ i = 1 3 P ( n ( w i ) , i ) = ( 1 − 1 1 + e − x w T θ 1 ) ( 1 − 1 1 + e − x w T θ 2 ) 1 1 + e − x w T θ 3 \prod_{i=1}^3P(n(w_i),i) = (1- \frac{1}{1+e^{-x_w^T\theta_1}})(1- \frac{1}{1+e^{-x_w^T\theta_2}})\frac{1}{1+e^{-x_w^T\theta_3}} i=1∏3​P(n(wi​),i)=(1−1+e−xwT​θ1​1​)(1−1+e−xwT​θ2​1​)1+e−xwT​θ3​1​

對于所有的訓練樣本,我們期望最大化所有樣本的似然函數乘積。

為了便于我們後面一般化的描述,我們定義輸入的詞為 w w w,其從輸入層詞向量求和平均後的霍夫曼樹根節點詞向量為 x w x_w xw​, 從根節點到 w w w所在的葉子節點,包含的節點總數為 l w l_w lw​, w w w在霍夫曼樹中從根節點開始,經過的第 i i i個節點(不包括根節點)表示為 p i w p_i^w piw​,對應的霍夫曼編碼為 d i w ∈ { 0 , 1 } d_i^w \in \{0,1\} diw​∈{0,1},其中 i = 2 , 3 , . . . l w i =2,3,...l_w i=2,3,...lw​。而該節點對應的模型參數表示為 θ i w \theta_i^w θiw​, 其中 i = 1 , 2 , . . . l w − 1 i =1,2,...l_w-1 i=1,2,...lw​−1,沒有 i = l w i =l_w i=lw​是因為模型參數僅僅針對于霍夫曼樹的内部節點。

定義 w w w經過的霍夫曼樹某一個節點 j j j的邏輯回歸機率為 P ( d j w ∣ x w , θ j − 1 w ) P(d_j^w|x_w, \theta_{j-1}^w) P(djw​∣xw​,θj−1w​),其表達式為:

P ( d j w ∣ x w , θ j − 1 w ) = { σ ( x w T θ j − 1 w ) d j w = 0 1 − σ ( x w T θ j − 1 w ) d j w = 1 P(d_j^w|x_w, \theta_{j-1}^w)= \begin{cases} \sigma(x_w^T\theta_{j-1}^w)& {d_j^w=0}\\ 1- \sigma(x_w^T\theta_{j-1}^w) & {d_j^w = 1} \end{cases} P(djw​∣xw​,θj−1w​)={σ(xwT​θj−1w​)1−σ(xwT​θj−1w​)​djw​=0djw​=1​

那麼對于某一個目标輸出詞 w w w,其最大似然為:

∏ j = 2 l w P ( d j w ∣ x w , θ j − 1 w ) = ∏ j = 2 l w [ σ ( x w T θ j − 1 w ) ] 1 − d j w [ 1 − σ ( x w T θ j − 1 w ) ] d j w \prod_{j=2}^{l_w}P(d_j^w|x_w, \theta_{j-1}^w) = \prod_{j=2}^{l_w} [\sigma(x_w^T\theta_{j-1}^w)] ^{1-d_j^w}[1-\sigma(x_w^T\theta_{j-1}^w)]^{d_j^w} j=2∏lw​​P(djw​∣xw​,θj−1w​)=j=2∏lw​​[σ(xwT​θj−1w​)]1−djw​[1−σ(xwT​θj−1w​)]djw​

注:我們可以看到,每一個詞 w w w都對應着自己的一套邏輯回歸的參數 θ w \theta^w θw。

在word2vec中,由于使用的是随機梯度上升法,是以并沒有把所有樣本的似然乘起來得到真正的訓練集最大似然,僅僅每次隻用一個樣本更新梯度,這樣做的目的是減少梯度計算量。這樣我們可以得到 w w w的對數似然函數 L L L如下:

L = l o g ∏ j = 2 l w P ( d j w ∣ x w , θ j − 1 w ) = ∑ j = 2 l w ( ( 1 − d j w ) l o g [ σ ( x w T θ j − 1 w ) ] + d j w l o g [ 1 − σ ( x w T θ j − 1 w ) ] ) L= log \prod_{j=2}^{l_w}P(d_j^w|x_w, \theta_{j-1}^w) = \sum\limits_{j=2}^{l_w} ((1-d_j^w) log [\sigma(x_w^T\theta_{j-1}^w)] + d_j^w log[1-\sigma(x_w^T\theta_{j-1}^w)]) L=logj=2∏lw​​P(djw​∣xw​,θj−1w​)=j=2∑lw​​((1−djw​)log[σ(xwT​θj−1w​)]+djw​log[1−σ(xwT​θj−1w​)])

要得到模型中 w w w詞向量和内部節點的模型參數 θ \theta θ, 我們使用梯度上升法即可。首先我們求模型參數 θ j − 1 w \theta_{j-1}^w θj−1w​的梯度:

∂ L ∂ θ j − 1 w = ( 1 − d j w ) ( σ ( x w T θ j − 1 w ) ( 1 − σ ( x w T θ j − 1 w ) σ ( x w T θ j − 1 w ) x w − d j w ( σ ( x w T θ j − 1 w ) ( 1 − σ ( x w T θ j − 1 w ) 1 − σ ( x w T θ j − 1 w ) x w = ( 1 − d j w ) ( 1 − σ ( x w T θ j − 1 w ) ) x w − d j w σ ( x w T θ j − 1 w ) x w = ( 1 − d j w − σ ( x w T θ j − 1 w ) ) x w \begin{aligned} \frac{\partial L}{\partial \theta_{j-1}^w} & = (1-d_j^w)\frac{(\sigma(x_w^T\theta_{j-1}^w)(1-\sigma(x_w^T\theta_{j-1}^w)}{\sigma(x_w^T\theta_{j-1}^w)}x_w - d_j^w \frac{(\sigma(x_w^T\theta_{j-1}^w)(1-\sigma(x_w^T\theta_{j-1}^w)}{1- \sigma(x_w^T\theta_{j-1}^w)}x_w \\ & = (1-d_j^w)(1-\sigma(x_w^T\theta_{j-1}^w))x_w - d_j^w\sigma(x_w^T\theta_{j-1}^w)x_w \\& = (1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))x_w \end{aligned} ∂θj−1w​∂L​​=(1−djw​)σ(xwT​θj−1w​)(σ(xwT​θj−1w​)(1−σ(xwT​θj−1w​)​xw​−djw​1−σ(xwT​θj−1w​)(σ(xwT​θj−1w​)(1−σ(xwT​θj−1w​)​xw​=(1−djw​)(1−σ(xwT​θj−1w​))xw​−djw​σ(xwT​θj−1w​)xw​=(1−djw​−σ(xwT​θj−1w​))xw​​

在這裡,用到了邏輯回歸裡一個公式: σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma' (x)=\sigma(x)(1-\sigma (x)) σ′(x)=σ(x)(1−σ(x))。

同樣的方法,可以求出 x w x_w xw​的梯度表達式如下:

∂ L ∂ x w = ( 1 − d j w − σ ( x w T θ j − 1 w ) ) θ j − 1 w \frac{\partial L}{\partial x_w} = (1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))\theta_{j-1}^w ∂xw​∂L​=(1−djw​−σ(xwT​θj−1w​))θj−1w​

注: 到這裡,細心的讀者已經看出問題了:我們的最終目的是求得詞典中每個詞的詞向量,而這裡的 x w x_w xw​表示得是 w w w的上下文 C o n t e x t ( w ) Context(w) Context(w)各個詞詞向量的累加平均,那麼,如何利用 ∂ L ∂ x w \frac{\partial L}{\partial x_w} ∂xw​∂L​來對 w w w的上下文 C o n t e x t ( w ) Context(w) Context(w)中的每個詞向量 w ~ \tilde{w} w~進行更新呢?word2vec的做法很簡單,直接取:

∂ L ∂ x w = ∑ j = 2 l w ( 1 − d j w − σ ( x w T θ j − 1 w ) ) θ j − 1 w \frac{\partial L}{\partial x_w} = \sum\limits_{j=2}^{l_w}(1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))\theta_{j-1}^w ∂xw​∂L​=j=2∑lw​​(1−djw​−σ(xwT​θj−1w​))θj−1w​

即把 ∑ j = 2 l w ∂ L ∂ x w \sum\limits_{j=2}^{l_w}\frac{\partial L}{\partial x_w} j=2∑lw​​∂xw​∂L​貢獻到 C o n t e x t ( w ) Context(w) Context(w)中每一個詞的詞向量中。這個應該很好了解,既然 x w x_w xw​本身就是 C o n t e x t ( w ) Context(w) Context(w)中各個詞向量的累加平均,求完梯度後當然也應該貢獻到每個分量上去。

3.3 基于Hierarchical Softmax的CBOW模型

由于word2vec有兩種模型:CBOW和Skip-Gram,我們先看看基于CBOW模型時, Hierarchical Softmax如何使用。

首先我們要定義詞向量的次元大小 M M M,以及CBOW的上下文大小 2 c 2c 2c,這樣我們對于訓練樣本中的每一個詞,其前面的 c c c個詞和後面的 c c c個詞作為了CBOW模型的輸入,該詞本身作為樣本的輸出,期望softmax機率最大。

在做CBOW模型前,我們需要先将詞彙表建立成一顆霍夫曼樹。

對于從輸入層到隐藏層(投影層),這一步比較簡單,就是對 w w w周圍的 2 c 2c 2c個詞向量求和取平均即可,即:

x w = 1 2 c ∑ i = 1 2 c x i x_w = \frac{1}{2c}\sum\limits_{i=1}^{2c}x_i xw​=2c1​i=1∑2c​xi​

第二步,通過梯度上升法來更新我們的 θ j − 1 w \theta_{j-1}^w θj−1w​和 x w x_w xw​,注意這裡的 x w x_w xw​是由 2 c 2c 2c個詞向量相加而成,我們做梯度更新完畢後會用梯度項直接更新原始的各個 x i ( i = 1 , 2 , , , , 2 c ) x_i(i=1,2,,,,2c) xi​(i=1,2,,,,2c),即:

θ j − 1 w = θ j − 1 w + η ( 1 − d j w − σ ( x w T θ j − 1 w ) ) x w \theta_{j-1}^w = \theta_{j-1}^w + \eta (1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))x_w θj−1w​=θj−1w​+η(1−djw​−σ(xwT​θj−1w​))xw​

x w = x w + η ∑ j = 2 l w ( 1 − d j w − σ ( x w T θ j − 1 w ) ) θ j − 1 w    ( i = 1 , 2.. , 2 c ) x_w= x_w +\eta \sum\limits_{j=2}^{l_w}(1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))\theta_{j-1}^w \;(i =1,2..,2c) xw​=xw​+ηj=2∑lw​​(1−djw​−σ(xwT​θj−1w​))θj−1w​(i=1,2..,2c)

其中 η \eta η為梯度上升法的步長。

這裡總結下基于Hierarchical Softmax的CBOW模型算法流程,梯度疊代使用了随機梯度上升法:

  • 輸入: 基于CBOW的語料訓練樣本,詞向量的次元大小 M M M,CBOW的上下文大小 2 c 2c 2c,步長 η \eta η
  • 輸出:霍夫曼樹的内部節點模型參數 θ \theta θ,所有的詞向量 w w w

    ① 基于語料訓練樣本建立霍夫曼樹。

    ② 随機初始化所有的模型參數 θ \theta θ,所有的詞向量 w w w

    ③進行梯度上升疊代過程,對于訓練集中的每一個樣本 ( c o n t e x t ( w ) , w ) (context(w), w) (context(w),w)做如下處理:

    a) e=0, 計算 x w = 1 2 c ∑ i = 1 2 c x i x_w= \frac{1}{2c}\sum\limits_{i=1}^{2c}x_i xw​=2c1​i=1∑2c​xi​

    b) for j = 2 j = 2 j=2 to l w l_w lw​, 計算:

    f = σ ( x w T θ j − 1 w ) g = ( 1 − d j w − f ) η e = e + g θ j − 1 w θ j − 1 w = θ j − 1 w + g x w f = \sigma(x_w^T\theta_{j-1}^w) \\ g = (1-d_j^w-f)\eta \\ e = e + g\theta_{j-1}^w \\ \theta_{j-1}^w= \theta_{j-1}^w + gx_w f=σ(xwT​θj−1w​)g=(1−djw​−f)ηe=e+gθj−1w​θj−1w​=θj−1w​+gxw​

    c) 對于 c o n t e x t ( w ) context(w) context(w)中的每一個詞向量 x i x_i xi​(共 2 c 2c 2c個)進行更新: x i = x i + e x_i = x_i + e xi​=xi​+e

    d) 如果梯度收斂,則結束梯度疊代,否則回到步驟3繼續疊代。

注:在③.b)中的第3步和第4步不能交換次序,即 θ j − 1 w \theta_{j-1}^w θj−1w​應該等到貢獻到 e e e後再做更新。

3.4 基于Hierarchical Softmax的Skip-Gram模型

現在我們先看看基于Skip-Gram模型時, Hierarchical Softmax如何使用。此時輸入的隻有一個詞 w w w,輸出的為 2 c 2c 2c個詞向量 c o n t e x t ( w ) context(w) context(w)。

我們對于訓練樣本中的每一個詞,該詞本身作為樣本的輸入, 其前面的 c c c個詞和後面的 c c c個詞作為了Skip-Gram模型的輸出,期望這些詞的softmax機率比其他的詞大。

Skip-Gram模型和CBOW模型其實是反過來的,在上一章已經講過。

第一步,在做Skip-Gram模型前,我們需要先将詞彙表建立成一顆霍夫曼樹。

對于從輸入層到隐藏層(投影層),這一步比CBOW簡單,由于隻有一個詞,是以,即 x w x_w xw​就是詞 w w w對應的詞向量。

第二步,通過梯度上升法來更新我們的 θ j − 1 w \theta_{j-1}^w θj−1w​和 x w x_w xw​,注意這裡的 x w x_w xw​周圍有 2 c 2c 2c個詞向量,此時如果我們期望 P ( x i ∣ x w ) , i = 1 , 2...2 c P(x_i|x_w), i=1,2...2c P(xi​∣xw​),i=1,2...2c最大。此時我們注意到由于上下文是互相的,在期望 P ( x i ∣ x w ) , i = 1 , 2...2 c P(x_i|x_w), i=1,2...2c P(xi​∣xw​),i=1,2...2c最大化的同時,反過來我們也期望 P ( x w ∣ x i ) , i = 1 , 2...2 c P(x_w|x_i),i=1,2...2c P(xw​∣xi​),i=1,2...2c最大。那麼是使用 P ( x i ∣ x w ) P(x_i|x_w) P(xi​∣xw​)好還是 P ( x w ∣ x i ) P(x_w|x_i) P(xw​∣xi​)好呢,word2vec使用了後者,這樣做的好處就是在一個疊代視窗内,我們不是隻更新 x w x_w xw​一個詞,而是 x i , i = 1 , 2...2 c x_i,i=1,2...2c xi​,i=1,2...2c共 2 c 2c 2c個詞。這樣整體的疊代會更加的均衡。因為這個原因,Skip-Gram模型并沒有和CBOW模型一樣對輸入進行疊代更新,而是對 2 c 2c 2c個輸出進行疊代更新。

這裡總結下基于Hierarchical Softmax的Skip-Gram模型算法流程,梯度疊代使用了随機梯度上升法:

  • 輸入:基于Skip-Gram的語料訓練樣本,詞向量的次元大小 M M M,Skip-Gram的上下文大小 2 c 2c 2c,步長 η \eta η
  • 輸出:霍夫曼樹的内部節點模型參數 θ \theta θ,所有的詞向量 w w w

    ① 基于語料訓練樣本建立霍夫曼樹。

    ② 随機初始化所有的模型參數 θ \theta θ,所有的詞向量 w w w

    ③ 進行梯度上升疊代過程,對于訓練集中的每一個樣本 ( w , c o n t e x t ( w ) ) (w,context(w)) (w,context(w))做如下處理:

    a) for i = 1 i =1 i=1 to 2 c 2c 2c:

    i) e=0

    ii) for j = 2 j = 2 j=2 to l w l_w lw​, 計算: f = σ ( x i T θ j − 1 w ) g = ( 1 − d j w − f ) η e = e + g θ j − 1 w θ j − 1 w = θ j − 1 w + g x i f = \sigma(x_i^T\theta_{j-1}^w) \\ g = (1-d_j^w-f)\eta \\ e = e + g\theta_{j-1}^w \\ \theta_{j-1}^w= \theta_{j-1}^w+ gx_i f=σ(xiT​θj−1w​)g=(1−djw​−f)ηe=e+gθj−1w​θj−1w​=θj−1w​+gxi​

    iii) x i = x i + e x_i = x_i + e xi​=xi​+e

    b)如果梯度收斂,則結束梯度疊代,算法結束,否則回到步驟a繼續疊代。

注:在③.a).ii)中的第3步和第4步不能交換次序,即 θ j − 1 w \theta_{j-1}^w θj−1w​應該等到貢獻到 e e e後再做更新。

以上就是基于Hierarchical Softmax的word2vec模型,下一章我們讨論基于Negative Sampling的word2vec模型。

四、基于Negative Sampling的模型

4.1 Hierarchical Softmax的缺點與改進

在講基于Negative Sampling的word2vec模型前,我們先看看Hierarchical Softmax的的缺點。的确,使用霍夫曼樹來代替傳統的神經網絡,可以提高模型訓練的效率。但是如果我們的訓練樣本裡的中心詞 w w w是一個很生僻的詞,那麼就得在霍夫曼樹中辛苦的向下走很久了。能不能不用搞這麼複雜的一顆霍夫曼樹,将模型變的更加簡單呢?

Negative Sampling就是這麼一種求解word2vec模型的方法,它摒棄了霍夫曼樹,采用了Negative Sampling(負采樣)的方法來求解,下面我們就來看看Negative Sampling的求解思路。

4.2 基于Negative Sampling的模型概述

既然名字叫Negative Sampling(負采樣),那麼肯定使用了采樣的方法。

比如我們有一個訓練樣本,中心詞是 w w w,它周圍上下文共有 2 c 2c 2c個詞,記為 c o n t e x t ( w ) context(w) context(w)。由于這個中心詞 w w w的确和 c o n t e x t ( w ) context(w) context(w)相關存在,是以它是一個真實的正例。通過Negative Sampling采樣,我們可以得到neg個和 w w w不同的中心詞 w i , i = 1 , 2 , . . n e g w_i,i=1,2,..neg wi​,i=1,2,..neg,這樣 c o n t e x t ( w ) context(w) context(w)和 w i w_i wi​就組成了neg個并不真實存在的負例。利用這一個正例和neg個負例,我們進行二進制邏輯回歸,得到負采樣對應每個詞 w i w_i wi​對應的模型參數 θ i \theta_{i} θi​,和每個詞的詞向量。

從上面的描述可以看出,Negative Sampling由于沒有采用霍夫曼樹,每次隻是通過采樣neg個不同的中心詞做負例,就可以訓練模型,是以整個過程要比Hierarchical Softmax簡單。

不過有兩個問題還需要弄明白:1)如果通過一個正例和neg個負例進行二進制邏輯回歸呢? 2) 如何進行負采樣呢?

我們在4.3讨論問題1,在4.4讨論問題2。

4.3 基于Negative Sampling的模型梯度計算

Negative Sampling也是采用了二進制邏輯回歸來求解模型參數,通過負采樣,我們得到了neg個負例 ( c o n t e x t ( w ) , w i ) , i = 1 , 2 , . . n e g (context(w),w_i),i=1,2,..neg (context(w),wi​),i=1,2,..neg。為了統一描述,我們将正例定義為 w 0 w_0 w0​。

在邏輯回歸中,我們的正例應該期望滿足:

P ( c o n t e x t ( w 0 ) , w i ) = σ ( x w 0 T θ w i ) , y i = 1 , i = 0 P(context(w_0), w_i) = \sigma(x_{w_0}^T\theta^{w_i}) ,y_i=1, i=0 P(context(w0​),wi​)=σ(xw0​T​θwi​),yi​=1,i=0

我們的負例期望滿足:

P ( c o n t e x t ( w 0 ) , w i ) = 1 − σ ( x w 0 T θ w i ) , y i = 0 , i = 1 , 2 , . . n e g P(context(w_0), w_i) =1- \sigma(x_{w_0}^T\theta^{w_i}), y_i = 0, i=1,2,..neg P(context(w0​),wi​)=1−σ(xw0​T​θwi​),yi​=0,i=1,2,..neg

我們期望可以最大化下式:

∏ i = 0 n e g P ( c o n t e x t ( w 0 ) , w i ) = σ ( x w 0 T θ w 0 ) ∏ i = 1 n e g ( 1 − σ ( x w 0 T θ w i ) ) \prod_{i=0}^{neg}P(context(w_0), w_i) = \sigma(x_{w_0}^T\theta^{w_0})\prod_{i=1}^{neg}(1- \sigma(x_{w_0}^T\theta^{w_i})) i=0∏neg​P(context(w0​),wi​)=σ(xw0​T​θw0​)i=1∏neg​(1−σ(xw0​T​θwi​))

利用邏輯回歸和上一章的知識,我們容易寫出此時模型的似然函數為:因為隻有1個正例:

∏ i = 0 n e g σ ( x w 0 T θ w i ) y i ( 1 − σ ( x w 0 T θ w i ) ) 1 − y i \prod_{i=0}^{neg} \sigma(x_{w_0}^T\theta^{w_i})^{y_i}(1- \sigma(x_{w_0}^T\theta^{w_i}))^{1-y_i} i=0∏neg​σ(xw0​T​θwi​)yi​(1−σ(xw0​T​θwi​))1−yi​

此時對應的對數似然函數為:

L = ∑ i = 0 n e g y i l o g ( σ ( x w 0 T θ w i ) ) + ( 1 − y i ) l o g ( 1 − σ ( x w 0 T θ w i ) ) L = \sum\limits_{i=0}^{neg}y_i log(\sigma(x_{w_0}^T\theta^{w_i})) + (1-y_i) log(1- \sigma(x_{w_0}^T\theta^{w_i})) L=i=0∑neg​yi​log(σ(xw0​T​θwi​))+(1−yi​)log(1−σ(xw0​T​θwi​))

和Hierarchical Softmax類似,我們采用随機梯度上升法,僅僅每次隻用一個樣本更新梯度,來進行疊代更新得到我們需要的 x w i , θ w i , i = 0 , 1 , . . n e g x_{w_i}, \theta^{w_i}, i=0,1,..neg xwi​​,θwi​,i=0,1,..neg,這裡我們需要求出 x w 0 , θ w i , i = 0 , 1 , . . n e g x_{w_0}, \theta^{w_i}, i=0,1,..neg xw0​​,θwi​,i=0,1,..neg的梯度:

首先我們計算 θ w i \theta^{w_i} θwi​的梯度:

∂ L ∂ θ w i = y i ( 1 − σ ( x w 0 T θ w i ) ) x w 0 − ( 1 − y i ) σ ( x w 0 T θ w i ) x w 0 = ( y i − σ ( x w 0 T θ w i ) ) x w 0 \begin{aligned} \frac{\partial L}{\partial \theta^{w_i} } &= y_i(1- \sigma(x_{w_0}^T\theta^{w_i}))x_{w_0}-(1-y_i)\sigma(x_{w_0}^T\theta^{w_i})x_{w_0} \\ & = (y_i -\sigma(x_{w_0}^T\theta^{w_i})) x_{w_0} \end{aligned} ∂θwi​∂L​​=yi​(1−σ(xw0​T​θwi​))xw0​​−(1−yi​)σ(xw0​T​θwi​)xw0​​=(yi​−σ(xw0​T​θwi​))xw0​​​

同樣的方法,我們可以求出 x w 0 x_{w_0} xw0​​的梯度如下:

∂ L ∂ x w 0 = ∑ i = 0 n e g ( y i − σ ( x w 0 T θ w i ) ) θ w i \frac{\partial L}{\partial x^{w_0} } = \sum\limits_{i=0}^{neg}(y_i -\sigma(x_{w_0}^T\theta^{w_i}))\theta^{w_i} ∂xw0​∂L​=i=0∑neg​(yi​−σ(xw0​T​θwi​))θwi​

有了梯度表達式,我們就可以用梯度上升法進行疊代來一步步的求解我們需要的 x w 0 , θ w i , i = 0 , 1 , . . n e g x_{w_0}, \theta^{w_i}, i=0,1,..neg xw0​​,θwi​,i=0,1,..neg。

4.4 Negative Sampling負采樣方法

現在我們來看看如何進行負采樣,得到neg個負例。word2vec采樣的方法并不複雜,如果詞彙表的大小為 V V V,那麼我們就将一段長度為1的線段分成 V V V份,每份對應詞彙表中的一個詞。當然每個詞對應的線段長度是不一樣的,高頻詞對應的線段長,低頻詞對應的線段短。每個詞 w w w的線段長度由下式決定:

l e n ( w ) = c o u n t ( w ) ∑ u ∈ v o c a b c o u n t ( u ) len(w) = \frac{count(w)}{\sum\limits_{u \in vocab} count(u)} len(w)=u∈vocab∑​count(u)count(w)​

在word2vec中,分子和分母都取了3/4次幂如下:

l e n ( w ) = c o u n t ( w ) 3 / 4 ∑ u ∈ v o c a b c o u n t ( u ) 3 / 4 len(w) = \frac{count(w)^{3/4}}{\sum\limits_{u \in vocab} count(u)^{3/4}} len(w)=u∈vocab∑​count(u)3/4count(w)3/4​

在采樣前,我們将這段長度為1的線段劃分成 M M M等份,這裡 M > > V M>>V M>>V,這樣可以保證每個詞對應的線段都會劃分成對應的小塊。而 M M M份中的每一份都會落在某一個詞對應的線段上。在采樣的時候,我們隻需要從 M M M個位置中采樣出neg個位置就行,此時采樣到的每一個位置對應到的線段所屬的詞就是我們的負例詞。

(一)了解word2vec:原理篇一、引言二、詞向量基礎三、 基于Hierarchical Softmax的模型四、基于Negative Sampling的模型五、Hierarchical Softmax和Negative Sampling的一些細節參考文獻

在word2vec中, M M M取值預設為 1 0 8 10^8 108。

4.5 基于Negative Sampling的CBOW模型

有了上面Negative Sampling負采樣的方法和邏輯回歸求解模型參數的方法,我們就可以總結出基于Negative Sampling的CBOW模型算法流程了。梯度疊代過程使用了随機梯度上升法:

  • 輸入: 基于CBOW的語料訓練樣本,詞向量的次元大小 M M M,CBOW的上下文大小 2 c 2c 2c,步長 η \eta η,負采樣的個數neg
  • 輸出:詞彙表每個詞對應的模型參數 θ \theta θ,所有的詞向量 x w x_w xw​

① 随機初始化所有的模型參數 θ \theta θ,所有的詞向量 x w x_w xw​

② 對于每個訓練樣本 ( c o n t e x t ( w 0 ) , w 0 ) (context(w_0),w0) (context(w0​),w0),負采樣出neg個負例中心詞 w i , i = 1 , 2 , . . . n e g w_i,i=1,2,...neg wi​,i=1,2,...neg

③ 進行梯度上升疊代過程,對于訓練集中的每一個樣本 ( c o n t e x t ( w 0 ) , w 0 , w 1 , . . . w n e g ) (context(w_0),w_0,w_1,...w_{neg}) (context(w0​),w0​,w1​,...wneg​)做如下處理:

a) e=0, 計算 x w 0 = 1 2 c ∑ i = 1 2 c x i x_{w_0}= \frac{1}{2c}\sum\limits_{i=1}^{2c}x_i xw0​​=2c1​i=1∑2c​xi​  

b) for i= 0 to neg, 計算:

  f = σ ( x w 0 T θ w i )   g = ( y i − f ) η   e = e + g θ w i   θ w i = θ w i + g x w 0    f = \sigma(x_{w_0}^T\theta^{w_i}) \\  g = (y_i-f)\eta \\  e = e + g\theta^{w_i} \\  \theta^{w_i}= \theta^{w_i} + gx_{w_0}    f=σ(xw0​T​θwi​) g=(yi​−f)η e=e+gθwi​ θwi​=θwi​+gxw0​​ 

c) 對于 c o n t e x t ( w ) context(w) context(w)中的每一個詞向量 x k x_k xk​(共 2 c 2c 2c個)進行更新:

x k = x k + e x_k = x_k + e xk​=xk​+e

d) 如果梯度收斂,則結束梯度疊代,否則回到步驟3繼續疊代。

4.6 基于Negative Sampling的Skip-Gram模型

有了上一節CBOW的基礎和上一章基于Hierarchical Softmax的Skip-Gram模型基礎,我們也可以總結出基于Negative Sampling的Skip-Gram模型算法流程了。梯度疊代過程使用了随機梯度上升法:

  • 輸入: 基于Skip-Gram的語料訓練樣本,詞向量的次元大小 M M M,CBOW的上下文大小 2 c 2c 2c,步長 η \eta η,負采樣的個數neg
  • 輸出:詞彙表每個詞對應的模型參數 θ \theta θ,所有的詞向量 x w x_w xw​

① 随機初始化所有的模型參數 θ \theta θ,所有的詞向量 x w x_w xw​

② 對于每個訓練樣本 ( c o n t e x t ( w 0 ) , w 0 ) (context(w_0),w0) (context(w0​),w0),負采樣出neg個負例中心詞 w i , i = 1 , 2 , . . . n e g w_i,i=1,2,...neg wi​,i=1,2,...neg

③ 進行梯度上升疊代過程,對于訓練集中的每一個樣本 ( c o n t e x t ( w 0 ) , w 0 , w 1 , . . . w n e g ) (context(w_0),w_0,w_1,...w_{neg}) (context(w0​),w0​,w1​,...wneg​)做如下處理:

a) for i = 1 i =1 i=1 to 2 c 2c 2c:

  • i) e=0
  • ii) for j = 0 j= 0 j=0 to neg, 計算: f = σ ( x w 0 i T θ w j ) g = ( y j − f ) η e = e + g θ w j θ w j = θ w j + g x w 0 i f = \sigma(x_{w_{0i}}^T\theta^{w_j}) \\ g = (y_j-f)\eta \\ e = e + g\theta^{w_j} \\ \theta^{w_j}= \theta^{w_j} + gx_{w_{0i}} f=σ(xw0i​T​θwj​)g=(yj​−f)ηe=e+gθwj​θwj​=θwj​+gxw0i​​
  • iii) 對于 c o n t e x t ( w ) context(w) context(w)中的每一個詞向量 x k x_k xk​(共 2 c 2c 2c個)進行更新: x k = x k + e x_k = x_k + e xk​=xk​+e

b) 如果梯度收斂,則結束梯度疊代,算法結束,否則回到步驟a繼續疊代。

注:

在CBOW中,直接和 2 c 2c 2c個真實視窗資料平均得到的詞一起,共neg+1個詞,進行拟合優化,這些詞中隻有一個正例,其餘全部都是負例。

在skip-gram裡則稍微複雜一點,由于沒有取平均,是以多了一層循環,也就是每個視窗詞都去和neg個負例一起去拟合優化。

五、Hierarchical Softmax和Negative Sampling的一些細節

① 在這2種模型中,每個詞 w w w的模型參數有什麼差別?

θ w i \theta^{w_i} θwi​是詞 w i w_i wi​對應的模型參數。在negative sampling中每個詞 w i w_i wi​隻有一個模型參數。

而在Hierarchical Softmax中,每個詞 w i w_i wi​有 l w − 1 l_w−1 lw​−1個模型參數。這些參數即在樹結構中的内部節點的參數。

② 為什麼Negative Sampling可以達到和Hierarchical Softmax類似的效果?

可以了解為負采樣是分層softmax的一種近似。正常我們是需要拿中心詞和對應的上下文來一起訓練的,隻是給出的正例,不是采樣得來的。但是為了應付海量資料的訓練,同時可以加快訓練速度,我們需要做一些精度的犧牲。這時我們直接通過少量的負采樣(負采樣更容易找到合适的詞)樣本來訓練,可以加快速度同時減少記憶體負擔。

本質上它們都是在一顆二叉樹上選擇合适的路徑下到葉子節點。隻是分層softmax裡面是正例訓練,而負采樣是負例訓練,同時負詞的個數較分層softmax少,不需要那麼大一顆哈夫曼樹來儲存,友善訓練快速收斂,同時記憶體消耗少。

③ 為什麼Hierarchical Softmax中,二叉樹的使用使得之前計算量為V,現在變成了log2V?

之前每個詞都需要計算 V V V個詞對應的softmax結果,現在每個詞隻需要在霍夫曼樹中從上到下走一遍到葉子,不用走所有的樹節點。是以就成了log2V。

④ 在Hierarchical Softmax中,如果每次都是更新上下文的詞向量的話,那skip-gram模也是把上下文作為輸入進行更新,而中心詞作為輸出去訓練上下文,那結構不就和CBOW差不多了嗎?

疊代更新的過程的确是類似的,隻有一些細節上的不同。

在CBOW中,在霍夫曼樹從上而下使用的輸入是 2 c 2c 2c個視窗詞詞向量的均值,隻有一個。

而在skip-gram裡面,在霍夫曼樹從上而下使用的輸入分别是各個詞向量,一共 2 c 2c 2c個。

是以可以看到在skip-gram算法裡面會多一層循環。

其實在Negative Sampling中也是一樣的。

⑤ word2vec就是求解每一個的單詞的embedding?那知道一個中心詞 w w w求上下文(CBOW)和已知上下文求中心詞 w w w(Skip-Gram)在其中起到了什麼作用呢?

word2vec就是求解每一個的單詞的embedding的詞向量。CBOW和Skip-Gram隻是2個求出似然函數的途徑,我們根據這2個思路得到似然函數進行梯度下降的求解。且這2個思路沒有本質差別(在梯度更新的公式上),都是更新 2 c 2c 2c個詞向量。

參考文獻

【1】word2vec原理(一) CBOW與Skip-Gram模型基礎

【2】word2vec在工業界的應用場景

【3】關于word2vec,我有話要說

繼續閱讀