Word2Vec简明教程:入门、原理及代码实现
Word2Vec簡明教程
- 1. 特征向量
- 2. 詞向量
- 2.1 例1:King- Man + Woman = Queen
- 2.2 例2:跨語言同義詞共現
- 3. NNLM
- 4. Word2Vec
- 4.1 SkipGram
- (1)基本概念
- (2)數據模型
- 4.2 CBoW
- 4.3 Negative Sampling
- 4.4 Hierarchical Softmax
- 5. 使用gensim
1. 特征向量
近年來,研究者通過詞匯學方法,發現約有五種特質可以涵蓋人格描述的所有方面,提出了人格的大五模式(Big Five),俗稱人格的海洋(OCEAN),包括以下五個維度:
- 開放性(Openness):具有想象、審美、情感豐富、求異、創造、智能等特質。
- 責任心(Conscientiousness):顯示勝任、公正、條理、盡職、成就、自律、謹慎、克制等特點。
- 外傾性(Extroversion):表現出熱情、社交、果斷、活躍、冒險、樂觀等特質。
- 宜人性(Agreeableness):具有信任、利他、直率、依從、謙虛、移情等特質。
- 神經質性(Neuroticism):難以平衡焦慮、敵對、壓抑、自我意識、沖動、脆弱等情緒的特質,即不具有保持情緒穩定的能力。
通過NEO-PI-R測試可以得出每個維度的打分(1-100),然后將其縮放到[?1,1][-1,1][?1,1]之間:
利用余弦相似度可以計算兩個人的性格相似度,如圖,向量a=[x1,y1],b=[x2,y2]\boldsymbol a=[x_1,y_1],\boldsymbol b =[x_2,y_2]a=[x1?,y1?],b=[x2?,y2?]
則,sim(a,b)=cosθ=ab∣a∣∣b∣=x1x2+y1y2x12+y12x22+y22sim(a,b) = cos \theta = \frac {ab}{\mid a \mid \mid b \mid} = \frac {x_1x_2+y_1y_2}{\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}}sim(a,b)=cosθ=∣a∣∣b∣ab?=x12?+y12??x22?+y22??x1?x2?+y1?y2??
對于nnn維向量A=[a1,a2,...an],B=[b1,b2,...bn]A=[a_1,a_2,...a_n],B=[b_1,b_2,...b_n]A=[a1?,a2?,...an?],B=[b1?,b2?,...bn?],
sim(A,B)=AB∣A∣∣B∣=∑i=1nAiBi∑i=1nAi2∑i=1nAi2sim(A,B) = \frac {AB}{\mid A \mid \mid B \mid}= \frac {\sum_{i=1}^{n}{A_iB_i}}{\sqrt{\sum_{i=1}^{n}{A_i^2}}\sqrt{\sum_{i=1}^{n}{A_i^2}}}sim(A,B)=∣A∣∣B∣AB?=∑i=1n?Ai2??∑i=1n?Ai2??∑i=1n?Ai?Bi??
余弦相似度的取值范圍在-1到1之間。余弦值越接近1,也就是兩個向量越相似,完全相同時數值為1;相反反向時為-1;正交或不相關是為0。
np.linalg.norm 操作是求向量的范式,默認是L2范式,等同于求向量的歐式距離。
import numpy as np jay = np.array([-0.4,0.8,0.5,-0.2,0.3]) p1 = np.array([-0.3,0.2,0.3,-0.4,0.9]) p2 = np.array([-0.5,0.4,-0.2,0.7,-0.1])def cos_sim(a, b):a_norm = np.linalg.norm(a)b_norm = np.linalg.norm(b)cos = np.dot(a,b)/(a_norm * b_norm)return cosprint(cos_sim(jay,p1),cos_sim(jay,p2))輸出如下:
0.6582337075311759 0.23612240736068565
可見前兩者較為相似。
余弦相似度也常用在文本相似度、圖片相似度等應用中,比如金融類新以下詞出現的頻率高:“股票、債券、黃金、期貨、基金、上漲、下跌”,而先這些詞出現相對較少:“宇宙、太空、星系、恒星、大氣層”。每一篇文章也都有相應的特征,由其主題決定,最簡單的可以用其TF-IDF值來表示。
2. 詞向量
對于每個人可以抽取特征形成一組向量,對于每個詞匯同樣可以將其轉換為一組向量,并計算相互之間的關系。1986年,Hinton在《Learning Distribution Representation of Concepts》中最早提出使用向量來表示詞。
對于詞典D\mathcal DD中的任意詞www,通過一個固定長度的向量v(w)∈Rm\rm v(w) \in \mathcal R^mv(w)∈Rm來表示,則v(w)\rm v(w)v(w)就稱為www的詞向量。
2.1 例1:King- Man + Woman = Queen
如,單詞King的詞向量(通過維基百科語料訓練的Glove向量)如下:
[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 ,
-0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 ,
0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344
, -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]
根據值對單元格進行顏色編碼(接近2則為紅色,接近0則為白色,接近-2則為藍色):
將“king”與其它單詞進行比較:
可以看出:
- 所有這些單詞都有一條直的紅色列,它們在這個維度上是相似的(名詞屬性)
- “woman”和“girl”在很多地方是相似的,“man”和“boy”也是一樣(Gender)
- “boy”和“girl”也有彼此相似的地方,但這些地方卻與“woman”或“man”不同。(Age)
- “king”和“queen”彼此之間相似,但它們與其它單詞都不同。(Royalty)
- 除了最后一個單詞“water”,所有單詞都是代表人,可以看到藍色列一直向下并在 “water”的詞嵌入之前停下了,顯示出類別之間的差異。
詞嵌入最經典的例子就是King??Man?+Woman?≈Queen?\vec {King} - \vec {Man} + \vec {Woman} \approx \vec {Queen}King??Man+Woman≈Queen?
2.2 例2:跨語言同義詞共現
以下為谷歌Mikolov等人在《Exploiting Similarities among Languages for Machine Translation》提及的一個著名的跨語言同義詞共現的案例。該例子通過語義映射技術,實現了機器翻譯。通過為兩種語言構建不同的語言空間,并在兩個空間上建立映射關系。
在向量空間內,不同的語言享有許多共性,只要實現一個向量空間向另一個向量空間的映射和轉換,即可實現語言翻譯。該技術對英語和西班牙語間的翻譯準確率高達90%90\%90%。
如對于英語和西班牙語,訓練得到對應的詞向量空間E(nglish)和S(panish)。
- 從英語中抽取五個詞“one,two,three,four,five”,通過PCA降維,得到對應的二維向量Vone,Vtwo,Vthree,Vfour,VfiveV_{one},V_{two},V_{three},V_{four},V_{five}Vone?,Vtwo?,Vthree?,Vfour?,Vfive?
- 從西班牙語中抽取對應的五個詞“uno,dos,tres,cuatro,cinoco”,通過PCA降維,得到對應的二維向量Vuno,Vdos,Vtres,Vcuatro,VcinocoV_{uno},V_{dos},V_{tres},V_{cuatro},V_{cinoco}Vuno?,Vdos?,Vtres?,Vcuatro?,Vcinoco?
可以看出,5個詞在兩個向量空間中的相對位置差不多,說明兩種不同語言對應向量空間的結構之間具有相似性,進一步說明了在詞向量空間中利用距離刻畫詞與詞之間相似度的合理性。
此外,對于句子、文檔也可以用句子向量及文檔向量來表示。
3. NNLM
為了得到每個詞的詞向量,需要根據大量語料進行訓練。2003年,Bengio等人在《A neural probabilistic language model》提出了用神經網絡建立統計語言模型的框架(NNLM,Neural Network Language Model),并首次提出了word embedding的概念(雖然沒有叫這個名字),奠定了包括word2vec等后續研究word representation learning的基礎。
NNLM模型的基本思想可以概括如下:
- 假定詞表中的每一個word都對應著一個連續的特征向量;
- 假定一個連續平滑的概率模型,輸入一段詞向量的序列,可以輸出這段序列的聯合概率;
- 同時學習詞向量的權重和概率模型里的參數。
值得注意的一點是,這里的詞向量也是要學習的參數。
該論文采用前向反饋神經網絡來擬合一個詞序列的條件概率p(wt∣w1,w2,...,wt?1)p(w_t|w_1,w_2,...,w_{t-1})p(wt?∣w1?,w2?,...,wt?1?),如下圖所示:
該模型分成兩部:
-
線性的Embedding層:輸入為N?1N?1N?1個one-hot詞向量,通過一個共享的D×VD \times VD×V的矩陣CCC,映射為N?1N?1N?1個分布式的詞向量(distributed vector)。其中,VVV是詞典的大小,DDD是Embedding向量的維度(一個先驗參數)。CCC矩陣里存儲了要學習的word vector。
-
前向反饋神經網絡:由一個tanh隱層和一個softmax輸出層組成。通過將Embedding層輸出的N?1N?1N?1個詞向量映射為一個長度為VVV的概率分布向量,從而對詞典中的word在輸入context下的條件概率做出預估:
p(wi∣w1,w2,...,wt?1)≈f(wi,wt?1,...,wt?n+1)=g(wi,C(wt?n+1),...,C(wt?1))p(w_i|w_1,w_2,...,w_{t-1}) \approx f(w_i, w_{t-1}, ..., w_{t-n+1}) = g(w_i, C(w_{t-n+1}), ..., C(w_{t-1}))p(wi?∣w1?,w2?,...,wt?1?)≈f(wi?,wt?1?,...,wt?n+1?)=g(wi?,C(wt?n+1?),...,C(wt?1?))
通過最小化cross-entropy的正則化損失函數來調整模型參數:L(θ)=1T∑tlog?f(wt,wt?1,...,wt?n+1)+R(θ)L(\theta)=\frac{1}{T}\sum_t{\log{f(w_t, w_{t-1}, ..., w_{t-n+1})}}+R(\theta)L(θ)=T1?t∑?logf(wt?,wt?1?,...,wt?n+1?)+R(θ)
模型參數θ\thetaθ包括了Embedding層矩陣C的元素和前向反饋神經網絡模型的權重wt,wt?1,...,wt?n+1w_t, w_{t-1}, ..., w_{t-n+1}wt?,wt?1?,...,wt?n+1?。
該模型同時解決了兩個問題:
- 統計語言模型里關注的條件概率p(wt∣context)p(w_t|context)p(wt?∣context)的計算
- 向量空間模型里關注的詞向量的表達
這兩個問題本質上并不獨立。通過引入連續的詞向量和平滑的概率模型,可以在一個連續空間里對序列概率進行建模,從根本上緩解數據稀疏性和維度災難的問題;而且以條件概率p(wt|context)為學習目標去更新詞向量的權重,具有更強的導向性,同時也與VSM里的Distributional Hypothesis不謀而合。
缺點:
- 只能處理定長的序列
- 訓練速度太慢
4. Word2Vec
2013年,Google團隊發表了word2vec工具(參見Mikolov等人發表的《Distributed Representations of Sentences and Documents》、《Efficient estimation of word representations in vector space》等論文),通過將所有的詞向量化,來定量的度量詞與詞之間的關系,挖掘詞之間的聯系。
主要包含
- 兩個模型:skip-gram(跳字模型)和CBow,Continuous Bag of Words(連續詞袋模型)
- 兩種高效訓練的方法:Negative Sampling(負采樣)和Hierarchical Softmax(層次Softmax)
4.1 SkipGram
(1)基本概念
Skip-gram模型從target word對context的預測中學習到word vector,該名稱源于該模型在訓練時會對上下文環境里的word進行采樣。
如:
按照上述思路產生的樣本如下:
針對上述模型,將預測相鄰單詞這一任務,轉換為判斷兩個單詞是否為相鄰的單詞的問題(0表示“不是鄰居”,1表示“鄰居”):
此時模型如下:
將模型從神經網絡改為邏輯回歸模型——更簡單,計算速度更快。但是此時所有單詞都是相鄰單詞鄰居(target=1),得到的訓練模型可能永遠返回1。
為了解決該問題,需要在數據集中引入負樣本,即非相鄰單詞樣本(target=0):
這個想法的靈感來自噪聲對比估計,將實際信號(相鄰單詞的正例)與噪聲(隨機選擇的不是鄰居的單詞)進行對比,導致了計算和統計效率的巨大折衷。
word2vec訓練過程中的兩個關鍵超參數是窗口大小和負樣本的數量,不同的任務適合不同的窗口大小。
(2)數據模型
SkipGram關注是給定中心詞www生成背景詞ccc的條件概率p(c∣w)p(c \mid w)p(c∣w),假設給定中心詞的情況下背景詞的生成相互獨立,則
max?θ∏w∈Word∏c∈Contextp(c∣w;θ)\max_{\theta} \prod_{w \in Word} \prod_{c \in Context} p(c \mid w; \theta)θmax?w∈Word∏?c∈Context∏?p(c∣w;θ)
?max?θ∑w∈Word∑c∈Contextlog?p(c∣w;θ)\Rightarrow \max_{\theta} \sum_{w \in Word} \sum_{c \in Context} \log p(c \mid w; \theta)?θmax?w∈Word∑?c∈Context∑?logp(c∣w;θ)
在跳字模型中,每個詞被表示成兩個ddd維向量,用來計算條件概率,詞典索引集V={0,1,…,∣V∣?1}\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}V={0,1,…,∣V∣?1}。
假設這個詞在詞典中索引為iii,當它為中心詞時向量表示為vi∈Rd\boldsymbol{v}_i\in\mathbb{R}^dvi?∈Rd,而為背景詞時向量表示為ui∈Rd\boldsymbol{u}_i\in\mathbb{R}^dui?∈Rd。 設中心詞www在詞典中索引為www,背景詞ccc在詞典中索引為ccc,給定中心詞生成背景詞的條件概率可以通過對向量內積做softmax運算而得到:
P(c∣w)=exp(uc?vw)∑i∈Vexp(ui?vw),P(c \mid w) = \frac{\text{exp}(\boldsymbol{u}_c^\top \boldsymbol{v}_w)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_w)},P(c∣w)=∑i∈V?exp(ui??vw?)exp(uc??vw?)?,
因此,Skip-gram模型的本質是計算輸入word的input vector vw\boldsymbol{v}_wvw? 與目標word的output vector uc\boldsymbol{u}_cuc? 之間的余弦相似度,并進行softmax歸一化,要學習的模型參數θ\thetaθ正是這兩類詞向量。
此時log?P(c∣w)=uc?vw?log?(∑i∈Vexp(ui?vw))\log P(c \mid w) = \boldsymbol{u}_c^\top \boldsymbol{v}_w - \log\left(\sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_w)\right)logP(c∣w)=uc??vw??log(i∈V∑?exp(ui??vw?))
為了計算最大值,對其求導
?logP(w∣c)?vw=uo?∑j∈Vexp?(uj?vw)uj∑i∈Vexp?(ui?vw)=uo?∑j∈V(exp(uj?vc)∑i∈Vexp(ui?vw))uj=uo?∑j∈VP(w∣c)uj.\begin{aligned} \frac{\partial \text{log}\, P(w \mid c)}{\partial \boldsymbol{v}_w} &= \boldsymbol{u}_o - \frac{\sum_{j \in \mathcal{V}} \exp(\boldsymbol{u}_j^\top \boldsymbol{v}_w)\boldsymbol{u}_j}{\sum_{i \in \mathcal{V}} \exp(\boldsymbol{u}_i^\top \boldsymbol{v}_w)}\\ &= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} \left(\frac{\text{exp}(\boldsymbol{u}_j^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_w)}\right) \boldsymbol{u}_j\\ &= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} P(w \mid c) \boldsymbol{u}_j. \end{aligned} ?vw??logP(w∣c)??=uo??∑i∈V?exp(ui??vw?)∑j∈V?exp(uj??vw?)uj??=uo??j∈V∑?(∑i∈V?exp(ui??vw?)exp(uj??vc?)?)uj?=uo??j∈V∑?P(w∣c)uj?.?
它的計算需要詞典中所有詞以www為中心詞的條件概率,其他詞向量的梯度同理可得。訓練結束后,對于詞典中的任一索引為iii的詞,均得到該詞作為中心詞和背景詞的兩組詞向量vi\boldsymbol{v}_ivi?和ui\boldsymbol{u}_iui?,一般使用跳字模型的中心詞向量作為詞的表征向量。
上述計算過程極其耗時,為此Mikolov引入了兩種優化算法:層次Softmax(Hierarchical Softmax)和負采樣(Negative Sampling),核心思想都是降低計算量。
4.2 CBoW
CBoW模型從context對target word的預測中學習到詞向量的表達,等價于一個詞袋模型的向量乘以一個Embedding矩陣,從而得到一個連續的embedding向量。這也是CBoW模型名稱的由來。
如:
使用目標詞的前兩個詞(“by”,“a”)與后兩個詞(“bus”,“in”),來預測目標詞(“red”):
4.3 Negative Sampling
令P(D=1∣w,c)P(D=1 \mid w,c)P(D=1∣w,c)表示中心詞www與背景詞ccc同時出現(正例)的概率,P(D=0∣w,wk)P(D=0 \mid w,w_k)P(D=0∣w,wk?)表示中心詞www與背景詞wkw_kwk?不同時出現(負例)的概率,
則
P(D=1∣w,c)=σ(uc?vw)P(D=1 \mid w,c)= \sigma (\boldsymbol{u}_c^\top \boldsymbol{v}_w)P(D=1∣w,c)=σ(uc??vw?)
P(D=0∣w,wk)=1?σ(uk?vw)P(D=0 \mid w,w_k)= 1- \sigma (\boldsymbol{u}_k^\top \boldsymbol{v}_w)P(D=0∣w,wk?)=1?σ(uk??vw?)
此時,
p(c∣w)=P(D=1∣w,c)∑k=1KP(D=0∣w,wk)=σ(uc?vw)+∑k=1K[1?σ(uk?vw)]\begin{aligned}p(c \mid w) & =P(D=1 \mid w,c) \sum_{k=1}^K P(D=0 \mid w,w_k) \\ &= \sigma (\boldsymbol{u}_c^\top \boldsymbol{v}_w) + \sum_{k=1}^K[ 1- \sigma (\boldsymbol{u}_k^\top \boldsymbol{v}_w)] \end{aligned}p(c∣w)?=P(D=1∣w,c)k=1∑K?P(D=0∣w,wk?)=σ(uc??vw?)+k=1∑K?[1?σ(uk??vw?)]?
需要最大化p(c∣w)p(c \mid w)p(c∣w),由于上式的計算復雜度由KKK個負采樣決定,計算量大大降低。
4.4 Hierarchical Softmax
為了避免要計算所有詞的softmax概率,word2vec使用Huffman樹來代替從隱藏層到輸出softmax層的映射,softmax概率計算只需要沿著樹形結構進行。
如圖,沿著霍夫曼樹從根節點一直走到葉子節點的詞w2w_2w2?。
Huffman樹的所有內部節點類似神經網絡隱藏層的神經元,根節點的詞向量對應投影后的詞向量,而所有葉子節點就類似于之前神經網絡softmax輸出層的神經元,葉子節點的個數就是詞匯表的大小。Huffman樹中,隱藏層到輸出層的softmax映射不是一下子完成的,而是沿著霍夫曼樹一步步完成,因此這種softmax名為"Hierarchical Softmax"。
word2vec中采用了二元邏輯回歸的方法,即規定沿著左子樹走,那么就是負類(Huffman樹編碼1),沿著右子樹走,那么就是正類(Huffman樹編碼0),使用sigmoid函數判別正類和負類。
使用Hierarchical Softmax后,由于Huffman樹是二叉樹,計算量為由VVV變成了log2Vlog2Vlog2V;此外,由于Huffman樹是高頻的詞靠近樹根,這樣高頻詞被找到花費時間更短。
5. 使用gensim
gensim是一個很好用的Python NLP的包,封裝了google的C語言版的word2vec,不只可以用于word2vec,還有很多其他的API可以用。可以使用
pip install gensim安裝。
在gensim中,word2vec 相關的API都在包gensim.models.word2vec中,和算法有關的參數都在類gensim.models.word2vec.Word2Vec中,主要參數如下:
- sentences: 要分析的語料,可以是一個列表,或者從文件中遍歷讀出。
- size: 詞向量的維度,默認值是100。這個維度的取值一般與語料的大小相關,如果是不大的語料,比如小于100M的文本語料,則使用默認值一般就可以了。如果是超大的語料,建議增大維度。
- window:即詞向量上下文最大距離,window越大,則和某一詞較遠的詞也會產生上下文關系。默認值為5。在實際使用中,可以根據實際的需求來動態調整這個window的大小。如果是小語料則這個值可以設的更小。對于一般的語料這個值推薦在[5,10]之間。
- sg: word2vec兩個模型的選擇:如果是0(默認), 則是CBOW模型;是1則是Skip-Gram模型。
- hs: word2vec兩個解法的選擇:如果是0(默認), 則是Negative Sampling;是1的話并且負采樣個數negative大于0, 則是Hierarchical Softmax。
- negative:即使用Negative Sampling時負采樣的個數,默認是5。推薦在[3,10]之間。這個參數在我們的算法原理篇中標記為neg。
- cbow_mean: 僅用于CBOW在做投影的時候,為0,則算法中的xw為上下文的詞向量之和,為1則為上下文的詞向量的平均值。
- min_count:需要計算詞向量的最小詞頻。這個值可以去掉一些很生僻的低頻詞,默認是5。如果是小語料,可以調低這個值。
- iter: 隨機梯度下降法中迭代的最大次數,默認是5。對于大語料,可以增大這個值。
- alpha: 在隨機梯度下降法中迭代的初始步長。算法原理篇中標記為η,默認是0.025。
- min_alpha: 由于算法支持在迭代的過程中逐漸減小步長,min_alpha給出了最小的迭代步長值。隨機梯度下降中每輪的迭代步長可以由iter,alpha, min_alpha一起得出。
以《人民的名義》為語料,分析主要人物的特征:
- 通過詞云可以發現,主要有侯亮平、李達康、高育良、祁同偉四位主角
- 使用model.wv.similarity方法計算相互之間相似度,發現侯亮平、李達康、祁同偉之間相似度較高
- 使用wv.doesnt_match比較沙瑞金與四位主角相似度,發現沙瑞金更加不同于四位主角
輸出如下:
輸出如下:
0.93316543
0.9705674
0.96616036
0.91774
0.9734558
0.9349903
沙瑞金
總結
以上是生活随笔為你收集整理的Word2Vec简明教程:入门、原理及代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xmanager远程桌面控制linux
- 下一篇: 年度最流行英文字体20款