全面理解word2vec

  1. 為什麼要用詞向量
  2. 什麼是word embedding
  3. 向量空間模型
  4. Word2Vec簡介
  5. CBOW和Skip-Gram
  6. CBOW模型
  7. Skip-gram模型
  8. 加速策略(一):Hierarchical Softmax
  9. 加速策略(二):Negative Sampling
  10. word2vec詞向量性質觀察

為什麼要用詞向量

自然語言處理系統通常將辭彙作為離散的單一符號,例如 「cat」 一詞或可表示為 Id537 ,而 「dog」 一詞或可表示為 Id143。這些符號編碼毫無規律,無法提供不同辭彙之間可能存在的關聯信息。換句話說,在處理關於 「dogs」 一詞的信息時,模型將無法利用已知的關於 「cats」 的信息(例如,它們都是動物,有四條腿,可作為寵物等等)。可見,將辭彙表達為上述的獨立離散符號將進一步導致數據稀疏,使我們在訓練統計模型時不得不尋求更多的數據。而辭彙的向量表示將克服上述的難題。

NLP 中最直觀,也是目前最常用的詞表示方法是 One-hot Representation,它是將詞符號化的一種方式,也就是每個詞的向量大小就是詞典大小,一個向量只有一個位置為1,其他位置為0,當然,這樣的向量不包含任何語義信息。

而為什麼一般不應該用one hot編碼?對於one hot編碼,有多少個字,就得有多少維向量,假如有1萬字,那麼每個字向量就是1萬維(常用的字可能不多,幾千個左右,但是按照詞的概念來看,常用的詞可能就有十幾萬了),這樣可能會造成維數爆炸,計算上受不了,於是就出來了連續向量表示,比如用100維的實數向量來表示一個字,這樣就大大降低了維度,當然,更深層的原因是,wors2vec的字、詞向量,能夠包涵語義信息,向量的夾角餘弦能夠在某種程度上表示字、詞的相似度等等。

什麼是word embedding

那如何將語義融入到詞表示中?Harris 在 1954 年提出的分布假說( distributional hypothesis)為這一設想提供了理論基礎:上下文相似的詞,其語義也相似。而基於基於分布假說的詞表示方法,根據建模的不同,主要可以分為三類:基於矩陣的分布表示、基於聚類的分布表示和基於神經網路的分布表示。而word embedding一般來說就是一種基於神經網路的分布表示。

舉個例子,給出一個文檔,文檔就是一個單詞序列比如 「A B A C B F G」, 希望對文檔中每個不同的單詞都得到一個對應的向量(往往是低維向量)表示。比如,對於這樣的「A B A C B F G」的一個序列,也許我們最後能得到:A對應的向量為[0.1 0.6 -0.5],B對應的向量為[-0.2 0.9 0.7] (此處的數值只用於示意),這個向量就是我們說的word embedding。

需要注意的是和下面要講的word2vec和word embedding的聯繫和區別,word embedding 是一個將詞向量化的概念,或者說是一種基於神經網路的分布表示,為區別one-hot的詞向量,可翻譯成詞嵌入。而word2vec是谷歌提出一種word embedding 的工具或者演算法集合

向量空間模型

向量空間模型 (VSMs)將辭彙表達(嵌套)於一個連續的向量空間中,語義近似的辭彙被映射為相鄰的數據點。向量空間模型在自然語言處理領域中有著漫長且豐富的歷史,不過幾乎所有利用這一模型的方法都依賴於分散式假設,其核心思想為出現於上下文情景中的辭彙都有相類似的語義。採用這一假設的研究方法大致分為以下兩類:基於計數的方法 (e.g. 潛在語義分析, Glove), 和 預測方法 (e.g. 神經概率化語言模型,word2vec).

簡而言之:基於計數的方法計算某辭彙與其鄰近辭彙在一個大型語料庫中共同出現的頻率及其他統計量,然後將這些統計量映射到一個小型且稠密的向量中。預測方法則試圖直接從某辭彙的鄰近辭彙對其進行預測,在此過程中利用已經學習到的小型且稠密的嵌套向量。

