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

1. 說說GloVe

正如GloVe論文的標題而言,**GloVe的全稱叫Global Vectors for Word Representation,它是一個基於全局詞頻統計(count-based & overall statistics)的詞表徵(word representation)工具,它能夠把一個單詞表達成一個由實數組成的向量,這些向量捕捉到了單詞之間一些語義特性,好比類似性(similarity)、類比性(analogy)等。**咱們經過對向量的運算,好比歐幾里得距離或者cosine類似度,能夠計算出兩個單詞之間的語義類似性。git

2. GloVe的實現步驟

2.1 構建共現矩陣

什麼是共現矩陣?github

共現矩陣顧名思義就是共同出現的意思,詞文檔的共現矩陣主要用於發現主題(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項目:github.com/stanfordnlp…

解壓後,進入目錄執行

make

進行編譯操做。

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

GloVe代碼實現

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

3.png

5. 參考文獻


做者:@mantchs

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

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

相關文章
相關標籤/搜索