論文學習:基於Hierarchical Softmax的CBOW模型

看到一篇寫的非常好的關於 word2vec 文章《word2vec中的數學原理詳解》[1],本來想着看完之後按自己對知識的整理做一下記錄,但是覺得原文作者(peghoty)寫的太好了,這裏按作者寫作邏輯記錄一下個人的學習筆記吧。

目錄

一、統計語言模型

(一)貝葉斯公式

(二)統計語言模型

二、n-gram 模型

(二)大數定理

(二)n-gram

三、基於Hierarchical Softmax的CBOW 模型

(一)網絡結構

(二)梯度計算


一、統計語言模型

(一)貝葉斯公式

貝葉斯公式應該都熟悉:

  • p(A|B)=\frac{p(A,B)}{p(B)}=\frac{p(B|A)p(A)}{p(B)}

(二)統計語言模型

例:藉助於貝葉斯公式給出了在語音識別系統中,給定語音段 Voice ,找到使得概率 p(Text|Voice) 最大的文本 Text ,公式如下:

  • p(Text|Voice)=\frac{p(Voice,Text)}{p(Voice)}=\frac{p(Voice|Text)p(Text)}{p(Voice)}

這裏 p(Voice|Text)聲學模型p(Text)語言模型,這裏我們只關注於語言模型的計算。

簡單來說,統計語言模型是構建一個基於語料庫的用來計算句子概率的概率模型。假設 W=\omega _{1}^{T}:=(\omega _{1},\omega _{2},...,\omega _{T}) 表示 T 個詞 \omega _{1},\omega _{2},...,\omega _{T} 按順序構成的句子,則 \omega _{1},\omega _{2},...,\omega _{T} 的聯合概率是:

  • p(W)=p(\omega _{1}^{T})=p(\omega _{1},\omega _{2},...,\omega _{T})

利用貝葉斯公式上式可被鏈式分解爲:

  • p(W)=p(\omega _{1}^{T})=p(\omega _{1},\omega _{2},...,\omega _{T})=p(\omega _{\omega _{1},...,\omega _{T-1}})\cdot p(\omega _{T}|\omega _{1},...,\omega _{T-1})=p(\omega _{\omega _{1},...,\omega _{T-2}})\cdot p(\omega _{T-1}|\omega _{1},...,\omega _{T-2})\cdot p(\omega _{T-1}|\omega _{1}^{T-1})=p(\omega _{1})\cdot p(\omega _{2}|\omega _{1})\cdot p(\omega _{3}|\omega _{1}^{2}) \cdot \cdot \cdot p(\omega _{T}|\omega _{1}^{T-1})

用通用的白話說就是:長句的概率 =1 個詞的概率 \times 第 1 個詞出現的情況下第 2 個詞的概率 \times 第 1 2 個詞出現的情況下第 3 個詞的概率 \times ...  \times 之前所有詞出現的情況下第 T 個詞的概率。

這種計算方式存在的問題是計算這些概率需要的成本太高。引用原作者的話:“假設語料庫對應詞典 D 的代銷(即詞彙量)爲 N ,那麼,如果考慮長度爲 T 的任意句子,理論上就有 N^{T} 種可能,而每種可能都要計算 T 個概率,總共就需要計算 TN^{T} 個概率”。針對該問題,常見的方法有 n-gram 模型和神經網絡兩種方法。

二、n-gram 模型

(二)大數定理

不失一般性地,我們從上述利用貝葉斯公式鏈式分解的 p(W)=p(\omega _{1})\cdot p(\omega _{2}|\omega _{1})\cdot p(\omega _{3}|\omega _{1}^{2}) \cdot \cdot \cdot p(\omega _{T}|\omega _{1}^{T-1}) 中抽取一個概率 p(\omega _{T}|\omega _{1}^{T-1}) ,利用貝葉斯公式,有:

  • p(\omega _{T}|\omega _{1}^{T-1})=\frac{p(\omega _{1}^{T})}{p(\omega _{1}^{T-1})}=\frac{count(\omega _{1}^{T})}{count(\omega _{1}^{T-1})}

這裏,count(\omega _{1}^{T}) 和 count(\omega _{1}^{T-1}) 分別是當語料庫足夠大時,根據大數定理表示的 \omega _{1}^{T} 和 \omega _{1}^{T-1} 在語料中出現的次數,當 T 很大時,計算 count(\omega _{1}^{T}) 和 count(\omega _{1}^{T-1}) 所耗的時間很長( count(\omega _{1}^{T}) 表示語料庫中同時包含詞 \omega _{1},\omega _{2},...,\omega _{T} 的語料數量,這意味着在計數過程中需要對每條語料進行判斷 T 次)。

(二)n-gram

首先得提一下馬爾科夫假設:下一個詞的出現僅依賴於它前面的 n-1 個詞。現在我們可以把概率 p(\omega _{T}|\omega _{1}^{T-1}) 近似表示:

  • p(\omega _{T}|\omega _{1}^{T-1})\approx p(\omega _{T}|\omega _{T-n+1}^{T-1})=\frac{count(\omega _{T-n+1}^{T})}{count(\omega _{T-n+1}^{T-1})}

該方法可顯著降低計算複雜度,實際應用中最常採用的是 n=3三元模型(即依賴於該詞之前的兩個詞)。

三、基於Hierarchical Softmax的CBOW 模型

(一)網絡結構

論文Exploiting Similarities among Languages for Machine Translation[2]給出了 CBOW 模型的網絡結構,如下圖1

圖1:CBOW模型

 該網絡結構包括三層:輸入層、投影層和輸出層。模型是在已知當前詞 \omega _{t} 的上下文 \omega _{t-2},\omega _{t-1},\omega _{t+1},\omega _{t+2}  的前提下預測當前詞 \omega _{t} ,即計算 p(\omega_{t} |Context(\omega_{t} )) ,這裏 Context(\omega_{t} )  表示詞 \omega _{t} 的上下文集合{}\left \{ \omega _{t-2},\omega _{t-1},\omega _{t+1},\omega _{t+2}\right \}

  1. 輸入層:當前詞 \omega _{t}上下文 \omega _{t-2},\omega _{t-1},\omega _{t+1},\omega _{t+2}  對應的詞向量 v(\omega _{t-2}),v(\omega _{t-1}),v(\omega _{t+1}),v(\omega _{t+2})\in \mathbb{R}^{m}。這裏 m 表示詞向量的長度\mathbb{R}^{m} 表示詞向量空間
  2. 投影層:將輸入層的 4 個向量做求和累加,即 x_{\omega } = v(\omega _{t-2})+v(\omega _{t-1})+v(\omega _{t+1})+v(\omega _{t+2})\in \mathbb{R}^{m}
  3. 輸出層:輸出層對應一棵二叉樹,它是以語料中出現過的詞當葉子結點,以各詞在語料中出現的次數當權值構造出來的 Huffman 樹。在這棵 Huffman 樹中,葉子結點共 N(=|D|) 個,分別對應 D 中的詞,非葉子結點 N-1 個(葉子結點兩兩合併得到的新結點數)。(具體內容見另一篇博客[3]

圖2 給出一個特殊的 CBOW 網絡結構

圖2:CBOW網絡結構

(二)梯度計算

 原作者給出了若干相關記號,這裏稍微修改一下,就上圖2 ,我們考慮詞 \omega 爲“夏天”的情況,記:

  1. p :從根結點出發到達 \omega 對應葉子結點的路徑(38→23→9→4→3)
  2.  l :路徑 p 中包含結點的個數(5 個:38,23,9,4,3)
  3.  p_{1},p_{2},...,p_{l} :路徑 p 中的第 l 個節點,其中 p_{1} 表示根結點,p_{l} 表示詞 \omega 對應的結點p_{1} 表示 38 對應的結點)
  4.  d_{2},d_{3},...,d_{l}\in \left \{ 0,1 \right \} :詞 \omega 的 Huffman編碼,根結點不對應編碼,故沒有 d_{1}d_{2}=1 )。
  5.  \theta _{1},\theta _{2},...,\theta _{l-1}\in \mathbb{R}^{m} :路徑 p 中非葉子結點對應的向量(以“夏天”爲例,共有 l-1=4 個非葉子結點)

