Unsupervised Learning: Word Embedding

by wenwu
0 comment

Unsupervised Learning: Word Embedding

Word Embedding(詞嵌入)就是將文字轉成向量的方法,也是降維(Dimension Reducion)的典型應用,那要如何用vector來表示一個word呢?

1-of-N Encoding

最傳統的方法就是1-of-N Encoding,這個vector的維度就等於世界所有單辭的數目,對每個單詞來說,只要某一個維度=1,其他等於0即可。
但是我們無法取得文字資訊,也無法建立同類word的聯繫

Word Class

word class將同類性質的word進行分類(clustering)。但是分類事不夠的,不同class之間的聯繫無法有效的表示出來

Word Embedding

Word Embedding把每一個word都投影到高維空間上,當然這個空間的維度要遠比1-of-N Encoding的維度低,假如後者有10萬維,那前者只需要50~100維就夠了,這實際上也是DimensionReduction的過程

類似語義(semantic)的詞彙,在這個word embedding的投影空間上是比較接近的,而且該空間裡的每一維都可能有特殊的含義。假設詞嵌入的投影空間如下圖所示,則橫軸代表了生物與其它東西之間的區別,而縱軸則代表了會動的東西與靜止的東西之間的差別

word embedding是一個無監督的方法(unsupervised approach),只要讓機器閱讀大量的文章,它就可以知道每一個詞彙embedding之後的特徵向量應該長什麼樣子

我們的任務就是訓練一個neural network,input是詞彙,output則是它所對應的word embedding vector,實際訓練的時候我們只有data的input,該如何解這類問題呢?

basic idea

word embedding 基本的精神就是,每一個詞彙的涵義都可以根據上下文來的到。有兩種做法來找出word embedding 的vector,分別是count based 和 prediction based

count based

假如w_i和w_j這兩個詞彙常常在同一篇文章中出現(co-occur),它們的word vector分別用V(w_i)和V(w_j)來表示,則V(w_i)和V(w_j)會比較接近

假設N_ij是w_i和w_j這兩個詞彙在相同文章裡同時出現的次數,我們希望它與的內積越接近越好,這個思想和之前的文章中提到的矩陣分解(matrix factorization)的思想其實是一樣的

prediction based

給定一個sentence,我們要訓練一個神經網路,他要做的就是根據當前的word : w_i-1,來預測下一個可能出現的word : w_i是什麼

假設我們使用1-of-N encoding把w_i-1表示成feature vector,它作為neural network的input,output的維數和input相等,只不過每一維都是小數,代表在1-of-N編碼中該維為1其餘維為0所對應的word會是下一個word 的概率

把第一個hidden layer的input z_1、z_2、z_3 …. 拿出來,它們所組成的 Z 就是word的另一種表示方式,當我們input不同的詞彙,向量Z就會發生變化

也就是說,第一層hidden layer的維數可以由我們決定,而它的input又唯一確定了一個word,因此提取出第一層hidden layer的input,實際上就得到了一組可以自定義維數的Word Embedding的向量

sharing parameters

詞彙由於搭配的方式千千萬萬,即使是人也無法準確的給出下一個詞彙具體是什麼。我們可以擴展這個問題,使用10個以上的詞彙去預測下一個詞彙,會得到較好的結果

這裡用兩個詞彙舉例,如果是一般神經網路,我們直接把w_i-2、w_i-1相連的weight都綁再一起,簡單來說就是相同dimension對應到第一層hidden layer相同neuron之間的連線擁有相同的weight,在下圖中,用同樣的顏色標註相同的weight:

如果我們不這樣做,不同weight的結果導致得到的Embedding 會是不一樣的,把兩組weight設定相同,使w_i-2、w_i-1的相對位置不會對結果產生影響

除此之外,共享參數還可以有效的減少參數量,不會因為input的詞彙增加而導致參數量暴增

Formulation

假設w_i-2的1-of-N編碼為x_i-2,w_i-1的1-of-N編碼為x_i-1,維數均為|V|,表示數據中的word總數hidden layer 的input 為向量z ,長度為|Z|,表示降為後的維數

其中W1和W2都是|Z|x|V|維的weight matrix,它由|Z|組|V|維的向量構成,第一組|V|維向量與|V|維的x_i-1相乘得到z1,第二組|V|維向量與|V|維的x_i-2相乘得到z2,…,依次類推
我們強迫讓W1=W2=W,此時z=W(x_i-2 + x_i-1)

因此,只要我們得到了這組參數X,就可以與1-of-N編碼x相乘得到word embedding的結果z

In Parctice

在實際操作上,我們如何保證W1和W2一樣呢? 
以下的w_i 與 w_j 為例,我們希望他們的weight是一樣的:

  • 首先在訓練的時候就要給他們一樣的初始值
  • 然後分別計算 loss function C 對 w_i 和 w_j 的偏微分,進行更新
  • 這個時候就會發現,偏微會不一樣,所以我們在後面加了對方的偏微,保證兩者的結果更新必須一致
  • 這個時候,我們保證了w_i 和 w_j始終相等:

如何去訓練這個神經網絡呢?注意到這個NN完全是unsupervised,你只需要上網爬一下文章數據直接餵給它即可


various architectures

除了以上的基本型態,prediction-based 方法還可以有多種變形

  • CBOW(continuous bag of word model) 
    拿前面的詞彙預測中間的詞彙
  • Skip-gram
    拿中間的詞彙預測前後的詞彙
  • Multi-domain Embedding 
    對圖像做embedding
  • Document Embedding 
    對圖像做embedding
  • Subtraction 機器問答
    機器不知道字與字之間的關係,但是可以用簡單的推論(減法)來推論這些關係,像是羅馬之於義大利等於柏林之於什麼,機器可以知道
    V(Germany)≈V(Berlin)-V(Rome)+V(Italy) 
    藉此推論答案時德國
  • Multi-lingual Embedding 
    建立不同文字間的聯繫,我們訓練英文與中文的資料庫是沒有連結的,所以訓練時要使用中英混雜的input,提供機器學習得內容

最後,儘管word vector 是deep learning 的一個應用,但是這個neural network 其實並不是 deep 的,他就只有一個linear 的 hidden layer

我們把1-of-N編碼輸入給NN,經過weight的轉換得到Word Embedding,再通過第一層hidden layer就可以直接得到輸出

其實過去很多人使用過deep model,但這個task不用deep就可以實現,這樣做既可以減少運算量,跑大量的data,又可以節省訓練的時間

Related Articles

發表迴響