而在這篇文章中,我們主要討論的是神經概率化語言模型,Glove或者其他之後有機會再講。

Word2Vec簡介

最簡單的理解,其實word2vec是只有一個隱層的全連接神經網路, 用來預測給定單詞的關聯度大的單詞。或者說就是一個語言模型。

下面看圖說下整體步驟是怎麼樣的:

  1. 在輸入層,一個詞被轉化為One-Hot向量。
  2. 然後在第一個隱層,輸入的是一個 W*x+bx 就是輸入的詞向量, Wb 是參數),做一個線性模型,注意已這裡只是簡單的映射,並沒有非線性激活函數,當然一個神經元可以是線性的,這時就相當於一個線性回歸函數。
  3. 第三層可以簡單看成一個分類器,用的是Softmax回歸,最後輸出的是每個詞對應的概率

舉個例子:

如果我們的語料僅僅有這3句話: 「the dog saw a cat」, 「the dog chased the cat」, 「the cat climbed a tree」. 那麼單詞字典只有8個單詞: 「the」, 「dog」, 「saw」, 「a」, 「cat」, 「chased」, 「climbed」, 「tree」.

那麼V=8, 輸入層的初始就可以是:

[1, 1, 1, 1, 1, 1, 1, 1] 代表: [「the」, 「dog」, 「saw」, 「a」, 「cat」, 「chased」, 「climbed」, 「tree」]

輸入[「」, 「dog「, 「」, 「」, 「」, 「」, 「」, 「」] 可以表示為: [0, 1, 0, 0, 0, 0, 0, 0]

輸入[「」, 「」, 「saw「, 「」 , 「」, 「」, 「」, 「」] 可以表示為: [0, 0, 1, 0, 0, 0, 0,0]

如果是在字典中有的, 就用1表示

W 的大小是NxV的, 通過訓練完畢後得到權重 W_1和W_0 ,當只要輸入單詞, 就能預測出最符合這個上下文的下一個單詞時,這時候的 W_1和W_0參數的精度最高。

CBOW和Skip-Gram

Word2vec是一種可以進行高效率詞嵌套學習的預測模型。其有兩種變體是現在比較常用的,分別為:連續詞袋模型(CBOW)及Skip-Gram模型。從演算法角度看,這兩種方法非常相似,其區別為CBOW根據源詞上下文辭彙(』the cat sits on the』)來預測目標辭彙(例如,『mat』),而Skip-Gram模型做法相反,它通過目標辭彙來預測源辭彙。

Skip-Gram模型採取CBOW的逆過程的動機在於:CBOW演算法對於很多分散式信息進行了平滑處理(例如將一整段上下文信息視為一個單一觀察量)。很多情況下,對於小型的數據集,這一處理是有幫助的。相比之下,Skip-Gram模型將每個「上下文-目標辭彙」的組合視為一個新觀察量,這種做法在大型數據集中會更為有效。

下面詳細說說兩種模型:

CBOW(Continuous Bag-of-Words)

普通的CBOW模型通過上下文來預測中心詞,拋棄了詞序信息,注意不同的論文有不同的描述,但本質都是一樣的,下面具體分層來說,第一種結構或角度:

輸入層: 2m×n 個節點,上下文共2m 個詞的n維向量,注意一開始為隨機初始化

投影層:n 個節點,上下文共 2m 個詞的詞向量直接相加後求得的平均值;

投影層到輸出層的連接邊:輸出詞矩陣  U_{|V|×n}};

輸出層: |V|個節點。第 i 個節點代表w_iii 的概率。

對於這裡來說輸入層的就是輸入的詞向量,我們看到,輸入層每個周圍詞用n個節點表示,n就是詞向量的大小,一開始隨機初始化,在之後作為模型參數學習更新,最終得到合適的詞向量。

在gensim 和 google的 word2vec實現中,也是這樣的結構,就是輸入層初始化的時候直接為每個詞隨機生成一個n維的向量,並且把這個n維向量作為模型參數學習,最終得到該詞向量。

另一種結構或者角度講解為:

輸入層: 2m×|V|個節點2m個詞的one-hot 編碼表示

輸入層到投影層到連接邊:輸入詞矩陣 V:n×|V|維;

