Skip-Gram神經網絡模型是壹種非常簡單的神經網絡結構,只有壹個隱含層。Skip-Gram模型的訓練過程可以看作是壹個“假任務”。為什麽叫“假任務”?因為訓練模型的目的不是將訓練好的模型用於任何分類任務,而是學習隱含層的權重矩陣,通過這些矩陣我們可以得到想要的詞的特征向量。總體框架如下圖所示。下面詳細描述這種跳格模型的訓練過程。
給定壹個特定的單詞作為輸入,我們從這個單詞的附近隨機選擇壹個單詞,網絡模型會告訴我們詞匯表中每個單詞出現在“附近”的概率。這裏的“接近”是指在壹定的窗口大小範圍內。輸出概率與在輸入單詞附近找到每個單詞的可能性有關。這裏,我們使用文本中指定的窗口大小中的詞對(inputword,outputword)來訓練神經網絡模型。可以得到如下圖所示的詞對。
下面詳細介紹跳格模型的訓練過程。首先,神經網絡模型只接受數值輸入,所以不能直接把每個單詞都輸入到壹個神經網絡中,所以對於神經網絡模型需要壹個單詞表示。因此,需要為訓練集中所有不同的單詞建立壹個詞匯表,然後將詞匯表中的每個單詞用壹鍵編碼的方式表示出來。舉個例子,有壹個大小為10000的詞匯,我們需要為每個詞建立壹個壹熱向量,這就要求每個詞對應的當前詞的位置是1,其他位置都是0,這樣我們就會得到10000個長度為10000的向量,其中每個向量只有壹個位置是654300。神經網絡的輸出是壹個10000維的向量,它表示對於輸入單詞,詞匯表中所有單詞出現在輸入單詞附近的預測概率。如下圖所示:
上述神經網絡結構的隱層神經元沒有激活函數,但輸出層的每個神經元都使用softmax函數。在訓練過程中使用詞對(inputword,outputword)。輸入是壹個獨熱向量,輸出也是壹個代表輸出字的獨熱向量。但是在訓練好的網絡上計算壹個輸入詞的時候,輸出向量實際上是壹個概率分布,而不是壹個壹熱向量。因為每個輸出單元都使用Softmax,而且沒有激活功能。
同樣,對於以上問題,有10000字。假設每個單詞需要學習壹個300維的向量,隱層可以用10000*300 (300個神經元,每個神經元的權重向量為10000)的矩陣來表示,如下圖所示。
縱向看隱層的權值矩陣,每壹列對應壹個神經元中的壹個參數向量,如果橫向看權值矩陣,每壹行就是壹個300維的向量,這就是我們需要學習的詞向量!也就是說,10000個單詞的向量表示就是10000*300的矩陣,每壹行對應壹個單詞的向量表示。那麽Skip-Gram的最終目的就是學習這個隱含層的權重矩陣。為什麽要對詞匯表中的單詞進行壹次性編碼?這裏有壹個解釋。如下圖所示,如果我們把這個權重矩陣乘以壹個壹熱向量,向量結果就是對應詞的特征表示。這意味著這個模型的隱層其實只是壹個查找表,隱層的輸出就是輸入單詞的“單詞向量”。
輸出層是softmax回歸分類器,每個輸出神經元(詞匯表中的每個單詞都有對應的輸出神經元)會產生壹個0到1之間的輸出,所有這些輸出值之和等於1。具體來說,每個輸出神經元都有壹個權重向量,將權重向量與隱含層中的向量相乘,然後對結果應用指數函數。最後,為了使輸出的和達到1,我們將這個結果除以所有10,000個輸出節點的結果的和。如下圖所示:
如果兩個不同的單詞具有非常相似的“上下文”(即它們周圍可能出現什麽單詞),那麽模型應該為這兩個單詞輸出非常相似的結果。網絡輸出的這兩個詞的相似度上下文預測的壹個表達就是這兩個詞的詞向量是相似的。換句話說,如果兩個單詞有相似的上下文,那麽網絡就有能力為這兩個單詞學習相似的單詞向量!
以上部分介紹了跳圖模型的具體實現思路,並對跳圖在實際訓練中的壹些問題進行了優化。通過分析上面的Skip-Gram神經網絡模型,可以發現壹個問題。因為我們需要為每個單詞學習壹個固定長度的向量表示,以上面的例子為例,當我們需要訓練10000個單詞的300維向量表示時,需要計算300萬個權值。在更大的數據集上,這個訓練過程非常慢,基本不可行,所以Skip-Gram的作者針對這個問題提出了幾種解決方案。常用的解決方案是子采樣頻繁詞和負采樣,接下來將詳細介紹這兩種解決方案。
子采樣的主要目的是通過減少訓練集中訓練樣本的數量來降低訓練成本。因為文本中很多詞的出現頻率很高,所以這個詞在訓練集中對應的詞對(輸入詞,輸出詞)的數量會很大,所以需要對這些高頻詞進行二次采樣,以減少這些高頻詞在訓練集中的規模。具體采樣策略如下:
我們假設w i代表詞匯表中的第I個單詞,z(w i)代表這個單詞在語料庫中的出現頻率。例如,如果壹個詞w i在壹個大小為10000的語料庫中的出現次數是100,那麽z(w i) =0.01。已知語料庫中每個單詞的頻率,每個單詞的子采樣采樣率w i如下:
這個函數有壹些有趣的地方:
雖然在訓練神經網絡模型時,子采樣可以明顯降低訓練集的規模,但不能從根本上解決隱層矩陣規模過大帶來的計算問題。也就是說,對於訓練集中的每個樣本,每次訓練都需要更新隱層中的所有參數,因此Skip-Gram模型的作者提出了另壹種優化計算問題的方法。
為了達到更高的精度,需要對每個訓練樣本中每個神經元的權值參數進行微調,所以每個訓練樣本都會對神經網絡中的所有參數進行微調。因為在極端條件下,子采樣會將訓練集減少不少於原始大小的3.3%,然而,這種減少對具有特別大的字典的訓練場景的影響是微弱的。因此,作者提出了負抽樣法。
負采樣通過使每個訓練樣本只修改壹小部分權重(而不是網絡中的所有權重),解決了計算量極大的問題。接下來,我們來看看負采樣是如何工作的。
壹般情況下,我們對每個詞語料庫訓練神經網絡模型,模型的輸出是壹個壹熱向量。在負抽樣中,我們隨機選擇幾個(假設5個)負詞來更新對應的權重(這裏負詞對應的是壹熱向量中值為0的詞,我們的目標詞可以理解為正詞,即壹熱向量中值為1的詞)。
回想壹下,我們模型的輸出層有壹個300×10000的權重矩陣。如果每個訓練樣本只更新當前正詞對應的5個權值,那麽對應的輸出層每次只需要更新6*300個權值,更新比例僅為6/10000=0.06%。
如上所述,負采樣會針對不同的數據集選擇2-20個負詞。下面是如何選擇這個否定詞。首先,對於壹個語料庫,壹個樣本被負抽樣選中的可能性取決於該樣本在語料庫中的出現頻率。
其中f (w i)表示單詞w i在語料庫中出現的頻率。在他們的論文中,作者指出,他們已經嘗試了這個公式的壹些變體,其中最好的是將每個單詞的頻率提高到3/4次方。如下所示:
經過對壹些樣本的處理,我們會發現,這個公式與簡單公式相比,傾向於增加不太頻繁的詞的概率,降低更頻繁的詞的概率。以上是對負抽樣的壹些簡單描述。
詞對和“短語”的主要思想是把壹個經常成對出現的短語當作壹個詞,從而降低整個訓練過程中的計算復雜度。這種方法在自然語言處理中有很大的應用前景。
參考:
1./2016/04/19/word 2 vec-tutorial-the-skip-gram-model/
2./2017/01/11/word 2 vec-教程-第二部分-負采樣/