無監督學習:詞嵌入or詞向量(Word Embedding)
National Taiwan University (NTU)李巨集毅老師的《Machine Learning》的學習筆記,因此在全文對視訊出現的內容多次引用。初出茅廬,學藝不精,有不足之處還望大家不吝賜教。
歡迎大家在評論區多多留言互動~~~~
1. 為什麼要使用詞嵌入(Word Embedding)
在詞嵌入之前往往採用 1-of-N Encoding 的方法,如下圖所示
這種方法主要有兩個 缺點,首先這種表示是正交的,但是正是由於正交性使得具有相似屬性的詞之間的關係變得微弱;其次這種編碼方式使得碼字很長,比如說一共有10萬個單詞,那麼就需要一個長度為10萬的串進行編碼。
為了克服這樣的缺點,採用了詞嵌入(Word Embedding)的方法。這種方法將詞對映到高維之中(但是維數仍比 1-of-N Encoding 低很多),相似的單詞會聚集在一起,而不同的單詞會分開;每個座標軸可以看作是區分這些單詞的一種屬性,比如說在上圖中,橫座標可以認為是生物與其他的區別,縱座標可以認為是會動和不會動的區別。
2. 為什麼詞嵌入(Word Embedding)是無監督學習
因為在進行學習的過程中,我們只知道輸入的是詞的一種編碼,輸出的是詞的另一種編碼,但是並不知道具體應該是怎樣的一種編碼,所以是無監督學習。
有的人可能想可以通過自編碼的方式實現詞嵌入,但是如果你得輸入是 1-of-N Encoding 的話,是基本上不可以採用這樣的方法處理的 ,因為輸入的向量都是無關的,很難通過自編碼的過程提取出什麼有用的資訊。
3. 詞嵌入(Word Embedding)的兩種方式
詞嵌入(Word Embedding)主要有基於統計(Count based )和基於預測(Perdition based)的兩種方法。
3.1 基於統計(Count based )
這種方法的主要思路如下圖所示
兩詞向量共同出現的頻率比較高的話,那麼這兩個詞向量也應該比較相似。所以兩個詞向量的點積應該與它們公共出現的次數成正比,這個於上節課講的矩陣分解就很像了。具體可以參見 Glove Vector: http://nlp.stanford.edu/projects/glove/
3.2 基於預測(Perdition based)
最原始的想法是如下圖所示的方法
在這裡神經網路的輸入是前一個單詞 的詞向量( 1-of-N Encoding )形式,經過神將網路他的輸出應該是下一個可能出現的單詞 是某一個詞的機率,因為是 1-of-N Encoding 形式,所以輸出的每一維代表是某一個次的概率。然後取第一層的權值輸入 作為詞向量。
在實際使用中,往往找的不僅僅是一個詞與下一個詞之間的關係,而是通過前面一堆詞推出後面的一個詞,在訓練的過程中有類似於權值共享的行為,如下圖所示
其中我們可以看到位於相同位置的輸入神經元有著相同的權值(在途中用相同顏色的線表示出來),這樣做的原因主要保證兩點,首先在要保證對於在同一批輸入的同一個單詞具有同樣的編碼(即相同的權重);其次權值共享可以減少模型中引數的個數。
那麼如何保證在訓練的過程中它們具有相同的權重呢?如下圖所示
在梯度更新的過程中,首相對共享的引數設定相同的初始值,其次在更新的過程中不僅僅要減去自己對應的梯度,還應該減去另一個相同位置神經元的梯度,保證兩個引數之間的更新過程是相同的。
除了可以根據之前的詞推出後面的詞,還可以根據兩邊的詞推出中間的詞,或者從中間的詞推出兩邊的詞
在這裡雖然用了神經網路,但是並沒有用deep learning,而只是用了一層的 linear hidden layer,主要是因為過去雖然有用過deep的方法,但是很難訓練,並且實際上用一層就可以達到的效果為什麼一定要用deep的方法呢。
通過實驗我們可以看到,詞向量之間是有一定的對應關係的,比如說國家與首都有著較好的對應關係,動詞的三態有著較為穩定的三角關係。
PS:感謝網友 @mabowen110 指出我忘記加上了部落格的來源,十分感謝~