Word2vec理解推導

     一旦提到自然語言處理,想必大家都會接觸到經典模型Word2vec,他是用來將單詞矢量化的一個模型,已經被證明所轉換的單詞具有語義話意義,平時我們在處理文本數據時,經常會遇到數據稀疏導致訓練困難的問題,舉個例子,有三個單詞,dog,cat,bird,如果按找平常one-hot的思維,那麼會被轉換成如下形式

  dog cat bird
  1 0 0
  0 1 0
  0 0 1

 

試想一下,若語料庫有幾十萬個單詞,那麼按如上轉換方法矩陣的維度會有多大,並且矩陣中大部分數據都是0,這種情況我們稱爲稀疏矩陣,在訓練上處理起來非常困難(你的內存會爆[微笑]),接着我們的google工程師出馬了,怎麼辦呢,壓縮呀!把矩陣維度要給搞下來啊,這個過程官方稱爲Distributed representation(分佈式表達),它的思路是通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關係。這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。在上面的基礎上稍微解釋一樣,所謂分佈式表達就是找到一列通俗的向量去衡量這些詞,例如用腿的數量去衡量dog,cat,bird,數字越大代表腿越多,這個是我隨便舉的一個,意會一下就行。

  dog cat bird
腿的數量 0.8 0.8 0.5
行走的速度 0.5 0.6 0.7

接下來進入正題了,word2vec分爲CBOW和SG模型,先從CBOW開始說

1.CBOW

 1.1 一個單詞的文本

如圖上爲最簡單的通過一個單詞通過one-hot(形式爲{x1,x2,...xv})作爲輸入,有

Vwi即是輸入單詞Wi的向量表示。

 

隱藏層---->輸出層

有另一個N*V的權重矩陣W'={W'ij},通過這個權重矩陣,我們可以計算詞彙表中每個單詞的得分Uj

接着就可以使用softmax來得到單詞的後驗分佈

基於上述公式可得到

Vw和V‘w都是單詞w的兩種表示,Vw來自w矩陣的行,V’w來自矩陣W’的列,在隨後分析中我們將 Vw稱爲單詞w的輸入向量,V’w爲單詞w的輸出向量。

 

隱藏層---->輸出層的權重更新公式

其中j*是輸出層中實際單詞的索引,uj是詞彙中第j個單詞的得分

所以損失函數是

 其中tj=1(j=j*),當且僅當第j個單元是真實輸入單詞時tj=1,否則tj=0,這個導數ej表示輸出層第j個單詞的預測誤差。

接下來,我們利用w'ij的導數求出隱藏層--->輸出層的梯度

再通過隨機梯度下降,我們得到輸出權重的更新公式

 

輸入層---->隱藏層的權重更新公式 

接下來,計算E對w的導數,回想起隱藏層對輸入層的值進行線性計算

我們得到V*N矩陣,X中只有一個元素是非零的,E對W的偏導中只有一列是非零的,那一列的值爲EH^T,N維向量得到W的更新等式

Vwi是W中一行,唯一單詞的輸入向量,並且是W的導數中唯一一行非0的,W中其它行在接下來迭代中都不會改變,因爲他們的的導數都是0.

 

1.2 多詞文本(Multi-word Context) 

 CBOW的核心即是輸入某個特定單詞的上下文單詞向量,輸出這個特定單詞的向量

根據上述說的輸入一個單詞情況理論,我們容易推出多詞向量情況,隱藏層爲權重乘向量相加取平均

C爲文本中單詞數量,其損失函數爲

 

2.Skip-Gram Model

skip-gram模型和CBOW模型剛好相反,其輸入爲特定單詞向量,輸出爲其單詞的上下文單詞向量 

在輸出層,不止輸出一個多項式分佈,輸出C個多項式分佈,每一個輸出通過同一個隱藏-輸出矩陣計算

Wc,j是輸出層的C塊的第j個單詞,Wo,c是輸出上下文中第C個詞,Wi是唯一的輸入單詞,Yc,j是輸出層中第C塊的第j個單元的輸出,Uc,j是輸出層中第C塊j單元的淨輸入,由於輸出塊使用同樣的權重,那麼

其中V’wj是詞彙表中第j個單詞的輸出向量,並且V'wj是W‘權重矩陣的一列 。

其損失函數爲

 

 3.寫在最後

     平時在使用gensim等工具訓練詞向量的時候,我們關心的並不是訓練網絡的輸出,而是訓練過程中的副產物權重作爲我們的詞向量embedding,即上面所提的輸入向量和輸出向量,一般我們都是採用輸入向量。

 

參考論文:word2vec Parameter Learning Explained

 

 

 

 

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