訓練GloVe詞向量模型
- 2019 年 12 月 5 日
- 筆記
- 1. 說說GloVe
- 2. GloVe的實現步驟
- 2.1 構建共現矩陣
- 2.2 詞向量和共現矩陣的近似關係
- 2.3 構造損失函數
- 2.4 訓練GloVe模型
- 3. GloVe與LSA、Word2Vec的比較
- 4. 程式碼實現
1. 說說GloVe
正如GloVe論文的標題而言,**GloVe的全稱叫Global Vectors for Word Representation,它是一個基於全局詞頻統計(count-based & overall statistics)的詞表徵(word representation)工具,它可以把一個單詞表達成一個由實數組成的向量,這些向量捕捉到了單詞之間一些語義特性,比如相似性(similarity)、類比性(analogy)等。**我們通過對向量的運算,比如歐幾里得距離或者cosine相似度,可以計算出兩個單詞之間的語義相似性。
2. GloVe的實現步驟
2.1 構建共現矩陣
什麼是共現矩陣?
共現矩陣顧名思義就是共同出現的意思,詞文檔的共現矩陣主要用於發現主題(topic),用於主題模型,如LSA。
局域窗中的word-word共現矩陣可以挖掘語法和語義資訊,例如:
- I like deep learning.
- I like NLP.
- I enjoy flying
有以上三句話,設置滑窗為2,可以得到一個詞典:{"I like","like deep","deep learning","like NLP","I enjoy","enjoy flying","I like"}。
我們可以得到一個共現矩陣(對稱矩陣):

中間的每個格子表示的是行和列組成的片語在詞典中共同出現的次數,也就體現了共現的特性。
GloVe的共現矩陣
根據語料庫(corpus)構建一個共現矩陣(Co-ocurrence Matrix)X,矩陣中的每一個元素 Xij 代表單詞 i 和上下文單詞 j 在特定大小的上下文窗口(context window)內共同出現的次數。一般而言,這個次數的最小單位是1,但是GloVe不這麼認為:它根據兩個單詞在上下文窗口的距離 d,提出了一個衰減函數(decreasing weighting):decay=1/d 用於計算權重,也就是說距離越遠的兩個單詞所佔總計數(total count)的權重越小。
2.2 詞向量和共現矩陣的近似關係
構建詞向量(Word Vector)和共現矩陣(Co-ocurrence Matrix)之間的近似關係,論文的作者提出以下的公式可以近似地表達兩者之間的關係:


這個函數影像如下所示:

2.4 訓練GloVe模型
雖然很多人聲稱GloVe是一種無監督(unsupervised learing)的學習方式(因為它確實不需要人工標註label),但其實它還是有label的,這個label就是以上公式中的 log(Xij),而公式中的向量 $w和tilde{w}$ 就是要不斷更新/學習的參數,所以本質上它的訓練方式跟監督學習的訓練方法沒什麼不一樣,都是基於梯度下降的。
具體地,這篇論文里的實驗是這麼做的:**採用了AdaGrad的梯度下降演算法,對矩陣 X 中的所有非零元素進行隨機取樣,學習曲率(learning rate)設為0.05,在vector size小於300的情況下迭代了50次,其他大小的vectors上迭代了100次,直至收斂。**最終學習得到的是兩個vector是 $w和tilde{w}$,因為 X 是對稱的(symmetric),所以從原理上講 $w和tilde{w}$ 是也是對稱的,他們唯一的區別是初始化的值不一樣,而導致最終的值不一樣。

3. GloVe與LSA、Word2Vec的比較
LSA(Latent Semantic Analysis)是一種比較早的count-based的詞向量表徵工具,它也是基於co-occurance matrix的,只不過採用了基於奇異值分解(SVD)的矩陣分解技術對大矩陣進行降維,而我們知道SVD的複雜度是很高的,所以它的計算代價比較大。還有一點是它對所有單詞的統計權重都是一致的。而這些缺點在GloVe中被一一克服了。
而word2vec最大的缺點則是沒有充分利用所有的語料,所以GloVe其實是把兩者的優點結合了起來。從這篇論文給出的實驗結果來看,GloVe的性能是遠超LSA和word2vec的,但網上也有人說GloVe和word2vec實際表現其實差不多。
4. 程式碼實現