爲什麼用 Huffman 樹作爲 CBOW 的輸出呢?原作者的原話如下:

        以圖2 中詞 \omega 是“夏天”爲例,從根結點出發到“夏天”這個葉子結點,中間共經歷了 4 詞分支(每天紅色的邊對於一次分支),而每次分支都可視爲進行了一次二分類

        既然是從二分類的角度來考慮問題,那麼對於每一個非葉子結點,就需要爲其左右子結點制定一個類別,即哪個是正類(標籤爲 1 ),哪個是負類(標籤爲 0 )。碰巧,除根結點以外,數中每個結點都對應了一個取值爲 0 或 1 的 Huffman 編碼。因此,一種最自然的做法就是將 Huffman 編碼爲 1 的結點定義爲正類,編碼爲 0 的結點定義爲負類。當然,這只是個約定而已,你也可以將編碼爲 1 的結點定義爲負類,而將編碼爲 0 的結點定義爲正類。事實上, word2vec 選用的就是後者,即約定:

Lable(p_{i})=1-d_{i},i=2,3,...,l

 簡而言之,將一個結點進行分類時,分到左邊就是負類,分到右邊就是正類

使用 sigmoid 激活函數,一個結點被分爲正類的概率是:

  • \sigma (x_{w}^{T}\theta )=\frac{1}{1+exp(-x_{w}^{T}\theta )}

 被分爲負類的概率也就是:

  • 1-\sigma (x_{w}^{T}\theta )

最後,對於詞典 D 中的任意詞 \omegaHuffman 樹中必存在一條從根結點到詞 \omega 對應結點的路徑 p (且唯一)。 路徑 p 上存在 l-1 個分支,將每個分支看做一次二分類,每一次分類就產生一個概率,將這些概率乘起來,就是所需的 p(\omega |Context(\omega ))

 注意到這裏的 \theta 是路徑 p 中非葉子結點對應的向量,熟悉 BP 神經網絡(不懂的可以看我的另一篇博客[4])的讀者應該就知道使用隨機梯度下降法需要優化的參數了。

BP 神經網絡中,輸出層的結果與真實值計算均方誤差MSE),並通過誤差的反向傳播方式來降低誤差,從而優化神經網絡中的權重矩陣;在 CBOW 模型中,輸出層的結果與真實值之間的均方誤差被替換爲概率 p(\omega |Context(\omega )) ,我們的目標變爲提高概率,故通過隨機梯度上升法來對非葉子結點向量集 \left \{ \theta _{1},\theta _{2},...,\theta _{l-1} \right \} 進行優化。繼而對詞 \omega詞向量進行優化。

公式有:

  • \theta _{j-1}:=\theta _{j-1}+\eta [1-d_{j}-\sigma (x^{T}\theta _{j-1})]x
  • v(\tilde{\omega })}:=v(\tilde{\omega })}+\eta \sum_{j=2}^{l}[1-d_{j}-\sigma (x^{T}\theta _{j-1})]\theta _{j-1}

[1] https://www.cnblogs.com/peghoty/p/3857839.html

[2] Mikolov T , Le Q V , Sutskever I . Exploiting Similarities among Languages for Machine Translation[J]. computer science, 2013.

[3] https://blog.csdn.net/qq_41297934/article/details/105169804

[4] https://blog.csdn.net/qq_41297934/article/details/104863418

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