word2vec理論與實踐

導讀

本文簡單的介紹了Google 於 2013 年開源推出的一個用於獲取 word vector 的工具包(word2vec),並且簡單的介紹了其中的兩個訓練模型(Skip-gram,CBOW),以及兩種加速的方法(Hierarchical Softmax,Negative Sampling)。

 

一 、word2vec

word2vec最初是由Tomas Mikolov 2013年在ICLR發表的一篇文章 Efficient Estimation of Word Representations in Vector Space  [ https://arxiv.org/pdf/1301.3781.pdf ] , 並且開源了代碼,作用是將所有詞語投影到K維的向量空間,每個詞語都可以用一個K維向量表示。由於它簡潔,高效的特點,引起了人們的廣泛關注,並應用在很多NLP任務中,用於訓練相應的詞向量。

 

1、傳統的詞表示 — one-hot representation

  • 這種方法把每個詞表示爲一個很長的向量。這個向量的維度是詞表大小,其中絕大多數元素爲 0,只有一個維度的值爲 1,這個維度就代表了當前的詞

  • 假如詞表是:[氣溫、已經、開始、回升、了],那麼詞的詞向量分別可以是[1,0,0,0,0],[0,1,0,0,0],[0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1]。這樣的表示方法簡單容易理解,而且編程也很容易實現,只需要取對應的索引就能夠完成,已經可以解決相當一部分NLP的問題,但是仍然存在不足,即詞向量與詞向量之間都是相互獨立的;我們都知道,詞與詞之間是有一定的聯繫的,我們無法通過這種詞向量得知兩個詞在語義上是否相似,並且如果詞表非常大的情況下,每個詞都是茫茫 0 海中的一個 1,這種高維稀疏的表示也有可能引發維度災難。爲了解決上述問題,就有了詞向量的第二種表示方法。

 

2、Distributed representation — word embedding

  • word2vec就是通過這種方法將詞表示爲向量,即通過訓練將詞表示爲限定維度K的實數向量,這種非稀疏表示的向量很容易求它們之間的距離(歐式、餘弦等),從而判斷詞與詞語義上的相似性,也就解決了上述one-hot方法表示兩個詞之間的相互獨立的問題

  • 不過Distributed representation並不是word2vec誕生纔有的, Distributed representation 最早是 Hinton 在 1986 年的論文《Learning distributed representations of concepts》中提出的。雖然這篇文章沒有說要將詞做 Distributed representation,但至少這種先進的思想在那個時候就在人們的心中埋下了火種,到 2000 年之後開始逐漸被人重視。 word2vec之所以會產生這麼大的影響,是因爲它採用了簡化的模型,使得訓練速度大爲提升,讓word embedding這項技術(也就是詞的distributed representation)變得實用,能夠應用在很多的任務上。

 

二 、Skip-Gram model and CBOW model

  • 我們先首先來看一下兩個model的結構圖。

  • 上圖示CBOWSkip-Gram的結構圖,從圖中能夠看出,兩個模型都包含三層結構,分別是輸入層投影層輸出層;CBOW模型是在已知當前詞上下文context的前提下預測當前詞w(t),類似閱讀理解中的完形填空;而Skip-Gram模型恰恰相反,是在已知當前詞w(t)的前提下,預測上下文context。

  • 對於CBOWSkip-Gram兩個模型,word2vec給出了兩套框架,用於訓練快而好的詞向量,他們分別是Hierarchical Softmax 和 Negative Sampling,下文將介紹這兩種加速方法。

 

三 、Negative Sampling

  • Negative Sampling(NEG) 是Tomas Mikolov在Distributed Representations of Words and Phrasesand their Compositionality中提出的,它是噪聲對比損失函數NCE(Noise Contrastive Estimation)的簡化版本,用於提高訓練速度和提升詞向量質量。

1、 Negative Sampling

  • 比如我們的訓練樣本,中心詞是w,它周圍上下文共有2c個詞,記爲context(w)。由於這個中心詞w,的確和context(w)相關存在,因此它是一個真實的正例。通過Negative Sampling進行負採樣,我們得到neg(負採樣的個數)個和w不同的中心詞wi,i=1,2,..neg,這樣context(w)和wi就組成了neg個並不真實存在的負例。利用這一個正例和neg個負例,我們進行二元邏輯迴歸(可以理解成一個二分類問題),得到負採樣對應每個詞wi對應的模型參數以及每個詞的詞向量。

2、 How to do Negative Sampling?

  • 我們來看一下如何進行負採樣,得到neg個負例。word2vec採樣的方法並不複雜,如果詞彙表的大小爲V,那麼我們就將一段長度爲1的線段分成V份,每份對應詞彙表中的一個詞。當然每個詞對應的線段長度是不一樣的,高頻詞對應的線段長,低頻詞對應的線段短(根據詞頻採樣,出現的次數越多,負採樣的概率越大)。每個詞w的線段長度由下式決定: 

  • 在採樣前,我們將這段長度爲1的線段劃分成M等份,這裏M»V,這樣能夠保證每個詞對應的線段都會劃分成對應的小塊,而M份中每一份都會落在某一個詞對應的線段上(如下圖),採樣的時候,我們只需要隨機生成neg個數,對應的位置就是採樣的負例詞。

 

四 、Hierarchical Softmax

  • 如下圖所示:網絡結構很簡單,僅僅包含三層網絡結構,輸入層,投影層,輸出層

  • 輸入層到投影層是把輸入層的所有向量進行加和給投影層,比如,輸入的是三個4維詞向量:(1,2,3,4),(9,6,11,8),(5,10,7,12),那麼我們word2vec映射後的詞向量就是(5,6,7,8),對CBOW模型來說,就是把上下文詞向量加和,然而,對於Skip-Gram模型來說就是簡單的傳值。

  • 最後的輸出是構建一顆哈夫曼樹,如何去構造簡單的哈夫曼樹。在這裏不在累述;在這裏,哈夫曼樹的所有葉子節點是詞表中的所有詞,權值是每個詞在詞表中出現的次數,也就是詞頻。

  • 一般得到哈夫曼樹後我們會對葉子節點進行哈夫曼編碼,由於權重高的葉子節點越靠近根節點,而權重低的葉子節點會遠離根節點,這樣我們的高權重節點編碼值較短,而低權重值編碼值較長。這保證的樹的帶權路徑最短,也符合我們的信息論,即我們希望越常用的詞(詞頻越高的詞)擁有更短的編碼,一般的編碼規則是左0右1,但是這都是人爲規定的,word2vec中正好採用了相反的編碼規則,同時約定左子樹的權重不小於右子樹的權重。

  • 如何「沿着哈夫曼樹一步步完成」呢?

    • 在word2vec中,採用了二元邏輯迴歸的方法,即規定沿着左子樹走,那麼就是負類(哈夫曼樹編碼1),沿着右子樹走,那麼就是正類(哈夫曼樹編碼0)。

  • 使用哈夫曼樹有什麼好處呢?

    • 首先,由於是二叉樹,之前計算量爲V,現在變成了log2V。

    • 其次,由於使用哈夫曼樹是高頻的詞靠近樹根,這樣高頻詞需要更少的時間會被找到,這符合我們的貪心優化思想。

 

五 、Demo

 

六 、Experiment Result

1、 Word-Similar Performance

  • 我們在英文語料enwiki-20150112_text.txt(12G)上進行了測試,測試採用的是根據這篇論文 Community Evaluation and Exchange of Word Vectors at wordvectors.org 提供的方法與site(http://www.wordvectors.org/index.php),計算詞之間的相似度。

  • 結果如下圖所示:由於 pytorch-version 訓練速度慢並且demo還沒有完善,所以僅在 Cpp-version 和 word2vec源碼(C-version)進行了測試對比。以上對比試驗均是在相同的參數設置下完成的。

  • 參數設置

    • model: skip-gram, loss: Negative Samplingneg: 10

    • dim: 100, lr: 0.025, windows size: 5minCount: 10, iters: 5

  • 上面結果表明,Cpp-version 和C-version 訓練出來的詞向量都能達到一樣的性能,甚至還比C-version訓練出來詞向量稍高一點。

 

2、 Train Time Performance

  • 由於上述實驗是在不同服務器,不同線程數目的情況下進行訓練,所以上述實驗的訓練時間不存在對比,爲了測試方便快速,在12G英文語料 enwiki-20150112_text.txt 上取出大約1G的文件,進行重新訓練兩份詞向量,看一下訓練時間,下圖是實驗結果。

  • 上述實驗結果能夠看出來:Cpp-version 和C-version 的訓練時間相差不大。

 

References

[1] Efficient Estimation of Word Representations in Vector Space
[2] Learning distributed representations of concepts
[3] Distributed Representations of Words and Phrasesand their Compositionality
[4] Community Evaluation and Exchange of Word Vectors at wordvectors.org
[5] https://blog.csdn.net/itplus/article/details/37998797(word2vec 中的數學原理詳解)
[6] http://www.cnblogs.com/pinard/p/7249903.html(word2vec 原理)


更多精彩內容,請關注 深度學習自然語言處理 公衆號,就是下方啦!跟隨小博主,每天進步一丟丟!哈哈!