投影層: n 個節點,上下文共  2m 個詞的one-hot 表示和輸入詞矩陣相乘後得到的詞向量求和再平均的值,也就是 V*x 的求和再平均 ;

投影層到輸出層的連接邊:輸出詞矩陣 U:|V|×n 維;

輸出層: |V|個節點,先經過softmaiii個節點代表w_iii的概率,後得到最大概率詞的one-hot表示。

然後詞向量就是神經網路里的參數,生成詞向量的過程就是一個參數更新的過程。首先將one-hot向量轉換成低維詞向量的這一層中,某個詞的one-hot表示可看成是 1*|V| (|V|是詞總數)的矩陣,與這個係數矩陣 V:n×|V|(維),相乘之後1*n的向量,這個向量就是這個詞對應的詞向量了。那V:n×|V|維 的矩陣,每一列就對應了每個單詞的詞向量。在神經網路中,訓練不斷更新這個矩陣。

另外,對於投影層到輸出層的輸出詞矩陣 U:|V|×n 的每一行,也是對於每個單詞的詞向量。然後詞向量具體怎麼得到呢?這類似一個查表,比如輸入節點有個詞x的one-hot是 [1,0,0,…,0],他與輸入詞矩陣相乘 U*x^T 就得到該詞的詞向量(因為one-hot 里值是 1 的那個位置,對應的 n個權重被激活,其實就是從一個 n*|V| 的隨機詞向量矩陣里,抽取某一列)。或者在輸出節點若得到詞x的one-hot是 [1,0,0,…,0],它和輸出詞矩陣 x*V 也得到該詞的詞向量。這也就是該詞對應的輸入向量和輸出向量,一般我們只用輸入向量。

然後兩種結構看下來,我們發現其實都是一樣的,只是第二種結構的輸入變成了一個one-hot表示,之後做一個類似查表操作得到詞向量,學習原來輸入向量變成學習現在的權重矩陣。

Skip-Gram模型

Skip-gram模型其實和CBOW模型很相似,都是相關詞預測其他詞,只是變成了由中心詞來預測上下文的詞。在結構上也是這樣,兩種角度,其中對於CBOW第二種結構或角度的情況如下圖:

以上是輸入層是one-hot,輸出層也是one-hot的結構,具體裡面的參數含義和CBOW相對應,這裡不再講解。

我們知道,Word2vec 本質上是一個語言模型,它的輸出節點數是 V 個,對應了 V 個詞語,也是一個多分類問題,但實際當中,詞語的個數非常非常多,直接softmax來計算會給計算造成很大困難,所以需要用技巧來加速訓練,下面就介紹word2vec對應的兩個加速技巧hierarchical softmax和negative sampling。注意:這兩個技巧只是加速訓練的技巧

Hierarchical Softmax

對於原始的模型來說,由於使用的是softmax()函數,時間複雜度為 O(|V|)(|V|表示詞典的總詞數) ,因此計算代價很大,對大規模的訓練語料來說,非常不現實。因此Mikolov 提出2個技巧,其中一個是Hierarchical Softmax。

簡單來說,Hierarchical Softmax是一種對輸出層進行優化的策略,輸出層從原始模型的利用softmax計算概率值改為了利用Huffman樹計算概率值。

Huffman樹是二叉樹,在葉子節點及葉子節點的權給定的情況下,該樹的帶權路徑長度最短(一個節點的帶權路徑長度指根節點到該節點的路徑長度乘以該節點的權,樹的帶權路徑長度指全部葉子節點的帶權路徑長度之和)。直觀上可以看出,葉子節點的權越大,則該葉子節點就應該離根節點越近。因此對於模型來說就是,詞頻越高的詞,距離根節點就越近。

而一開始我們可以用以詞表中的全部詞作為葉子節點,詞頻作為節點的權,構建Huffman樹,作為輸出。從根節點出發,到達指定葉子節點的路徑是唯一的。Hierarchical Softmax正是利用這條路徑來計算指定詞的概率,而非用softmax來計算。

