當前位置:成語大全網 - 新華字典 - word2vec模型之Skip-Gram Model

word2vec模型之Skip-Gram Model

本文介紹壹種基於神經網絡結構的Word2Vec模型,Word2Vec是目前NLP領域的基礎知識,這裏僅對Word2Vec模型中的Skip-Gram模型進行詳細介紹。

?Skip-Gram神經網絡模型是壹種非常簡單的神經網絡結構,是壹個僅有壹個Hidden Layer的神經網絡結構。Skip-Gram模型的訓練過程可以視作壹個“Fake Task(偽任務)”,為何稱之為“Fake Task”?是因為訓練該模型的目的並不是將訓練好的模型用於任何的分類任務,而是為了學習得到隱層的權重矩陣,而通過這些矩陣我們會得到想要的單詞的特征向量,總體框架入下圖所示。下面詳細介紹這個Skip-Gram模型的訓練過程。

?給定壹個特定的word作為輸入,我們從該word的附近隨機挑選壹個word,該網絡模型會告訴我們詞匯表中的每個單詞出現在“附近”的概率。這裏的“附近”指的是在特定window size範圍內。輸出概率與在輸入詞附近找到每個單詞的可能性有關。這裏,我們使用文本中指定window size內的word pair(inputword,outputword)來訓練神經網絡模型。word pairs的獲取方式如下圖所示。

?這裏詳細介紹壹下Skip-Gram模型的訓練過程。首先,神經網絡模型只接受數值型的輸入,故不能直接將每個單詞直接輸入到壹個神經網絡中,故而需要壹種針對神經網絡模型的單詞表示方式,為此需要針對訓練集中的所有不同的單詞構建壹個詞匯表(vocabulary),然後將詞匯表中的每個單詞以 One-Hot編碼 的方式進行表示。比如,現在有壹個大小為10000的詞匯表,我們需要為每個單詞構建壹個One-Hot向量,要求每個單詞對應的當前單詞的位置為1,其他所有位置為0,因此我們會得到10000個長度為10000的向量,其中每個向量都只有壹個位置為1。神經網絡的輸出是壹個10000維的向量,表示針對輸入單詞,詞匯表中所有的單詞出現在輸入單詞附近的預測概率。如下圖所示:

?上述的神經網絡結構隱層中的神經元沒有激活函數,但輸出層的每個神經元使用了softmax函數。訓練的過程使用word pair(inputword,outputword),輸入是壹個One-Hot的向量,輸出的也是壹個表示輸出單詞的One-Hot的向量。但是當在壹個輸入詞在訓練好的網絡上計算時,輸出的向量實際上是壹個概率分布,並不是壹個One-Hot向量。因為每個輸出的單元使用了 Softmax ,且沒有激活函數。

?同樣的針對上述問題,有10000個單詞,假設需要為每個單詞學習壹個300維的向量,那麽隱層可以由壹個10000*300的矩陣來表示(300個神經元,每個神經元都有壹個10000維的權重向量),如下圖所示。

?豎著看這個隱層的權重矩陣,每壹列對應壹個神經元中的參數向量,而如果橫著看這個權重矩陣,每壹行就是壹個300維的向量,而這這就是我們需要通過學習得來的詞向量!也就是說,10000個單詞的向量表示就是這個10000*300的矩陣,每行對應壹個單詞的向量表示。那麽Skip-Gram最終的目的就是學習這個隱層的權重矩陣。而為什麽針對詞匯表裏的單詞要進行One-Hot編碼,這裏解釋壹下。如下圖所示,如果我們用壹個One-Hot向量乘以這個權重矩陣,那麽得出的向量結果就是對應單詞的特征表示。這意味著這個模型的隱層實際上只是作為壹個查找表,而隱層的輸出則是輸入的單詞的“詞向量(word vector)”。

?輸出層為softmax回歸分類器,每個輸出神經元(詞匯表中的每個單詞都有壹個對應的輸出神經元)將產生0到1之間的輸出,所有這些輸出值的總和將等於1。具體來說,每個輸出神經元都有壹個權重向量,它將權重向量與隱層中的向量相乘,然後將指數函數應用於結果。最後,為了使輸出之和達到1,我們將這個結果除以來自所有10,000個輸出節點的結果之和。如下圖所示:

