1. 程式人生 > >為什麼要做word embedding

為什麼要做word embedding

該篇主要是討論為什麼要做word embedding:

gitbook閱讀:Word Embedding介紹

至於word embedding的詳細訓練方法在下一節描述。

 

目錄

  • 單詞表達
    • One hot representation
    • Distributed representation
  • Word embedding
    • 目的
      • 資料量角度
      • 神經網路分析
    • 訓練簡述

 

單詞表達

先前在卷積神經網路的一節中,提到過圖片是如何在計算機中被表達的。 同樣的,單詞也需要用計算機可以理解的方式表達後,才可以進行接下來的操作。

One hot representation

程式中編碼單詞的一個方法是one hot encoding。

例項:有1000個詞彙量。排在第一個位置的代表英語中的冠詞"a",那麼這個"a"是用[1,0,0,0,0,...],只有第一個位置是1,其餘位置都是0的1000維度的向量表示,如下圖中的第一列所示。

 

也就是說,

在one hot representation編碼的每個單詞都是一個維度,彼此independent。

Distributed representation

然而每個單詞彼此無關這個特點明顯不符合我們的現實情況。我們知道大量的單詞都是有關。

語義:girl和woman雖然用在不同年齡上,但指的都是女性。

複數:word和words僅僅是複數和單數的差別。

時態:buy和bought表達的都是“買”,但發生的時間不同。

所以用one hot representation的編碼方式,上面的特性都沒有被考慮到。

我們更希望用諸如“語義”,“複數”,“時態”等維度去描述一個單詞。每一個維度不再是0或1,而是連續的實數,表示不同的程度。

目的

但是說到底,為什麼我們想要用Distributed representation的方式去表達一個單詞呢?

資料量角度

這需要再次記住我們的目的:

機器學習:從大量的個樣本  {\{(x_i,y_i)^N_{i=1}}\}
 中,尋找可以較好預測未見過  x_{new} 所對應  y_{new} 的函式  f:x\rightarrow y 。

例項:在我們日常生活的學習中,大量的 {\{(x_i,y_i)^N_{i=1}}\} 就是歷年真題, x_i 是題目,而 y_i 是對應的正確答案。高考時將會遇到的 x_{new} 往往是我們沒見過的題目,希望可以通過做題訓練出來的解題方法 f:x\rightarrow y 來求解出正確的 y_{new} 。

如果可以見到所有的情況,那麼只需要記住所有的 x_i 所對應的 y_i 就可以完美預測。但正如高考無法見到所有型別的題一樣,我們無法見到所有的情況。這意味著,

機器學習需要從有限的例子中尋找到合理的  f 。

高考有兩個方向提高分數:

  • 方向一:訓練更多的資料:題海戰術。
  • 方向二:加入先驗知識:儘可能排除不必要的可能性。

問題的關鍵在於訓練所需要的資料量上。

同理,如果我們用One hot representation去學習,那麼每一個單詞我們都需要例項資料去訓練,即便我們知道"Cat"和"Kitty"很多情況下可以被理解成一個意思。

為什麼相同的東西卻需要分別用不同的資料進行學習?

 

神經網路分析

假設我們的詞彙只有4個,girl, woman, boy, man,下面就思考用兩種不同的表達方式會有什麼區別。

One hot representation

儘管我們知道他們彼此的關係,但是計算機並不知道。在神經網路的輸入層中,每個單詞都會被看作一個節點。 而我們知道訓練神經網路就是要學習每個連線線的權重。如果只看第一層的權重,下面的情況需要確定4*3個連線線的關係,因為每個維度都彼此獨立,girl的資料不會對其他單詞的訓練產生任何幫助,訓練所需要的資料量,基本就固定在那裡了。

 

Distributed representation

我們這裡手動的尋找這四個單詞之間的關係。可以用兩個節點去表示四個單詞。每個節點取不同值時的意義如下表。 那麼girl就可以被編碼成向量[0,1],man可以被編碼成[1,1](第一個維度是gender,第二個維度是age)。

 

