詞向量發展史-共現矩陣-SVD-NNLM-Word2Vec-Glove-ELMo

話不多說,直接上乾貨。

首先介紹相關概念:

詞嵌入把詞映射爲實數域上向量的技術也叫詞嵌入(word embedding

詞向量的分類表示

一、共現矩陣

       通過統計一個事先指定大小的窗口內的word共現次數,以word周邊的共現詞的次數做爲當前wordvector具體來說,我們通過從大量的語料文本中構建一個共現矩陣來定義word representation

       例如,有語料如下

I like deep learning.
I like NLP.
I enjoy flying.

      得到共現矩陣X如下:

此時選的窗口大小爲3,選擇在該窗口內詞彙的共現頻率作爲vector

矩陣定義詞向量的優點:在一定程度上緩解了one-hot向量相似度爲0的問題,但依舊沒有解決數據係數和維度災難的問題。

二、SVD(奇異值分解)

       既然基於共現矩陣得到的離散詞向量存在着高維和稀疏性的問題,一個自然而然的解決思路是對原始詞向量進行降維,從而得到一個稠密的連續詞向量。

       首先,統計一個詞語的共生矩陣XX是一個|V|×|V| 大小的矩陣,Xij表示在所有語料中,詞彙表V中第i個詞和第j個詞同時出現的詞數,|V|爲詞彙表的大小。X做矩陣分解(如奇異值分解)得到矩陣正交矩陣U,對U進行歸一化得到矩陣,即視爲所有詞的詞向量:

SVD得到了word的稠密(dense)矩陣,該矩陣具有很多良好的性質:語義相近的詞在向量空間相近,甚至可以一定程度反映word間的線性關係。

但這樣的傳統做法有很多問題:

  1. 由於很多詞沒有出現,導致矩陣極其稀疏,因此需要對詞頻做額外處理來達到好的矩陣分解效果;
  2. 矩陣非常大,維度太高
  3. 需要手動去掉停用詞(如although, a,...),不然這些頻繁出現的詞也會影響矩陣分解的效果。

奇異值分解可見本專欄的博客

三、神經網絡語言模型(NNLM

NNLMBengio等人提出,他的主要想法就是:

1. 把字典裏的每一個單詞對應一個詞特徵向量

2. 把單詞序列表示成聯合概率函數

3. 自動學習詞特徵向量和概率函數的參數

NNLM中,每一個單詞爲向量空間中的一個點,而且特徵的數目要比字典的大小要小,它的概率函數表示爲在給定前一個詞下,後一個詞的條件概率的乘積。

輸入:

(1)首先是對整個詞彙表建立一個索引,每個單詞對應一個索引號,其實就是one-hot編碼

(2)one-hot編碼建立索引矩陣D,維度爲 (n−1)×|V|,即每一行代表一個單詞的one hot

(3)而矩陣C每一行爲一個單詞的詞向量,這樣D⋅C就抽取出對應單詞的向量了,這就是圖中的table look-up in c

(4)找出對應的詞向量後,將這些詞向量拼接在一起,形成一個 (n−1)m維的列向量x

(5)經過隱含層tanh函數的激活,再經過softmax輸出層的輸出,這就得到了函數g的輸出向量。

輸出:

       函數g把輸入的上下文單詞的特徵向量(C(wt−n+1),...,C(wt−1))映射爲下一個單詞wt的條件概率分佈函數,當然,這個單詞wt在字典V中。

四、Word2Vec

       2013年,Google團隊發表了word2vec工具word2vec工具主要包含兩個模型:跳字模型(skip-gram)和連續詞袋模型(continuous bag of words,簡稱CBOW),以及兩種近似訓練法:負採樣(negative sampling)和層序softmaxhierarchical softmax)。值得一提的是,word2vec的詞向量可以較好地表達不同詞之間的相似和類比關係。    

      在skip-gram模型中,我們用一個詞來預測它在文本序列周圍的詞。

      在cbow模型中,我們用周圍詞來預測核心詞。

      word2vec詳情可參考我的這篇博客

 

五、Glove

      Glove是斯坦福大學Jeffrey Pennington等人提出的他們認爲雖然skip-gram模型在計算近義詞方面比較出色,但它們只是在局部上下文窗口訓練模型,並且它很少使用語料中的一些統計信息,因此Jeffrey Pennington等人又提出了一個新型模型GloVe

       首先給一些說明,詞-詞共現計數矩陣可以表示爲X,則Xij爲單詞j出現在單詞i上下文中的次數。Xi=ΣkXik表示任何詞出現在單詞i上下文中的次數,Pij=P(j|i)=Xij/Xi表示單詞j出現在單詞i上下文中的比率

       使用一個例子來說明是怎樣從共現概率中抽取確定的意思,其實也就是說,和哪個上下文單詞在一起的多,那麼這個單詞與這個上下文單詞在一起要比與其他詞在一起意義要大。

       例如i=ice, j=steam,假設有共現詞k,但是kice的聯繫要比與steam的聯繫強,也就是說單詞kice出現的概率比與 steam出現的概率大,比如說k=solid,那麼我們認Pik/Pjk會很大。

       相似地,如果單詞ksteam的聯繫比與ice的聯繫強,例如k=gas,那麼Pik/Pjk的比率會很小,對於其他的單詞kwater, fashionice,steam聯繫都強或都不強的話,則Pik/Pjk的比率會接近1

       這個比率就能區別相關詞(solid, gas)和不相關詞(water, fashion),並且也能區別這兩個相關的詞(solid, gas)。那麼得到的向量可能爲ice-steam=solid-gas,這與word2vec相似。

        word2vecglove的區別:

        Omer Levy等人對基於計數的方法和基於embedding的方法做了對比,發現它們之間並沒有非常大的差距,在不同的場景各個模型發揮不同的作用,它們之間並沒有誰一定優於誰,相比於算法而言,增加語料量,進行預處理以及超參數的調整顯得非常重要。特別指出,基於negtive samplingskip-gram模型可以作爲一個基準,儘管對不同的任務它可能不是最好的,但是它訓練快,佔用內存和磁盤空間少。

六、ELMo-動態詞向量

        艾倫研究所開發,並於6月初在NAACL 2018年發佈ELMo(深度語境化的單詞表示)。ELMo(Embeddings from Language Models) ,被稱爲時下最好的通用詞和句子嵌入方法,來自於語言模型的詞向量表示,也是利用了深度上下文單詞表徵,該模型的優勢:
1)能夠處理單詞用法中的複雜特性(比如句法和語義)
2)這些用法在不同的語言上下文中如何變化(比如爲詞的多義性建模)

       ELMoword2vecglove最大的不同:即詞向量不是一成不變的,而是根據上下文而隨時變化,這與word2vec或者glove具有很大的區別

