1. Introduction
今天學的論文是斯坦福大學 2014 年的工作《GloVe: Global Vectors for Word Representation》,在當時有兩種主流的 Word Embedding 方式,一種是 LSA,創建詞頻矩陣,利用 SVD 分解得到詞向量;另一種是 13 年提出的 Word2Vec,基於滑動窗口的淺層神經網絡。前者的優點是利用了全局的統計信息(共現矩陣),後者的優點是計算簡單且效果好 = =,但缺點是沒利用全局的統計信息。所以這篇論文的主要工作是想綜合兩者的優點。
在看論文前我們不妨來思考一下,如果你是研究員,現在有這樣的想法(綜合全局信息和局部信息),你該如何去實現?
2. GloVe Model
2.1 Weighted Least Squares
我們先來給些定義,另 X 爲詞與詞的共現矩陣, 表示單詞 j 出現在單詞 i 上下文中的次數。於是我們有單詞 j 出現在單詞 i 上下文的共現概率:
我們觀察下表的共現概率,只看第一行第二行我們能看出 ice 和 stream 與 solid gas water fashion 等詞的相關性嗎?答案是否定的,但如果我們使用比值 就可以很直觀的看到其相關性:
- 當 k = solid 時,其值爲 8.9,則表明,ice 與 solid 更相關;
- 當 k = gas 時,其值爲 ,所以 steam 與 gas 更相關;
- 當值爲 1 左右時,表明 ice 和 steam 與目標單詞 k 都相關或者都不相關。
從上面的表述中我們看出,比值更能反映相關性,而不是共現單詞概率。所以我們有:
其中, 表示單詞 i 的詞向量, 是獨立的上下文向量將在後面進行介紹,F 可以視爲一種映射或是一種運算。
我們再來看下上面的等式,一個很直觀的感覺就是 F 可能取值很廣。不過不要緊,我們現在給它加些約束。由於向量空間是線形的,所以可以使用向量差:
爲了保證混合向量的維度不變,我們再做個點乘:
實際中,單詞和共現單詞是可以可交換的,現在的等式不滿足交換律。
爲了保證交換律,我們先讓 F 保證爲羣 到羣 的羣同態:
羣同態:設 和 是兩個羣,,有 ,則稱 爲 M 到 S 的同態或羣映射。
所以我們有:
從加減到乘除的運算最容易想到的是指數運算,所以 :
但是有 存在依然沒法符合交換律,又由於其與 k 無關,所以可以將其視爲一個常數 :
現在還不滿足,不過已經很快了,我們在額外的添加一個偏執項 :
好了,現在的等式是對原始等式的一個極端簡化。但這個等式還有一個問題:當 時怎麼辦?所以在實際的算法中我們會加一個偏執: ,這樣即保證了稀疏性,又不至於導致發散。
以上想法看似天馬行空,其實一部分想法是與 LSA 密切相關的(參考 SVD 的變種)。我們 LSA 所有的共現都是等價的, 即使共現次數非常小。然而很多非常小的共現可能是源於噪聲,其攜帶的信息非常少,所以我們引入加權最小二乘法來約束一下噪聲:
其中,權重應該遵循以下原則:
- ,保證了代價函數 J 在 0 點的連續性;
- 應該非遞減的,這個很好理解,共現越多,權值越大;
- 對於較大的 x , 不能太大;
這樣的函數有很多,我們自己設計一個:
這裏的 爲經驗參數,可以取 1 或者 3/4,我們這裏取 3/4(是不是想起了什麼?提示一下:Word2Vec 中 Negative Sampling )。下圖爲 的函數的可視化:
2.2 Relationship to Word2Vec
目前所有的 Word Embedding 的無監督方法最終都是基於語料庫的,只是某些方法不是特別明顯,如 Word2Vec,本節將說明我們定義的模型與現有模型的一些關係。
我們先來給出 Skip-Gram 的預測概率:
全局交叉熵代價函數爲:
計算代價昂貴,Skip-Gram 給出會採用近似解。
由於相同單詞 i 和 j 可以在語料庫中出現多次,所以將相同值的 i 和 j 放在一起:
由於 ,所以:
其中, 爲分佈 和 的交叉熵。J 可以視爲交叉上誤差的加權和。
交叉熵損失的一個重要缺點是需要對分佈 Q 進行歸一化,代價昂貴,所以我們使用最小二乘法來代替交叉熵:
其中,$\hat P_{ij} = X_{ij},\ \hat Q_{ij} = exp(w_i^T\hat w_j) $ 都是非正態分佈,捨棄原來的歸一化因子。
但這個式子引入了一個新的問題: 通常取值很大。一個有效的方式是取 log:
當然 Mikolov 等人也採用了 Sub-Sampling 來減少高頻單詞的權重,所以我們有:
至此就完成了公式推導,可以看到其實這和我們給出的 GloVe 的代價函數基本是一致的。
3. Experiments
然後我們來看下與其他模型的對比實驗部分:
還有參數敏感性的實驗:
細心的同學可以看到這裏有一個 Window Size 的參數,這個是用來統計共現矩陣的。
至此,我們的論文就結束了。但我看完這篇論文還有一個非常大的疑惑:GloVe 是怎麼訓練的呢?
4. Training
我覺得出現這個疑惑一個很大的原因在於,我一直以爲 GloVe 是在 Skip-Gram 架構的基礎上添加語料庫的全局信息,所以也沒有太明白爲什麼論文要證明 Word2Vec 的代價函數與 GloVe 的代價函數相似。
但其實 GloVe 與 LSA 更相關,我們來看下 GloVe 推導的公式:
是不是和帶有偏置的 SVD 的數學表達式很像:
這樣一看應該就明白了,GloVe 的訓練方式其實和 SVD 類似。而推導 Skip-Gram 的代價函數其實是爲了證明其代價函數與 GloVe 設計的代價函數是有關的。所以 Glove 更像是擁有 LSA 的優點,並加入 Skip-Gram 的優點,而不是反過來的。
下面簡要給出 GloVe 的訓練過程:
- 首先,預統計 GloVe 的共現矩陣;
- 接着,隨機初始化兩個矩陣:W 和 ,大小爲 ,還有兩個偏置向量:B 和 大小爲 ;
- 然後,計算 GloVe 的損失函數,並通過 Adagrad 來更新參數,參數包括兩個矩陣和兩個偏置向量;
- 最後,重複第三步知道達到停止條件後結束訓練。
我們最終得到的詞向量爲 W 和 ,類似於 Skip-Gram 裏面的輸入矩陣和輸出矩陣。
那麼問題來了:爲什麼不用一個矩陣和一個偏置項呢?這樣計算量還可以減少一半,何樂不爲?
歡迎大家在留言區討論留言。
我們再簡單分析一下 GloVe 的時間複雜度,從上面的實驗結果來看 GloVe 的速度是非常快的,其原因主要有以下幾點:
- 時間複雜度低,最差爲 O© ,即統計一遍語料庫的共現矩陣,具體推導看論文;
- 參數稀疏,可以用異步梯度下降算法進行優化;
- 關注全局信息,收斂速度快。
5. Conclusion
至此,我們便結束了 GloVe 的介紹,用一句話總結便是:GloVe 使用具有全局信息的共現矩陣,並採用類似矩陣分解的方式求解詞向量,通過修改代價函數將 Word2Vec 關注局部特徵的優點加入進來,並取得了良好的效果。
我們嘗試着將 GloVe 與 Word2Vec 進行對比:
- Word2Vec 有神經網絡,GloVe 沒有;
- Word2Vec 關注了局部信息,GloVe 關注局部信息和全局信息;
- 都有滑動窗口但 Word2Vec 是用來訓練的,GloVe 是用來統計共現矩陣的;
- GloVe 的結構比 Word2Vec 還要簡單,所以速度更快;
- Word2Vec 是無監督學習,而 GloVe 可是視爲有監督的,其 Label 爲 。
再試着將 GLoVe 與 SVD 進行對比:
- SVD 所有單詞統計權重一致,GloVe 對此進行了優化;
- GloVe 使用比值而沒有直接使用共現矩陣。
當然 GloVe 看着那麼好,其實並不一定,在很多任務中都沒 Word2Vec 的效果好。
畢竟沒有最好的模型,只有最適合的模型。
6. Reference
- 《GloVe: Global Vectors for Word Representation》
關注公衆號跟蹤最新內容:阿澤的學習筆記。