NLP綜述:(一)靜態詞向量
準備將NLP知識系統化,所以會寫一個系列文章:NLP綜述。內容會涵蓋NLP的各個部分,各個部分有粗有細。
本文是本系列第一篇,總結靜態詞向量發展的歷史,包括基於SVD的方法,word2vec,Glove以及subword-units對詞向量的補充。
首先為什麼要做詞向量,其實這個問題可以換個問法"為什麼要做embedding"?原因有三:
- 抽象的事物應該有一個低維的表示。比如我們看到一張含有一張小狗的圖片,它底層的表示就是像素值。同樣的我們看到"dog」這個單詞時,它也應該有更低維的表示。
- 計算機和神經網路善於處理低緯度信息。
- 解決one-hot編碼問題。one-hot編碼是一 種特殊的高維到低維的映射,具有稀疏性,且向量長度較長並隨著樣本集變化而變化。one-hot編碼是一種」討巧」的編碼方式,一般無法表示兩個實體之間的相關性,embedding可以一定程度上解決這些問題。
說白了,任何embedding的終極目標都是在尋找一個長度固定的向量,它可以表示一個實體的「本質」。接下來篇幅會根據詞向量發展的歷史寫。
詞向量分為靜態詞向量和動態(上下文)詞向量,靜態詞向量指的是一個單詞不管上下文如何變化只有一個唯一的詞向量表示,所以它最大的缺點是無法表達多意性,動態詞向量指的會根據上下文動態適應性的調整詞向量,可以一定程度上解決單詞多意性。
一般而言,動態詞向量會歸類為預訓練模型,例如elmo,bert模型。但是其實嚴格來說,不管靜態還是動態詞向量本身都是一種預訓練的思想, 即第一階段訓練詞向量,第二階段根據使用預訓練的詞向量並根據需要是否進行fine-tuning。但是為了突出預訓練的重要性,我們這裡也只單獨說靜態詞向量,後面有文章專門說基於預訓練的動態詞向量。這裡說這麼一段廢話是希望讀者能意識到這兩塊內容是有深刻的歷史沿革的。
1. 基於矩陣分解的方法
這種方法的基本思想是通過大量的數據統計到詞的累計共現矩陣X,然後對X進行奇異值分解得到?,U的每一列對應一個詞的向量表示,SVD更多信息參考這裡。
共現矩陣一般分為詞-文檔共現矩陣和詞-詞共現矩陣。
詞-文檔共現矩陣
這種共現矩陣的思想認為相關的詞會出現在同一個文檔中。假設詞表大小為?,文檔數 量為?,那麼詞-文檔共現矩陣規模為?,矩陣元素?表示詞i在文 檔j中的出現次數,只要對所有文檔循環一次就可以統計得到該矩陣
詞-詞共現矩陣
詞-詞共現矩陣的思想是詞i的窗口內出現了j,那麼認為i和j的共現次數加一,?表 示兩個詞的共現次數,X是一個?的方陣。窗口一般是對稱的,長度一般為 5-10。
這種基於共現矩陣進行SVD分解的方法存在問題:
- 矩陣的維度經常發生變化(新詞和新文檔的加入)
- 矩陣非常稀疏
- 矩陣過大
- SVD分解的計算複雜度大,對於n×m的矩陣進行分解的複雜度為?
- 需要對X矩陣進行一些修正來修複詞頻分佈不均勻問題
- 無法適應一詞多義(靜態詞向量的痛點)
對X矩陣的一些修正:
- 功能詞(the, he, has)過於頻繁,對語法有很大影響,解決辦法是降低使用或完全忽略功能詞
- 採用帶權重的窗口,距離當前詞距離越近共現權重越大
- 用皮爾遜相關係數代替計數,並置負數為0
那能否不構造這種共現矩陣,就可以學習詞向量呢?這就是迭代的方法——2013年橫空出世的word2vec。
2.word2vec
如果要評出nlp最重要的里程碑,word2vec絕對是一個candidate。
word2vec來源於2013年的論文《Efficient Estimation of Word Representation in Vector Space》,它的核心思想是通過詞的上下文得到詞的向量化表示,有兩種方法:CBOW(通過附近詞預測中心詞)、Skip-gram(通過中心詞預測附近的詞)。
word2vec部分有太多的資料了,這裡推薦word2vec的數學原理詳解,多看兩遍,否則容易陷入繁亂的數學推導中。
word2vec的優點是克服了基於矩陣分解的部分問題:
- 語料庫可以動態的變化,可以在線學習
- 不需要進行矩陣分解這種重量級的運算
缺點:
- 每次更新只使用少語料上下文信息,缺少全局上下文的大局觀。
- 無法適應一詞多義(靜態詞向量的痛點)
3. Glove
基於SVD的方法使用的是全局共現信息,能有效地利用統計信息, 但在 word analogy 任務上效果相對較差, 這意味著其向量空間結構並非最優;而word2vec使用的是局部共現信息,在 word analogy 任務上效果好, 但利用語料的統計信息的能力較差, 因為它基於分離的局部上下文進行訓練, 而非全局的 co-occurrence 統計。
而Glove(Global Vectors for Word Representation)融合了兩者的優點,利用詞共現矩陣充分利用了統計信息,高效地對語義進行編碼。先定義符號:
- ?:詞共現矩陣
- ? :在整個語料庫中,單詞i和單詞j共同出現在一個窗口中的次數
- ? :所有單詞在單詞 i的上下文中出現的次數
- ? :單詞 j 在單詞i的上下文中出現的概率。
作者的基本思路是這樣的:比如word i = ice,word j = steam,考慮如下情況:
- 對於與ice相關而與steam不相關的詞,例如solid,我們期望共現概率比值? 較大;
- 對於與ice不相關而與steam相關的詞,例如gas,我們期望共現概率比值? 較小;
- 對於與ice和steam都相關的詞,例如water,我們期望共現概率比值 ?接近1;
- 對於與ice和steam都不相關的詞,例如fashion,我們期望共現概率比值 ?接近1。
下圖是在一個60億單詞語料庫中的統計: