word2vec原理(二) 基於Hierarchical Softmax的模型

    word2vec原理(一) CBOW與Skip-Gram模型基礎html

    word2vec原理(二) 基於Hierarchical Softmax的模型git

    word2vec原理(三) 基於Negative Sampling的模型github

    在word2vec原理(一) CBOW與Skip-Gram模型基礎中,咱們講到了使用神經網絡的方法來獲得詞向量語言模型的原理和一些問題,如今咱們開始關注word2vec的語言模型如何改進傳統的神經網絡的方法。因爲word2vec有兩種改進方法,一種是基於Hierarchical Softmax的,另外一種是基於Negative Sampling的。本文關注於基於Hierarchical Softmax的改進方法,在下一篇討論基於Negative Sampling的改進方法。算法

1. 基於Hierarchical Softmax的模型概述

    咱們先回顧下傳統的神經網絡詞向量語言模型,裏面通常有三層,輸入層(詞向量),隱藏層和輸出層(softmax層)。裏面最大的問題在於從隱藏層到輸出的softmax層的計算量很大,由於要計算全部詞的softmax機率,再去找機率最大的值。這個模型以下圖所示。其中$V$是詞彙表的大小,網絡

 

    word2vec對這個模型作了改進,首先,對於從輸入層到隱藏層的映射,沒有采起神經網絡的線性變換加激活函數的方法,而是採用簡單的對全部輸入詞向量求和並取平均的方法。好比輸入的是三個4維詞向量:$(1,2,3,4), (9,6,11,8),(5,10,7,12)$,那麼咱們word2vec映射後的詞向量就是$(5,6,7,8)$。因爲這裏是從多個詞向量變成了一個詞向量。函數

    第二個改進就是從隱藏層到輸出的softmax層這裏的計算量個改進。爲了不要計算全部詞的softmax機率,word2vec採樣了霍夫曼樹來代替從隱藏層到輸出softmax層的映射。咱們在上一節已經介紹了霍夫曼樹的原理。如何映射呢?這裏就是理解word2vec的關鍵所在了。post

    因爲咱們把以前全部都要計算的從輸出softmax層的機率計算變成了一顆二叉霍夫曼樹,那麼咱們的softmax機率計算只須要沿着樹形結構進行就能夠了。以下圖所示,咱們能夠沿着霍夫曼樹從根節點一直走到咱們的葉子節點的詞$w_2$。優化

 

    和以前的神經網絡語言模型相比,咱們的霍夫曼樹的全部內部節點就相似以前神經網絡隱藏層的神經元,其中,根節點的詞向量對應咱們的投影后的詞向量,而全部葉子節點就相似於以前神經網絡softmax輸出層的神經元,葉子節點的個數就是詞彙表的大小。在霍夫曼樹中,隱藏層到輸出層的softmax映射不是一會兒完成的,而是沿着霍夫曼樹一步步完成的,所以這種softmax取名爲"Hierarchical Softmax"。編碼

    如何「沿着霍夫曼樹一步步完成」呢?在word2vec中,咱們採用了二元邏輯迴歸的方法,即規定沿着左子樹走,那麼就是負類(霍夫曼樹編碼1),沿着右子樹走,那麼就是正類(霍夫曼樹編碼0)。判別正類和負類的方法是使用sigmoid函數,即:$$P(+) = \sigma(x_w^T\theta) = \frac{1}{1+e^{-x_w^T\theta}}$$url

    其中$x_w$是當前內部節點的詞向量,而$\theta$則是咱們須要從訓練樣本求出的邏輯迴歸的模型參數。

    使用霍夫曼樹有什麼好處呢?首先,因爲是二叉樹,以前計算量爲$V$,如今變成了$log_2V$。第二,因爲使用霍夫曼樹是高頻的詞靠近樹根,這樣高頻詞須要更少的時間會被找到,這符合咱們的貪心優化思想。

    容易理解,被劃分爲左子樹而成爲負類的機率爲$P(-) =  1-P(+)$。在某一個內部節點,要判斷是沿左子樹仍是右子樹走的標準就是看$P(-),P(+)$誰的機率值大。而控制$P(-),P(+)$誰的機率值大的因素一個是當前節點的詞向量,另外一個是當前節點的模型參數$\theta$。

    對於上圖中的$w_2$,若是它是一個訓練樣本的輸出,那麼咱們指望對於裏面的隱藏節點$n(w_2,1)$的$P(-)$機率大,$n(w_2,2)$的$P(-)$機率大,$n(w_2,3)$的$P(+)$機率大。

    回到基於Hierarchical Softmax的word2vec自己,咱們的目標就是找到合適的全部節點的詞向量和全部內部節點$\theta$, 使訓練樣本達到最大似然。那麼如何達到最大似然呢?

