【word2vec】算法原理 公式推導

前言

    近兩年來由Mikolov等人提出的word2vec模型和應用引起了社會的極大的關注。使用word2vec模型學習的單詞的向量表示已經被證明能夠攜帶語義信息,且在各種NLP任務中都是有用的。越來越多的研究人員希望嘗試使用word2vec,但我注意到對於word2vec參數學習過程目前還缺乏一個全面解釋的資料,因此限制了許多神經網絡方面瞭解不深的人去理解word2vec的工作原理。

    本文提供了word2vec模型的參數更新方程的詳細推導和解釋,包括原始的連續詞袋(CBOW)模型和skip-gram模型,以及一些高級技巧--分層的soft-max和負抽樣。

在閱讀前你需要一些基礎知識:

神經元網絡模型和反向傳播的基礎知識

1 Continuous Bag-of-Word Model(CBOW)

1.1 One-word context  (只考慮目標單詞前面一個單詞的情況

   在我的下篇博客中有對此原理做一定數學舉例:以解數學題的方式來理解word2vec

     我們從Mikolov等人最簡單版本的連續詞袋模型(CBOW)開始介紹。連續詞袋模型做出這樣的假設一個單詞出現的可能性與其上下文的單詞組成有關,這意味着對於CBOW模型我們可以通過給定的上下文單詞環境來預測一個目標單詞,就像一個二元模型。

    圖一爲簡化的通過上下文來定義詞向量的網絡模型,我們設置詞彙量的大小爲V,隱藏層的大小爲N,相鄰層上的節點完全連接。輸入向量是一個one-hot編碼的向量,對於給定的輸入上下文單詞,one-hot編碼中每個單詞的向量表示爲\begin{Bmatrix} x_{1},x_{1},...x_{v} \end{Bmatrix},其中只有一個節點x_{k}爲1,而所有其他節點爲0。

    輸入層和輸出層之間的權重可以由V\cdot N的矩陣W表示。

                                                                     \large W=\bigl(\begin{smallmatrix} w_{11} &w_{12} &... &w_{1n} \\ w_{21} &w_{22} &... &w_{2n} \\ .... & ...& ... & ...\\ w_{v1}& w_{v2} &... &w_{vn} \end{smallmatrix}\bigr)

其中W矩陣的每一行代表的是一個與輸入層相關的單詞的N維向量表示形式 V_{w}。那麼假設我們給定了一個輸入單詞,其單詞向量的第k個元素X_{k}=1,其餘X_{k'}=0(k'\not\equiv k),則有:

                                                                    \large \large h=x^{T}W=W_{(k,\cdot )}x_{k}=V_{w_{I}}^{T}                                                          (1)

     h向量完全是由W矩陣第k行計算出來的 (因爲除X_{k}=1外,其餘X_{k'}都爲0),V_{w_{I}}是輸入字w_{I}的向量表示。

     分析完輸入層到隱藏層之後,我們再看隱藏層到輸出層,有一個新的的權重矩陣W^{'}=w_{ij}^{'},它也是一個V\cdot N矩陣。使用這些權重w_{ij}^{'},我們可以計算詞彙表中每個單詞的分數u_{j}

                                                                       \large u_{j}=v_{wj}^{'}^{T}\cdot h                                                                               (2)

其中v_{wj}^{'}是矩陣W^{'}的第j列,然後我們使用一個滿足多項式分佈的對數線性分類模型soft-max來獲取單詞的後驗概率。

                                                               \large p(w_{j} |w_{I} ) = y_{j}=\frac{e^{u_{j}}}{\sum_{j^{'}=1}^{V} e^{u_{j^{'}}}}                                                         (3)

其中\large y_{j}是輸出層中\large j節點的輸出,我們將式子(1)和(2)代入式子(3),得到:

                                                              \large p(w_{j} |w_{I} ) = y_{j}=\frac{e^{{V_{w_{O}}^{'}}^{T}V_{w_{I}}}}{\sum_{j^{'}=1}^{V} e^{{V_{w_{j}^{'}}^{'}}^{T}V_{w_{I}}}}                                                  (4)

    注意\large v_{w}\large v_{w}^{'}是單詞\large w的兩種表示方式,\large v_{w}是矩陣W的一行,是由輸入層→隱藏層的權值矩陣。\large v_{w}^{'}是矩陣W^{'}的一列,是由隱藏層→輸出層的權值矩陣。在之後的分析中,我們默認將\large v_{w}稱爲單詞w的“input vector”,將\large v_{w}^{'}稱爲單詞w的“output vector”。

更新隱藏層→輸出層權重的等式

       現在我們開始推到CBOW模型的權值更新方程。雖然實際的計算方式有點不切實際(之後解釋),但是這不妨礙我們推到這個方程來增加我們對這個原始模型的理解。推到過程需要一些神經網絡的知識基礎:有關反向傳播基礎知識的綜述,請參閱神經元網絡模型和反向傳播的基礎知識

     由上一階段的描述可知,現在訓練的目標(這節只針對一個單詞)就是求公式(4)的最大值。其意在當我們給定了上下文信息以及其權值矩陣的情況下,在詞彙表中計算每個詞成爲中心單詞的概率,從而預測目標單詞。

                                                                    \large \\max(P(w_{0}|w_{I}))\\=max(y_{j*})\\=log(max(y_{j*}))\\=u_{j*}-log(\sum_{j^{'}=1}^{V}e^{u_{j^{'}}} ):=-E                                     (7)

     這裏我們設置一個\large E=-P(w_{0}|w_{I})爲我們的損失函數(一個最小化的目標),\large j*是目標單詞在輸出層的索引。可以發現,對於這個損失函數的計算,我們可以將其理解爲一種特殊情況下對2個概率分佈的交叉熵測量。

    現在我們來推到一下隱藏層到輸出層之前的權重更新方程,首選我們對損失函數\large E=-P(w_{0}|w_{I})求關於\large u_{j}的偏導,這樣得:

                                                                       \large \frac{\partial E}{\partial u_{j}}=y_{j}-t_{j}:=e_{j}                                                                                (8)

    其中\large t_{j}=1(j=j*)|0(j\neq j*),即當且僅當輸出層的第\large j個單詞爲目標單詞時,\large t_{j}的值爲1,其餘情況都爲0。可以看出這個導數實質上是輸出層的預測誤差\large e_{j}

接下來我們通過鏈式法則來求出損失函數在\large w_{ij}^{'}上的偏導, 並通過此來計算隱藏層到輸出層的梯度。 

                                                                     \large \frac{\partial E}{\partial w_{ij}^{'}}=\frac{\partial E}{\partial u_{j}}\cdot \frac{\partial u_{j}}{\partial w_{ij}^{'}}=e_{j}\cdot h_{i}

之後我們使用隨機梯度下降方法,得到最終的隱藏層→輸出層的權重更新方程

                                                                   \large w_{ij}^{'}:= w_{ij}^{'}-\eta \cdot e_{j}\cdot h_{i}

或者說:

                                                                    \large \\V_{w_{j}}^{'}:= V_{w_{j}}^{'}-\eta \cdot e_{j}\cdot h       \large j=1,2...V                                                  (11)

其中\large \eta爲梯度下降算法的學習率(\large \eta > 0) ,\large e_{j}=y_{j}-t_{j},其中\large h_{i}是隱藏層的第\large i個神經元,\large V_{w_{j}}^{'}是輸出單詞\large w_{j}的向量表示。可以看出,通過對比輸出的可能性\large y_{j}和期望的輸出\large t_{j}(取值只能爲0或者1)來更新權重意味着我們需要遍歷詞彙表中所有單詞。

這個過程中:

  1.     當 \large y_{i}>t_{j}('高估')的時候,\large e_{j}>0,那麼會從\large V_{w_{0}}^{'}上減去隱藏向量\large h的一部分,這樣向量\large V_{w_{0}}^{'}就與向量\large V_{w_{I}}相差更遠;
  2.     當 \large y_{i}<t_{j}('低估')的時候,\large e_{j}<0,那麼會從\large V_{w_{0}}^{'}上加上隱藏向量\large h的一部分,這樣向量\large V_{w_{0}}^{'}就與向量\large V_{w_{I}}相差更近;
  3.     當 \large y_{i}\cong t_{j}('相近')的時候,\large e_{j}\cong 0,那麼會從\large V_{w_{0}}^{'}的值在更新過程基本不會發生變化;

更新隱藏層→輸出層權重的等式

     在介紹完hidden→output的權重矩陣\large W^{'}更新公式之後,我們接着介紹input→hidden的權重矩陣\large W的更新過程。在上面小節中我們解釋了損失函數\large E,現在我們對\large E\large h_{i}上求偏導:

                                                    \large \dpi{100} \large \frac{\partial E}{\partial h_{i}}=\sum_{j=1}^{v}\frac{\partial E}{\partial u_{j}}\cdot \frac{\partial u_{j}}{\partial h_{i}}=\sum_{j=1}^{v}e_{j}\cdot w_{ij}^{'}:=EH_{i}                                                            (12)

其中\large h_{i}爲隱藏層上第\large i個神經元的輸出;\large u_{j}=v_{wj}^{'}^{T}\cdot h,表示輸出層第j個神經單元的輸入;\large e_{j}=y_{j}-t_{j}爲輸出層第j個單詞的預測誤差。所以我們設定一個\large N維的向量\large EH,它的每一個元素代表的是詞彙表中的每個單詞的預測誤差\large e_{j}與詞彙表中每個輸出單詞的向量的乘積之和。

    接下來,我們需要求出損失函數\large E關於權重矩陣\large W的偏導數。首先,我們知道隱藏層激活單元的輸出\large h_{i}是輸入層的值\large x_{k}與其權重\large w_{kI}的線性組合,由此分解式子(1)我們可以得到:

                                                       \large h=x^{T}W=W_{(k,\cdot )}x_{k}=V_{w_{I}}^{T}

                                                      \large h_{i}=\sum _{k=1}^{V}x_{k}\cdot w_{kI}                                                                                                       (13)

    對於權重矩陣\large W的每一個元素\large w_{kI},通過式(12)和式(13),我們可以求得其在損失函數\large E上的偏導:

                                                       \large \frac{\partial E}{\partial w_{ki}}=\frac{\partial E}{\partial h_{i}}\cdot \frac{\partial h_{i}}{\partial w_{ki}}=EH_{i}\cdot x_{k}                                                                          (14)

     以線性代數的角度來說:

                                                            \large \frac{\partial E}{\partial W}=x \cdot EH=x*EH^{T}                                                                             (15)

    通過式(15)我們得到一個\large V\times N的矩陣,由於\large x只有一個非零值(one-hot),所以\large \frac{\partial E}{\partial W}的結果也只有一行是非零的,非零N維向量就是那一行\large EH的值,由此我們得到權重矩陣\large W的更新方程:

                                                                \large v_{w_{I}}:=v_{w_{I}}-\eta \cdot EH                                                                                      (16)

     其中\large v_{w_{I}}是矩陣\large W中輸入單詞\large w_{I}(即one-hot編碼中非零的哪行對應的單詞)的輸入向量。我們不用去關心除\large v_{wI}外的其他行向量,因爲其\large x_{k}的值爲0,由式(14)可以看出其偏導\large \frac{\partial E}{\partial w_{kI}}也爲0。

       經過多次迭代反向傳播後,誤差\large e_{j}等於\large y_{j}等於\large t_{j},通過式子(12)中我們知道:

                                                                     \large EH_{i}=\sum_{j=1}^{v}e_{j}\cdot w_{ij}^{'}

     由此式子(16)我們可以這樣理解我們將詞彙表中的每個輸出向量的一部分添加到輸入單詞的詞向量上。這樣就和權值矩陣\large W^{'}的更新類似了:

  1. 如果過高地估計了某個單詞\large w_{j}作爲最終輸出單詞的概率(即:\large y_{j}>t_{j}),則上下文單詞\large w_{I}(context word )的輸入向量與單詞\large w_{j}的輸出向量在更新的過程中距離就會越來越遠。
  2. 與之相反,如果某個單詞\large w_{j}作爲最終輸出單詞的概率被低估(即:\large y_{j}<t_{j}),則單詞\large w_{I}的輸入向量與單詞\large w_{j}的輸出向量在更新過程中距離就會越來越接近。
  3. 如果對於單詞\large w_{I}的概率預測是準確的,則對於單詞的輸入向量在更新過程中幾乎保持不變。

由此可以發現輸入單詞\large w_{I}詞向量的更新取決與其與詞彙表中所有單詞的預測誤差。預測誤差越大,則目標單詞(預測的單詞)對於輸入單詞詞向量的更新過程影響越大。這就是爲什麼word2vec可以得出‘國王’-'皇后'='男人'-'女人'的結論的原因。國王和皇后是經常一起組合出現的,男人和女人也是組合出現的,屬於聯想詞,所以說,一個詞的常規穩定的位置通常會由他的組合詞,也就是經常一起出現的詞決定的。所以這些最常出現的組合詞就決定了目標詞的更新規律

1.2 Multi-word context  (考慮上下文多個單詞的情況)

        考慮上下文多個單詞的CBOW模型如圖2所示,可以發現與上一節(one-word context)不同的是, Multi-word context 會去考慮目標單詞上下文的多個單詞,通過這些個單詞來確定目標單詞出現的可能性。

     不同與之前方式,在計算Multi-word context 隱藏層的輸出值的過程中,會將輸入的上下文單詞的向量累加起來求均值,接着使用這個均值與input→hidden的權值矩陣\large W相乘,作爲最終的結果。公式如下:

                                                               \large h=\frac{1}{C}W\cdot (x_{1}+x_{2}....+x_{C}) 

                                                                   \large =\frac{1}{C}\cdot (V_{w_{1}}+V_{w_{2}}...+V_{w_{C}})                                                               (18)

   其中\large C是上下文的單詞個數,\large w_{1},w_{2}...w_{C}指的是上下文的具體的單詞,\large V_{w}是單詞\large w的輸入向量。而損失函數就轉化爲:

                                                              \large E=-log(p(w_{0}|w_{I,1}...w_{I,C}))

                                                                   \large =-u_{j*}+log(\sum_{j^{'}=1}^{V}e^{u_{j^{'}}})

                                                                   \large =-v_{w_{o}}^{'}^{T} \cdot h+log(\sum_{j^{'}=1}^{V}e^{h\cdot v_{w_{j}}^{'}^{T}} )

       Multi-word context 的損失函數與one-word context的目的一樣,公式也與(7)相同,除了用公式(18)的方式來替代了one-word context公式(1)的\large h

        同時,Multi-word context 由隱藏層→輸出層的權值矩陣\large W^{'}的更新的過程與one-word context也是一樣的。我們直接把之前的公式(11)寫在下面:

                                                            \large \\V_{w_{j}}^{'}:= V_{w_{j}}^{'}-\eta \cdot e_{j}\cdot h        \large j=1,2...V                                                              (22)

     通過迭代\large j我們將遍歷整個語料庫,以此來更新\large W^{'}(隱藏層→輸出層的矩陣)。

     更新輸入層→隱藏層權值矩陣\large W的方程也與之前的公式(16)類似,只不過現在我們需要對上下文的每一個單詞\large w_{I,C}都執行如下更新公式: 

                                                               \large \\V_{w_{I,c}}:= V_{w_{I,c}}-\frac{1}{C}\cdot\eta \cdot E H        \large c=1,2...C                                                       (23)

    其中\large V_{w_{I,c}}是輸入上下文單詞的第\large c個單詞的輸入向量;\large \eta表示大於零的學習率;\large EH=\frac{\partial E}{\partial h_{i}}由公式(12)確定。

2 Skip-Gram Model

    skip-gram與上一章介紹的CBOW正好相反,skip-gram是通過中心單詞(target word)來預測其上下文的單詞(context words)。如圖3所示:

 這裏我們依然用\large V_{w_{I}}來表示輸入層上唯一的輸入單詞的向量,這樣我們對於隱藏層的輸出值\large h的計算就可以照搬使用公式(1):

                                                                           \large h=W_{(K,\cdot )}^{T}:=V_{w_{I}}

  這意味着\large h只是矩陣\large W的其中一行。[輸入\large x_{k}爲一個one-hot向量,\large x_{k}轉置與權值矩陣的點積,結果就爲\large W矩陣的其中一行]。在輸出層上,不同於CBOW模型輸出單個多項式分佈,Skip-garm模型的輸出層輸出多個多項式分佈。每個輸出都使用相同的隱藏層->輸出層矩陣計算:

                                                                           \large p(w_{c,j}=w_{O,c}|w_{I})=y_{c,j}=\frac{e^{u_{c,j}}}{\sum_{j^{'}=1}^{V}e^{u_{j^{'}}} }

   其中\large w_{c,j}表示輸出層的第c個panel的第j個單詞;\large w_{0,c}實際上是輸出上下文的第c的單詞;\large w_{I}是唯一的輸入單詞;\large y_{c,j}是輸出層第c個panel上第j個神經元節點的輸出值(概率);\large u_{c,j}輸出層在第c個panel上第j個節點的輸出值。但由於輸出層的所有panels共享同一權值矩陣\large W^{'},所以:         

                                                                         \large u_{c,j}=u_{j}=V_{w_j}^{'}^{T}\cdot h\large c=1,2,....C     

    *panel:輸出層的表示每個上下文單詞的神經元的組合

    其中\large V_{w_{j}}^{'}是詞彙表中第j個單詞\large w_{j}的輸出向量, 同樣,它也取自於隱藏層→輸出層權值矩陣\large W^{'}的其中一列。

     skip-gram模型參數更新的方法實際上與one-word-context模型的差別並不是很大。這裏我們將損失函數變爲:

                                                                             \large \\E=-log(p(w_{O,1},w_{O,2},....w_{O,C}|w_{I}))\\ =-log(\prod _{c=1}^{C}\frac{e^{u,j_{c}^{*}}}{\sum_{j^{'}=1}^{V}e^{u_{j^{'}}}})\\ =-\sum_{c=1}^{C} u_{j_{c}^{*}}+C\cdot log(\sum_{j^{'}=1}^{V}u_{j^{'}})

其中\large j_{c}^{*}實際上是第c個輸出層輸出的上下文單詞在語料庫中的索引。接下來,我們對輸出層的每一個panel上的所有激活單元的輸入值\large u_{c,j}均求其關於\large E的偏導數得:

                                                                                \large \frac{\partial E}{\partial u_{c,j}}=y_{c,j}-t_{c,j}:=e_{c,j}

    和式子(8)一樣,\large e_{c,j}代表着輸出層上每個神經元節點的預測誤差。爲了書寫方便,我們假設一個V維度的向量\large EI=\begin{Bmatrix} EI_{1},EI_{2}....EI_{V} \end{Bmatrix}來表示所有上下文單詞的預測誤差之和,公式表示爲:

                                                                                          \large EI_{j}=\sum _{c=1}^{C}e_{c,j}

   然後我們通過鏈式法則來求得隱藏層→輸出層的權值矩陣\large W^{'}關於\large E的偏導,得:

                                                                   \large \frac{\partial E}{\partial w_{i,j}^{'}}=\sum_{c=1}^{C}\frac{\partial E}{\partial u_{c,j}}\cdot \frac{\partial u_{c,j}}{\partial w_{i,j}^{'}} =EI_{j}\cdot h_{i}

    再由此推導出隱藏層→輸出層的權值矩陣\large W^{'}的更新方程:

                                                                     \large w_{i,j}^{'}:=w_{i,j}^{'}-\eta \cdot EI_{j}\cdot h_{i}

     或者這樣表示:

                                                                 \large V_{w_{j}}^{'}:=w_{j}}^{'}-\eta \cdot EI_{j}\cdot h        \large j=1,2,....V

    這個公式的直觀理解與公式(11)的概念相同,除了一點:輸出層的預測誤差的計算是基於多個上下文單詞context words,而不是單個目標單詞 target word;需注意的是對於每一個訓練樣本,我們都要利用該參數更新公式來更新隱藏層→輸出層的權重矩陣\large W^{'}的每個元素。

     而對於輸入層→隱藏層的權值矩陣\large W的更新過程,與公式(12)到公式(16)類似:

                                                               \large V_{w_{I}}:=V_{w_{I}}-\eta \cdot EH

    但需要注意的是,這裏的\large EH中累加的\large e_{j}要用\large EI_{j}替代:

                                                                \large EH_{i}=\sum _{j=1}^{v}EI_{j}\cdot w_{ij}^{'}

3.優化計算效率

    到目前爲止,我們都在討論bigram,CBOW和skip-gram模型的原始形式,現在我們將介紹一些高級的tricks來優化運行的效率。

    首先總結一下之前介紹的所有模型,詞彙表中的每個單詞都存在2種向量表示的方法:

輸入向量\large v_{w}

輸出向量\large v_{w}^{'}

   對於輸入向量的學習成本並不高,而對於輸出向量的學習代價卻是昂貴的。 從參數更新方程(22)和(33)我們可以看出,爲了更新每一例輸出向量\large v_{w}^{'},我們需要迭代詞彙表裏面的每一個詞,計算他們的輸入值\large u_{j};預測值\large y_{j}(skip-gram中是\large y_{c,j})的可能性;預測誤差\large e_{j}(skip-gram中是\large EI_{j});最後使用預測誤差來更新他們的輸出向量\large V_{j}^{'}

   顯然對於訓練樣本的每個單詞做這樣的計算開銷太大,尤其是在語料庫很大的時候,這樣的計算方式顯得有些不切實際。解決這個問題,直觀的方式是限制必須要更新的訓練樣例的輸出向量的數目。一種有效的方式就是實現一個分層的soft-max;另一種方法也同樣簡單,通過採樣來解決,這個內容將會放在下一章討論。

    這2中技巧都只是在優化更新輸出向量的計算量,在我們的推到過程中,我們主要關注3個數值:

  1. \large E,新的目標函數;
  2. \large \frac{\partial E}{\partial V_{w}^{'}},輸出向量新的更新方程;
  3. \large \frac{\partial E}{\partial h},更新輸入向量的反向傳播算法 的 預測誤差 之和。

3.1 Hierarchical Softm

           分層soft-max是計算soft-max的有效方法,該模型使用二叉樹來表示詞彙表中的所有單詞,假設詞彙表有\large V個單詞,那麼用二叉樹來表示這\large V個單詞時,這些單詞都只能在葉子節點上。而由於二叉樹的性質,那些非葉子的節點爲\large V-1個。對於每個葉子節點,存在也只存在一條從根節點出發到達此節點的絕對路徑。通過這條路徑,我們就能預估這個葉子節點表示的單詞的可能性。下面是一個二叉樹的示例:

         上圖是一個分詞soft-max模型的二叉樹示例, 白色的節點代表的是詞彙表中的單詞,黑色的節點代表的是非葉子節點。其中加粗顯示的部分是從跟節點到單詞\large w_{2}節點的路徑。該路徑長度爲\large L(w_{2})=4\large n(w,j)表示從跟節點到單詞\large w的路徑中的第\large j個節點。

         在分層的soft-max模型中,單詞沒有了輸出向量的表示形式,取而代之的是,\large V-1個非葉子節點中的每個節點都有一個輸出向量\large v_{n(w,j)}^{'},這樣定義一個單詞成爲輸出單詞的可能性的公式就可以表示爲:

                                       \dpi{100} \large p(w=w_{0}})=\prod_{j=1}^{L(w)-1}\sigma(\left \[[ n(w,j+1)=ch(n(w,j)) \right ]]\cdot v_{n(w,j)}^{'}^{T} \cdot h)                                      (37)

其中:

\large ch(n(w,j))\large n(w,j)節點的左孩子節點;

\large v_{n(w,j)}^{'}\large n(w,j)節點的向量表示(即輸出向量);

\large h是隱藏層的輸出值;(在Skip-gram模型中 \large h=v_{w_{I}},在CBOW模型中\large h=\frac{1}{C}\sum_{c=1}^{C} v_{w_{c}})

\large [[a=b]]是一個特殊的函數,定義爲:  \large [[a=b]]=\left\{\begin{matrix} 1 & a=b\\ -1& a\neq b \end{matrix}\right.

下面,用一個例子來加深對公式(37)的理解:

      回顧一下二叉樹示例的圖,假設我們要計算單詞\large w_{2}成爲輸出單詞的可能性,我們將求解這個概率的問題定義爲求解從根節點隨機遊走到葉子節點\large w_{2}的概率,在其路徑上的每個非葉子節點(包括跟節點),我們都要分析他走向左孩子節點和右孩子節點的概率。

       這裏我們定義走向左孩子節點的概率爲:

                                                                      \large p(n,left)=\sigma (v_{n}^{'}^{T}\cdot h)                                                                             (39)

      從公式可以發現\large p(n,left)的值取決於非葉子節點的向量表示\large v_n^{'}和隱藏層的輸出值(隱藏層的輸出值取決與輸入單詞的向量表示)。

       顯然走向右孩子節點的概率我們就可以這樣定義:

                                                                     \large p(n,left)=1-\sigma (v_{n}^{'}^{T}\cdot h)=\sigma (-v_{n}^{'}^{T}\cdot h)

       根據二叉樹示例圖中從跟節點到\large w_{2}的路徑,我們能計算出單詞\large w_{2}成爲輸出單詞的可能性:

                                                        \large p(w=w_{0}})=p(n(w_2,1),left)\cdot p(n(w_2,2),left)\cdot p(n(w_2,3),right)

                                                                              \large =\sigma (v_{n(w_{2},1)}^{'}^{T}\cdot h)\cdot \sigma (v_{n(w_{2},2)}^{'}^{T}\cdot h)\cdot \sigma (-v_{n(w_{2},3)}^{'}^{T}\cdot h)  

     再回頭看看公式(37),用上面的例子來理解,是不難的。而且可以發現:

                                                            \large \sum _{i=1}^{V}p(w_{i}=w_{O})=1

     現在我們開始推導非葉子節點的向量表示形式的參數更新公式,爲了方便理解,我們還是先以one-word context(即只考慮上下文一個單詞的情況)示例,之後我們拓展到CBOW或者skip-gram都會很方便。

     爲了簡化公式,方便理解,令:

                                                     \large [[\cdot ]]=[[ n(w,j+1)=ch(n(w,j)) ]]

                                                     \large v_{j}^{'}=v_{n(w,j)}^{'}

 則對於訓練樣本來說,其損失函數可以定義爲:

                                                      \large E=-log(p(w=w_{O}|w_{I}))=-\sum _{j=1}^{L(w)-1}log(\sigma ([[\cdot ]]v_{j}^{'}^{T}h))

然後我們對\large E去關於\large v_{j}^{'}h的偏導數,得:

                                                     \large \frac{\partial E}{\partial v_{j}^{'}h}=(\sigma ([[\cdot ]] v_{j}^{'}h)-1)[[\cdot ]]

                                                               \large =\left\{\begin{matrix} \sigma ( v_{j}^{'}h)-1& ([[\cdot ]]=1)\\ \sigma ( v_{j}^{'}h) & ([[\cdot ]]=-1) \end{matrix}\right.

                                                              \large =\sigma ( v_{j}^{'}h)-t_{j}

\large [[\cdot ]]=1\large t_{j}=1,其餘\large t_{j}=0.

接着我們計算內部節點\large n(w,j)的向量表示\large V_{j}^{'}關於函數\large E的偏導,得:

                                                      \large \frac{\partial E}{\partial V_{j}^{'}}=\frac{\partial E}{\partial V_{j}^{'}h}\cdot \frac{\partial V_{j}^{'}h}{\partial V_{j}^{'}}=(\sigma ( v_{j}^{'}h)-t_{j})\cdot h

因此得到更新函數的公式爲:

                                                    \large V_{j}^{'}:=V_{j}^{'}-\eta\cdot \sigma ( v_{j}^{'}h)-t_{j})\cdot h

可以將\large \sigma ( v_{j}^{'}h)-t_{j})理解爲節點\large n(w,j)的預測誤差;並且這個公式需要循環迭代\large j=1,2....,L(w)-1。每一個內部節點的“任務”就是預測其隨機遊走路徑是指向左孩子節點還是指向右孩子節點。

\large t_{j} =1等於時意味着\large n(w,j)節點的路徑指向左孩子節點;

\large t_{j} =0等於時意味着\large n(w,j)節點的路徑指向右孩子節點;

\large \sigma ( v_{j}^{'}h)是預測的結果

    對於一個訓練實例 , 如果內部節點的預測值非常接近於真實值,則它的向量表示\large V_{j}^{'}的更新變化很小;否則\large V_{j}^{'}向量指向一個適當的方向使得該實例的預測誤差逐漸減小。這種更新方式同樣可以應用與CBOW和skip-gram模型,只不過應用在skip-gram我們需要在輸出單詞上循環迭代C個輸出上下文中的每一個單詞。

    爲了使用反向傳播算法來更新輸出層→隱藏層的權值矩陣\large W,我們對隱藏層的輸出\large h計算其關於損失函數\large E的導數,得:

                                                              \large \\ \frac{\partial E}{\partial h}=\sum_{j=1}^{L(w)=1}\frac{\partial E}{\partial V_{j}^{'}}\cdot \frac{\partial V_{j}^{'}}{\partial h}\\ =\sum_{j=1}^{L(w)=1}(\sigma (v_{j}^'^Th)-t_{j})\cdot V_{J}^{'}\\ :=EH

   接下來我們根據公式(23)便可以獲得CBOW模型輸入向量的更新公式;對於skip-gram模型,我們需要計算上下文信息中的每個單詞的\large EH_{i},並將\large \sum EH_{i}帶入公式(35),就能夠得到輸入向量的更新公式。

       從以上更新公式我們可以看出:經過改進的模型Hierarchical soft-max的每個訓練樣例的每個上下文單詞的計算複雜度從\large O(V)降爲\large O(log(V))。但是模型的參數幾乎沒有什麼改變(內部節點對應\large V-1維向量,而原始模型的單詞的輸出向量維數爲\large V

3.2 Negative Sampling

    Negative Sampling(負抽樣)的方法比分層soft-max來得更爲直截了當:在每次循環迭代過程中需要處理大量的節點上的計算,爲了解決這個問題,Negative Sampling提出了只更新其中一部分輸出向量的解決方案。

    顯然,負抽樣的目的是爲了最終輸出的上下文單詞(正樣本)[基於訓練樣本的半監督學習]在採樣過程中應該保留下來並更新,同時也需要採集一些反面例子[與訓練樣本結果不符](也可以稱之爲“負樣本”)

    那麼怎麼採集這些例子呢?這裏我們引入一個概念“噪聲分佈\large p_{n}(w)”,通過噪聲分佈函數來採集例子。噪聲分佈函數並是特指某一函數,而是任意能夠起到採樣的函數。當然,當你有足夠的經驗後,你會知道在什麼情況下應用什麼噪聲分佈函數會更爲合適。

    那麼把Negative Sampling(負抽樣)應用到Word2vec上時,我們不用再使用那種能夠產生很好的後驗概率的多項式分佈的負採樣形式。Word2vec的作者們發現使用下面這種目標函數就能產生高質量且可靠的word embeddings:

                                                                 \large E=-log(\sigma (v_{w_{O}}^'^Th))-\sum _{i=1}^{K}log(\sigma (-v_{w_{i}}^'^Th))

其中:

\large w_{i}是通過噪聲分佈\large p_{n}(w)函數採集的一系列樣本;

\large h是隱藏層的輸出值;[在skip-gram中\large h=V_{w_{I}},在CBOW中\large h=\frac{1}{C}\sum_{c=1}^{C}V_{w_{c}}]

向量\large V_{w}代表輸入層上單詞\large w的向量,它實際上是輸入矩陣\large W的其中一行;

向量\large V_{w}^{'}代表輸出層上單詞\large w的向量,它實際上是輸出矩陣\large W^{'}的其中一列;(說了N遍了,emmmm.....)

(每個單詞都有2中向量表示形式\large V_{w}\large V_{w}^{'}

我們對目標函數\large E求其關於標量\large w_{j}}^'^Th的偏導,得:

                                                               \large \frac{\partial E}{\partial V_{w_{j}}^'^Th}=\left\{\begin{matrix} \sigma(V_{w_{j}}^'^Th)-1 & w_{j}=w_{O}\\\sigma(V_{w_{j}}^'^Th) & w_{j}\in \begin{Bmatrix} w_{i}|i=1,2...,K \end{Bmatrix}\end{matrix}\right.

                                                                              \large =\sigma(V_{w_{j}}^'^Th) -t_{j}

其中\large t_{j}表示單詞\large w_{j}的“類型”,當\large w_{j}是正樣本時,及預測值與真實值相同時\large t_{j}=1,反之\large t_{j}=0。然後通過鏈式法則可以得到目標函數\large E關於單個單詞輸出向量\large V_{w_{j}}}^{'}的導數,得:

                                                                   \large \frac{\partial E}{\partial V_{w_{j}}^{'}}=\frac{\partial E}{\partial V_{w_{j}}^'^Th}\cdot \frac{\partial V_{w_{j}}^'^Th}{\partial V_{w_{j}}^{'}}= (\sigma(V_{w_{j}}^'^Th) -t_{j})h

   所以我們的更新函數就可以表示爲:                                                    

                                                                   \large V_{w_{j}}}^{'}:=V_{w_{j}}}^{'}-\eta (\sigma(V_{w_{j}}^'^Th) -t_{j})h

                                                                   \large s.t.: w_{j}\in \begin{Bmatrix} w_{O} \end{Bmatrix}\bigcup \begin{Bmatrix} w_{i}\sim p_{n}(w)|i=1,2...,K \end{Bmatrix}                                (59)

    negative sampling的關鍵就是公式(59)的更新過程只應用於詞彙表的子集\large w_{j}\in \begin{Bmatrix} w_{O} \end{Bmatrix}\bigcup \begin{Bmatrix} w_{i}\sim p_{n}(w)|i=1,2...,K \end{Bmatrix},而並非應用於整個詞彙表,從而大大的減輕的計算量。除詞彙量的大小變了之外,其餘更新的方式是與式子(11)一樣的。公式(59)適用於CBOW和skip-gram模型,在skip-gram模型中,我們每次更新一個單詞。

        接着利用反向傳播算法來計算目標函數\large E關於隱藏層輸出值\large h的偏導,得:

                                                                      \large \frac{\partial E}{\partial h}=\frac{\partial E}{\partial V_{w_{j}}^'^Th}\cdot \frac{\partial V_{w_{j}}^'^Th}{\partial h}= (\sigma(V_{w_{j}}^'^Th) -t_{j})v_{w_{j}}^{'}:=EH

   在CBOW模型中,我們將上面公式代入(23)即可完成對模型輸入向量矩陣的更新;

   在skip-gram模型輸入向量矩陣的更新中,我們需要計算每個上下文單詞\large EH值的和然後再將其代入公式(35)。

4 Discussio

4.1爲什麼使用soft-max?

     使用soft-max可以更好的幫助我們去定義單詞之間的概率分佈,改模型使用交叉熵作爲損失函數,從理論上說,你也可以使用平方和作爲損失函數,但是這樣的話針對soft-max開發的優化效率提升性能技巧將不再適用。

4.2輸入向量和輸出向量之間的關係是什麼?

    輸入向量是輸入層→隱藏層的權值矩陣其中一行;輸出向量是隱藏層→輸出層的權值矩陣其中一列;
    從定義上他們就是一個單詞的2種向量表示形式。

4.3Word2vec的目的是得到詞向量,是2組詞向量還是一組詞向量?

   之前提到Word2vec訓練對每個單詞有2組詞向量,但是最終其實保留輸入層到隱藏層的這組詞向量,輸出層對應的 分層-softmax 也會生成一系列的向量,但最終都被拋棄,不會使用。

References

  1. Goldberg, Y. and Levy, O. (2014). word2vec explained: deriving mikolov et al.’s negativesampling word-embedding method. arXiv:1402.3722 [cs, stat]. arXiv: 1402.3722.
  2. Mikolov, T., Chen, K., Corrado, G., and Dean, J. (2013a). Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781.
  3. Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., and Dean, J. (2013b). Distributed representations of words and phrases and their compositionality. In Advances in Neural Information Processing Systems, pages 3111–3119.
  4. Mnih, A. and Hinton, G. E. (2009). A scalable hierarchical distributed language model.In Koller, D., Schuurmans, D., Bengio, Y., and Bottou, L., editors, Advances in Neural Information Processing Systems 21, pages 1081–1088. Curran Associates, Inc.
  5. Morin, F. and Bengio, Y. (2005). Hierarchical probabilistic neural network language model.In AISTATS, volume 5, pages 246–252. Citeseer.

關於word2vec的參數解釋到此結束了,對文章有疑問或者其他方面問題的可以通過下面方式聯繫作者:

QQ:470581985

微信:lsq960124

打賞一下作者:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章