?如果兩個不同的單詞有非常相似的“上下文”(也就是說,它們周圍可能出現什麽單詞),那麽該模型應當為這兩個單詞輸出非常相似的結果。網絡輸出這兩個單詞相似上下文預測的壹種表達形式就是這兩個單詞的單詞向量相似。換言之,如果兩個單詞有相似的上下文,那麽該網絡就有能力為這兩個單詞出學習相似的單詞向量!

?以上部分介紹了Skip-Gram模型的具體實現思路,接下來會針對Skip-Gram在實際訓練中的壹些問題進行優化。通過分析上述的Skip-Gram神經網絡模型,可以發現壹個問題,由於需要為每個單詞學習壹個固定長度的向量表示,因此以上面的例子為例,當需要訓練10000個單詞的300維的向量表示時,我們需要計算出300萬個權重值。而在更大的數據集上,這樣的訓練過程是十分緩慢的,基本上不可行,因此Skip-Gram的作者針對這個問題提出了幾種解決方案。常用的方案有Subsampling frequent words和Negative Sampling,接下來會詳細介紹這兩種解決方案。

?Subsampling主要目的是通過削減訓練集的訓練樣本數來降低訓練代價。由於在文本中,許多單詞出現的頻率很高,這就導致了這個單詞對應的word pair (inputword,outputword)在訓練集中的數量會非常多,因此需要針對這些高頻詞進行二次采樣以降低這些高頻詞在訓練集中的規模。具體采樣策略如下:

假設 w i 表示詞匯表中的第 i 個單詞, z(w i ) 表示該詞在語料庫中出現的頻率。例如壹個單詞 w i 在大小為10000的語料庫中出現的次數為100,那麽 z(w i ) =0.01。知道了每個單詞在語料庫中的出現頻率之後,那麽對於每個單詞 w i 的subsampling采樣率如下:

該函數有壹些有趣的點:

?Subsampling雖然能明顯地縮小訓練神經網絡模型時的訓練集大小,但是並不能從根本上解決隱層矩陣規模大而帶來的計算問題。也就是說,對於訓練集中的每個樣本,每次訓練都需要更新隱層中的所有參數,因此Skip-Gram模型的作者又提出了另外壹種方式來優化計算問題。

?由於訓練神經網絡模型為了達到更高的精度,需要通過訓練樣本中每次細微地調整每個神經元的權重參數,因此每個訓練每個訓練樣本都會微調神經網絡中的所有參數。由於SubSampling在極限情況下,對訓練集的削減程度不會低於原規模的3.3%,然而 ,這種程度的削減對於壹個字典特別大的訓練場景的影響是微弱的。為此作者又提出了壹種Negative Sampling的方式。

Negative Sampling通過讓每個訓練樣本只修改壹小部分權重(而不是網絡中的全部權重)來解決計算量特別大的問題。接下來可以看壹下Negative Sampling的工作原理。

?正常情況下,我們對每個單詞語料訓練神經網絡模型,模型的輸出是壹個one-hot的向量。在Negative Sampling時,我們隨機選擇若幹個(假設5個)negative word去更新對應的權重,(這裏Negative word 對應的時One-Hot向量中值為0的單詞,而我們的目標單詞可以理解為Positive word,即對應One-Hot向量中值為1的單詞)。

?回想壹下,我們的模型輸出層有個300×10000的權重矩陣,如果每個訓練樣本只更新5個negative word和當前的positive word對應的權重,那麽每次訓練對應輸出層只需要更新6*300個權重,此時更新比例只有6/10000=0.06%。

?上面提到了,針對不同的數據集,Negative Sampling會選擇2-20個negative word,下面介紹壹下如何挑選這個Negative word。首先針對壹個語料庫,每次Negative Sampling挑選出的樣本的可能性取決於該樣本在語料庫中出現的頻數。

?其中 f ( w i )表示單詞 w i 在語料庫中出現的頻數。作者在他們的論文中指出,他們嘗試了這個公式的壹些變體,其中表現最好的是將每個單詞出現的頻數提高到3/4次方。如下所示:

?處理壹些樣本之後會發現,與簡單的公式相比,這個公式有增加不太頻繁單詞的概率和減少更頻繁單詞的概率的趨勢。以上就是對Negative Sampling的壹些簡單描述。

?Word Pairs and “Phrases”的主要思想是將經常成對出現或者某個短語當成壹個Word,以此來降低整個訓練過程中的計算復雜度。該方法在自然語言處理中有很大的應用場景。

參考:

1. /2016/04/19/word2vec-tutorial-the-skip-gram-model/

2. /2017/01/11/word2vec-tutorial-part-2-negative-sampling/