[機器學習與深度學習] - No.1 基於Negative Sampling SKip-Gram Word2vec模型學習總結

基於Negative Sampling SKip-Gram Word2vec模型學習總結

1. Word2vec簡介

Word2Vec是從大量文本語料中以無監督的方式學習語義知識的一種模型,它被大量地用在自然語言處理(NLP)中。那麼它是如何幫助我們做自然語言處理呢?Word2Vec其實就是通過學習文本來用詞向量的方式表徵詞的語義信息。Word2vec的結果是爲了獲得Word Embedding,我們又稱爲詞嵌入。Word Embedding就是一個映射,將單詞從原先所屬的空間映射到新的多維空間中,也就是把原先詞所在空間嵌入到一個新的空間中去。

Word2Vec模型實際上分爲了兩個部分,第一部分爲建立模型,第二部分是通過模型獲取嵌入詞向量。基於訓練數據構建一個神經網絡,當這個模型訓練好以後,我們並不會用這個訓練好的模型處理新的任務,我們真正需要的是這個模型通過訓練數據所學得的參數,例如隱層的權重矩陣。

如果之前瞭解過RNN 語言模型,會瞭解到,如果我們的詞典中一共有10000個不同的詞,那麼我們每個詞將會使用10000維的one-hot編碼來表示。如果我們希望使用300維的特徵向量代表每個詞,我們設置模型的隱藏層節點爲300維。輸入層-隱藏層的權重矩陣爲:10000X300維。那麼權重矩陣的每一行即代表我們最後所需的word embedding

Word2vec模型結構:
這裏寫圖片描述

輸入層-隱藏層權重矩陣:
這裏寫圖片描述

2. Skip-Gram

Word2Vec模型中,主要有Skip-Gram和CBOW兩種模型,。Skip-Gram是給定中心詞來預測上下文,CBOW是給定上下文,來預測中心詞

這裏寫圖片描述

如上圖所示,藍色是我們給定的中心詞,上下兩邊綠色的字體表示我們中心詞的上下文

這裏寫圖片描述

1. 輸入形式

Word2vec的輸入形式爲one-hot編碼。假設從我們的訓練文檔中抽取出10000個唯一不重複的單詞組成詞彙表。我們對這10000個單詞進行one-hot編碼,得到的每個單詞都是一個10000維的向量,向量每個維度的值只有0或者1,假如單詞ants在詞彙表中的出現位置爲第3個,那麼ants的向量就是一個第三維度取值爲1,其他維都爲0的10000維的向量(ants=[0, 0, 1, 0, …, 0])。

模型的輸入如果爲一個10000維的向量,那麼輸出也是一個10000維度(詞彙表的大小)的向量,它包含了10000個概率,每一個概率代表着當前詞是輸入樣本中output word的概率大小。

2. 樣本形式

假設我們有一句話“The quick brown fox jumps over the lazy dog.”

  • 我們假設中間詞爲fox
  • 接下來,我們設置中心詞fox的上下文範圍。我們使用skip_window來表示我們從中心詞的左右兩側選取的詞的數量,num_skips 表示我們在中心詞的上下文中選取作爲輸出詞的數量。例如:當skip_window=2num_skips = 2,中心詞爲fox時 ,我們獲得fox的上下文窗口爲['quick','brown','jumps','over']。我們隨機從窗口中選取兩個詞作爲輸出,那麼我們的樣本元組應該如同:('fox','brown')('fox','over')

這裏寫圖片描述

如上圖,列出了中心詞所有的訓練樣本。在代碼的實現過程中,我們會使用隨機數來隨機選取窗口中的輸出詞。

3. Negative Sampling

訓練一個神經網絡意味着要輸入訓練樣本並且不斷調整神經元的權重,從而不斷提高對目標的準確預測。每當神經網絡經過一個訓練樣本的訓練,它的權重就會進行一次調整。語料詞典的大小決定了我們的Skip-Gram神經網絡將會擁有大規模的權重矩陣,所有的這些權重需要通過我們數以億計的訓練樣本來進行調整,這是非常消耗計算資源的,並且實際中訓練起來會非常慢。

1. 負採樣簡介

負採樣(negative sampling)解決了這個問題,它是用來提高訓練速度並且改善所得到詞向量的質量的一種方法。不同於原本每個訓練樣本更新所有的權重,負採樣每次讓一個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。

假如我們訓練樣本('fox','brown'),由於我們使用的是one-hot編碼來表示詞,我們期望對應“brown”單詞的那個輸出神經元輸出1,其他剩餘的所有輸出神經元輸出0,我們稱所有輸出爲1的輸出神經元對應的詞爲”positive”詞,所有輸出爲0的神經元對應的詞爲”negative”詞

使用負採樣的方法,我們不對所有輸出神經元對應的權值進行更新,只是隨機選取幾個”negative”詞,更新他們對應的權重。當然,我們也會更新”positive”的對應權值。

如上面所述,加入我們有10000個單詞,每個單詞用300維表示,那麼我們的權重矩陣爲10000x300維的矩陣。我們每次更新需要更新3000000個值。如果我們只更新隨機選取的5個”negative”單詞和一個”positive”的權重,那麼我們只需要更新1800個值,相當於之前0.06%的計算量。

2. 負採樣點選取

本質上來說,一個單詞備選做爲”negative word”的概率和他出現的頻率有關,出現頻次越高的單詞越容易備選做”negative word”。這就是我們對採樣過程的一個大致要求,本質上是一個帶權採樣的問題。

我們使用一個比較通俗的描述來解釋一下帶權採樣:

設詞典D中的每個詞ω 對應一個線段l(ω) ,長度爲:

len(ω)=counter(ω)uDcounter(u)

這裏的counter()表示一個詞在語料中出現的次數。現在將這些線段首位連接在一起,形成一個長度爲1的單位線段,如果在線段上隨機的打點,那麼長度長(頻率大)的線段被打中的概率就大

所以,根據{len()j}j=0N 可以得到區間[0,1]上的一個非等距剖分,共有N個剖分區間

接着,我們引入區間[0,1]上的一個等距離剖分,剖分解點爲{mj}j=0M ,其中M >> N, 如下圖所示
這裏寫圖片描述
如上圖所示,採樣就簡單了。我們生成一個[1,M-1]之間的隨機整數r,然後查看該整數r落在了哪個詞對應的線段內,那麼該單詞就是採樣點。如果碰巧遇到了”positive word”,那麼就跳過重新選取。

在word2vec的C語言實現中,使用了下面的公式來計算單詞被選做負樣本的概率。每個單詞被選爲“negative words”的概率計算公式與其出現的頻次有關。

P(ωj)=f(ωj)34j=0n(f(ωj)34)

其中f(ωj) 代表詞ωj 的在整個語料中出現的頻次

4. 參考文章:

http://blog.csdn.net/itplus/article/details/37998797

https://www.leiphone.com/news/201706/eV8j3Nu8SMqGBnQB.html

http://www.thushv.com/natural_language_processing/word2vec-part-1-nlp-with-deep-learning-with-tensorflow-skip-gram/

http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章