理解word2vec的訓練過程

生成詞向量是自然語言處理中的基本過程,此前對此只知道使用但是一直不知道其原理。

最近補課,仔細學習了word2vec,上網查資料的時候發現很多博客資料上講到的主要是理論,不好全面理解;而對於介紹應用的文章又偏重於某個工具的使用而不是訓練的細節,所以特別參考了Tensorflow上的實現寫下本篇文章,以防忘記。其中Tensorflow實現word2vec請點擊這裏


正文:

對於word2vec的原理這裏不做過多解釋,如果不熟悉可以看 [NLP] 秒懂詞向量Word2vec的本質,下文中有些圖片借用了文章中的圖片,下面主要介紹訓練過程。


詞向量其實是將詞映射到一個語義空間,得到的向量。而word2vec是借用神經網絡的方式實現的,考慮文本的上下文關係,有兩種模型CBOW 和Skip-gram,這兩種模型在訓練的過程中類似。Skip-gram 模型是用一個詞語作爲輸入,來預測它周圍的上下文,CBOW模型是拿一個詞語的上下文作爲輸入,來預測這個詞語本身。


詞向量訓練的預處理步驟:
  1. 對輸入的文本生成一個詞彙表,每個詞統計詞頻,按照詞頻從高到低排序,取最頻繁的V個詞,構成一個詞彙表。每個詞存在一個one-hot向量,向量的維度是V,如果該詞在詞彙表中出現過,則向量中詞彙表中對應的位置爲1,其他位置全爲0。如果詞彙表中不出現,則向量爲全0
  2. 將輸入文本的每個詞都生成一個one-hot向量,此處注意保留每個詞的原始位置,因爲是上下文相關的
  3. 確定詞向量的維數N


Skip-gram處理步驟:
  1. 確定窗口大小window,對每個詞生成2*window個訓練樣本,(i, i-window),(i, i-window+1),...,(i, i+window-1),(i, i+window)
  2. 確定batch_size,注意batch_size的大小必須是2*window的整數倍,這確保每個batch包含了一個詞彙對應的所有樣本
  3. 訓練算法有兩種:層次 Softmax 和 Negative Sampling
  4. 神經網絡迭代訓練一定次數,得到輸入層到隱藏層的參數矩陣,矩陣中每一行的轉置即是對應詞的詞向量


CBOW的處理步驟:
  1. 確定窗口大小window,對每個詞生成2*window個訓練樣本,(i-window, i),(i-window+1, i),...,(i+window-1, i),(i+window, i)
  2. 確定batch_size,注意batch_size的大小必須是2*window的整數倍,這確保每個batch包含了一個詞彙對應的所有樣本
  3. 訓練算法有兩種:層次 Softmax 和 Negative Sampling
  4. 神經網絡迭代訓練一定次數,得到輸入層到隱藏層的參數矩陣,矩陣中每一行的轉置即是對應詞的詞向量


參數矩陣解釋:
對輸入層到隱藏層的參數包含W和b,我們需要的是W,這裏的W是一個矩陣,shape=(N,V)。其中V是上文所述的詞表的大小,N是需要生成的詞向量的維數。N同樣也是隱藏層(第一層)中的隱藏節點個數。
每次一個batch_size輸入其實一個矩陣(batch_size, V),記爲X,隱藏層輸出爲Y,公式爲。所有的輸入共享一個W,每次迭代的時候都在修改W,由於one-hot的性質,每次修改W只修改1對應的那一行。而這一行也就是詞向量(轉置後)


神經網絡像是一個黑盒子,這其中的概念很難理解,這裏給出我對詞向量訓練的個人理解:

對於每個詞s,訓練數據對應的標記是另一個詞t,訓練其實是想找到一種映射關係,讓s映射到t。但很顯然我們不是希望找到一個線性函數,使得給定s一定能得到t,我們希望的是能夠通過s得到一類詞T,包含t。對於T中的每個t,由於在s上下文中出現的頻次不同,自然能得到一個概率,頻次越高說明s與t相關性越高。

對於詞向量,或者說參數矩陣W,可以認爲是一個將詞映射到語義空間的橋樑,s與t相關性越高,則認爲其在語義空間中越近,那麼對應的橋樑也越靠近。如果用向量來理解的話就是向量之前的夾角越小,我們使用向量來表示這個詞的信息,重要的是得到了語義信息。在實際應用中,生成一段文本,我們可以判斷詞與詞的向量之間相似度,如果過低則就需要懷疑是否正確了。


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