1. 程式人生 > >word2vec預訓練詞向量

word2vec預訓練詞向量

NLP中的Word2Vec講解

 

  word2vec是Google開源的一款用於詞向量計算 的工具,可以很好的度量詞與詞之間的相似性;

  word2vec建模是指用CBoW模型或Skip-gram模型來計算不同 詞語的向量(word vector)

  CBoW是給定上下文來預測輸入詞、Skip-gram給定輸入詞預測上下文,但最終都會得到詞向量矩陣W

上圖為詞向量的部分視覺化結構

 

 

Statistical Language Model (統計語言模型)

   在深入word2vec之前,首先回顧下nlp中的一個基本問題:如何計算一段文字序列在某種語言下出現的概率?(Ngram)

統計語言模型給出了這一類問題的一個基本解決框架。對於一段文字序列: 它的概率可表示為:

                                              

即將序列的聯合概率轉化為一系列條件概率的乘積。問題變成了如何去預測這些給定previous words下的條件概率:

                        

由於其巨大的引數空間,這樣一個原始的模型在實際中並沒有什麼用。我們更多的是採用其簡化版本——Ngram模型:

                                                                                            

  常見的如bigram模型(N=2)和tirgram模型(N=3)。事實上,由於模型複雜度和預測精度的限制,我們很少會考慮N>3的模型。我們可以用最大似然法去求解Ngram模型的引數——等價於去統計每個Ngram的條件詞頻。為了避免統計中出現0概率問題(一段從未在訓練集中出現過的Ngram片段會使整個序列的概率為0),人們基於原始的Ngram模型進一步發展出了back-off trigram模型(用低階的bigram和unigram代替0概率的trigram)和interpolated trigram模型(將條件概率表示為unigram、bigram、

trigram三者的線性函式)。

 

Distributed Representation(分散式表示)詞向量演算法綜述

  不過Ngram模型仍有侷限性。首先無法處理N>3的詞序列(實際應用中>3會發生引數空間的爆炸式增長,維度災難問題),其次它並沒有考慮詞與詞之間的內在聯絡性(只是概率的詞頻統計)。例如,考慮"the cat is walking in the bedroom"這句話。如果我們在訓練語料中看到了很多類似“the dog is walking in the bedroom”或是“the cat isrunningin the bedroom”這樣的句子,那麼,即使我們沒有見過這句話,也可以從“cat”和“dog”(“walking”和“running”)之間的相似性,推測出這句話的概率。然而, Ngram模型做不到。

  於是,人們就自然而然的想到,能否用一個連續的稠密向量去刻畫一個word的特徵呢? 這樣我們不僅可以去刻畫詞與詞之間的相似度,還可以建立一個從向量到概率的平滑函式模型,使得相似的詞向量可以對映到相近的概率空間上。這個稠密連續向量也被稱為word的distributed representation(分散式表示)。

  事實上,這個概念在資訊檢索(Information Retrieval)領域早就已經被廣泛使用了。只不過在IR領域裡,這個概念被稱為向量空間模型(Vector Space Model,以下簡稱VSM)。

VSM是一種Statistical Semantics Hypothesis:語言的統計特徵隱藏著語義的資訊(Statistical pattern of human word usage can be used to figure out what people mean)。例如,兩篇具有相似詞分佈的文件可以被認為是有著相近的主題。這個Hypothesis有很多衍生版本。其中,比較廣為人知的兩個版本是Bag of Words Hypothesis和Distributional Hypothesis。前者是說,一篇文件的詞頻(而不是詞序)代表了文件的主題;後者是說,上下文環境相似的兩個詞有著相近的語義。後面我們會看到word2vec演算法也是基於Distributional的假設。

那麼,VSM是如何將稀疏離散的one-hot詞向量對映為稠密連續的Distributional Representation的呢?

簡單來說,基於Bag of Words Hypothesis(詞袋假設),我們可以構造一個term-document(關聯矩陣)矩陣A:矩陣的行Ai,: 對應著詞典裡的一個word,矩陣的列A:,j 對應著訓練預料裡的一篇文件;矩陣裡的元素Ai,j代表著word  wi 在文件Dj 中出現的次數(或頻率)。那麼我們就可以提取列向量作為word的語義向量(不過,實際應用中,我們更多的是用列向量做為文件的主題向量,即一篇文件的詞頻代表了文件的主題)

term-document關聯矩陣:
doc 1:new home sales top forecasts  doc 2:home sales rise in july  doc 3:increase in home sales in july  doc 4: july new home sales rise

類似的,我們可以基於Distributional Hypothesis(分散式特徵表達猜想/上下文特徵表示)構造一個word-context的矩陣。與term-document相比,矩陣的列變成了context裡的word,矩陣的元素也變成了一個context窗口裡word的共現次數。word-context矩陣 通過統計一個事先指定大小的視窗內的word共現次數,不僅可以刻畫word的語義資訊,還在一定程度上反映了word的語法結構資訊。

