了解Word2vec
一,詞向量
首先需要了解詞向量。
比如有一個城市的詞彙表(北京,上海,甯夏,紐約,巴黎,,,,,南京)One-Hot Encoder按照如下方式:
杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
甯波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
北京 [1,0,0,0,0,0,0,0,0,……,0,0,0,0,0,0,0]
但是使用One-Hot Encoder有以下問題。一方面,城市編碼是随機的,向量之間互相獨立,看不出城市之間可能存在的關聯關系。其次,向量次元的大小取決于語料庫中字詞的多少。如果将世界所有城市名稱對應的向量合為一個矩陣的話,那這個矩陣過于稀疏,并且會造成次元災難。
使用Vector Representations可以有效解決這個問題。Word2Vec可以将One-Hot Encoder轉化為低次元的連續值,也就是稠密向量,并且其中意思相近的詞将被映射到向量空間中相近的位置。如果将embed後的城市向量通過PCA降維後可視化展示出來,那就是這個樣子。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TPn5UMNRlWspkbaZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM5MDNygTN0ETNwMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
華盛頓和紐約聚集在一起,北京上海聚集在一起,且北京到上海的距離與華盛頓到紐約的距離相近。也就是說模型學習到了城市的地理位置,也學習到了城市地位的關系。
二,Word2vec--具體了解之Word embedding
幹什麼的?
首先有了文本語料庫,你需要對語料庫進行預處理,得到你想要的processed corpus之後,将他們的one-hot向量作為word2vec的輸入,通過word2vec訓練低維詞向量(word embedding)就ok了。
目前有兩種訓練模型(CBOW和Skip-gram),兩種加速算法(Negative Sample與Hierarchical Softmax)。
本文主要用了詞向量,這裡闡述word2vec如何将corpus的one-hot向量(模型的輸入)轉換成低維詞向量(模型的中間産物,更具體來說是輸入權重矩陣)。
2.1 Word2Vec兩種模型
Word2Vec包含了兩種詞訓練模型:CBOW模型和Skip-gram模型。
1)CBOW模型根據中心詞W(t)周圍的詞來預測中心詞
2)Skip-gram模型則根據中心詞W(t)來預測周圍詞
word2vec模型其實就是簡單化的神經網絡。
輸入是One-Hot Vector,Hidden Layer沒有激活函數,也就是線性的單元。Output Layer次元跟Input Layer的次元一樣,用的是Softmax回歸。我們要擷取的dense vector其實就是Hidden Layer的輸出單元。
抛開兩個模型的優缺點不說,它們的結構僅僅是輸入層和輸出層不同。請看:
1)CBOW模型
2)Skip-gram模型
接下來我們具體分析一下CBOW模型的構造,以及詞向量是如何産生的。了解了CBOW模型,Skip-gram模型也就不在話下啦。
2.2 CBOW模型的了解
先來看着這個結構圖,用自然語言描述一下CBOW模型的流程:
CBOW模型結構圖
1) 輸入層:上下文單詞的onehot. {假設單詞向量空間dim為V,上下文單詞個數為C}。
2)所有onehot分别乘以共享的輸入權重矩陣W. {V*N矩陣,N為自己設定的數,初始化權重矩陣W}。
3)所得的向量 {因為是onehot是以為向量} 相加求平均作為隐層向量, size為1*N。
4)乘以輸出權重矩陣W' {N*V}。
5)得到向量 {1*V} 激活函數處理得到V-dim機率分布 {PS: 因為是onehot嘛,其中的每一維鬥代表着一個單詞},機率最大的index所訓示的單詞為預測出的中間詞(target word)。
6)與true label的onehot做比較,誤差越小越好。
是以,需要定義loss function(一般為交叉熵代價函數),采用梯度下降算法更新W和W'。訓練完畢後,輸入層的每個單詞與矩陣W相乘得到的向量的就是我們想要的詞向量(word embedding),這個矩陣(所有單詞的word embedding)也叫做look up table(其實這個look up table就是矩陣W自身),也就是說,任何一個單詞的onehot乘以這個矩陣都将得到自己的詞向量。有了look up table就可以免去訓練過程直接查表得到單詞的詞向量了。
三, 具體例子了解CBOW模型流程
假設我們現在的Corpus是這一個簡單的隻有四個單詞的document:
{I drink coffee everyday}
我們選coffee作為中心詞,window size設為2。也就是說,我們要根據單詞"I","drink"和"everyday"來預測一個單詞,并且我們希望這個單詞是coffee。
這裡,drink稀疏的表示[0 1 0 0]經過embedding之後變為了稠密的矩陣[2 2 1]。