當前位置:
首頁 > 最新 > 一文了解Word2vec之Skip-Gram訓練網路的3種技術

一文了解Word2vec之Skip-Gram訓練網路的3種技術

上一篇斯坦福大學NLP-cs224課程筆記2:詞向量介紹了 Word2vec 模型的基本思想,得到目標函數,給定中心詞求上下文概率,最後還說到用 negative sampling 方法優化目標函數,常見的 Word2vec的兩種形式:Skip-Gram,CBOW模型。

鑒於上篇主要從理論角度,這一篇將從訓練角度,更多關於 Word2vec 之 Skip-Gram 模型的訓練,Skip-Gram會按照文本窗的方式將原文本組合為神經網路需要的訓練樣本,如果原始文本為The quick brown fox jumps over the laze dog,如果設置 window 的 fixed-size 為 2,那麼可以得到如下所示的訓練樣本:

Word2vec 網路結構

我們擁有1萬個單詞的vocabulary,如果想嵌入300維的詞向量,那麼我們的輸入-隱層權重矩陣和隱層-輸出層的權重矩陣都會有 10000 x 300 =300萬個權重參數。

如上所示,輸入層為 one-hot 編碼的詞向量,隱含層為要嵌入的300個神經元,輸出層為 softmax 分類器,神經元個數為 1萬個,在 Skip-Gram 模型中為輸入的中心詞的上下文的概率,如輸入詞對 ( ants, abandon)訓練後,開始調整權重參數,使得儘可能在輸出層對應 abandon的概率高。

O(n)

訓練一個神經網路意味著要輸入訓練樣本並且不斷調整神經元的權重,從而不斷提高對目標的準確預測。每當神經網路經過一個訓練樣本的訓練,它的權重就會進行一次調整。

以上模型訓練過程中,我們需要大量的訓練數據來調整 300 萬個權重參數,同時還要避免出現神經網路的通病:過擬合。

所有的權重參數都需要通過我們數以億計的訓練樣本來進行調整,這是非常消耗計算資源的,並且實際中訓練起來會非常慢。為此 google 的 Word2vec 作者在後面的論文中提出了降低時間複雜度的 3 種方法。

降低O(n)

下面詳細介紹這 3 種降低時間複雜度的方法。

Word pairs 看成一個 word

一些單片語合的含義如果拆開後和原來具有完全不同的意義,那麼這種片語應該看成一個詞。比如 「New York」 ,「United Stated」 等拆開後表達不出原來的意思。

在Google發布的模型中,它本身的訓練樣本中有來自 Google News 數據集中的1000億的單詞,但是除了單個單詞以外,單片語合有3百萬之多。

高頻詞抽樣

英語中的高頻單詞比如 the,根據 Skip-Gram 模型,the 會被選擇為中心詞和上下文詞,下面分別討論這兩種情況。

當 the 選擇為中心詞時,組成訓練的詞對中將會出現大量的 (」the「,...) 這樣的訓練樣本,而這些樣本數量遠遠超過了學習 the 這個詞向量所需的訓練樣本數。

當 the 被選為上下文詞時,比如詞對 ("fox", "the") 這樣的訓練樣本,並不會給我們提供關於 「fox」 更多的語義信息。

因此,類似於 the 這種高頻單詞,如果我們選擇它的概率降到很小或刪除,會帶來什麼好處呢? 訓練樣本很減少,同時不會對詞向量的生成質量造成影響。

如果用 ωi 表示一個單詞,Z(ωi) 是 ωi 這個單詞在所有語料中出現的頻次,這個單詞被保留下來參與訓練的概率圖為如下:

可以看出單詞出現的頻次越高,被選中的概率越小。

negative sampling

因為 negative sampling 是降低時間複雜度的另一個非常重要的技術,因此單獨拿出來說一下,它是用來提高訓練速度並且改善所得到詞向量的質量的一種關鍵方法。

不採用這種技術前,原本每個訓練樣本需要更新所有的權重參數,negative sampling每次讓一個訓練樣本僅僅更新一小部分的權重參數,從而降低梯度下降過程中的計算量。

如果 vocabulary 大小為1萬時,當輸入樣本 ( "fox", "quick") 到神經網路時,「 fox」經過 one-hot 編碼,在輸出層我們期望對應 「quick」 單詞的那個神經元結點輸出 1,其餘 9999 個都應該輸出 0。在這裡,這9999個我們期望輸出為0的神經元結點所對應的單詞我們為negative word.negative sampling 的想法也很直接,將隨機選擇一小部分的 negative words,比如選 10個 negative words 來更新對應的權重參數。

在論文中作者指出指出對於小規模數據集,建議選擇 5-20 個 negative words,對於大規模數據集選擇 2-5個 negative words.

如果使用了 negative sampling 僅僅去更新positive word- 「quick」 和選擇的其他 10 個negative words 的結點對應的權重,共計 11 個輸出神經元,相當於每次只更新 300 x 11 = 3300 個權重參數。對於 3百萬 的權重來說,相當於只計算了千分之一的權重,這樣計算效率就大幅度提高。

選擇 negative words

使用 一元模型分布 (unigram distribution) 來選擇 negative words,一個單詞被選作 negative sample 的概率跟它出現的頻次有關,出現頻次越高的單詞越容易被選作negative words,經驗公式為:

U(w) 代表每個單詞被賦予的一個權重,即它單詞出現的頻次,分母 Z 代表所有單詞的權重和。

公式中開3/4的根號完全是基於經驗的,論文中提到這個公式的效果要比其它公式更加出色。

總結

總結了實際訓練過程中,降低訓練的時間複雜度的3中技術:

將常見的單片語合word pairs或者片語作為單個word來處理。

對高頻次單詞進行 sampling來減少訓練樣本的個數。

對優化目標採用negative sampling方法,對每個訓練樣本的訓練只會更新一很小部分的權重參數,從而降低計算負擔。

接下來,在 Tensorflow 中實現 Skip-Gram 模型。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 演算法channel 的精彩文章:

演算法channel關鍵詞和文章索引
深度學習和自然語言處理:介紹

TAG:演算法channel |