skip-gram負采樣
自然語言處理領域中,判斷兩個單詞是不是一對上下文詞(context)與目标詞(target),如果是一對,則是正樣本,如果不是一對,則是負樣本。
采樣得到一個上下文詞和一個目标詞,生成一個正樣本(positive example),生成一個負樣本(negative example),則是用與正樣本相同的上下文詞,再在字典中随機選擇一個單詞,這就是負采樣(negative sampling)。
下圖為cbow和skip-gram模型:
skip-gram模型輸入:
舉個例子:
我們知道對于每個input word來說,有多個output word(上下文)。例如我們的輸入是【熟悉】,上下文是[熟練掌握, java, python, shell],那麼【熟悉】這一個batch中就有四個訓練樣本[熟悉, 熟練掌握], [熟悉, java], [熟悉, python], [熟悉, shell]。
但是神經網絡模型隻能接受數值輸入,是以必須進行one-hot編碼,假設我們在訓練資料中隻能取出10000個不重複的單詞作為詞彙表,那麼我們對每個單詞編碼都是1 *10000的向量。
模型的輸入是10000維的向量,那麼輸出也是10000維(詞彙表的大小)向量,它包含了10000個機率,每一個機率代表着目前詞是輸入樣本中output word的機率大小。如下圖,神經網絡架構:
對于輸出層用softmax,計算量很大,通常用“nagative sampling"(負采樣)計算,這樣,每個訓練樣本 隻能更新一小部分模型權重,進而減輕計算負擔。
當我們用訓練樣本(input word:“fox”, output word:“quick”)來訓練我們的神經網絡時,“fox”和“quick”都是經過one-hot編碼的。如果我們的vocabulary大小為10000時,在輸出層,我們希望“quick”單詞那個位置輸出1,其餘都是0。這些其餘我們期望輸出0的位置所對應的單詞我們成為“negative” word。
當使用負采樣時,我們将随機選擇一小部分的negative words(比如選5個negative words)來更新對應的權重。我們也會對我們的positive word進行權重更新(上面的例子指的是"quick")
在論文中,作者指出指出對于小規模資料集,選擇5-20個negative words會比較好,對于大規模資料集可以僅選擇2-5個negative words。