word_embedding的負取樣演算法,Negative Sampling 模型
Negative Sampling 模型的CBOW和Skip-gram的原理。它相對於Hierarchical softmax 模型來說,不再採用huffman樹,這樣可以大幅提高效能。
一、Negative Sampling
在負取樣中,對於給定的詞w,如何生成它的負取樣集合NEG(w)呢?已知一個詞w,它的上下文是context(w),那麼詞w就是一個正例,其他詞就是一個負例。但是負例樣本太多了,我們怎麼去選取呢?在語料庫C中,各個詞出現的頻率是不一樣的,我們取樣的時候要求高頻詞選中的概率較大,而低頻詞選中的概率較小。這就是一個帶權取樣的問題。設詞典D中的每一個詞w對應線段的一個長度:
任何取樣演算法都應該保證頻次越高的樣本越容易被取樣出來。基本的思路是對於長度為1的線段,根據詞語的詞頻將其公平地分配給每個詞語:
counter就是w的詞頻。
於是我們將該線段公平地分配了:
接下來我們只要生成一個0-1之間的隨機數,看看落到哪個區間,就能取樣到該區間對應的單詞了,很公平。
但怎麼根據小數找區間呢?速度慢可不行。
word2vec用的是一種查表的方式,將上述線段標上M個“刻度”,刻度之間的間隔是相等的,即1/M:
接著我們就不生成0-1之間的隨機數了,我們生成0-M之間的整數,去這個刻度尺上一查就能抽中一個單詞了。
在word2vec中,該“刻度尺”對應著table陣列。具體實現時,對詞頻取了0.75次冪:
這個冪實際上是一種“平滑”策略,能夠讓低頻詞多一些出場機會,高頻詞貢獻一些出場機會,劫富濟貧。
二、CBOW
三、損失函式
NCE損失函式表示如下:
該損失函式計算上下文與目標單詞之間的點積,採集每一個正樣本的同時採集k個負樣本。公式的第一項最小化正樣本的損失,第二項最大化負樣本的損失。現在如果將負樣本作為第一項的變數輸入,則損失函式結果應該很大。