舉個例子:針對某一詞多義的詞彙 w="蘋果"
文本序列1=“ 買了 六斤 蘋果。
文本序列2=“ 買了一個 蘋果 7
上面兩個文本序列中都出現了蘋果這個詞彙,但是在不同的句子中,它們的含義顯示是不同的,一個屬於水果領域,一個屬於電子產品呢領域,如果針對蘋果這個詞彙同時訓練兩個詞向量來分別刻畫不同領域的信息呢?答案就是使用ELMo

        ELMo是雙向語言模型bilm的多層表示的組合,基於大量文本,ELMo模型是從深層的雙向語言模型(deep bidirectional language model)中的內部狀態(internal state)學習而來的,而這些詞向量很容易加入到QA、文本對齊、文本分類等模型中,後面會展示一下ELMo詞向量在各個任務上的表現。

       它首先在大文本語料庫上預訓練了一個深度雙向語言模型(bilm),然後把根據它的內部狀態學到的函數作爲詞向量。實驗表明,這些學到的詞表徵可以輕易地加入到現有的模型中,並在回答問題、文本蘊含、情感分析等 6 個不同的有難度的 NLP 問題中大幅提高最佳表現。實驗表明顯露出預訓練模型的深度內部狀態這一做法非常重要,這使得後續的模型可以混合不同種類的半監督信號。

       使用ELMo獲得詞向量替換Glove的詞向量作爲多項特定NLP模型的輸入,在ELMO實驗論文中表明具有一定的效果提升:

ps:

elmo很厲害,但並不是說在中文語料的表現上比word2vec好很多。據哈工大的研究表明,從句發任務的角度出發,在OOV比例高的數據中ELMO效果好。哈工大分析了OOV、traning data size、morphological richness等因素。在多國語法任務中,OOV rate與ELMo帶來的提升的相關性最高。(當然,這些因素之間實際上不是正交的,traning data size比較小的往往OOV rate也高,morphology rich的數據OOV往往更多)。

回到中文的問題,ELMo能否比word2vec好以及好多少,和實際任務關係可能很大。

如果是訓練數據很少或者接近zero-shot,one-shot這種settings,ELMo很可能表現得更好。如果訓練數據很好(比如其他答案中提到的dureader數據),ELMo可能沒什麼效果。

除此之外,中文是形態不豐富的語言,這點可能會影響ELMo的發揮。

詳情可見鏈接

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