2. 基於Hierarchical Softmax的模型梯度計算

   咱們使用最大似然法來尋找全部節點的詞向量和全部內部節點$\theta$。先拿上面的$w_2$例子來看,咱們指望最大化下面的似然函數:$$\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}}$$

    對於全部的訓練樣本,咱們指望最大化全部樣本的似然函數乘積。

    爲了便於咱們後面通常化的描述,咱們定義輸入的詞爲$w$,其從輸入層詞向量求和平均後的霍夫曼樹根節點詞向量爲$x_w$, 從根節點到$w$所在的葉子節點,包含的節點總數爲$l_w$, $w$在霍夫曼樹中從根節點開始,通過的第$i$個節點表示爲$p_i^w$,對應的霍夫曼編碼爲$d_i^w \in \{0,1\}$,其中$i =2,3,...l_w$。而該節點對應的模型參數表示爲$\theta_i^w$, 其中$i =1,2,...l_w-1$,沒有$i =l_w$是由於模型參數僅僅針對於霍夫曼樹的內部節點。

    定義$w$通過的霍夫曼樹某一個節點j的邏輯迴歸機率爲$P(d_j^w|x_w, \theta_{j-1}^w)$,其表達式爲:

$$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}$$

    那麼對於某一個目標輸出詞$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}$$

    在word2vec中,因爲使用的是隨機梯度上升法,因此並無把全部樣本的似然乘起來獲得真正的訓練集最大似然,僅僅每次只用一個樣本更新梯度,這樣作的目的是減小梯度計算量。這樣咱們能夠獲得$w$的對數似然函數$L$以下:

$$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)])$$

    要獲得模型中$w$詞向量和內部節點的模型參數$\theta$, 咱們使用梯度上升法便可。首先咱們求模型參數$\theta_{j-1}^w$的梯度:

$$ \begin{align} \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{align}$$

    若是你們看過以前寫的邏輯迴歸原理小結,會發現這裏的梯度推導過程基本相似。

    一樣的方法,能夠求出$x_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 $$

    有了梯度表達式,咱們就能夠用梯度上升法進行迭代來一步步的求解咱們須要的全部的$\theta_{j-1}^w$和$x_w$。

3. 基於Hierarchical Softmax的CBOW模型

    因爲word2vec有兩種模型:CBOW和Skip-Gram,咱們先看看基於CBOW模型時, Hierarchical Softmax如何使用。

    首先咱們要定義詞向量的維度大小$M$,以及CBOW的上下文大小$2c$,這樣咱們對於訓練樣本中的每個詞,其前面的$c$個詞和後面的$c$個詞做爲了CBOW模型的輸入,該詞自己做爲樣本的輸出,指望softmax機率最大。

    在作CBOW模型前,咱們須要先將詞彙表創建成一顆霍夫曼樹。

    對於從輸入層到隱藏層(投影層),這一步比較簡單,就是對$w$周圍的$2c$個詞向量求和取平均便可,即:$$x_w = \frac{1}{2c}\sum\limits_{i=1}^{2c}x_i$$

    第二步,經過梯度上升法來更新咱們的$\theta_{j-1}^w$和$x_w$,注意這裏的$x_w$是由$2c$個詞向量相加而成,咱們作梯度更新完畢後會用梯度項直接更新原始的各個$x_i(i=1,2,,,,2c)$,即:

