不懂word2vec,還敢說自己是做NLP?

簡介

如今,深度學習炙手可熱,deep learning在圖像處理領域已經取得了長足的進展。隨著Google發布word2vec,深度學習在自然語言處理領域也掀起了一陣狂潮。由於最近正在做一個相關的NLP項目,所以抽時間總結一下word2vec的相關知識點。

本文的知識結構如下:

  • 簡介
  • 詞的獨熱表示
  • 詞的分散式表示
  • 詞嵌入
  • 兩種訓練模式
  • 兩種加速方法
  • word2vec和word embedding的區別
  • 小結
  • 參考

詞的獨熱表示

到目前為止最常用的詞表示方法是 One-hot Representation,這種方法把每個詞表示為一個很長的向量。這個向量的維度是詞表大小,其中絕大多數元素為 0,只有一個維度的值為 1,這個向量就代表了當前的詞。

「可愛」表示為 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]

「麵包」表示為 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]

每個詞都是茫茫 0 海中的一個 1。這種 One-hot Representation 如果採用稀疏方式存儲,會是非常的簡潔:也就是給每個詞分配一個數字 ID。比如剛才的例子中,可愛記為 3,麵包記為 8(假設從 0 開始記)。

缺點分析:

1、向量的維度會隨著句子的詞的數量類型增大而增大;

2、任意兩個詞之間都是孤立的,無法表示語義層面上辭彙之間的相關信息,而這一點是致命的。

詞的分散式表示

傳統的獨熱表示僅僅將詞符號化,不包含任何語義信息。如何將語義融入到詞表示中?Harris 在 1954 年提出的「分布假說」為這一設想提供了理論基礎:上下文相似的詞,其語義也相似。Firth 在 1957年對分布假說進行了進一步闡述和明確:詞的語義由其上下文決定。

以(CBOW)為例,如果有一個句子「the cat sits one the mat」,在訓練的時候,將「the cat sits one the」作為輸入,預測出最後一個詞是「mat」。

圖1

分散式表示的最大優點在於它具有非常強大的表徵能力,比如n維向量每維k個值,可以表徵k的n次方個概念。下圖的神經網路語言模型(NNLM)採用的就是文本分散式表示。而詞向量(word embedding)是訓練該語言模型的一個附加產物,即圖中的Matrix C。

圖2

所以我們可以將我們的任務拆解成兩部分:

一、選擇一種方式描述上下文

二、選擇一種「模型」刻畫某個詞(即「目標詞」)與其上下文之間的關係。

詞嵌入

基於神經網路的分布表示一般稱為詞向量、詞嵌入( word embedding)或分散式表示( distributed representation)。核心依然是上下文的表示以及上下文與目標詞之間的關係的建模。

上面了解到獨熱編碼的維度過大的缺點。對此進行如下改進:

1、將vector每一個元素由整形改為浮點型,變為整個實數範圍的表示;

2、將原來稀疏的巨大維度壓縮嵌入到一個更小維度的空間。如圖所示:

圖3

「詞嵌入」也由此得名。

本質:詞向量是訓練神經網路時候的隱藏層參數或者說矩陣。

圖4

兩種訓練模式

  • CBOW (Continuous Bag-of-Words Model)
  • Skip-gram (Continuous Skip-gram Model)

CBOW:上下文來預測當前詞

圖5

Skip-gram:當前詞預測上下文

圖6

兩種加速方法

  • Negative Sample
  • Hierarchical Softmax

大家都知道哈夫曼樹是帶權路徑最短的樹,一般神經網路語言模型在預測的時候,輸出的是預測目標詞的概率(每一次預測都要基於全部的數據集進行計算,很大的時間開銷)。

Hierarchical Softmax是一種對輸出層進行優化的策略,輸出層從原始模型的利用softmax計算概率值改為了利用Huffman樹計算概率值。一開始我們可以用以詞表中的全部詞作為葉子節點,詞頻作為節點的權,構建Huffman樹,作為輸出。從根節點出發,到達指定葉子節點的路徑是唯一的。Hierarchical Softmax正是利用這條路徑來計算指定詞的概率,而非用softmax來計算。

