【自然語言處理】word2vec模型

1 N-gram模型

  在自然語言處理(Natural Language Processing,NLP)中,N-gram模型是一個重要的統計語言模型,它通過在一個大的語料庫進行統計,使得我們的模型可以計算出某個語句出現的概率。如有一個句子由w1,w2,...wnw_1,w_2,...w_n組成,則它出現的概率爲
P(w1,w2,w3,..,wn)=P(w1start)P(w2w1,start)P(w3w2,w1,start)...P(wnstart,w1,w2,...,wn1) P(w_1,w_2,w_3,..,w_n)=P(w_1|start)P(w_2|w_1,start)P(w_3|w_2,w_1,start)...P(w_n|start,w_1,w_2,...,w_{n-1})
  由於這個模型的參數過多,並且也難以統計。N-gram模型對上式進行了簡化,假設某個詞出現的概率基於它前面出現的若干個詞,則式子可以用下面的式子表示:
P(w1,w2,w3,..,wn)=P(w1start)P(w2w1)...P(wnwn1) P(w_1,w_2,w_3,..,w_n)=P(w_1|start)P(w_2|w_1)...P(w_n|w_{n-1})
  這裏假設每個詞只與前面一個詞相關,其中每個條件概率可以統計的方式進行估算
P(wnwn1)=Count(wn,wn1)Count(wn1) P(w_n|w_{n-1})=\frac{Count(w_n,w_{n-1})}{Count(w_{n-1})}
  上面的式子是基於前面一個詞彙的條件概率,涉及到2個詞,所以是2-gram。如果考慮基於前n-1個的條件概率,則是N-gram。
  N-gram模型有一個致命的弱點,就是它永遠沒有足夠的數據,數據有很大的稀疏性。比如語料中可能存在“小狗會跑”和“小貓會跳”,但是由於沒有“小狗會跳”和“小貓會跑”的語料,我們的模型永遠不能夠得到“小狗會跳”和“小貓會跑”這個句子。事實上,當n大於3時基本就無法處理了,參數空間太大。實際上,在深度學習中我們可以用RNN,LSTM來克服N-gram模型無法關聯距離較遠的詞彙的缺點。

2 Word Embedding

  我們如何在計算機中表示一個詞呢?最簡單的方法就是使用one-hot向量來表示。用n維向量表示n個詞彙,每個vector中,只有某一位爲1,其他位都爲0,表示某個詞彙。比如,我們有蘋果,香蕉和檸檬三個詞彙,可以分別用[1,0,0],[0,1,0],[0,0,1][1,0,0],[0,1,0],[0,0,1]來表示。
  它的壞處有兩點:

  • 第一,詞彙與詞彙之間沒有聯繫,詞彙之間是相互獨立的。如果用one-hot來表示詞的話,我們無法從中看出詞之間的關聯,比如“dog”和“cat”都是動物,“蘋果”和“香蕉”都是水果,他們的詞向量之間應該很相似。
  • 第二,當語料庫較大,比如有10萬個詞,則每一個詞都是一個10萬維的向量,訓練難度劇增。
      基於以上的缺點,人們想到了使用較小的向量來表示,比如用一個100維的向量來表示,其中每一維代表一定的特徵,比如性別,顏色,大小,是否爲動物,是否爲事物,會跑,會跳……這樣我們就將詞向量壓縮到了一定的大小,避免了維度災難。同時又使得詞與詞之間存在一定的相關性。比如dog和cat在某些維度上會比較相近,使用某些距離度量方式,我們可以算出distance(“dog”,“cat”)是比較小的。用這種方式表示的詞向量叫做分佈式詞向量,可以看做是one-hot向量中的1被分佈在各個維度之中。那麼如何得到這個低維度的向量呢?我們需要進行通過訓練得到這個向量。

3 word2vec模型

  word2vec模型包含了Skip-gram和CBOW模型兩個語言模型,它們都是通過神經網絡來訓練得到詞向量。

3.1 CBOW模型

  CBOW(Continuous Bag-of-Word Model)又稱連續詞袋模型,是一個三層神經網絡。該模型的特點是輸入已知上下文,輸出對當前單詞的預測。CBOW的三層模型如下(以“I love Natural Language Processing”爲例,窗口長度爲2):

  • 輸入層:假設語料庫只有5個詞,用5維one-hot向量分別表示上面的詞彙。假設我們掃描一遍,總共得到以下5個對應關係:([love,Natural],I),([I,Natural,Language],Iove),([I,love,Language,Processing],Natural),([Natural,Language],Processing),其中用中括號括起來的就是我們的輸入,將其用one-hot向量表示,組織成矩陣的形式。假設窗口長度用C表示,總共的語料數爲N則輸入的矩陣爲2C×N2C\times N
  • 隱藏層:隱藏層的權重矩陣W實際上就是我們要學習的參數,假設我們要將原始的one-hot向量映射成K維,那W的維度就是N×KN \times K,不考慮偏置的情況下,其中一個ont-hot向量跟參數矩陣相乘得到的向量,就是我們需要的分佈式詞向量。如下圖所示,由於是one-hot向量,假設1的位置爲4,所以相乘實際上就是在W矩陣中取出第4行。
    在這裏插入圖片描述
    當所有的輸入都轉換成分佈式詞向量之後,對其算求和平均,得到隱藏層的輸出hhhh1×K1\times K的向量。
  • 輸出層:隱藏層的輸出需要經過一個K×NK \times N的矩陣後作爲輸出層的輸入,假設爲矩陣U,再使用softmax計算得到輸出層的輸出,即
    yi=exp(Ui)j=1Nexp(Uj)y_i=\frac{\exp(U_i)}{\sum\limits_{j=1}^N\exp(U_j)}
    yiy_i代表輸出第i個詞的概率。

  訓練的目標是期望訓練樣本特定詞對應的softmax概率最大,我們定義交叉熵損失函數,使用反向傳播算法進行參數的求解,就可以求得我們需要的W矩陣。CBOW模型也就學習完畢。

