小白都能理解的通俗易懂word2vec詳解

前言

自從Mikolov在他2013年的論文「Efficient Estimation of Word Representation in Vector Space」提出詞向量的概念後,NLP領域彷彿一下子進入了embedding的世界,Sentence2Vec、Doc2Vec、Everything2Vec。詞向量基於語言模型的假設——「一個詞的含義可以由它的上下文推斷得出「,提出了詞的Distributed Representation表示方法。相較於傳統NLP的高維、稀疏的表示法(One-hot Representation),Word2Vec訓練出的詞向量是低維、稠密的。Word2Vec利用了詞的上下文信息,語義信息更加豐富,目前常見的應用有:
1. 使用訓練出的詞向量作爲輸入特徵,提升現有系統,如應用在情感分析、詞性標註、語言翻譯等神經網絡中的輸入層。
2. 直接從語言學的角度對詞向量進行應用,如使用向量的距離表示詞語相似度、query相關性等。
注:前言部分內容來自參考文獻1。

1.什麼是word2vec

如果用一句比較簡單的話來總結,word2vec是用一個一層的神經網絡(即CBOW)把one-hot形式的稀疏詞向量映射稱爲一個n維(n一般爲幾百)的稠密向量的過程。爲了加快模型訓練速度,其中的tricks包括Hierarchical softmax,negative sampling, Huffman Tree等。

在NLP中,最細粒度的對象是詞語。如果我們要進行詞性標註,用一般的思路,我們可以有一系列的樣本數據(x,y)。其中x表示詞語,y表示詞性。而我們要做的,就是找到一個x -> y的映射關係,傳統的方法包括Bayes,SVM等算法。但是我們的數學模型,一般都是數值型的輸入。但是NLP中的詞語,是人類的抽象總結,是符號形式的(比如中文、英文、拉丁文等等),所以需要把他們轉換成數值形式,或者說——嵌入到一個數學空間裏,這種嵌入方式,就叫詞嵌入(word embedding),而 Word2vec,就是詞嵌入( word embedding) 的一種。

在 NLP 中,把 x 看做一個句子裏的一個詞語,y 是這個詞語的上下文詞語,那麼這裏的 f,便是 NLP 中經常出現的『語言模型』(language model),這個模型的目的,就是判斷 (x,y) 這個樣本,是否符合自然語言的法則,更通俗點說就是:詞語x和詞語y放在一起,是不是人話。

Word2vec 正是來源於這個思想,但它的最終目的,不是要把 f 訓練得多麼完美,而是隻關心模型訓練完後的副產物——模型參數(這裏特指神經網絡的權重),並將這些參數,作爲輸入 x 的某種向量化的表示,這個向量便叫做——詞向量。
(上面部分內容來自參考文獻2)

2.CBOW與Skip-Gram

word2vec裏面有兩個重要的模型-CBOW模型(Continuous Bag-of-Words Model)與Skip-gram模型。在Tomas Mikolov的paper中給出了示意圖。

這裏寫圖片描述

由名字與圖都很容易看出來,CBOW就是根據某個詞前面的C個詞或者前後C個連續的詞,來計算某個詞出現的概率。Skip-Gram Model相反,是根據某個詞,然後分別計算它前後出現某幾個詞的各個概率。

上一張圖,可以比較清楚地看清楚CBOW的訓練過程。
這裏寫圖片描述
(圖片來自網絡)

把這張圖看懂,基本word2vec就懂了一大半。下面來詳細說說這張圖。
詞向量最簡單的方式是1-of-N的one-hot方式。onehot對於同學們來說都很熟悉了,也就是從很大的詞庫corpus裏選V個頻率最高的詞(忽略其他的) ,V一般比較大,比如V=10W,固定這些詞的順序,然後每個詞就可以用一個V維的稀疏向量表示了,這個向量只有一個位置的元素是1,其他位置的元素都是0。One hot方式其實就是簡單的直接映射,所以缺點也很明顯,維數很大,也沒啥計算上的意義。
在上圖中,
1、Input layer輸出層:是上下文單詞的one hot。假設單詞向量空間的維度爲V,即整個詞庫corpus大小爲V,上下文單詞窗口的大小爲C。
2、假設最終詞向量的維度大小爲N,則圖中的權值共享矩陣爲W。W的大小爲 V * N,並且初始化。
3、假設語料中有一句話」我愛你」。如果我們現在關注」愛」這個詞,令C=2,則其上下文爲」我」,」你」。模型把」我」 「你」的onehot形式作爲輸入。易知其大小爲1*V。C個1*V大小的向量分別跟同一個V * N大小的權值共享矩陣W相乘,得到的是C個1*N大小的隱層hidden layer。
4.C個1*N大小的hidden layer取平均,得到一個1*N大小的向量,即圖中的Hidden layer。
5.輸出權重矩陣W’爲N*V,並進行相應的初始化工作。
6.將得到的Hidden layer向量 1*V與W’相乘,並且用softmax處理,得到1*V的向量,此向量的每一維代表corpus中的一個單詞。概率中最大的index所代表的單詞爲預測出的中間詞。
7.與groud truth中的one hot比較,求loss function的的極小值。

3.word2vec其實不關注模型

word2vec可以分爲兩部分:模型與通過模型獲得的詞向量。
word2vec的思路與自編碼器(auto-encoder)的思路比較相似。都是先基於訓練數據構建一個神經網絡。當這個網絡訓練好一有,我們並不會利用這個訓練好的網絡處理新任務,我們真正需要的是這個模型通過訓練數據所學得的參數,例如隱層的權重矩陣——後面我們將會看到這些權重在Word2Vec中實際上就是我們試圖去學習的「word vectors」。基於訓練數據建模的過程,我們給它一個名字叫「Fake Task」,意味着建模並不是我們最終的目的。

上面提到的這種方法實際上會在無監督特徵學習(unsupervised feature learning)中見到,最常見的就是自編碼器(auto-encoder):通過在隱層將輸入進行編碼壓縮,繼而在輸出層將數據解碼恢復初始狀態,訓練完成後,我們會將輸出層「砍掉」,僅保留隱層。

4.tricks

1.hierarchical softmax
最後預測輸出向量時候,大小是1*V的向量,本質上是個多分類的問題。通過hierarchical softmax的技巧,把V分類的問題變成了log(V)次二分類。

2.negative sampling
本質上是對訓練集進行了採樣,從而減小了訓練集的大小。

參考文獻:
1.https://zhuanlan.zhihu.com/p/28491088
2.https://zhuanlan.zhihu.com/p/26306795
3.http://alwa.info/2016/04/24/Autoencoder-%E8%AF%A6%E8%A7%A3/
4.https://qrfaction.github.io/2018/03/20/%E6%95%B0%E6%8D%AE%E7%AB%9E%E8%B5%9Btrick%E6%80%BB%E7%BB%93/ 數據競賽trick總結