即Hierarchical Softmax:把 N 分類問題變成 log(N)次二分類

Negative Sampling(簡寫NEG,負採樣),這是Noise-Contrastive Estimation(簡寫NCE,雜訊對比估計)的簡化版本:把語料中的一個詞串的中心詞替換為別的詞,構造語料 D 中不存在的詞串作為負樣本。在這種策略下,優化目標變為了:最大化正樣本的概率,同時最小化負樣本的概率。這樣說大家可能已經糊塗了,我們省去繁瑣的數學推倒,這裡舉一個例子:

假設有一個句子為:「The quick brown fox jumps over the lazy dog.「

如果我們用skip-gram model ,貌似這是一個很大的網路。

圖7

注意:比如像「the」這種常見的詞,我們會遇到兩個問題:

1. 比如(fox,the)其實沒有傳遞我們關於 fox的信息。『the『出現得太多了。

2. 我們有太多 (『the』,…)的樣本,多於我們實際需要的。

所以word2vec採用了降採樣的策略。對於每個我們在訓練樣本中遇到的詞,我們有一個概率去刪除它。這個概率與單詞出現的頻率相關。

如果我們採用window size = 10,同時我們刪除『the』:

1. 當我們再去訓練剩下的詞,我們就不會再遇到『the』了;

2. 我們減少了10個包含『the』的樣本

這其實就是『NEG』的核心思想。

word2vec和word embedding的區別

簡言之,word embedding 是一個將詞向量化的概念,中文譯名為"詞嵌入"。

word2vec是谷歌提出的一種word embedding的具體手段,採用了兩種模型(CBOW與skip-gram模型)與兩種方法(負採樣與層次softmax方法)的組合,比較常見的組合為 skip-gram+負採樣方法。

Word embedding的訓練方法大致可以分為兩類:

(1)無監督或弱監督的預訓練

優點:不需要大量的人工標記樣本就可以得到質量還不錯的embedding向量

缺點:準確率有待提高

解決辦法:得到預訓練的embedding向量後,用少量人工標註的樣本再去優化整個模型

典型代表:word2vec和auto-encoder

(這裡解釋一下AutoEncoder,AutoEncoder也可以用於訓練詞向量,先將one hot映射成一個hidden state,再映射回原來的維度,令輸入等於輸出,取中間的hidden vector作為詞向量,在不損耗原表達能力的前提下壓縮向量維度,得到一個壓縮的向量表達形式。)

(2)端對端(end to end)的有監督訓練。

優點:學習到的embedding向量也往往更加準確

缺點:模型在結構上往往更加複雜

應用:通過一個embedding層和若干個卷積層連接而成的深度神經網路以實現對句子的情感分類,可以學習到語義更豐富的詞向量表達。

word2vec不關心後續的應用場景,其學習到的是就是根據共現信息得到的單詞的表達,用n-gram信息來監督,在不同的子task間都會有一定效果。而end2end訓練的embedding其和具體子task的學習目標緊密相關,直接遷移到另一個子task的能力非常弱。

常用的word embedding分為dense和sparse兩種形式:

常見的sparse就比如 co-occurence 或者one-hot的形式;對sparse embedding進行一些降維運算比如SVD、PCA就可以得到dense。

小結

通過閱讀這篇文章,大家應該對word2ec有了一個基本的了解,如果想更加深入透徹的了解此工具,可以從數學原理入手並且閱讀word2vec的源碼,這裡附上我參考的帶有完整注釋的源碼地址,感興趣的可以參考一下。

帶完整注釋的word2vec源碼

參考

  1. github.com/tensorflow/t
  2. word2vec中的數學原理 - peghoty
  3. Distributed Representations of Words and Phrases and their Compositionality, NIPS2013
  4. mccormickml.com/2017/01Word2Vec Tutorial Part 2 - Negative Sampling?

    mccormickml.com圖標mccormickml.com/2017/01

碼字不易,歡迎給個贊!

歡迎交流與轉載,文章會同步發布在公眾號:機器學習演算法工程師(Jeemy110)

推薦閱讀:

TAG:深度學習DeepLearning | 神經網路 | NLP書籍 |