詞向量 — word2vec

       自然語言是一套用來表達含義的複雜系統。在這套系統中,詞是表義的基本單元。在機器學習中,如何使用向量表示詞?

顧名思義,詞向量是用來表示詞的向量,通常也被認爲是詞的特徵向量。近年來,詞向量已逐漸成爲自然語言處理的基礎知識。

爲何不採用one-hot向量

我們在循環神經網絡中介紹過one-hot向量來表示詞。假設詞典中不同詞的數量爲NN,每個詞可以和從0到N−1N−1的連續整數一一對應。假設一個詞的相應整數表示爲ii,爲了得到該詞的one-hot向量表示,我們創建一個全0的長爲NN的向量,並將其第ii位設成1。

然而,使用one-hot詞向量並不是一個好選擇。一個主要的原因是,one-hot詞向量無法表達不同詞之間的相似度。例如,任何一對詞的one-hot向量的餘弦相似度都爲0。

word2vec

2013年,Google團隊發表了word2vec工具。word2vec工具主要包含兩個模型:跳字模型(skip-gram)和連續詞袋模型(continuous bag of words,簡稱CBOW),以及兩種高效訓練的方法:負採樣(negative sampling)和層序softmax(hierarchical softmax)。值得一提的是,word2vec詞向量可以較好地表達不同詞之間的相似和類比關係。

word2vec自提出後被廣泛應用在自然語言處理任務中。它的模型和訓練方法也啓發了很多後續的詞向量模型。本節將重點介紹word2vec的模型和訓練方法。

模型

跳字模型

在跳字模型中,我們用一個詞來預測它在文本序列周圍的詞。例如,給定文本序列"the", "man", "hit", "his", 和"son",跳字模型所關心的是,給定"hit",生成它鄰近詞“the”, "man", "his", 和"son"的概率。在這個例子中,"hit"叫中心詞,“the”, "man", "his", 和"son"叫背景詞。由於"hit"只生成與它距離不超過2的背景詞,該時間窗口的大小爲2。

我們來描述一下跳字模型。

假設詞典大小爲|||V|,我們將詞典中的每個詞與從0到||−1|V|−1的整數一一對應:詞典索引集={0,1,…,||−1}V={0,1,…,|V|−1}。一個詞在該詞典中所對應的整數稱爲詞的索引。給定一個長度爲TT的文本序列中,tt時刻的詞爲w(t)w(t)。當時間窗口大小爲mm時,跳字模型需要最大化給定任一中心詞生成背景詞的概率:

 

∏t=1T∏−m≤j≤m,j≠0ℙ(w(t+j)∣w(t))∏t=1T∏−m≤j≤m,j≠0P(w(t+j)∣w(t))

上式的最大似然估計與最小化以下損失函數等價

 

−1T∑t=1T∑−m≤j≤m,j≠0logℙ(w(t+j)∣w(t))−1T∑t=1T∑−m≤j≤m,j≠0logP(w(t+j)∣w(t))

我們可以用vv和uu分別代表中心詞和背景詞的向量。換言之,對於詞典中一個索引爲ii的詞,它在作爲中心詞和背景詞時的向量表示分別是vivi和uiui。而詞典中所有詞的這兩種向量正是跳字模型所要學習的模型參數。爲了將模型參數植入損失函數,我們需要使用模型參數表達損失函數中的中心詞生成背景詞的概率。假設中心詞生成各個背景詞的概率是相互獨立的。給定中心詞wcwc在詞典中索引爲cc,背景詞wowo在詞典中索引爲oo,損失函數中的中心詞生成背景詞的概率可以使用softmax函數定義爲

 

ℙ(wo∣wc)=exp(u⊤ovc)∑i∈exp(u⊤ivc)P(wo∣wc)=exp(uo⊤vc)∑i∈Vexp(ui⊤vc)

當序列長度TT較大時,我們通常隨機採樣一個較小的子序列來計算損失函數並使用隨機梯度下降優化該損失函數。通過微分,我們可以計算出上式生成概率的對數關於中心詞向量vcvc的梯度爲:

 

∂logℙ(wo∣wc)∂vc=uo−∑j∈exp(u⊤jvc)∑i∈exp(u⊤ivc)uj∂logP(wo∣wc)∂vc=uo−∑j∈Vexp(uj⊤vc)∑i∈Vexp(ui⊤vc)uj

而上式與下式等價:

 

∂logℙ(wo∣wc)∂vc=uo−∑j∈ℙ(wj∣wc)uj∂logP(wo∣wc)∂vc=uo−∑j∈VP(wj∣wc)uj

通過上面計算得到梯度後,我們可以使用隨機梯度下降來不斷迭代模型參數vcvc。其他模型參數uouo的迭代方式同理可得。最終,對於詞典中的任一索引爲ii的詞,我們均得到該詞作爲中心詞和背景詞的兩組詞向量vivi和uiui。

連續詞袋模型

