1. 程式人生 > >[cs224n].2 詞向量表示word2vec

[cs224n].2 詞向量表示word2vec

Part I:背景

Part II:訓練模式(CBOW,Skip Gram)

Part III:優化方法(Negative Sampling,Hierarchical SoftMax)

Part IV:詞向量衡量指標

Part I:背景

特徵表達是很基礎也很重要的一步,我們通常需要用一個向量去表示一個東西,比如文字中的詞向量,知識圖譜中的知識向量,以及Network Embedding等。

在NLP中,傳統演算法通常使用one-hot形式表示一個詞,存在以下問題:

1)維度爆炸,詞表通常會非常大,導致詞向量維度也會非常大。

2)損失語義資訊,one hot隨機給每個詞語進行編號對映,無法表示詞語之間的關係。

所以word embeding的優勢如下:

1)將詞語對映成一個固定維度的向量,節省空間。

2)詞向量可能會具備一定的語義資訊,將相似的詞語放到相近的向量空間(比如香蕉和蘋果都是屬於水果,蘋果又會涉及到歧義問題),可以學習到詞語之間的關係(比如經典的 男人-女人=國王-王后)。

本文會介紹一下Word2vec原理,這是一種常見的可以用於訓練詞向量的模型工具。常見的做法是,我們先用word2vec在公開資料集上預訓練詞向量,載入到自己的模型中,對詞向量進行調整,調整成適合自己資料集的詞向量。

Part II:訓練模式

我們通常是通過將詞向量用於某些任務中,用這些任務的衡量指標去衡量模型結果。

那麼反過來,如果我們想要訓練詞向量,可以先去訓練一個語言模型,然後將模型中對應的引數,作為詞向量。從任務形式上看,我們是在訓練語言模型,而實際上我們最終的目標是想得到詞向量,我們更關心的是這個詞向量合不合理。

Word2vec根據上下文之間的出現關係去訓練詞向量,有兩種訓練模式,Skip Gram和CBOW,其中Skip Gram根據目標單詞預測上下文,CBOW根據上下文預測目標單詞,最後使用模型的部分引數作為詞向量。

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

一. CBOW

根據上下文預測目標單詞,我們需要極大化這個目標單詞的出現概率。

假設詞表大小為V,詞向量維度為N,上下文單詞為x1,x2, ..., xc,定義上下文視窗大小為c,對應的目標單詞為y,我們將x跟y都表示成one hot形式。這裡涉及到兩個矩陣引數,W是詞向量矩陣,每一行都是某個詞的詞向量v,W'可以看做是一個輔助矩陣,每一列可以看做是某個詞對應的相關向量v'。

前向過程:

x->hidden:對於每個xi,取出對應的詞向量vi,再對這些詞向量取平均作為hidden vector,相當於通過簡單粗暴的疊加,得到這些詞語的語義向量。

h->y:將h乘以W'得到一個維度為V的向量u,進行softmax歸一化得到概率向量,取概率最大的作為預測單詞。

後向過程:

我們需要極大化目標單詞的出現概率p(y | x1, x2, ... , xc),也就是極小化負對數似然函式,Loss函式定義為:

我們需要更新兩個矩陣引數,W和W',先根據loss對引數求梯度,再使用梯度下降法更新引數。具體的求導過程這裡略過,請移步原論文。

對於W',經過求導,v'更新公式為:

也就是說,需要更新整個W'矩陣,所有v'向量。(這裡造成了巨大的計算量)

對於W,經過求導,v更新公式為:

也就是說,這裡只需要更新c個上下文單詞所對應的詞向量。

二. Skip Gram

根據目標單詞預測其上下文,假設輸入的目標單詞為x,定義上下文視窗大小為c,對應的上下文為y1, y2, ... , yc,這些y是相互獨立的。

前向過程:

x->hidden:將輸入單詞x乘以詞向量矩陣W,相當於取出該詞的詞向量v。

h->y:對於每個輸出單詞y_i,將h乘以矩陣W'得到向量u,再經過softmax歸一化得到概率向量,取概率最大的預測為上下文單詞,極大化y_i的預測概率。

這些上下文單詞是相互獨立的,雖然他們共享W',但是loss是不一樣的,我們需要極大化這些詞出現的概率。作為一個語言模型這種做法是略顯粗糙,但是這裡我們的目的只是為了訓練詞向量,並不是需要訓練一個多麼好的語言模型。

後向過程:

直觀上的樣本格式是(x,y1, y2, ... , yc),然後極大化p(y|x),因為這些y是相互獨立的,又變成極大化p(y1|x)*p(y2|x)*...*p(yc|x),取log將連乘變成連加,取負將極大化變成極小化,使用交叉熵作為loss函式:

所以這裡我們可以將樣本格式定義成(x, y),將所有樣本的Loss加起來。

對於W',經過求導,v'更新公式為:

也就是說,這裡依然需要更新所有v'向量。(無法避免的巨大的計算量)

對於W,經過求導,v更新公式為:

這裡只需要更新目標詞語所對應的那個詞向量。

作者:susht 連結:https://zhuanlan.zhihu.com/p/35500923 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。  

Part III:優化方法

原始的方法所存在的問題是計算量太大,體現在以下兩方面:

1)前向過程,h->y這部分在對向量進行softmax的時候,需要計算V次。

2)後向過程,softmax涉及到了V列向量,所以也需要更新V個向量。

問題就出在V太大,而softmax需要進行V次操作,用整個W進行計算。

因此word2vec使用了兩種優化方法,Hierarchical SoftMax和Negative Sampling,對softmax進行優化,不去計算整個W,大大提高了訓練速度。

一. Hierarchical SoftMax

HS用哈夫曼樹,把預測one-hot編碼改成預測一組01編碼,進行層次分類。

在哈夫曼樹中,每個葉節點是詞表中的一個詞,每個非葉子節點對應一個v'向量,樹的深度為L(w),整顆樹有V-1個非葉子節點和V個葉節點。假設輸入單詞是w_i,目標單詞是w_o,那麼n(w, i)表示從根節點到葉節點w路徑中的第i個節點,v'(w, i)表示n(w, i)所對應的v'向量。

注意:v'不是針對詞語w而言,而是針對節點n,每個節點n都有自己的一個向量v',而不是每個詞在每個節點上有一個向量,或者說,這些詞在同一個節點上共享向量。

假設h是w_i前面所計算出來的hidden vector,我們在非葉子節點中使用該節點處的v'向量和h點乘,再用sigmoid去判斷向左還是向右:(取代softmax)

那麼每個葉節點會有一個概率p(wi=wo),最終我們需要極大化從根節點到預測單詞w_o這條路徑的概率,比如對於目標單詞w2,我們需要極大化p(w2=w_o):

在根節點處左右概率之和是1,然後在接下來的每個節點,對應兩個子節點的概率值之和等於父節點本身的概率值,那麼走到最後,所有葉子節點的概率值之和必定還是等於1:

這也就保證了原始softmax概率和為1的前提,因此可以用層次sigmoid去代替softmax函式。

作者:susht 連結:https://zhuanlan.zhihu.com/p/35500923 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。  

Loss函式定義為:

極大化目標單詞的路徑概率。

現在我們重新定義v'為:

那麼對於W',經過求導,v'更新公式為:

也就是說,這裡只需要更新L(w)-1個v'向量,時間複雜度直接從O(V)降到了O(logV)。

關於空間複雜度,原始方法中每個單詞需要一個v'向量,總共需要V個向量,而HS中每個節點也會有一個v'向量,總共需要V-1個向量,這些向量維度是一樣的,並不會增加空間複雜度。

二. Negative Sampling

NS僅僅選擇一小部分列向量進行更新,和HS相比,顯得相對簡單一點。

對於每條資料,首先我們將原始的V個詞劃分成正樣本w_o和負樣本w_neg,正樣本也就是要預測的單詞,剩下的就是負樣本。負樣本非常多,我們需要取樣出K個負樣本,與正樣本一起訓練。從前我們需要對所有V個詞進行softmax計算,現在對於我們只使用到了正樣本和負樣本,只針對這幾個詞進行計算,計算量可以大大減小。

負樣本選取方式:

NS是一種概率取樣的方式,可以根據詞頻進行隨機抽樣,我們傾向於選擇詞頻比較大的負樣本,比如“的”,這種詞語其實是對我們的目標單詞沒有很大貢獻的。

Word2vec則在詞頻基礎上取了0.75次冪,減小詞頻之間差異過大所帶來的影響,使得詞頻比較小的負樣本也有機會被採到。

Loss函式定義為:

極大化正樣本出現的概率,同時極小化負樣本出現的概率,以sigmoid來代替softmax,相當於進行二分類,判斷這個樣本到底是不是正樣本。

那麼對於W',經過求導,v'更新公式為:

也就是說,這裡不需要更新所有v'向量,只需要更新部分v'向量,這裡的wj是正樣本w_o和負樣本w_neg的集合,只更新這些樣本所對應的v'向量。

Part IV:衡量指標

詞向量的衡量指標通常有以下幾種:

1)詞彙相似度任務,比如wordsim353,但是這種方式比較依賴於資料集。

2)類比任務,比如男人-女人=國王-王后

3)應用於實際任務上的效果,比如文字分類,情感分析,句法分析,序列標註,閱讀理解等等。這種方法我覺得是比較靠譜的,因為我們訓練詞向量是希望得到一個好的詞向量,然後能在別的任務上work,

4)視覺化,可以用谷歌的Embedding Projector工具,用 PCA、t-SNE對高維詞向量進行視覺化,把資料降到三維,以3D方式檢視資料,感覺還挺好玩的。