(六) 語言模型 Language Madel 與 word2vec


 

語言模型簡介(Language Model)

簡單的說,語言模型 (Language Model) 是用來計算一個句子出現概率的模型,假設句子  ,其中  代表句子中的第  個詞語,則語句 W 以該順序出現的概率可以表示為:

  

其中 ,  $p(w_n|w_1^{n-1}) = p(w_n|w_1,w_2,...,w_{n-1})$  ,  $ p(w_n|w_1^{n-1})$ 即為 Language Model 的參數,。通常參數的求解用方法是 N-gram 模型,最大熵模型,HMM,CRF 以及本文將重點講述的 Neural Network Lauguage Model ,對於 N-gram 中的 $ p(w_n|w_1^{n-1})$ 是這樣計算的,先引入大小為  的詞表,與語料庫  :

  

 ,即在語料庫  中出現的次數注意到 $ p(w_n|w_1^{n-1})$ 計算的復雜性與稀疏性,所以計算一般是引入 Markov 假設,即詞語的出現僅與其前 k 個詞相關 即  ,  這樣就大大簡化了計算,k 即為 N-Gram 中的 N,比如 K = 2 ,有

  

這里還有一些平滑的技巧,比如   =  0 時的處理等等,這里不再贅述。將計算好后的參數保存起來,之后即可用到各種各樣的NLP任務重,比如分詞,詞性標注,NER 等等。

 

神經網絡語言模型(Neural Network Lauguage Model,NNLM)

神經網絡語言模型(以下簡稱 NNLM )正式由 Bengio 與於 2003 年提出,他也是用於計算  的一種模型(該模型同樣假設語料庫中詞語只與前 k 個相關),這里為了便於表示, 另 $context(w_n) = w_{n-k+1}^{n-1}$ ,便可以得到給定詞語 $w$ 在當前上下文中出現的概率為  ,不同於 N-gram 的直接統計頻率的方式, NNLM 用一個關於 $\theta$ 的函數 $F(w,context(w),\theta)$ 來表示  ,意思就是說,當前詞為  時,其上下文為  的概率可以用一個關於  的函數 $F(w,context(w),\theta)$ 表示,然后問題就轉變為了求得最優的參數  來生成 Language Model , 待求得 $\theta^*$ 后 ,對於任意在詞表  中的詞語  ,都可以直接帶入到 $F(w,context(w),\theta^*)$ 中,得到其對應的概率 , NNLM 即是采用神經網絡結構來構造函數 $F(w,context(w),\theta^*)$ 的,構造完成后,根據訓練語料  來求得最優的參數  即可。這里求解算法采用的是參數估計中極大似然估計,即:

  

以上公式何解呢?就是假設語料庫 $C$ 是按照 $F(w,context(w),\theta)$ 生成的 , 現在 $C$ 已經在那里了,但參數 $\theta^*$ 還不知道,很簡單的 MLE 的思想就可解決了,此處 $R(\theta)$ 是引入 $\theta$ 的先驗信息來構造成 MAP ,也可以叫做正則化,但是 NNLM 里是沒有引入任何先驗信息的,所以這里不考慮 $R(\theta)$ ,Bengio 提出的 NNLM 就長下邊的那個樣子

很復雜的圖,其實 idea 並不復雜,來看 NNLM 構造 ,首先,引入了詞向量的概念,即將詞表中的詞語  表示為一個固定長度為 $M$ 向量的形式   ,(m 為人工定義的詞向量的長度),這樣整個詞表可以用 一個  的矩陣表示,每一列為一個詞向量,現在找到詞 $w_t$ 的上下文 $context(w_t)$ ,  這里 Bengio 設定的上下文 $context(w_t)$ 是詞 $w_t$ 的前  個詞語,並把這  個詞語的詞向量首尾相接的拼起來,形成維度為 $(n-1)m$ 的向量來當做神經網絡的輸入,所以 NNLM 輸入層的大小已經確定為 $(n-1)m$ , 隱層的規模就是人工指定了,輸出層的大小為  $|V|$ ,為什么是 $|V|$ 呢,因為這里類似於 supervised learning ,輸入特征為 $context(w_t)$ 對應的 $(n-1)m$ 維的向量,通過 NNLM 后期望的輸出應該是詞語 $w_t$ 了,即輸出類似於模型學習到的到標簽的映射,因為共有 $|V|$ 個詞語,所以輸出層維度為 $|V|$ , $w_t$ 在詞表 $V$ 中的下標對應的維度就是映射 $w_t$ 的得分,而 softmax 正好可以把該得分歸一化為概率。

假設輸入為詞語 $w$ ,其上下文 $context(w)$ 拼接成一個輸入 $\mathbf{x}_w$ ,在 NN 中的計算如下所示:

  