那麼這時再來看神經網路需要學習的連線線的權重就縮小到了2*3。同時,當送入girl為輸入的訓練資料時,因為它是由兩個節點編碼的。那麼與girl共享相同連線的其他輸入例子也可以被訓練到(如可以幫助到與其共享female的woman,和child的boy的訓練)。

 

Word embedding也就是要達到第二個神經網路所表示的結果,降低訓練所需要的資料量。

Word embedding

而上面的四個單詞可以被拆成2個節點的是由我們人工提供的先驗知識,所以才能夠降低訓練所需要的資料量。 但是我們沒有辦法一直人工提供,機器學習的宗旨就是讓機器代替人力去發現pattern。

Word embedding就是要從資料中自動學習到Distributed representation。

訓練方法

問題來了,我們該如何自動尋找到類似上面的關係,將One hot representation轉變成Distributed representation。 我們事先並不明確目標是什麼,所以這是一個無監督學習任務。

無監督學習中常用思想是:當得到資料{\{(x_i,y_i)^N_{i=1}}\}後,我們又不知道目標(輸出)時,

  • 方向一:從各個輸入 {{x_i}^N_{i=1} }之間的關係找目標。 如聚類。
  • 方向二:並接上以目標輸出 y_i 作為新輸入的另一個任務 g:y \rightarrow z ,同時我們知道的對應 z_i 值。用資料 {\{(x_i,z_i)^N_{i=1}}\} 訓練得到 k:x \rightarrow z ,也就是 z=g(f(x)) ,中間的表達 y=f(x) 則是我們真正想要的目標。如生成對抗網路。

Word embedding更偏向於方向二。 同樣是學習一個 k:x \rightarrow z ,但訓練後並不使用 k ,而是隻取前半部分的 f:x \rightarrow y

到這裡,我們希望所尋找的 k:x \rightarrow z 既有標籤 z ,又可以讓 f(x) 所轉換得到的 y 的表達具有Distributed representation中所演示的特點。

同時我們還知道,

單詞意思需要放在特定的上下文中去理解。

那麼具有相同上下文的單詞,往往是有聯絡的。

例項:那這兩個單詞都狗的品種名,而上下文的內容已經暗指了該單詞具有可愛,會舔人的特點。

  • 這個可愛的 泰迪 舔了我的臉。
  • 這個可愛的 金巴 舔了我的臉。

而從上面這個例子中我們就可以找到一個 k:x \rightarrow z :預測上下文。

用輸入單詞  x 作為中心單詞去預測其他單詞  z 出現在其周邊的可能性。

我們既知道對應的 z ,同時該任務 k 又可以讓 f(x) 所轉換得到的 y 的表達具有Distributed representation中所演示的特點。 因為我們讓相似的單詞(如泰迪和金巴)得到相同的輸出(上下文),那麼神經網路就會將泰迪的輸入和金巴的輸入經過神經網路 f(x) 得到的泰迪的輸出和 金巴的輸出幾乎相同。

 

用輸入單詞作為中心單詞去預測周邊單詞的方式叫做:Word2Vec The Skip-Gram Model

用輸入單詞作為周邊單詞去預測中心單詞的方式叫做:Continuous Bag of Words (CBOW)

 

 

Embedding Layer其實就是lookup table,具有降維的作用。輸入到網路的向量常常是非常高的維度的one-hot vector,比如8000維,只有一個index是1,其餘位置都是0,非常稀疏的向量。Embedding後可以將其降到比如100維度的空間下進行運算。

同時還有額外的特點,比如:

詞向量“女人”與“男人”的距離 約定於 “阿姨”與“叔叔”距離。

W(‘‘woman")−W(‘‘man") ≃ W(‘‘aunt")−W(‘‘uncle")

W(‘‘woman")−W(‘‘man") ≃ W(‘‘queen")−W(‘‘king")

更多關於詞向量的內容參考http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/