$$\theta_{j-1}^w = \theta_{j-1}^w + \eta  (1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))x_w $$$$x_i= x_i +\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) $$

    其中$\eta$爲梯度上升法的步長。

    這裏總結下基於Hierarchical Softmax的CBOW模型算法流程,梯度迭代使用了隨機梯度上升法:

    輸入:基於CBOW的語料訓練樣本,詞向量的維度大小$M$,CBOW的上下文大小$2c$,步長$\eta$

    輸出:霍夫曼樹的內部節點模型參數$\theta$,全部的詞向量$w$

    1. 基於語料訓練樣本創建霍夫曼樹。

    2. 隨機初始化全部的模型參數$\theta$,全部的詞向量$w$

    3. 進行梯度上升迭代過程,對於訓練集中的每個樣本$(context(w), w)$作以下處理:

      a)  e=0, 計算$x_w= \frac{1}{2c}\sum\limits_{i=1}^{2c}x_i$

      b)  for j = 2 to $ l_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$$

              c) 對於$context(w)$中的每個詞向量$x_i$(共2c個)進行更新:$$x_i = x_i + e$$ 

      d) 若是梯度收斂,則結束梯度迭代,不然回到步驟3繼續迭代。

4. 基於Hierarchical Softmax的Skip-Gram模型

    如今咱們先看看基於Skip-Gram模型時, Hierarchical Softmax如何使用。此時輸入的只有一個詞$w$,輸出的爲$2c$個詞向量$context(w)$。

    咱們對於訓練樣本中的每個詞,該詞自己做爲樣本的輸入, 其前面的$c$個詞和後面的$c$個詞做爲了Skip-Gram模型的輸出,,指望這些詞的softmax機率比其餘的詞大。

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

    在作CBOW模型前,咱們須要先將詞彙表創建成一顆霍夫曼樹。

    對於從輸入層到隱藏層(投影層),這一步比CBOW簡單,因爲只有一個詞,因此,即$x_w$就是詞$w$對應的詞向量。

    第二步,經過梯度上升法來更新咱們的$\theta_{j-1}^w$和$x_w$,注意這裏的$x_w$周圍有$2c$個詞向量,此時若是咱們指望$P(x_i|x_w), i=1,2...2c$最大。此時咱們注意到因爲上下文是相互的,在指望$P(x_i|x_w), i=1,2...2c$最大化的同時,反過來咱們也指望$P(x_w|x_i), i=1,2...2c$最大。那麼是使用$P(x_i|x_w)$好仍是$P(x_w|x_i)$好呢,word2vec使用了後者,這樣作的好處就是在一個迭代窗口內,咱們不是隻更新$x_w$一個詞,而是$x_i, i=1,2...2c$共$2c$個詞。這樣總體的迭代會更加的均衡。由於這個緣由,Skip-Gram模型並無和CBOW模型同樣對輸入進行迭代更新,而是對$2c$個輸出進行迭代更新。

    這裏總結下基於Hierarchical Softmax的Skip-Gram模型算法流程,梯度迭代使用了隨機梯度上升法:

    輸入:基於Skip-Gram的語料訓練樣本,詞向量的維度大小$M$,Skip-Gram的上下文大小$2c$,步長$\eta$

    輸出:霍夫曼樹的內部節點模型參數$\theta$,全部的詞向量$w$

    1. 基於語料訓練樣本創建霍夫曼樹。

    2. 隨機初始化全部的模型參數$\theta$,全部的詞向量$w$,

    3. 進行梯度上升迭代過程,對於訓練集中的每個樣本$(w, context(w))$作以下處理:

      a)  for i =1 to 2c:

        i) e=0

        ii)for j = 2 to $ l_w$, 計算:$$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$$

        iii) $$x_i = x_i + e$$

      b)若是梯度收斂,則結束梯度迭代,算法結束,不然回到步驟a繼續迭代。

5. Hierarchical Softmax的模型源碼和算法的對應    

    這裏給出上面算法和word2vec源碼中的變量對應關係。

    在源代碼中,基於Hierarchical Softmax的CBOW模型算法在435-463行,基於Hierarchical Softmax的Skip-Gram的模型算法在495-519行。你們能夠對着源代碼再深刻研究下算法。

    在源代碼中,neule對應咱們上面的$e$, syn0對應咱們的$x_w$, syn1對應咱們的$\theta_{j-1}^i$, layer1_size對應詞向量的維度,window對應咱們的$c$。

    另外,vocab[word].code[d]指的是,當前單詞word的,第d個編碼,編碼不含Root結點。vocab[word].point[d]指的是,當前單詞word,第d個編碼下,前置的結點。

  

    以上就是基於Hierarchical Softmax的word2vec模型,下一篇咱們討論基於Negative Sampling的word2vec模型。

 

 (歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

相關文章
相關標籤/搜索