1. 程式人生 > >【轉載】負取樣演算法

【轉載】負取樣演算法

任何取樣演算法都應該保證頻次越高的樣本越容易被取樣出來。基本的思路是對於長度為1的線段,根據詞語的詞頻將其公平地分配給每個詞語:

image.png

counter就是w的詞頻。

於是我們將該線段公平地分配了:

image.png

接下來我們只要生成一個0-1之間的隨機數,看看落到哪個區間,就能取樣到該區間對應的單詞了,很公平。

但怎麼根據小數找區間呢?速度慢可不行。

word2vec用的是一種查表的方式,將上述線段標上M個“刻度”,刻度之間的間隔是相等的,即1/M:

image.png

接著我們就不生成0-1之間的隨機數了,我們生成0-M之間的整數,去這個刻度尺上一查就能抽中一個單詞了。

在word2vec中,該“刻度尺”對應著table陣列。在具體實現時,不是直接用counter(w),而是對詞頻取了α次冪,一般去α=3/4=0.75,即:

image.png

這個冪實際上是一種“平滑”策略,能夠讓低頻詞多一些出場機會,高頻詞貢獻一些出場機會,劫富濟貧。

原文:word2vec原理推導與程式碼分析



MARSGGBO原創





2019-1-1