1. 程式人生 > >word2vec 學習和理解

word2vec 學習和理解

這裡先按吳恩達老師的課程講解的softmax做一個筆記,和之前看的一個大神的文章,相對比,來方便我對word2vec的理解。

 

 

目的:學習一個詞嵌入矩陣E。

手段:構建一個語言模型。

 

最老的方法:

預測一個句子(4個詞)之後的下一個詞是什麼。

例如,下面是一個樣本:

a glass of orange (juice).

樣本輸入: a glass of orange

樣本輸出:juice

 

實際上,我們會遍歷一篇文章,然後文章中如果有這麼一句話a glass of orange (juice).

它就可以作為一個樣本了。

I want a glass of orange juice.

這樣的句子,按照視窗為4來處理的話,可能會有如下的樣本: 

樣本輸入(樣本輸出)

want a glass of (orange)

want a glass of (apple)

want a glass of (mango)

這樣, 經過訓練之後,orange apple mango等詞彙就會有相近的詞向量。

(為什麼?以後可以再思考解釋一下。暫時沒想通)

 

訓練的模型為:

詞嵌入矩陣E,隨機初始化。假設one-hot表示有10000個詞(實際更多),詞向量維度是300,那麼E大小為300*10000

開始:

(1)->4個詞的one-hot 

(2)-> 乘以E,得到4個詞的詞向量表示,合併成一個大的向量 

(3)-> 輸入到一個隱藏層

(4)-> 輸出到一個softmax

(5)-> 輸出為樣本輸出。

 

輸入層:詞向量維度為300,那麼(2)得到的向量長度為4*300 = 1200,即輸入層有1200個特徵。

隱藏層:假設隱藏層的啟用項有500個(可能沒那麼少,這裡打個比方),那麼隱藏層權重矩陣W1 是 1200*500的。不過這層的引數我們不關注。

softmax層:為了獲得一個詞庫總量(本例為10000詞)的分類器。所以softmax的權重為W2 = 500*10000.

分類器如下:

e_Vi是隱藏層的輸出,i表示one-hot的第一個詞。Si是樣本輸出表示的單詞。

可以看到,分母有一個超大的求和,大小為one-hot詞向量大小,這個例子是10000。

為了計算得到一個樣本的損失函式,需要進行10000次求和。

這個計算簡直不能忍的。

 

於是後面會有其他的模型來解決這個求和量過大的問題(還會解決這個模型的其他缺陷,這裡不做過多討論)。

 

 

第二部分

上面,語言模型是根據前面4個詞,預測最後一個詞。

但實際,我們的目標不是語言模型本身,所以可以用另一種方法來預測詞的關係。

 

比如,用上下文。

I want a glass of orange juice to go ...

還是orange這個詞,這時候,我們的樣本就不一定是前面4個詞了。可以是左邊取幾個,右邊取幾個。

比如如下是一個樣本:(左右視窗是2)

glass of (orange) juice to

 

此外,還有其他方式,比如取上一個詞作為輸入,預測下一個詞。

of (orange)

之類的。 這個就是skip-gram的思路。

 

接下來的例子,模型為:

一個上文->預測一個下文

開始:

(1)->one-hot 乘以 詞嵌入矩陣E,得到詞向量

(2)->詞嵌入矩陣輸入到一個softmaxt,直接預測下文

(3)沒有了。

我們看到,吳恩達課程裡,講softmax層的計算公式時,為:

P(t|C) = \frac{e^{\theta _t^T \cdot e_c}}{\sum_{j=1}^{10000} e^{ \theta _j^T \cdot e_c}}

這個公式是直接把前面層所做的東西合併了。

這裡的θ,就是softmax層的權重。小寫t表示單詞t在one-hot裡的下表序號。

這個公式,實際上就是將softmax的輸出做一個歸一化,求得t分類的相對概率。