word2vec算法原理公式推導

                                  word2vec參數學習解釋

                                                        摘 要

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

    本文提供了word2vec模型的參數更新方程的詳細推導和解釋,包括原始的連續詞袋(CBOW)模型和skip-gram模型,以及一些高級技巧--分層的soft-max和負抽樣。在附錄中,回顧了神經元網絡模型和反向傳播的基礎知識

1 連續詞袋(CBOW)模型

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

    我們從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 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模型的權值更新方程。雖然實際的計算方式有點不切實際(之後解釋),但是這不妨礙我們推到這個方程來增加我們對這個原始模型的理解。推到過程需要一些神經網絡的知識基礎:有關反向傳播基礎知識的綜述,請參閱附錄A。

     由上一階段的描述可知,現在訓練的目標(這節只針對一個單詞)就是求公式(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

     這裏我們設置一個\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}

    其中\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

其中\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)來更新權重意味着我們需要遍歷詞彙表中所有單詞。

這個過程中:

    當 \large y_{i}>t_{j}('高估')的時候,\large e_{j}>0,那麼會從\large V_{w_{0}}^{'}上減去隱藏向量\large h的一部分,這樣向量\large V_{w_{0}}^{'}就與向量\large V_{w_{I}}相差更遠;

    當 \large y_{i}<t_{j}('低估')的時候,\large e_{j}<0,那麼會從\large V_{w_{0}}^{'}上加上隱藏向量\large h的一部分,這樣向量\large V_{w_{0}}^{'}就與向量\large V_{w_{I}}相差更近;

    當 \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 \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_{wI}:=v_{wI}-\eta \cdot EH

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

 

 

 

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