上圖是一個已根據詞頻構建好的Huffman樹,各葉子節點代表詞表中的各個詞,非葉子節點共 |V|?1 個。以詞 w_2 為例,從根節點到該葉子節點的路徑長度  L(w_2)=4 ,各個節點依次被記為  n(w_2,1) 、n(w_2,2)、n(w_2,3) 和 n(w_2,L(w_2)) 。對於每個非葉子節點 n(w,j) ,雖然不是詞表中的詞,但也引入所謂的「輸出詞向量」 u_{n(w,j)} ,是需要學習的參數,為什麼要引入它?下面講述。

從根節點出發,走到指定葉子節點 W 的過程,就是一個進行 L(w)?1 次二分類的過程:路徑上的每個非葉子節點都擁有兩個孩子節點,從當前節點 n(w,j)n(w,j) 向下走時共有兩種選擇,走到左孩子節點 ch(n(w,j)) 就定義為分類到了正類,走到右孩子節點就定義為分類到了負類。

以CBOW模型為例,即輸入層是 hat{v}_t 。用二項Logistic回歸模型對每一次分類過程建模:從當前節點 n(w,j)n(w,j) 走到下一節點,那麼走到左孩子節點的概率為

走到右孩子節點的概率為

將上面兩個式子統一起來,那就是

雙線括弧的意思是,當括弧內為真則輸出1,為假則輸出-1

現在計算輸出詞為 W 的概率:這對應於一條從根節點 n(w,1) 走到葉子節點 n(w,L(w)) 的路徑,概率計算式為下式:

平均時間複雜度為 O(log|V|) ,相比於使用softmax()函數有很大提高。

所以簡單來說,應用Hierarchical Softmax就是把 N 分類問題變成 log(N)次二分類

Negative Sampling

第二種加速策略是Negative Sampling(簡寫NEG,負採樣),這是Noise-Contrastive Estimation(簡寫NCE,雜訊對比估計)的簡化版本:把語料中的一個詞串的中心詞替換為別的詞,構造語料 D 中不存在的詞串作為負樣本。本質上就是一個預測全部分類的變成預測總體類別的子集的方法。在這種策略下,優化目標變為了:最大化正樣本的概率,同時最小化負樣本的概率。對於一個詞串 (w,c) ( c 表示 w 的上下文),用二項Logistic回歸模型對其是正樣本的概率建模:

所以全部正樣本的似然函數為

同理,全部負樣本的似然函數為

需要最大化前者同時最小化後者,也就是最大化下式:

取對數得到對數似然:

由於使用SGD,所以只需要知道對一個正樣本 (w,c) 的目標函數。式中 NEG(w) (w,c) 的負樣本的中心詞集合:

當然既然是負採樣,那麼怎麼負採樣是一個比較重要的問題,NEG(w)中一般包涵5到10個詞,現在這裡先不詳細解釋,之後有機會再講。

注意:因為都是來自論文《word2vec Parameter Learning Explained》的筆記,所以對於Negative Sampling和Hierarchical Softmax的講解直接參考了前人的博客Hierarchical Softmax與Negative Sampling。

word2vec詞向量性質觀察

查看某個詞在embedding里的最近鄰居可以看到單詞間的語義接近關係,將vector構成的空間降維,可以更高效地查找最近單詞,但降維過程中要保持鄰居關係(原來接近的降維後還要接近),比如我們可以把學習向量映射到2維中以便我們觀察,其中用到的技術可以參考 t-SNE 降緯技術。當我們第一次發現這樣的誘導向量空間中,展示了一些特定的語義關係,這是非常有趣的,比如文字中 male-femalegender 甚至還有 country-capital 的關係, 如下方的圖所示

另外,我們能得到的不僅是單詞的鄰接關係,由於將單詞向量化,可以對單詞進行計算可以通過計算進行語義加減,語法加減。

最後,對於word2vec的論文有很多,推薦幾篇我覺得比較好的論文,這篇文章也很多都是這些論文的筆記:

《Distributed Representations of Sentences and Documents》

《Efficient estimation of word representations in vector space》

《word2vec Parameter Learning Explained》

推薦閱讀:

TAG:機器學習 | 深度學習DeepLearning | word2vec |