1. 程式人生 > >無監督學習:詞嵌入or詞向量(Word Embedding)

無監督學習:詞嵌入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)

  最原始的想法是如下圖所示的方法

在這裡神經網路的輸入是前一個單詞 wi1 的詞向量( 1-of-N Encoding )形式,經過神將網路他的輸出應該是下一個可能出現的單詞 wi 是某一個詞的機率,因為是 1-of-N Encoding 形式,所以輸出的每一維代表是某一個次的概率。然後取第一層的權值輸入 z 作為詞向量。

  在實際使用中,往往找的不僅僅是一個詞與下一個詞之間的關係,而是通過前面一堆詞推出後面的一個詞,在訓練的過程中有類似於權值共享的行為,如下圖所示

其中我們可以看到位於相同位置的輸入神經元有著相同的權值(在途中用相同顏色的線表示出來),這樣做的原因主要保證兩點,首先在要保證對於在同一批輸入的同一個單詞具有同樣的編碼(即相同的權重);其次權值共享可以減少模型中引數的個數。

  那麼如何保證在訓練的過程中它們具有相同的權重呢?如下圖所示

在梯度更新的過程中,首相對共享的引數設定相同的初始值,其次在更新的過程中不僅僅要減去自己對應的梯度,還應該減去另一個相同位置神經元的梯度,保證兩個引數之間的更新過程是相同的。

  除了可以根據之前的詞推出後面的詞,還可以根據兩邊的詞推出中間的詞,或者從中間的詞推出兩邊的詞

在這裡雖然用了神經網路,但是並沒有用deep learning,而只是用了一層的 linear hidden layer,主要是因為過去雖然有用過deep的方法,但是很難訓練,並且實際上用一層就可以達到的效果為什麼一定要用deep的方法呢。

  通過實驗我們可以看到,詞向量之間是有一定的對應關係的,比如說國家與首都有著較好的對應關係,動詞的三態有著較為穩定的三角關係。

PS:感謝網友 @mabowen110 指出我忘記加上了部落格的來源,十分感謝~