這裏先按吳恩達老師的課程講解的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層的計算公式時,爲:
這個公式是直接把前面層所做的東西合併了。
這裏的θ,就是softmax層的權重。小寫t表示單詞t在one-hot裏的下表序號。
這個公式,實際上就是將softmax的輸出做一個歸一化,求得t分類的相對概率。