四步理解GloVe!(附代碼實現)


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"}

我們可以得到一個共現矩陣(對稱矩陣):

image

中間的每個格子表示的是行和列組成的詞組在詞典中共同出現的次數,也就體現了共現的特性。

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)之間的近似關系,論文的作者提出以下的公式可以近似地表達兩者之間的關系:

\[w_i^T\tilde{w_j}+b_i+\tilde{b}_j=log(X_{ij}) \]

其中,\(w_i^T和\tilde{w}_j\) 是我們最終要求解的詞向量;\(b_i和\tilde{b}_j\) 分別是兩個詞向量的bias term。當然你對這個公式一定有非常多的疑問,比如它到底是怎么來的,為什么要使用這個公式,為什么要構造兩個詞向量 $$w_i^T和\tilde{w}_j$$?請參考文末的參考文獻。

2.3 構造損失函數

有了2.2的公式之后我們就可以構造它的loss function了:

\[J=\sum_{i,j=1}^Vf(X_{ij})(w_i^T\tilde{w}_j+b_i+\tilde{b}_j-log(X_{ij}))^2 \]

這個loss function的基本形式就是最簡單的mean square loss,只不過在此基礎上加了一個權重函數 \(f(X_{ij})\),那么這個函數起了什么作用,為什么要添加這個函數呢?我們知道在一個語料庫中,肯定存在很多單詞他們在一起出現的次數是很多的(frequent co-occurrences),那么我們希望:

  • 這些單詞的權重要大於那些很少在一起出現的單詞(rare co-occurrences),所以這個函數要是非遞減函數(non-decreasing);
  • 但我們也不希望這個權重過大(overweighted),當到達一定程度之后應該不再增加;
  • 如果兩個單詞沒有在一起出現,也就是 \(X_{ij}=0\),那么他們應該不參與到 loss function 的計算當中去,也就是f(x) 要滿足 f(0)=0。

滿足以上三個條件的函數有很多,論文作者采用了如下形式的分段函數:

這個函數圖像如下所示:

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}\) 是也是對稱的,他們唯一的區別是初始化的值不一樣,而導致最終的值不一樣。

所以這兩者其實是等價的,都可以當成最終的結果來使用。但是為了提高魯棒性,我們最終會選擇兩者之和 \(w+\tilde{w}\) 作為最終的vector(兩者的初始化不同相當於加了不同的隨機噪聲,所以能提高魯棒性)。在訓練了400億個token組成的語料后,得到的實驗結果如下圖所示:

這個圖一共采用了三個指標:語義准確度,語法准確度以及總體准確度。那么我們不難發現Vector Dimension在300時能達到最佳,而context Windows size大致在6到10之間。

3. GloVe與LSA、Word2Vec的比較

LSA(Latent Semantic Analysis)是一種比較早的count-based的詞向量表征工具,它也是基於co-occurance matrix的,只不過采用了基於奇異值分解(SVD)的矩陣分解技術對大矩陣進行降維,而我們知道SVD的復雜度是很高的,所以它的計算代價比較大。還有一點是它對所有單詞的統計權重都是一致的。而這些缺點在GloVe中被一一克服了。

而word2vec最大的缺點則是沒有充分利用所有的語料,所以GloVe其實是把兩者的優點結合了起來。從這篇論文給出的實驗結果來看,GloVe的性能是遠超LSA和word2vec的,但網上也有人說GloVe和word2vec實際表現其實差不多。

4. 代碼實現

生成詞向量

下載GitHub項目:https://github.com/stanfordnlp/GloVe/archive/master.zip

解壓后,進入目錄執行

make

進行編譯操作。

然后執行 sh demo.sh 進行訓練並生成詞向量文件:vectors.txt和vectors.bin

GloVe代碼實現

機器學習通俗易懂系列文章

3.png

5. 參考文獻


作者:@mantchs

GitHub:https://github.com/NLP-LOVE/ML-NLP

歡迎大家加入討論!共同完善此項目!群號:【541954936】NLP面試學習群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM