訓練乙個神經網路意味著要輸入訓練樣本並且不斷調整神經元的權重,從而不斷提高對目標的準確**。每當神經網路經過乙個訓練樣本的訓練,它的權重就會進行一次調整。
所以,詞典的大小決定了我們的skip-gram神經網路將會擁有大規模的權重矩陣,所有的這些權重需要通過數以億計的訓練樣本來進行調整,這是非常消耗計算資源的,並且實際中訓練起來會非常慢。
負取樣(negative sampling)解決了這個問題,它是用來提高訓練速度並且改善所得到詞向量的質量的一種方法。不同於原本每個訓練樣本更新所有的權重,負取樣每次讓乙個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。
當我們用訓練樣本 ( input word: "fox",output word: "quick") 來訓練我們的神經網路時,「 fox」和「quick」都是經過one-hot編碼的。如果我們的詞典大小為10000時,在輸出層,我們期望對應「quick」單詞的那個神經元結點輸出1,其餘9999個都應該輸出0。在這裡,這9999個我們期望輸出為0的神經元結點所對應的單詞我們稱為「negative」 word。
當使用負取樣時,我們將隨機選擇一小部分的negative words(比如選5個negative words)來更新對應的權重。我們也會對我們的「positive」 word進行權重更新(在我們上面的例子中,這個單詞指的是」quick「)。
ps: 在**中,作者指出指出對於小規模資料集,選擇5-20個negative words會比較好,對於大規模資料集可以僅選擇2-5個negative words。
我們使用「一元模型分布(unigram distribution)」來選擇「negative words」。個單詞被選作negative sample的概率跟它出現的頻次有關,出現頻次越高的單詞越容易被選作negative words。
每個單詞被選為「negative words」的概率計算公式:
其中 f(ωi)代表著單詞出現的頻次,而公式中開3/4的根號完全是基於經驗的。
在**負取樣的**實現中,unigram table有乙個包含了一億個元素的陣列,這個陣列是由詞彙表中每個單詞的索引號填充的,並且這個陣列中有重複,也就是說有些單詞會出現多次。那麼每個單詞的索引在這個陣列**現的次數該如何決定呢,有公式,也就是說計算出的負取樣概率*1億=單詞在表**現的次數。
有了這張表以後,每次去我們進行負取樣時,只需要在0-1億範圍內生成乙個隨機數,然後選擇表中索引號為這個隨機數的那個單詞作為我們的negative word即可。乙個單詞的負取樣概率越大,那麼它在這個表**現的次數就越多,它被選中的概率就越大。
skip gram與負取樣
skip gram是word2vec中的主要模型之一 另乙個模型是cbow 簡單來說,cbow是給定上下文,來 input word 而skip gram是給定input word,來 上下文。下面我們來理解skip gram模型。首先,給定句子如下 the man who passes the s...
雜訊對比估計 負樣本取樣
目錄gutmann m u,hyvarinen a.noise contrastive estimation a new estimation principle for unnormalized statistical models c international conference on ar...
NLP《詞彙表示方法(四)負取樣》
一 負取樣 在cbow和skip gram模型中,最後輸出的都是詞彙的one hot向量,假如我們的詞彙表的數量是10000,嵌入空間的維度是300,再假設此時是以skip gram模型只 context內的單獨乙個word的模型為例,那麼從隱藏層到輸出層的引數數量是300 x 10000的。每次的...