for example:I like deep learning; I like NLP; I enjoy flying;
設定視窗的大小為1, 得到word-context矩陣:

注意,這兩類矩陣的行向量所計算的相似度有著細微的差異:term-document矩陣會給經常出現在同一篇document裡的兩個word賦予更高的相似度;而word-context矩陣會給那些有著相同context的兩個word賦予更高的相似度。後者相對於前者是一種更高階的相似度,因此在傳統的資訊檢索領域中得到了更加廣泛的應用。

 

Neural Network Language Model(神經網路語言模型)

  鑑於Ngram等模型的不足,2003年,Bengio等人發表了一篇開創性的文章:A neural probabilistic language model[3]。在這篇文章裡,他們總結出了一套用神經網路建立統計語言模型的框架(Neural Network Language Model,以下簡稱NNLM),並首次提出了word embedding的概念(雖然沒有叫這個名字),從而奠定了包括word2vec在內後續研究word representation learning的基礎。

 NNLM模型的基本思想可以概括如下:

  1. 假定詞表中的每一個word都對應著一個連續的特徵向量;
  2. 假定一個連續平滑的 概率模型,輸入一段詞向量的序列,可以輸出這段序列的 聯合概率;
  3. 同時學習詞向量的權重和概率模型裡的引數。

值得注意的一點是,這裡詞向量也是要學習的引數。

在03年的論文中,Bengio等人採用了一個簡單的前向反饋神經網路  來擬合一個詞序列的條件概率

  (計算Ngram概率)。整個模型的網路結構見下圖:

 

我們將整個模型拆分成兩部分加以理解:

  1. 首先是一個線性的Embedding層。它將輸入的N-1個one-hot詞向量,通過一個共享的D×V的矩陣C,對映為N-1個分散式的詞向量(distributed vector)。其中,V是詞典的大小,D是Embedding向量的緯度(一個先驗引數,可以調整)。C矩陣(C矩陣初始值是隨機初始化的)裡儲存了要學習的word vector。
  2. 其次是一個簡單的前向反饋網路g。它由一個tanh(啟用函式)隱層和一個softmax(多分類輸出佔比)輸出層組成。通過將Embedding層輸出的N-1個詞向量對映為一個長度為D的概率分佈向量,從而對詞典中的word在輸入context下的條件概率作出預估:

              

我們可以通過最小化一個cross-entropy(交叉熵)的正則化損失函式來調整模型的引數θ:

            

其中,模型的引數θ包含了Embedding層矩陣C的元素,和前向反饋神經網路g裡的權重。這是一個巨大的引數空間。不過,在用SGD(一種梯度下降的方法)學習更新模型的引數時,並不是所有的引數都需要調整(例如未在輸入的context中出現的 詞對應的詞向量)。計算的瓶頸主要在softmax層的歸一化函式上(需要對詞典中所有的word計算一遍條件概率)。

下面給出softmax函式曲線和計算方程及計算方法:

                               ∞ ∞         

 (圖片來自網路)

其中,Vi 是分類器前級輸出單元的輸出。i 表示類別索引,總的類別個數為 C。Si 表示的是當前元素的指數與所有元素指數和的比值。關於softmax詳細資訊,請看這個連結

 然而,拋棄複雜的引數空間,我們不禁要問,為什麼這樣一個簡單的模型會取得巨大的 成功呢?

仔細觀察這個模型你就會發現,它其實在同時解決兩個問題:一個是統計語言模型裡關注的條件概率 的計算;一個是向量空間模型裡關注的詞向量的表達。而這兩個問題本質上並不獨立。通過引入連續的詞向量和平滑的概率模型,我們就可以在一個連續空間裡對序列概率進行建模,從而從根本上緩解資料稀疏性和緯度災難的問題。另一方面,以條件概率 為學習目標去更新詞向量的權重,具有更強的導向性,同時也與VSM裡的Distributional Hypothesis不謀而合。

 

CBoW & Skip-gram Model(詞向量模型演算法)     

  一個問題是,同Ngram模型一樣,NNLM模型只能處理定長的序列。在03年的論文裡,Bengio等人將模型能夠一次處理的序列長度N提高到了5,雖然相比bigram和trigram已經是很大的提升,但依然缺少靈活性。因此,Mikolov等人在2010年提出了一種RNNLM模型,用遞迴神經網路代替原始模型裡的前向反饋神經網路,並將Embedding層與RNN裡的隱藏層合併,從而解決了變長序列的問題。

   另一個問題就比較嚴重了。NNLM的訓練太慢了。即便是在百萬量級的資料集上,即便是藉助了40個CPU進行訓練,NNLM也需要耗時數週才能給出一個稍微靠譜的解來。顯然,對於現在動輒上千萬甚至上億的真實語料庫,訓練一個NNLM模型幾乎是一個impossible mission。