最后得到的向量  , 現在為了讓  的每個分量  表示當前當前詞為詞表的第  個且當前上下文為  的概率,做一個softmax 歸一化即可:

  

 此處, =  表示為詞表中的第 i 個詞,以上便為我們用 NN 構造出的代表概率的函數  ,然后采用 MLE 估計即可,這里待估計參數  分別為整個詞表詞語的詞向量與 NN 中的權值  ,網絡中還有一些需要設定的參數,比如上下文詞語  的設定一般不大於 5 ,詞向量的長度  一般介於  之間,另外需要注意 NNLM是自帶平滑的,因為任意詞語  的概率  都經過了 softmax 歸一化,所以  取值介於(0-1)之間。計算還是用先前的公式:

  

該 log 似然可以用梯度上升法來求解,具體這里不涉及了。參數求解完后,便得到了我們的語言模型,現在估計一個現實任務中的詞語   對應的   時,只需將該詞語  對應的詞向量輸入到  里,就會得到其對應的概率值。

 NNLM 的副產品詞向量也包含了豐富的信息,因為每個詞語都被表示為長度為  的向量,在詞向量空間  中,語義相似的詞語的距離會很接近,且會有 man - woman = king - queen 這種神奇的效果出現。另外除了詞向量外,還有字向量,句子向量與文章向量 。之后的關於詞向量的工作大部分都是對於這里詞向量復雜性的進一步改進,13年的 mikolov 的word2vec 工作比較典型,分為為基於 Hierarchical Softmax 與 Negative Sampling 的,下邊來一一介紹。

 

基於 Hierarchical Softmax 的模型

1)Continuous Bag-of-Words Model  CBOW

 CBOW 是在給定當前詞   后,預測上下文信息為   ,而 Skip-gram 與之相反,是給定  ,預測中間空缺的詞為  ,兩個模型分別如下圖所示:

語言模型還是那個問題,映射函數的構造,這里根據任務不同 CBOW 需要構造的是  ,而 Skip-gram 需要構造的是  ,在CBOW 中,改進了 NNLM 中計算復雜的環節,去掉了 NNLM 中的隱藏層,且最后的 softmax 層在CBOW中也變成了一個 Huffman 樹的結構。整個網絡如下圖所示:

CBOW 的任務是給定詞 $w_t$ ,預測其上下文  ,這里其上下文 $context(w_t)$ 是取其前后長度各位 c 共 2c 的詞語,將這些詞語的詞向量作為輸入,下面來看CBOW網絡的結構:

Input Layer

  輸入為詞語  對應的  ,取前后各 c 個詞語,共 2c 個詞語對應的詞向量為  ,詞向量的長度為 m(同 NNLM ,m為人工指定的詞向量的長度)。

Projection Layer

  將  中所有的詞向量累加,   即為投影層的輸出,將  送入Output Layer 即可, 的計算如下:

     

Output Layer

  這里的輸出層不再是 NNLM 中的 softmax 了,而改為了 Huffman 樹結構,該樹是通過統計詞表 V 的詞語構建的,通過統計預料 C 中的詞語的詞頻,來構建這顆 Huffman 樹,根據 Huffman 數的性質,詞頻大的詞語所處的層數一般會很淺,樹中的每個葉節點均代表一個詞表 V 中的詞語。可見共有 |V| 個葉節點,且葉節點的順序為左大右小。

CBOW這種層次的設計很大程度提高了網絡的效率,但輸出層樹形結構的設計也導致了前向傳導計算  的過程不同於 softmax ,為了方便推到,引入以下的符號:


  : 從根節點出發到詞語  對應的葉節點的路徑;

: : 路徑中包含的節點的個數為

 : 路徑  中的各個節點, 代表根節點,  代表詞語   對應的葉節點;

: 詞語  的 Huffman 編碼(左 1 右 0),由  位編碼構成( 從  開始 ), 表示路徑  中節點  對應的編碼;

 :路徑中非葉子節點(共  個)對應的向量, 表示路徑  中的第  個非葉子節點對應的向量。


上邊的符號太多,用一個例子來說明,設當前的詞表 V 為 {我,喜歡,觀看,巴西,足球,世界杯} ,在語料庫 C 中統計的詞頻分別為 {15,8,6 ,5,3,1} ,構建的 Huffman 樹如下圖所示:(注意建樹時詞頻大的當做左子樹,詞頻小的當做右子樹,且編碼為左 1 右 0)。

若當前的詞語  為 “足球” , 則  為紅線連接的路徑,該路徑包含  個節點,分別為  ,對應的 Huffman 編碼  為 1001  ,  為路徑上非葉節點對應的向量。