連續詞袋模型與跳字模型類似。與跳字模型最大的不同是,連續詞袋模型中用一箇中心詞在文本序列周圍的詞來預測該中心詞。例如,給定文本序列"the", "man", "hit", "his", 和"son",連續詞袋模型所關心的是,鄰近詞“the”, "man", "his", 和"son"一起生成中心詞"hit"的概率。

假設詞典大小爲|||V|,我們將詞典中的每個詞與從0到||−1|V|−1的整數一一對應:詞典索引集={0,1,…,||−1}V={0,1,…,|V|−1}。一個詞在該詞典中所對應的整數稱爲詞的索引。給定一個長度爲TT的文本序列中,tt時刻的詞爲w(t)w(t)。當時間窗口大小爲mm時,連續詞袋模型需要最大化由背景詞生成任一中心詞的概率:

 

∏t=1Tℙ(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m))∏t=1TP(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m))

上式的最大似然估計與最小化以下損失函數等價

 

−∑t=1Tlogℙ(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m))−∑t=1TlogP(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m))

我們可以用vv和uu分別代表背景詞和中心詞的向量(注意符號和跳字模型中的不同)。換言之,對於詞典中一個索引爲ii的詞,它在作爲背景詞和中心詞時的向量表示分別是vivi和uiui。而詞典中所有詞的這兩種向量正是連續詞袋模型所要學習的模型參數。爲了將模型參數植入損失函數,我們需要使用模型參數表達損失函數中的中心詞生成背景詞的概率。給定中心詞wcwc在詞典中索引爲cc,背景詞wo1,…,wo2mwo1,…,wo2m在詞典中索引爲o1,…,o2mo1,…,o2m,損失函數中的背景詞生成中心詞的概率可以使用softmax函數定義爲

 

ℙ(wc∣wo1,…,wo2m)=exp[u⊤c(vo1+…+vo2m)/(2m)]∑i∈exp[u⊤i(vo1+…+vo2m)/(2m)]P(wc∣wo1,…,wo2m)=exp[uc⊤(vo1+…+vo2m)/(2m)]∑i∈Vexp[ui⊤(vo1+…+vo2m)/(2m)]

當序列長度TT較大時,我們通常隨機採樣一個較小的子序列來計算損失函數並使用隨機梯度下降優化該損失函數。通過微分,我們可以計算出上式生成概率的對數關於任一背景詞向量voivoi(i=1,…,2mi=1,…,2m)的梯度爲:

 

∂logℙ(wc∣wo1,…,wo2m)∂voi=12m(uc−∑j∈exp(u⊤jvc)∑i∈exp(u⊤ivc)uj)∂logP(wc∣wo1,…,wo2m)∂voi=12m(uc−∑j∈Vexp(uj⊤vc)∑i∈Vexp(ui⊤vc)uj)

而上式與下式等價:

 

∂logℙ(wc∣wo1,…,wo2m)∂voi=12m(uc−∑j∈ℙ(wj∣wc)uj)∂logP(wc∣wo1,…,wo2m)∂voi=12m(uc−∑j∈VP(wj∣wc)uj)

通過上面計算得到梯度後,我們可以使用隨機梯度下降來不斷迭代各個模型參數voivoi(i=1,…,2mi=1,…,2m)。其他模型參數ucuc的迭代方式同理可得。最終,對於詞典中的任一索引爲ii的詞,我們均得到該詞作爲背景詞和中心詞的兩組詞向量vivi和uiui。

近似訓練法

我們可以看到,無論是跳字模型還是連續詞袋模型,每一步梯度計算的開銷與詞典V的大小相關。顯然,當詞典較大時,例如幾十萬到上百萬,這種訓練方法的計算開銷會較大。所以,使用上述訓練方法在實踐中是有難度的。

我們將使用近似的方法來計算這些梯度,從而減小計算開銷。常用的近似訓練法包括負採樣和層序softmax。

負採樣

我們以跳字模型爲例討論負採樣。

詞典V大小之所以會在目標函數中出現,是因爲中心詞wcwc生成背景詞wowo的概率ℙ(wo∣wc)P(wo∣wc)使用了softmax,而softmax正是考慮了背景詞可能是詞典中的任一詞,並體現在softmax的分母上。

我們不妨換個角度,假設中心詞wcwc生成背景詞wowo由以下相互獨立事件聯合組成來近似

  • 中心詞wcwc和背景詞wowo同時出現在該訓練數據窗口
  • 中心詞wcwc和第1個噪聲詞w1w1不同時出現在該訓練數據窗口(噪聲詞w1w1按噪聲詞分佈ℙ(w)P(w)隨機生成,假設一定和wcwc不同時出現在該訓練數據窗口)
  • ...
  • 中心詞wcwc和第KK個噪聲詞wKwK不同時出現在該訓練數據窗口(噪聲詞wKwK按噪聲詞分佈ℙ(w)P(w)隨機生成,假設一定和wcwc不同時出現在該訓練數據窗口)

我們可以使用σ(x)=1/(1+exp(−x))σ(x)=1/(1+exp(−x))函數來表達中心詞wcwc和背景詞wowo同時出現在該訓練數據窗口的概率:

 

ℙ(D=1∣wo,wc)=σ(u⊤ovc)P(D=1∣wo,wc)=σ(uo⊤vc)

那麼,中心詞wcwc生成背景詞wowo的對數概率可以近似爲

 

logℙ(wo∣wc)=log[ℙ(D=1∣wo,wc)∏k=1,wk∼ℙ(w)Kℙ(D=0∣wk,wc)]logP(wo∣wc)=log[P(D=1∣wo,wc)∏k=1,wk∼P(w)KP(D=0∣wk,wc)]

假設噪聲詞wkwk在詞典中的索引爲ikik,上式可改寫爲

 

logℙ(wo∣wc)=log11+exp(−u⊤ovc)+∑k=1,wk∼ℙ(w)Klog[1−11+exp(−u⊤ikvc)]logP(wo∣wc)=log11+exp(−uo⊤vc)+∑k=1,wk∼P(w)Klog[1−11+exp(−uik⊤vc)]

因此,有關中心詞wcwc生成背景詞wowo的損失函數是

 

−logℙ(wo∣wc)=−log11+exp(−u⊤ovc)−∑k=1,wk∼ℙ(w)Klog11+exp(u⊤ikvc)−logP(wo∣wc)=−log11+exp(−uo⊤vc)−∑k=1,wk∼P(w)Klog11+exp(uik⊤vc)

當我們把KK取較小值時,每次隨機梯度下降的梯度計算開銷將由(||)O(|V|)降爲(K)O(K)。

我們也可以對連續詞袋模型進行負採樣。有關背景詞w(t−m),…,w(t−1),w(t+1),…,w(t+m)w(t−m),…,w(t−1),w(t+1),…,w(t+m)生成中心詞wcwc的損失函數

 

−logℙ(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m))−logP(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m))

在負採樣中可以近似爲

 

−log11+exp[−u⊤c(vo1+…+vo2m)/(2m)]−∑k=1,wk∼ℙ(w)Klog11+exp[(u⊤ik(vo1+…+vo2m)/(2m)]−log11+exp[−uc⊤(vo1+…+vo2m)/(2m)]−∑k=1,wk∼P(w)Klog11+exp[(uik⊤(vo1+…+vo2m)/(2m)]

同樣地,當我們把KK取較小值時,每次隨機梯度下降的梯度計算開銷將由(||)O(|V|)降爲(K)O(K)。

層序softmax

層序softmax利用了二叉樹。樹的每個葉子節點代表着詞典V中的每個詞。每個詞wiwi相應的詞向量爲vivi。我們以下圖爲例,來描述層序softmax的工作機制。

假設L(w)L(w)爲從二叉樹的根到代表詞ww的葉子節點的路徑上的節點數,並設n(w,i)n(w,i)爲該路徑上第ii個節點,該節點的向量爲un(w,i)un(w,i)。以上圖爲例,L(w3)=4L(w3)=4。那麼,跳字模型和連續詞袋模型所需要計算的任意詞wiwi生成詞ww的概率爲:

 

ℙ(w∣wi)=∏j=1L(w)−1σ([n(w,j+1)=leftChild(n(w,j))]⋅u⊤n(w,j)vi)P(w∣wi)=∏j=1L(w)−1σ([n(w,j+1)=leftChild(n(w,j))]⋅un(w,j)⊤vi)

其中σ(x)=1/(1+exp(−x))σ(x)=1/(1+exp(−x)),如果xx爲真,[x]=1[x]=1;反之[x]=−1[x]=−1。

由於σ(x)+σ(−x)=1σ(x)+σ(−x)=1,wiwi生成詞典中任何詞的概率之和爲1:

 

∑w=1ℙ(w∣wi)=1∑w=1VP(w∣wi)=1

讓我們計算wiwi生成w3w3的概率,由於在二叉樹中由根到w3w3的路徑上需要向左、向右、再向左地遍歷,我們得到

 

ℙ(w3∣wi)=σ(u⊤n(w3,1)vi))⋅σ(−u⊤n(w3,2)vi))⋅σ(u⊤n(w3,3)vi))P(w3∣wi)=σ(un(w3,1)⊤vi))⋅σ(−un(w3,2)⊤vi))⋅σ(un(w3,3)⊤vi))

我們可以使用隨機梯度下降在跳字模型和連續詞袋模型中不斷迭代計算字典中所有詞向量vv和非葉子節點的向量uu。每次迭代的計算開銷由(||)O(|V|)降爲二叉樹的高度(log||)O(log|V|)。

結論

word2vec工具中的跳字模型和連續詞袋模型可以使用兩種負採樣和層序softmax減小訓練開銷。

 

參考文獻:

http://zh.d2l.ai/chapter_natural-language-processing/word2vec.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章