這時候,還是那個Mikolov站了出來。他注意到,原始的NNLM模型的訓練其實可以拆分成兩個步驟:

  1. 用一個簡單模型訓練出連續的詞向量;
  2. 基於詞向量的表達(不會同時訓練詞向量了),訓練一個連續的Ngram神經網路模型。

   而NNLM模型的計算瓶頸主要在第二步。

如果我們只想得到word的連續特徵向量,是不是可以對第二步裡的神經網路模型進行簡化呢?

Mikolov是這麼想的,也是這麼做的。他在2013年一口氣推出了兩篇paper,並開源了一款計算詞向量的工具——至此,word2vec橫空出世,主角閃亮登場。

有了前邊的基礎,理解word2vec就變的很簡單了。

首先,我們對原始的NNLM模型做如下改造:

  1. 移除前向反饋神經網路中非線性的hidden layer,直接將中間層的Embedding layer與輸出層的softmax layer連線;
  2. 忽略上下文環境的序列資訊:輸入的所有詞向量均彙總到同一個Embedding layer;
  3. 將Future words納入上下文環境

得到的模型稱之為CBOW模型(Continuous Bag-of-Words Model),也是word2vec演算法的第一個模型

上邊可以不看;

CBoW模型

                   

 

 

 簡單介紹下圖二 CBOW引數的含義:

  1. 輸入層(Input layer):上下文單詞的onehot。(假設單詞空間向量dim為V,V的值為詞典中所有詞的個數,上下文單詞個數為C)
  2. 所有onehot分別乘以共享的輸入權重矩陣W(V*N的矩陣,N為自己設定的數,權重矩陣W初始值為隨機初始化的任意值)
  3. N-dim隱藏層向量的值為所有的C個onehot與W相乘,再相加取平均,size為1*N
  4. 再乘以輸出權重矩陣W'(矩陣size為N*V)
  5. 得到向量(1*V),啟用函式(softmax)處理得到V-dim概率分佈(PS:因為是onehot,每個一維都代表著一個單詞),概率最大的index所表示的單詞為預測出的中間詞( target word )
  6. 與true label的onehot(上左圖中的true label為 w(t))作比較,誤差越小越好

    所以需要定義loss function(一般為交叉熵代價函式),採用梯度下降演算法更新W和W'。訓練完畢後,輸入層的每個單詞與矩陣W相乘得到的向量就是我們想要的詞向量(word embedding)這個W矩陣(所有單詞的word embedding)也叫做look up table。

詳細例子,請看這裡

 

Skip-gram模型

CBoW模型依然是從context對target word的預測中學習到詞向量的表達。反過來,我們能否從target word對context的預測中學習到word vector呢?答案是可以的:

                         

 

 

 

 關於skip-gram的詳細介紹,請看這裡

這個模型被稱為Skip-gram模型(名稱源於該模型在訓練時會對上下文環境裡的word進行取樣)。

如果將Skip-gram模型的前向計算過程寫成數學形式(只是一個softmax),我們得到:

                        

其中,Vi 是Embedding層矩陣裡的列向量,也被稱為wi的input vector。Uj 是softmax層矩陣裡的行向量,也被稱為wi 的output vector。

因此,Skip-gram模型的本質是計算輸入word的input vector與目標word的output vector之間的餘弦相似度,並進行softmax歸一化。我們要學習的模型引數正是這兩類詞向量。

然而,直接對詞典裡的V個詞計算相似度並歸一化,顯然是一件及其耗時的impossible mission。為此,Mikolov引入了兩種優化演算法:層次Softmax(Hierarchical Softmax)和負取樣(Negative Sampling)。

Hierarchical Softmax(層次Softmax)

層次Softmax的方法最早由Bengio在05年引入到語言模型中。它的基本思想是將複雜的歸一化概率分解為一系列條件概率乘積的形式:

                  

 

其中,每一層條件概率對應一個二分類問題,可以通過一個簡單的邏輯迴歸函式去擬合。這樣我們對V個詞的概率歸一化問題,轉化成了對logV個詞的概率擬合問題。

我們可以通過構造一顆分類二叉樹來直觀地理解這個過程。未完...

 

參考文獻:

  1. Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.(這篇文章就講了兩個模型:CBOW 和 Skip-gram)
  2. Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.(這篇文章針對Skip-gram模型計算複雜度高的問題提出了一些該進)
  3. Presentation on Word2Vec(這是NIPS 2013workshop上Mikolov的PPT報告)
  4. https://www.cnblogs.com/guoyaohua/p/9240336.html 原文的主要學習文章
  5. https://blog.csdn.net/bitcarmanlee/article/details/82320853   softmax函式
  6. https://www.jianshu.com/p/d2f0759d053c  CBoW模型
  7. https://blog.csdn.net/u010665216/article/details/78721354  skip-gram函式

S=w1,w2