詞嵌入模型的發展歷程

本文意在梳理如何用向量表示單詞來讓單詞變得可計算的這一nlp問題的發展歷程。

自然語言處理(Natural Language Processing),曾經也叫做“Computational linguistics”。從名字就能看出,核心就在於讓language變得computational,在可以計算的前提下,一切計算機/數學方法才得以使用。這就是word representation的出發點,將language / paragraph / sentence/ word/ character 用數學形式來表示。目前通常採用的representation形式是向量形式。

1.普通序數
首先對於離散的單詞我們可能會想到用一個整數序號來表示不同的單詞。
如:有{蘋果,橘子,梨}     我們可能會用蘋果:1,橘子:2,梨:3來表示三個不同的水果。
但是:如果進行加法操作:3-1=2,3-2=1;難道我們可以認爲梨和蘋比梨和橘子更像嗎?

2.one-hot編碼
於是,我們引出one-hot編碼,它最大的特點就是假設不同的word之間相互獨立,這就解決了上述問題。
假設詞料庫有n個單詞,那麼就假設一個n維向量,n個每次佔據自己獨立的索引,那麼表示第a的單詞,就用這樣一個n維向量表示,其中第a個位置爲1,其餘n-1個位置用0表示。爲了提高魯棒性,我們可以設置一個未定義的位置即使用n+1維向量,遇到沒在語料庫的word在第n+1個位置置一。
但是,如果n太大,那無疑是個計算災難。於是詞嵌入模型(Distributed Representation)應運而生。

3.詞嵌入模型
Distributed Representation的意思是,描述language的向量是定長的(fix-length),在定長的向量中,一個語義信息可能由多個維度共同決定,一個維度也可能決定着多方面的語義信息。此時,word vector就比較稠密(dense),不再像one-hot encoding一樣稀疏。這樣就可以大大縮短表示word的vector維度。

獲取詞向量基本上有三種思路:
1.利用全局統計信息,進行矩陣分解(如LSA)來獲取詞向量,這樣獲得的詞向量往往在詞相似性任務上表現不好,表明這是一個次優的向量空間結構。
2.利用局部上下文窗口單獨訓練,但是統計信息作爲有用的先驗知識,沒有很好的利用到。如word2vec。
3.Glove:結合兩種訓練方式,獲取更好的詞向量

3.1統計方法

3.1.1 向量空間模型(VSM)
首先介紹一下VSM,因爲LSA就是對於VSM的改進。
VSM的基本思想是:給定一個文本,用一個向量表示文本的語義,向量的每一維對應一個單詞,數字表示單詞在文本出現的次數。於是一個nxm的單詞-文本矩陣,n表示單詞的類別總數,m表示m個文本,每一個列向量表示一個文本的語義,比較兩個文本的相似度就用內積來表示。因爲如果文本相同的單詞很多,內積就越大,表示越相似。但是其不能處理一詞多義及多詞一義,比如airplane和aircraft是個近義詞,但是內積依舊爲0。
ps:用tf-idf來表示數值,來優化常用詞比如the、a對模型的影響,因爲這些常用詞不代表具體意義。

3.1.2 LSA(全局特徵)
單詞-話題矩陣 nxk
與單詞-文本矩陣近似,現在列向量表示一個話題的單詞向量,每一個值代表該單詞在話題的權值,權值越大表示該單詞越能表示這個話題。
話題-文本矩陣 kxm
與單詞-文本矩陣近似,列向量表示一個文本的話題向量。
這樣一來,
單詞-文本矩陣X(nxm)
單詞-話題矩陣T (nxk)
話題-文本矩陣 Y(kxm)
X=TY
這樣就將文本用單詞來表示變成了文本用話題來表示,相當於變換了座標系。
可以用SVD處理等式。

3.2局部上下文(context)方法
因爲僅關注全局的cooccurence,word vector包含的詞向量語義信息有限,僅僅能進行詞語相似度計算等有限的任務。所以引入了針對於局部上下文的word2vec方法。
word2vec有兩種形式
3.2.1 ebow
在這裏插入圖片描述
cbow是利用上下文來預測其中的某一單詞,如圖所示。
3.2.2 skip-grim
在這裏插入圖片描述
skip-gram是利用某一單詞來預測其上下文。

具體ebow和skip-gram的細節就不細說了,提一下訓練方法,爲了提高訓練速度,我們常用hierarchical softmax和negative sampling兩種方法。其中hierarchical分層是因爲引入了哈夫曼樹,有興趣的同學可以自己瞭解一下。

經過訓練得到嵌入矩陣後,比如說要將單詞壓縮到k個維度,那麼嵌入矩陣就是kxn大小,每個列向量代表一個單詞的嵌入向量。

3.3Glove方法

3.3.1共現矩陣
還有一種共現矩陣的方法。
將共現矩陣行(列)作爲詞向量
例如:語料庫如下:
• I like deep learning.
• I like NLP.
• I enjoy flying.
則共現矩陣表示如下:(使用對稱的窗函數(左右window length都爲1) )
在這裏插入圖片描述
例如:“I like”出現在第1,2句話中,一共出現2次,所以=2。。
對稱的窗口指的是,“like I”也是2次。
將共現矩陣行(列)作爲詞向量表示後,可以知道like,enjoy都是在I附近且統計數目大約相等,他們意思相近。

而glove算法就是通過共現矩陣來訓練出來每個單詞對應的詞向量。
https://zhuanlan.zhihu.com/p/42073620知乎的這個回答我覺得很到位,大家可以直接去看這個。

以上內容就是詞向量表示的發展概況了。

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