word2vec高效訓練方法


在word2vec原理中講到如果每個詞向量由300個元素組成,並且一個單詞表中包含了10000個單詞。回想神經網絡中有兩個權重矩陣——一個在隱藏層,一個在輸出層。這兩層都具有300 x 10000 = 3,000,000個權重!使用梯度下降法在這種巨大的神經網絡下面進行訓練是很慢的。並且可能更糟糕的是,你需要大量的訓練數據來調整這些權重來避免過擬合。上百萬的權重乘以上十億的訓練樣本,意味着這個模型將會是一個超級大怪獸!這時就要采用負樣本和層級softmax來優化。

word2vec的C代碼中使用了一個公式來計算給出特定單詞時候單詞表中的單詞出現的概率。

wi代表單詞,z(wi)代表在總的語料庫中的一個概率。比如說,如果單詞”peanut”在1十億的單詞庫中出現了1000次,那么z(‘peanut’) = 1e-6。

這也是代碼中名為“采樣”的一個來控制重采樣頻率的一個參數,它的默認值為0.001。更小的“采樣”參數意味着單詞被保存下來的幾率更小。

1. 負樣本

訓練一個神經網絡意味着使用一個訓練樣本就要稍微調整一下所有的神經網絡權重,這樣才能夠確保預測訓練樣本更加精確。換句話說,每個訓練樣本都會改變神經網絡中的權重。

單詞表的大小意味着我們的skip-gram神經網絡擁有非常龐大的權重數,所有權重都會被十億個樣本中的一個稍微地進行更新!

負采樣通過使每一個訓練樣本僅僅改變一小部分的權重而不是所有權重,從而解決這個問題。下面介紹它是如何進行工作的。

當通過(”fox”, “quick”)詞對來訓練神經網絡時,我們回想起這個神經網絡的“標簽”或者是“正確的輸出”是一個one-hot向量。也就是說,對於神經網絡中對應於”quick”這個單詞的神經元對應為1,而其他上千個的輸出神經元則對應為0。

使用負采樣,我們通過隨機選擇一個較少數目(比如說5個)的“負”樣本來更新對應的權重。(在這個條件下,“負”單詞就是我們希望神經網絡輸出為0的神經元對應的單詞)。並且我們仍然為我們的“正”單詞更新對應的權重(也就是當前樣本下”quick”對應的神經元)。

論文說選擇5~20個單詞對於較小的樣本比較合適,而對於大樣本,我們可以選擇2~5個單詞。

如果我們模型的輸出層有大約300 x 10,000維度的權重矩陣。所以我們只需要更新正確的輸出單詞”quick”的權重,加上額外的5個其他應該輸出為0的單詞的權重。也就是總共6個輸出神經元,和總共1800個的權重值。這些總共僅僅是輸出層中3百萬個權重中的0.06%。

2. 層次softmax

softmax需要對每個詞語都計算輸出概率,並進行歸一化,計算量很大;

進行softmax的目的是多分類,那么是否可以轉成多個二分類問題呢, 如SVM思想? 從而引入了層次softmax

 

 

 

 

為什么有效?

1)用huffman編碼做詞表示

2)把N分類變成了log(N)個2分類。 如要預測的term(足球)的編碼長度為4,則可以把預測為'足球',轉換為4次二分類問題,在每個二分類上用二元邏輯回歸的方法(sigmoid);

3)邏輯回歸的二分類中,sigmoid函數導數有很好的性質,σ(x)=σ(x)(1σ(x))σ′(x)=σ(x)(1−σ(x))

4)采用隨機梯度上升求解二分類,每計算一個樣本更新一次誤差函數

注:gensim的word2vec 默認已經不采用分層softmax了, 因為log21000=10log21000=10也挺大的;如果huffman的根是生僻字,則分類次數更多。

 

參考文獻:

https://blog.csdn.net/qq_28444159/article/details/77514563

http://flyrie.top/2018/10/31/Word2vec_Hierarchical_Softmax/

https://www.cnblogs.com/liyuxia713/p/11185028.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM