詞嵌入的那些事兒(一)
1. 詞向量介紹
在討論詞嵌入之前,先要理解詞向量的表達形式,注意,這裡的詞向量不是指 Word2Vec 。關於詞向量的表達,現階段採用的主要有 One hot representation 和 Distributed representation 兩種表現形式。
1.1 One hotrepresentation
顧名思義,採用獨熱編碼的方式對每個詞進行表示。
例如,一段描述:“杭州和上海今天有雨”,通過分詞工具可以把這段描述分為[‘杭州’‘和’‘上海’今天’‘有’‘雨’],因此詞表的長度為6,那麼‘杭州’、‘上海’、'今天'的One hot representation分別為[1 0 0 0 0 0] [0 0 1 0 0 0] [0 0 0 1 0 0]。
可以看到,One hot representation編碼的每個詞都是一個維度,元素非0即1,且詞與詞之間彼此相互獨立。
1.2 Distributedrepresentation
Distributedrepresentation 在 One hot representation 的基礎上考慮到詞間關係,例如詞義、詞性等資訊。每一個維度元素不再是 0 或 1 ,而是連續的實數,用來表示不同詞資訊的程度。 Distributed representation 又包含了以下三種處理方式:
-
基於矩陣的分佈表示。
-
基於聚類的分佈表示。
-
基於神經網路的分佈表示。
而現在常說的 Distributed representation 主要是基於神經網路的分散式表示的。例如 ‘ 杭州 ’ 、 ‘ 上海 ’ 的 Distributed representation 分別為 [0.3 1.2 0.8 0.7] 和 [0.5 1.2 0.6 0.8 ] 。
所以對於詞嵌入,可以理解是對詞的一種分散式表達方式,並且是從高維稀疏向量對映到了相對低維的實數向量上。
2. 為什麼使用詞嵌入
詞嵌入,往往和Distributed representation聯絡在一起。這裡主要從計算效率、詞間關係和樣本數量這三點說明。
-
計算效率。採用One hotrepresentation的每個詞的向量維度由詞彙表大小決定,如果詞彙表很大,那麼每個詞的向量維度很高且非常稀疏。而由於往往和神經網路結合,所以造成儲存和計算問題。
-
詞間關係。和One hot representation相比,Distributed representation能夠表達詞間關係。
-
樣本數量。對於把詞語作為模型輸入的任務,和One hotrepresentation相比,對於相似的詞語,可以通過較少樣本完成訓練。
3. Language Models
由於詞嵌入目的是為了能更好地對 NLP 的輸入做預處理。所以在對詞嵌入技術作進一步討論之前,有必要對語言模型的發展做一些介紹。
3.1 Bag of words model
Bag of words model 又稱為詞袋模型,顧名思義,一段文字可以用一個裝著這些詞的袋子來表示。詞袋模型通常將單詞和句子表示為數字向量的形式,其中向量元素為句子中此單詞在詞袋錶出現的次數。然後將數字向量輸入分類器 ( 例如 Naive Bayes) ,進而對輸出進行預測。這種表示方式不考慮文法以及詞的順序。
例如以下兩個句子:
-
John likes to watch movies. Mary likes movies too.
-
John also likes to watch football games.
基於以上兩個句子,可以建構詞袋錶: [ "John", "likes", "to", "watch", "movies", "also", "football", "games", "Mary", "too" ]
由於詞袋錶的長度為 10 ,所以每個句子的數字向量表示長度也為 10 。下面是每個句子的向量表示形式:
-
[1, 2, 1, 1, 2, 0, 0, 0, 1, 1]
-
[1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
Bag of words model 的優缺點很明顯。 優點是基於頻率統計方法,易於理解; 缺點是它的假設 ( 單詞之間完全獨立 ) 過於強大,無法建立準確的模型。
3.2 N-Gram model
N-gram model 的提出旨在減少傳統 Bag of words model 的一些強假設。
語言模型試圖預測在給定前 t 個單詞的前提下觀察第 t+ 1 個單詞 w t + 1 的概率:
利用概率鏈式法則,可以計算出觀察整個句子的概率:
可以發現,估計這些概率可能是困難的。因此可以用最大似然估計對每個概率進行計算 :
然而,採用最大似然估計方法也面臨兩點問題:
-
通常無法從語料庫中觀察到足夠多的樣本
-
由於需要遍歷語料庫每個句子,所以計算複雜度較高。
因此對其繼續改進,採用了馬爾可夫鏈的思想。
馬爾可夫鏈規定:系統下一時刻的狀態僅由當前狀態決定,不依賴於以往的任何狀態 。即第 t + 1 個單詞的發生概率表示為:
因此,一個句子的概率可以表示為:
同樣地,馬爾可夫假設可以推廣到: 系統下一時刻的狀態僅由當前 0 個、 1 個、 2 個 ...n 個狀態決定 。 這就是 N-gram model 的 N 的意思:對下一時刻的狀態設定當前狀態的個數。下面分別給出了 unigram (一元模型)和 bigram (二元模 型)的第 t + 1 個單詞的發生概率:
可以發現, N-Gram model 在 Bag of words model 的 基礎上,通過採用馬爾科夫鏈的思想,既減少了概率計算的複雜度,又同時考慮到了詞間關係。
3.3 Word2Vec Model
Word2Vec 模型實際上分為了兩個部分,第一部分為訓練資料集的構造,第二部分是通過模型獲取詞嵌入向量,即 word embedding 。
Word2Vec 的整個建模過程實際上與自編碼器( auto-encoder )的思想很相似,即先基於訓練資料構建一個神經網路,當這個模型訓練好後,並不會用這個訓練好的模型處理新任務,而真正使用的是更新後的模型引數。
關於 word embedding 的發展,由於考慮上下文關係,所以模型的輸入和輸出分別是詞彙表中的片語成,進而產生出了兩種模型方法: Skip-Gram 和 CBOW 。同時,在隱藏層 - 輸出層,也從 softmax 方法演化到了分層 softmax 和 negative sample 方法。
所以,要拿到每個詞的詞嵌入向量,首先需要理解 Skip-Gram 和 CBOW 。下圖展示了 CBOW 和 Skip-Gram 的網路結構:
下面以 Skip-Gram 模型為例,來理解詞嵌入, Skip-Gram 是給定 input word 來預測上下文。所以關於 Skip-Gram 的模型結構,主要分為幾下四步:
-
從句子中定義一箇中心詞,即 Skip-Gram 的模型 input word
-
定義 skip_window 引數,用於表示從當前 input word 的一側(左邊及右邊)選取詞的數量。
-
根據中心詞和 skip_window ,構建視窗列表。
-
定義 num_skips 引數,用於表示從當前視窗列表中選擇多少個不同的詞作為 outputword 。
假設有一句子 "The quick brown fox jumps over the lazy dog" ,設定的視窗大小為 2 ( window_size ),也就是說僅選中心詞( input word )前後各兩個詞和中心詞( input word )進行組合。如下圖所示,以步長為 1 對中心詞進行滑動,其中藍色代表 input word ,方框代表位於視窗列表中的詞。
這樣,採用 Skip-Gram 模型構造的訓練資料已經完成。
3.4 Skip-Gram 網路結構
在 3.3 小節中,對如何使用 Skip-Gram 進行訓練集的構造做出瞭解釋,本節會進一步對其網路結構進行說明。
需要注意的是: 無論採用 Skip-Gram 還是 CBOW 模型,構造的訓練樣本中輸入及輸出形式都應該是單詞的 One hotrepresentation 。結合下圖理解:
圖中左側的神經元 Input Vector 代表對輸入詞進行 One hot representation ,右側 Output Layer 的神經元則代表輸出詞。
3.4.1 隱藏層
假設正在學習具有 300 個特徵的詞向量。因此,隱藏層將由一個包含 10000 行 ( 每個單詞對應一行 ) 和 300 列 ( 每個隱藏神經元對應一列 ) 的權重矩陣來表示。(注:谷歌在其釋出的模型中的隱藏層使用了 300 個輸出(特徵),這些特徵是在谷歌新聞資料集中訓練出來的 ( 資料集可以從 這裡 下載 ) 。特徵的數量 300 則是模型進行調優選擇後的超引數)。
下面左右兩張圖分別從不同角度表達了輸入層 - 隱層的權重矩陣 。
從左圖看,每一列代表一個 One hot representation 的詞和隱層單個神經元連線的權重向量。從右圖看,每一行實際上代表了每個詞的詞向量,或者詞嵌入。
所以我們的 目標就是學習輸入層 - 隱藏層的權矩陣,而隱藏層 - 輸出層的部分,則是在模型訓練完畢後不需要儲存的引數。這一點,與自編碼器的設計思想是類似的。
可能會有疑惑:難道真的分別要把每一個 One hot representation 的詞( 1 x 10000 )與一個 10000 x 300 的權矩陣相乘嗎?
實際上,工程師們已經考慮到了這一點。由於 One hot representation 的詞具有隻有一個元素這為 1 ,其餘元素值為 0 的特性,所以可以通過查詢 One hot representation 中元素為 1 的位置索引,進而獲得對應要乘以的 10000 x 300 的權矩陣的向量值,從而解決計算速度緩慢的問題。下圖的例子,可幫助我們進一步理解。
可以看到, One hot representation 中元素為 1 的位置索引為 3 ,所以只需要乘以 10000 x 300 的權矩陣中位置索引同樣為 3 的向量值即可得到相應的輸出。
3.4.2 輸出層
下面是計算某個單詞在輸出神經元的輸出的例子,可以看到,採用的是適用於多分類的 softmax 函式:
4. 總結
本文對詞嵌入技術做了介紹。並以Skip-Gram模型為例,對其內部原理進行了較為深入的討論。
回顧全文,可以總結出以下結論:
-
詞嵌入是一種把詞從高維稀疏向量對映到了相對低維的實數向量上的表達方式。
-
Skip-Gram 和 CBOW 的作用是構造神經網路的訓練資料。
-
對於單位矩陣的每一維 ( 行 ) 與實矩陣相乘,可以簡化為查詢元素 1 的位置索引從而快速完成計算。
-
詞嵌入可看做是一種資料預訓練過程,而最近提出的 上下文雙向模型( BERT )也是一種對資料的預訓練演算法。
-
CTR 問題的特徵構造演算法也或多或少地借鑑了詞嵌入技術。