3.2 Skip-Gram模型

  Skip-Gram模型跟CBOW模型是反過來的,同樣是三層神經網絡,但是Skip-Gram模型的特點是輸入已知單詞,輸出對上下文的預測。這裏就簡單地過一下,大體上和CBOW模型差不多。
  仍舊以“I love Natural Language Processing”爲例,窗口長度爲2爲例,對於Skip-Gram模型的有以下的對應關係:(I,[love,Natural]),(Iove,[I,Natural,Language]),(Natural,[I,love,Language,Processing]),(Processing,[Natural,Language])。則輸入的維度爲1×N1\times N,隱藏層的權重矩陣W維度爲N×KN\times K,輸出神經元有2C2C個,每個神經元的權重矩陣維數爲K×NK\times N。輸出是softmax概率排前2C2C2C2C個詞,訓練的目標是期望訓練樣本特定的2C2C個上下文對應的softmax概率最大。Skip-Gram模型大體上就是這樣。

3.3 Hierarchical Softmax

  從上面的訓練過程可以知道,從輸入層到隱藏層的權重矩陣是我們需要的矩陣,自然是不能省掉的。而隱藏層到輸出層的權重矩陣對我們來說卻沒有什麼作用,卻有K×NK \times N個權重需要學習。因此我們考慮對其進行優化。
  根據數據結構的知識,我們知道哈弗曼樹可以用來對數據進行編碼,使得需要發送的編碼最短。於是我們想到利用哈弗曼樹來提高我們的效率。我們讓葉節點個數爲N,表示所有的詞彙,利用語料庫中的詞頻,構建哈弗曼樹。這樣離樹根越近的葉節點越高頻,並且每個非葉子節點使用一個sigmoid函數來判斷往左還是往右。沿着左邊走爲正類,編碼爲0,沿着右邊走爲負類,編碼爲1。以CBOW模型爲例,我們從輸出層的輸入是1×K1 \times K的向量,我們讓其輸入到哈弗曼樹的樹根,根據樹根的sigmoid即其參數計算得到應該往左還是往右。由於我們知道最終應該走到哪個葉子節點,所以我們的訓練過程就是在讓這顆哈弗曼樹所有的非葉子節點上面的參數符合我們的樣本。
  由於是二叉樹,計算量會從之前的K×NK \times N變成log(K×N)\log (K \times N),同時哈弗曼樹使得高頻詞更容易被找到。做完這一步優化,我們只需要寫出表達式,求出偏導,利用反向傳播求解矩陣W和哈弗曼樹的參數即可。
  在Skip-Gram模型中,同樣可以使用上面的優化。它並沒有和CBOW模型一樣對輸入進行迭代更新,而是對2c個輸出進行迭代更新。

3.4 負採樣

  負採樣(negative sampling)通過使每一個訓練樣本僅僅改變一小部分的權重而不是所有權重,從而解決梯度下降法需要更新大量權重的缺點。它是用來提高訓練速度並且改善所得到詞向量的質量的一種方法。不同於原本每個訓練樣本更新所有的權重,負採樣每次讓一個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。
  在CBOW模型中,假如對於([love,Natural],I),樣本,最後的輸出應該只有I這個詞的神經元爲1,其他詞應該爲0。正常來說,我們應該通過梯度下降修正權重,使得I對應的神經元出現1的概率增大,其他神經元出現1的概率降低。這時我們需要更新的權重個數爲K×NK \times N。而負採樣就是通過隨機選取較少的負樣本來更新對應的權重。負樣本就是我們希望其輸出爲0的樣本,比如對於([love,Natural],I),樣本,在已知上下文love,Natural的情況下,輸出爲1的樣本爲I,輸出爲0的樣本就是Language和Processing。通常情況下語料會很多,不止這裏的5個,假設語料有1萬個詞,我們可以負採樣得到Language和Processing。在最終的計算中,我們只需要更新正確輸出“I”的權重,以及應該輸出0的“Language”和“Processing”的權重。這樣就達到了簡化計算量的目的。
  負採樣的方法很簡單,根據詞頻將詞彙分段,假設有V個詞,則分成V段。通常我們會將詞頻計算公式的分子分母同時取0.75次冪,這個冪實際上是一種“平滑”策略,能夠讓低頻詞多一些出場機會,高頻詞貢獻一些出場機會。由於概率之和爲1,可以將詞彙看成是長度爲1上佔着不同比例的線段。我們選定一個比V更大的M,將1劃分成M等份。這樣每個V都會分到1個或者多個M。採樣時,我們只需要從M個位置中選出neg個位置,其對應的詞就是我們負採樣得到的詞,如果採集到上下文的詞,將其丟棄即可。

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