當輸入詞語  后,會找到  前后的各 c 個詞語的詞向量,在投影層累加起來構造出  ,接下來  會傳導到輸出的 Huffman 層來構造最終的假設函數也即語言模型所要求的概率  。CBOW 是這樣做的,從根節點  的過程中,每向下傳導一層,即從根節點開始,每選擇一次左右孩子的分支,就進行一次二分類。 分類器選擇的是 Logistic Regression(LR),LR 中代表正負類的標簽是用  {1 ,0}  表示的,正好對應了 Huffman 編碼 中的 {1 ,0} ,  需要注意的是 CBOW 中 LR 采用的是左 0 右 1 的標簽模式,節點  對應的標簽  ,  分到左邊即為標簽為 0 的負類,分到右邊即為 標簽為 1 的正類。當在第  層分類時,節點  對應的參數為  根據 LR 的公式,分到正類的概率為:

  

分到負類的概率自然為: 

注意  會決定下一層的標簽 ,最終通過不斷二分類向下傳導到詞語 $w$ 對應的葉節點,詞語  對應的概率  即把這些二分類聯合起來:

其中:

寫到一起有 $p(d_i^w|\mathbf{x}_w,\theta_{i-1}^w) = \left [\sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w)^{1-d_i^w} \right ] \cdot\left [(1-\sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) ^{d_i^w}\right]$,現在就可以進行最后的 MLE 了,列出語料庫中的所有詞語,最大化以下似然函數即可 ,形式如下:

\begin{aligned}
\ \ L &= \prod_{w \in C} p(w|context(w)) \\
&\Rightarrow \\
logL&= \sum_{w \in C} logp(w|context(w)) \\
&=\sum_{w \in C} log\left [\prod_{i=2}^{l^w} p(d_i^w|\mathbf{x}_w,\theta^w_{i-1}) \right ]\\
&= \sum_{w \in C} log \left \{\prod_{i=2}^{l^w} \left [ \sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w)^{1-d_i^w} \right ] \cdot\left [(1-\sigma( \theta^{w \ T}_{i-1}\mathbf{x}_w) ^{d_i^w} \right ] \right \} \\
&=\sum_{w \in C} \sum_{i=2} ^{l^w} \left \{ (1-d_i^w) \cdot log \left [ \sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] +d_i^w \cdot \left [1-\sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] \right \}
\end{aligned}

為了便於推倒,將上式花括號的內容寫作 $L(w,i)$  ,即  $L(w,i)  =  (1-d_i^w) \cdot log \left [ \sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] +d_i^w \cdot \left [1-\sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] $ 。

$ L $  便是 CBOW 的目標函數 ,對於 $ L$ 的優化,CBOW 采用的是梯度上升算法(因為要尋找的是 $max $ 值,尋找 $min $ 時采用梯度下降的方法即可),目標函數 $ L$ 中的參數包括 $ \mathbf{x}_w  \ ,  \theta_{i}^w $ ,其中 $ w \in C $ , $ i = 1,2,...,l^{w-1} $ , 也就是所有非葉節點對應的權值向量 $\theta^w$ , 給定輸入為 $w \in C$ 時,要計算 $L$ 首先看 $L(w,j)$ 對$ \mathbf{x}_w  \ ,  \theta_{i-1}^w $ 的到倒數:

\begin{aligned}
\frac{\partial L(w,i) }{\partial \theta_{i-1}^w}
&= \frac{\partial }{\partial \theta_{i-1}^w}\left \{ (1-d_i^w) \cdot log \left [ \sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] +d_i^w \cdot \left [1-\sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] \right \} \\
&=(1-d_i^w) \cdot \left [ 1- \sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] \cdot \mathbf{x}_w - d_i^w \cdot \sigma (\theta^{w \ T}_{i-1}\mathbf{x}_w) \cdot \mathbf{x}_w \\
&=\left [ 1-d_i^w -\sigma(\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] \cdot \mathbf{x}_w
\end{aligned}

於是 $\theta_{i-1}^w $ 的梯度更新公式為:$ \theta_{i-1}^w := \theta_{i-1}^w + \eta \cdot \left [ 1-d_i^w -\sigma(\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] \cdot \mathbf{x}_w $

同時根據 $ \mathbf{x}_w $ 與 $ \theta_{i-1}^w $ 的對稱性可得到 $ \mathbf{x}_w $ 的梯度:

\[\frac{\partial L(w,i) }{\partial \mathbf{x}_w }  =  \left [ 1-d_i^w -\sigma(\theta^{w \ T}_{i-1}\mathbf{x}_w) \right ] \cdot \theta_{i-1}^w \]

因為 $ \mathbf{x}_w $ 表示的是 $context(w)$ 中的詞向量的和,如何采用 $\frac{\partial L(w,i) }{\partial  \mathbf{x}_w} $ 來對 $context(w)$ 中 $2c$ 個詞向量的和進行更新呢, CBOW 是這樣做的:

\[ \mathbf{v}(\bar{w}) := \mathbf{v}(\bar{w}) + \eta \sum_{i=2}^{l^w}\frac{\partial L(w,i)}{\partial \mathbf{x}_w}  \ \ \  , \bar{w} \in context(w)\] 

注意這里有 $ \mathbf{x}_w = \sum \mathbf{v}(\bar{w}) $ ,因為梯度的更新是對向量的和進行的,那么是否有必要對 $\sum_{i=2}^{l^w}\frac{\partial L(w,i)}{\partial \mathbf{x}_w} $ 做平均,來使其分別貢獻到求和前的各個詞向量呢,其實不用,只用控制 $ \eta  $ 的大小就可以了,這樣就可以把  $\sum_{i=2}^{l^w}\frac{\partial L(w,i)}{\partial \mathbf{x}_w} $ 貢獻到 $\bar{w} \in context(w)$ 中每個詞的詞向量了。

綜上,當給定輸入為 $w \ ,context(w)$ 時,給出 CBOW 的實現 word2vec 中主要部分的偽代碼:

\begin{aligned}
 \ &e = 0 \\
 \ &\mathbf{x}_w = \sum_{\bar{w}  \in context(w) } \mathbf{v}(\bar{w} ) \ \ \ \ \\
 \ &for \ i=2 \rightarrow l^w \ do: \\
&\ \ \ \ \ \ q = \sigma(\theta^{w \ T}_{i-1}\mathbf{x}_w) \\
&\ \ \ \ \ \ g = \eta (1-d_i^w-q)\\
&\ \ \ \ \ \ e := e+ g \cdot \theta^{w }_{i-1} \\
&\ \ \ \ \ \ \theta^{w }_{i-1} := \theta^{w}_{i-1} +g \cdot \mathbf{x}_w \\
 \ &for \ \bar{w}  \in conetxt(w) : \\
&\ \ \ \ \ \ \mathbf{v}(\bar{w} ) := \mathbf{v}(\bar{w} ) +e
\end{aligned}

  需要注意3中最后兩步順序不能顛倒,即  $\theta_{j-1}^w$  先貢獻到 $e$ 然后進行相應的更新,至此,CBOW  模型已全部推倒完成。接下來便是另一種基於  Hierarchical Softmax 的模型 Skip-gram 模型。

2)Skip-gram Model

Skip-gram  的任務是給出詞 $w$ 來預測其前后各 $c$ 個詞語 $context(w)$ ,其推倒與 CBOW 大同小異,網絡結構也是大體相同,如下圖:

Input  Layer

  對於輸入詞語 $w$ ,轉化為詞向量的形式  $\mathbf{v}(w) \in \mathbb{R}^m$ 當做輸入

Projection  Layer

  由於只有一個詞向量 $\mathbf{v}(w)$ ,投影層其實是多於的,只是為了和 CBOW 做對比

Output  Layer

  同 CBOW 一樣為 一顆 Huffman 樹

 CBOW 的任務是給定 $context(w)$ 計算 $w$, 對應概率為 $p(w|context(w))$ ,而 Skip-gram 的任務是給定 $w$ ,來預測 $context(w)$ ,其對應的概率為 $p(w|context(w))$ , Skip-gram將 $p(w|context(w))$ 定義為如下的形式:

\[ p(context(w)|w) = \prod p(w'|w)  \ , \ \ w' \in context(w) \]

類似於 CBOW 中 Hierarchical Softmax 的思想,每個 $w'$ 的概率可以表達為 $p(w'|w) = \prod_{i=2}^{l^{w'}}p(d_i^{w'}|\mathbf{v}(w),\theta_{i-1}^{w'})$ ,其中:

\[p(d_i^{w'}|\mathbf{v}(w),\theta_{i-1}^{w'}) = \left[ \sigma(\theta^{w' \ T}_{i-1}\mathbf{v}(w))  \right]^{1-d_i^{w'}} \cdot \left[ 1-\sigma(\theta^{w' \ T}_{i-1}\mathbf{v} (w))  \right]^{d_i^{w'}} \]

接下來寫出似然函數的具體形式:

有了以上目標函數,接下來就可以進行進一步的對 $\theta^{w'} , \  \mathbf{v}(w)$ 求導.

同樣,記 $L(w,w',i) =\left \{ (1-d_i^{w'}) \cdot log \left [\sigma (\theta^{w'\ T}_{i-1}\mathbf{v}(w)) \right ] +d_i^{w'} \cdot log\left [1-\sigma (\theta^{w' \ T}_{i-1}\mathbf{v}(w)) \right ]\right \}$ ,接下來對 $L(w,w',i)$ 對參數分別進行求導:

\begin{aligned}
\frac{\partial L(w,w',i)}{\partial \theta_{i-1}^{w'}}
&= \frac{\partial}{\partial \theta_{i-1}^{w'}}\left \{ (1-d_i^{w'}) \cdot log \left [\sigma (\theta^{w'\ T}_{i-1}\mathbf{v}(w)) \right ] +d_i^{w'} \cdot log\left [1-\sigma (\theta^{w' \ T}_{i-1}\mathbf{v}(w)) \right ]\right \} \\
&= (1-d_i^{w'}) \cdot \left [1- \sigma (\theta^{w'\ T}_{i-1}\mathbf{v}(w)) \right ] \cdot \mathbf{v}(w) +d_i^{w'} \cdot \left [1-\sigma (\theta^{w' \ T}_{i-1}\mathbf{v}(w)) \right ] \cdot \mathbf{v}(w) \\
&=\left [ 1 -d_i^{w'}-\sigma (\theta^{w'\ T}_{i-1} \mathbf{v}(w)) \right ]\cdot \mathbf{v}(w) \\
\end{aligned}

根據對稱性可得到 $\mathbf{v}(w)$ 的導數:

\begin{aligned}
\frac{\partial L(w,w',i)}{\partial\mathbf{v}(w)} =\left [ 1 -d_i^{w'}-\sigma (\theta^{w'\ T}_{i-1} \mathbf{v}(w)) \right ]\cdot \theta^{w'\ T}_{i-1} \\
\end{aligned}

現在可以得到 $\mathbf{v}(w)$ 與 $\theta^{w'\ T}_{i-1}$ 的更新公式分別為:

\begin{aligned}
\theta^{w'}_{i-1} &: =\theta^{w'}_{i-1} + \eta \left[1-d_i^{w'} -\sigma(\theta^{w' \ T}_{i-1} \mathbf{v}(w))\right ] \cdot \mathbf{v}(w) \\
\mathbf{v}(w) &: =\cdot \mathbf{v}(w) + \eta \sum_{w' \in context(w)} \sum_{i=2}^{l^{w'}}\left[1-d_i^{w'}- \sigma(\theta^{w' \ T}_{i-1} \mathbf{v}(w)) \right ] \cdot \theta^{w'}_{i-1}
\end{aligned}

綜上,當給定輸入為 $w \ ,context(w)$ 時,給出 Skip-gram  主要部分的偽代碼:

\begin{aligned}
& e = 0 \\
& for \ \ w'\in context(w) \ \ do: \\
& \ \ \ \ \ for \ i=2 \rightarrow l^{w'} \ do: \\
&\ \ \ \ \ \ \ \ \ \ \ q = \sigma(\theta^{w' \ T}_{i-1}\mathbf{v}(w)) \\
&\ \ \ \ \ \ \ \ \ \ \ g = \eta (1-d_i^{w'}-q)\\
&\ \ \ \ \ \ \ \ \ \ \ e := e+ g \cdot \theta^{w'}_{i-1} \\
&\ \ \ \ \ \ \ \ \ \ \ \theta^{w'}_{i-1} := \theta^{w'}_{i-1} +g \cdot \mathbf{v}(w) \\
&\mathbf{v}(w) := \mathbf{v}(w) +e
\end{aligned}

但 Skip-gram 的實現 word2vec 並不是等 $context(w)$ 中的所有詞 $w'$ 處理完后才刷新 $ \mathbf{v}(w) $ ,而是每處理一個詞就刷新一次,即

\begin{aligned}
& for \ \ w'\in context(w) \ \ do: \\
& \ \ \ \ \ e = 0 \\
& \ \ \ \ \ for \ i=2 \rightarrow l^{w'} \ do: \\
&\ \ \ \ \ \ \ \ \ \ \ q = \sigma(\theta^{w' \ T}_{i-1}\mathbf{v}(w)) \\
&\ \ \ \ \ \ \ \ \ \ \ g = \eta (1-d_i^{w'}-q)\\
&\ \ \ \ \ \ \ \ \ \ \ e := e+ g \cdot \theta^{w'}_{i-1} \\
&\ \ \ \ \ \ \ \ \ \ \ \theta^{w'}_{i-1} := \theta^{w'}_{i-1} +g \cdot \mathbf{v}(w) \\
& \ \ \ \ \ \mathbf{v}(w) := \mathbf{v}(w) +e
\end{aligned}

至此,基於 Hierarchical Softmax 的兩個模型 CBOW 與 Skip-gram 均介紹完成。接下來是更加快速的基於 Negative-Sampling 的模型。

基於 Negative-Sampling 的模型

基於 Hierarchical Softmax 兩個模型采用的 Huffman 樹結構雖然大大優化了 NNLM 中的 softmax 層,但仍屬於比較復雜的結構,有咩有更簡單的方法呢,Mikolov提出的一種基於 Negative Sampling 的模型,他可以用來進一步提高訓練速度,並且可以改善詞向量的質量

1)CBOW 模型

在 CBOW 中,任務是給定詞語 $w$ 來預測期上下文 $context(w)$ ,因此對於給定的 $context(w)$ , $w$ 就是一個正樣本,語料庫中其他詞就是負樣本了,所謂的負采樣就是說在語料庫中采樣得到一批負樣本 $\hat{w}_i$ 構造負樣本集合 $ N(w) = \left \{ \hat{w}_i \right \} \neq \phi $ ,合起來寫作 $ Neg(w) = N(w) \cup \left\{  w \right \} $ ,則樣本 $w' \in Neg(w)$ 對應的正負標簽可表示為:

\[L^w(w')=\left\{
\begin{aligned}
1 , \ \ \ w' = w \\
0 , \ \ \ w' = \hat{w} \\
\end{aligned}
\right.\]

現在通過集合 $Neg(w)$ 來構造合適的語言模型 $p(w,context(w))$ ,首先寫出單個詞語,我們希望最大化:\[ \prod_{w' \in Neg(w)}p(w'|context(w))\]

其中:

\[p(w'|context(w))=\left\{
\begin{aligned}
\sigma(\mathbf{x}_w^T\theta^{w'}), \ \ \ \ \ \ & L^{w}(w') = 1 \\
1-\sigma(\mathbf{x}_w^T\theta^{w'}), \ & L^{w}(w') = 0 \\
\end{aligned}
\right.\]

寫到一起有:

\[p(w'|context(w))= \left [\sigma(\mathbf{x}_w^T\theta^{w'})  \right ] ^{L^w(w')} \cdot \left [1-\sigma(\mathbf{x}_w^T\theta^{w'})  \right ] ^{1-L^w(w')}\]

這里 $\mathbf{x}_w$ 仍為 $context(w)$ 中詞向量的和, $\theta^{w'} \in\mathbb{R}^m$ 表示詞語 $w'$ 對應的輔助向量,對於單個輸入 $w$ ,現在就要最大化:

\[\left[ \sigma(\mathbf{x}_w^T\theta^{w})  \right ] \prod_{\hat{w}\in N(w)}  \left [1-\sigma(\mathbf{x}_w^T\theta^{\hat{w}})  \right ]  \]

最大化上式等價於最大化 $w$ 為正類,而所有 $\hat{w}$ 為負類的聯合概率。即增大正樣本概率的同時,降低負樣本的概率,現在對於給定的語料庫 $C$ ,似然函數可以寫成:

\[L = \prod_{w \in C} \prod_{w' \in Neg(w)} p(w'|context(w))\]

現在根據似然函數來找到參數的極大值即可:

\begin{aligned}
L &= \prod_{w \in C} \prod_{w' \in Neg(w)} p(w'|context(w)) \\
\Rightarrow \\
logL &=log \left [ \prod_{w \in C} \prod_{w' \in Neg(w)} p(w'|context(w)) \right ] \\
&= \sum_{w \in C} log \prod_{w' \in Neg(w)} p(w'|context(w)) \\
&=\sum_{w \in C} log \prod_{w' \in Neg(w)} \left \{ \left [\sigma(\mathbf{x}_w^T\theta^{w'}) \right ] ^{L^w(w')} \cdot \left [1-\sigma(\mathbf{x}_w^T\theta^{w'}) \right ] ^{1-L^w(w')} \right \} \\
&=\sum_{w \in C} \sum_{w' \in Neg(w)} \left \{ L^w(w') \cdot log\left [\sigma(\mathbf{x}_w^T\theta^{w'}) \right ] + \left [1-L^w(w') \right ] \cdot log \left [1-\sigma(\mathbf{x}_w^T\theta^{w'}) \right ] \right \}
\end{aligned}

同樣通過梯度上升的方式求解,首先記:

\[L(w,w') = \left \{ L^w(w') \cdot log\left [\sigma(\mathbf{x}_w^T\theta^{w'}) \right ] + \left  [1-L^w(w') \right ] \cdot log \left[1-\sigma(\mathbf{x}_w^T\theta^{w'}) \right ] \right \}\]

首先看 $L(w,w')$ 對 $\theta^{w'}$ 的梯度:

\begin{aligned}
\frac{\partial L(w,w') }{\partial \theta^{w'}} &=\frac{\partial }{\partial \theta^{w'}} \left \{ L^w(w') \cdot log\left [\sigma(\mathbf{x}_w^T\theta^{w'}) \right ] + \left [1-L^w(w') \right ] \cdot log \left[1-\sigma(\mathbf{x}_w^T\theta^{w'}) \right ] \right \} \\
&=L^w(w') \cdot \left [1-\sigma(\mathbf{x}_w^T\theta^{w'}) \right ]\mathbf{x}_w - \left [1-L^w(w') \right ] \cdot \left[\sigma(\mathbf{x}_w^T\theta^{w'}) \right ]\mathbf{x}_w \\
&=\left [ L^w(w') - \sigma(\mathbf{x}_w^T\theta^{w'}) \right ]\mathbf{x}_w
\end{aligned}

同樣,考慮 $\mathbf{x}_w$ 與 $\theta^{w'}$ 的對稱性,可得到 $L(w,w')$ 關於 $\mathbf{x}_w$ 的導數:

\[\frac{\partial L(w,w') }{\partial \mathbf{x}_w} = \left [ L^w(w') - \sigma(\mathbf{x}_w^T\theta^{w'}) \right ]\theta^{w'} \]

因此當給定輸入為 $w$ ,$context(w)$ ,對於 $\bar{w} \in context(w)$ 與 $\theta^{w'} , \ w' \in Neg(w)$ ,分別給出$\theta^{w'} ,\mathbf{v}(\bar{w}) $ 的梯度更新公式:

\[\theta^{w'}  = \theta^{w'}  + \eta \left [  L^{w}(w') - \sigma(\mathbf{x}_w^T\theta^{w'}) \right ] \mathbf{x}_w  \ \ \ \ \ \mathbf{v}(\bar{w})  = \mathbf{v}(\bar{w})  + \eta \sum_{w' \in Neg(w)} \frac{\partial L(w,w') }{\partial \mathbf{x}_w}  \]

 綜上給出 基於 Negative Sampling 的 CBOW 的梯度上升代碼

\begin{aligned}
\ &e = 0 \\
\ &\mathbf{x}_w = \sum_{\bar{w} \in context(w) } \mathbf{v}(\bar{w} ) \ \ \ \ \\
\ &for \ w' \in \ Neg(w) \ do: \\
&\ \ \ \ \ \ q = \sigma(\mathbf{x}_w^T \theta^{w'}) \\
&\ \ \ \ \ \ g = \eta (L^w(w')-q)\\
&\ \ \ \ \ \ e := e+ g \cdot \theta^{w' } \\
&\ \ \ \ \ \ \theta^{w'} := \theta^{w'} +g \cdot \mathbf{x}_w \\
\ &for \ \bar{w} \in conetxt(w) : \\
&\ \ \ \ \ \ \mathbf{v}(\bar{w} ) := \mathbf{v}(\bar{w} ) +e
\end{aligned}

至此,基於 Negative-Sampling 的CBOW 全部介紹完畢。

2) Skip-gram 模型

 與 CBOW 任務相反,Skip-gram 的任務是給定 $w$ ,來預測 $context(w)$ ,這時我們要對每個 $\bar{w} \in context(w)$ ,來產生一個負采樣集合 $N(\bar{w})$ ,與 $\left \{ \bar{w} \right\}$ 一起生成 $Neg(\bar{w})$ ,可見對於每個樣本  $\bar{w}$  Skip-gram的任務是這樣的

\[p(context(w)|w) = \prod_{\bar{w} \in context(w)} p(\bar{w}|w)\]

結合構造的負樣本集,對每個 $\hat{w}$ ,我們要最大化的聯合概率是:

\[p(context(w)|w) = \prod_{\bar{w} \in context(w)} p(\bar w|w)\prod_{w' \in Neg(\bar{w})}p(w'|\bar w)\]

這里,如果對 $w'$ ,滿足 $w' \in Neg(\bar w) $ 且 $w' = \bar w$ ,(即 $w'$ 為負采樣集合中的自身),則 $L^{w}(w') = 1$,否則 $L^{w}(w') = 0$ ,這即為人工指定的標簽。 現在可以寫出:

\[ p(w'|\bar w)=\begin{cases}
&\sigma(\mathbf{v}(w)^T \theta^{(w')}), \ \ \ \ \ \ L^{w}(w') = 1\\ 
&1-\sigma(\mathbf{v}(w)^T \theta^{(w')}), \ L^{w}(w') = 0\\ 
\end{cases} \]

寫到一起:

\[p(w'|\bar w) = \left [\sigma(\mathbf{v}(w)^T \theta^{(w')})  \right ]^{L^w(w')}+\left [1-\sigma(\mathbf{v}(w)^T \theta^{(w')})  \right ]^{1-L^w(w')}\]

現在可以寫出整個語料庫的似然函數:

\begin{aligned}
L &= \prod_{w \in C}p(context(w)|w) \\
&= \prod_{w \in C}\prod_{\bar w \in context(w)}p(\bar w|w) \\
&= \prod_{w \in C}\prod_{\bar w \in context(w)}\prod_{w' \in Neg(\bar w)}p(w'|\bar w,w)\\
\Rightarrow \\
logL&=\sum_{w \in C}log\prod_{\bar w \in context(w)}\prod_{w' \in Neg(\bar w)}\left \{ \left [\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]^{L^w(w')}+\left [1-\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]^{1-L^w(w')} \right \}\\
&=\sum_{w \in C}\sum_{\bar w \in context(w)}\sum_{w' \in Neg(\bar w)}\left \{L^w(w') \cdot log \left [\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]+ \left [1- L^w(w') \right ] \cdot log \left [1-\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ] \right \}
\end{aligned}

 接下來對參數求導即可,另:

\[L(w,\bar w, w') = L^w(w') \cdot log \left [\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]+ \left [1- L^w(w') \right ] \cdot log \left [1-\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]\]

從而得到 $L(w,\bar w ,w')$ 關於 $\mathbf{v}(w)$ 與 $\theta^{w'}$ 的梯度:

 \begin{aligned}
\frac{\partial L(w,\bar w, w')}{\partial \theta^{w'}} &= \frac{\partial }{\partial \theta^{w'}}L^w(w') \cdot log \left [\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]+ \left [1- L^w(w') \right ] \cdot log \left [1-\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ] \\
&=L^w(w') \left [1-\sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]\mathbf{v}(w)-\left [1- L^w(w') \right ]\sigma(\mathbf{v}(w)^T \theta^{w'})\mathbf{v}(w) \\
&=\left [L^w(w')- \sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]\mathbf{v}(w)
\end{aligned}

根據對稱性:

\[\frac{\partial L(w,\bar w, w')}{\partial \mathbf{v}(w) } = \left [L^w(w')- \sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]\theta^{w'}\]

接下來可以寫出隨機坐標上升法的參數更新公式:

\[\theta^{w'} := \theta^{w'} + \eta \left [L^w(w')- \sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]\mathbf{v}(w)\]

\[\mathbf{v}(w) := \mathbf{v}(w) + \eta \sum_{ \bar w \in context(w)} \sum_{w' \in Neg(\bar w)} \left [L^w(w')- \sigma(\mathbf{v}(w)^T \theta^{w'}) \right ]\theta^{w'}\]

這里給出基於 Negative-Sampling 的 Skip-gram 的隨機梯度上升的偽代碼:

\begin{aligned} 
for \ \bar w &\ \in context(w) \ do:\\
\ \ \ \ \ &e = 0 \\
\ \ \ \ \ &for \ w' \in \ Neg(\bar w) \ do: \\
&\ \ \ \ \ \ q = \sigma(\mathbf{v}(w)^T \theta^{w'}) \\
&\ \ \ \ \ \ g = \eta (L^w(w')-q)\\
&\ \ \ \ \ \ e := e+ g \cdot \theta^{w' } \\
&\ \ \ \ \ \ \theta^{w'} := \theta^{w'} +g \cdot \mathbf{v}(w) \\
&\mathbf{v}(w ) := \mathbf{v}(w ) +e
\end{aligned}

 注意,這里並不是等所有  $\bar{w}$ 處理完后更新 $\mathbf{v}(w )$ ,而是處理一個 $\bar{w}$ 更新一次,同層次 softmax 的處理方式。

 3)Negative-Sampling方法

以上兩小節只是給出基於負采樣的訓練算法,這里承接上文,對給定的詞語 $w$ , 給出負樣本集 $Neg(w)$ 的選取方法,負樣本選取遵循的規律是頻率高則被選擇的概率較大,反之較小,對於詞典 $V$ ,每個詞語的權重可以表示為:

\[p(w) = \frac{count(w)}{\sum_{w' \in V}count(w')}\]

$count(w)$表示詞語 $w$ 在語料庫 $C$ 的計數,類似於 $LDA$ 中的 $Gibbs Sampling$,將 $p(w)$ 累加起來,即

\begin{aligned}
for \ &i = 1 \rightarrow |V|-1 \ do: \\
&p[i] :=p[i] +p[i-1]
\end{aligned}

如果按照 $u \sim (0-p[|V|-1])$ 來生成一個隨機數,看隨機數落在哪個區間 $(p[k] \sim p[k+1])$,進而選取詞語 $k$ ,這種做法無疑會大大增加時間復雜度,所以,可以對數組 $p$ 建立索引,即建立長度為 $M$ 的數組 $m$ ,使 $M >> |V| -1$ ,這樣每個每個 $m[i] , i \in (1,M-1) $會對應一個 $p[k]$ ,每次生成一個 $1 \sim M$ 的隨機數 $n$,采樣結果為: $m[n] = p[k]$ 即可,原本已線性時間采樣,現在變成了$O(1)$ ,具體可以看下圖:

如果采樣到自身,直接跳過即可, Google 的 word2vec 實現采取 $M =10^8$ ,且 p 的計算如下:

\[p(w) = \frac{count(w)^{\frac{3}{4}}}{\sum_{w' \in V}count(w')^{\frac{3}{4}}} \] 

至此, word2vec 已經全部介紹完畢,有機會再繼續深入,現在一些 paper 的工作集中在詞向量的可解釋性與詞向量的本質,好像說與 LSA 的 SVD 矩陣分解是等價的,具體到時候再看。

參考:

[1] Bengio Y, Schwenk H, Senécal J S, et al. A neural probabilistic language model[J]. Journal of Machine Learning Research, 2003, 3(6):1137-1155.

[2] Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.

[3] Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. Advances in Neural Information Processing Systems, 2013, 26:3111-3119.

[4]word2vec中的數學


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM