word2vec原理介紹

Posted by

之前寫過一篇博文介紹如何使用word2vec,最近老闆讓我講一講word2vec,顯然光講word2vec的使用是不夠的,更重要的是介紹原理。這篇文章就寫寫自己對於word2vec的一些理解吧。

背景介紹

Word2vec是google在2013年開源的一款將詞表征為實數值向量的高效工具,一般被認為是一個深度學習模型。Word2vec的讚譽極高,被稱為2013年最重要的自然語言處理工具,相信搞NLP的沒有不知道word2vec的。在我看來,Word2vec最重要的貢獻是提供了一個基礎,也就是把詞轉換為實數值向量,在這個基礎上可以玩很多花樣。當然,可以站在一個更高的角度來看,這裡的詞其實並不一定真的就是單詞,完全可以是具有一定意義的單元塊,比如國外音樂網站就用word2vec來訓練用戶的聽歌記錄,這裡的單元塊就是歌曲編號,如果用戶對音樂類型的喜好是一致的,那麼訓練後就能找到與某個歌曲相似的歌曲,這樣就能給用戶進行推薦了,相信類似這樣的例子還有很多。

下面是word2vec最基本的查找相近詞效果:

從上面兩幅圖可以看出word2vec的效果還是不錯。

原理介紹

Word2vec的原理主要涉及到統計語言模型(包括N-gram模型和神經網絡語言模型),continuousbag-of-words模型以及continuous skip-gram模型。下面分別進行介紹:

統計語言模型

統計語言模型就是用一個機率分布來表示一段語句:

一般的語言模型可以用各個詞語的條件機率表示:

每個詞的出現機率與其上下文有關(確切的說是在前面出現的詞)。

N-gram模型

N-gram的意思就是每個詞出現只看其前面的n個詞,可以對每個詞出現的機率進行近似

比如當n=2的時候

其實n=2時模型一般被稱為Bigram,n=3是則被稱為Trigram,這兩者算是最常用的模型。

N-gram的效果還是不錯的,否則不會這麼多人用,但是其存在一些問題:

-無法建模更遠的關係。當n取值較大時計算量會大大增加,故一般只取2,3

-無法建模詞之間的相似度。比如對」 Thecat is walking in the bedroom.」 」A dog was running in a room.」 這兩句話,無法識別出其實dog和cat是類似的,bedroom和room也是類似的,walking和running也是類似的,如果能夠識別出這些相似特徵,那麼222就可以組合出8句話了,這將大大豐富語料,可惜N-gram做不到。

-未出現的n元組機率為0。對於沒有出現過的,肯定就求不出來機率了,不過可以用平滑法(出現次數都增加1,1為基準值)或回退法(用n-1元機率模擬)來處理這種情況。

神經網絡語言模型(NNLM)

為了避免N-gram模型中的那些問題,可以考慮用神經網絡來構建語言模型。該模型用特徵向量來表征每個詞各個方面的特徵,把詞轉換為向量後一個詞就對應為特徵空間中的一個點。同時,每個詞的特徵維度少於詞表的總數,這算是NNLM的一大優勢。

NNLM的基礎是一個聯合機率

其中g(.)就代表一個神經網絡。

神經網絡的目的是學習得到一個模型

並且對任意的滿足

該模型可以進一步分解

-字典集合V中的詞i到其向量C(i)的映射函數C,C是一個|V|*m的矩陣

-用C表示詞之間的機率函數

g(.)的輸出是一個向量,第i維表示第二個參數為g函數的參數

訓練的目的是最大化似然函數

輸出時採用了softmax函數

接下來用梯度下降的方法求解theta即可

以上就是神經網絡語言模型的基本思想。

Continuous Bag-of-Words模型

Continuous Bag-of-Words(CBOW)模型與NNLM類似,不同點在於CBOW去除了最耗時的非線性隱層,讓所有詞共享隱層,所有詞都被映射到同一個位置。

結構如下

從圖中能夠看到CBOW是通過上下文來預測中間的詞,如果窗口大小為k,則模型預測

同時CBOW採用了層次softmax算法,該算法結合了Huffman編碼,每個詞 w 都可以從樹的根結點root沿著唯一一條路徑被訪問到,其路徑也就形成了其編碼code。假設 n(w, j)為這條路徑上的第 j 個結點,且 L(w)為這條路徑的長度, j 從 1 開始編碼,即 n(w, 1)=root,n(w, L(w)) = w。對於第 j 個結點,層次 Softmax 定義的Label 為 1 – code[j]。

取一個適當大小的窗口當做語境,輸入層讀入窗口內的詞,將它們的向量(K維,初始隨機)加和在一起,形成隱藏層K個節點。輸出層是一個巨大的二叉樹,葉節點代表語料里所有的詞(語料含有V個獨立的詞,則二叉樹有|V|個葉節點)。而這整顆二叉樹構建的算法就是Huffman樹。這樣,對於葉節點的每一個詞,就會有一個全局唯一的編碼,形如”010011″,不妨記左子樹為1,右子樹為0。接下來,隱層的每一個節點都會跟二叉樹的內節點有連邊,於是對於二叉樹的每一個內節點都會有K條連邊,每條邊上也會有權值。結構如下

在給定上下文時,對於一個要預測的詞(這應該算是一個正樣本,該詞是預先知道的),這時就讓預測詞的二進位編碼機率最大即可(採用logistic函數計算機率),例如如果一個詞是「010001」,我們求解第一位為0的機率,第二位為1的機率等等。而一個詞在當前網絡中的機率就是從根結點到該詞路徑上的機率的乘積。於是就能夠得到樣本差值,接下來用梯度下降的方法求解參數即可。很顯然,神經網絡就是用正負樣本不斷訓練,求解輸出值與真實值誤差,然後用梯度下降的方法求解各邊權重參數值的。這裡採用二叉樹的方式是為了降低時間複雜度

除了層次softmax之外,CBOW還有另一種方法negative sampling,也就是隨機生成負例來訓練神經網絡,思想差不多,這裡省略。

Continuous skip-gram模型

Skip-gram模型與CBOW正好相反,是通過中間詞來預測前後詞,一般可以認為位置距離接近的詞之間的聯繫要比位置距離較遠的詞的聯繫緊密。

其預測機率

目標為最大化

結構為

值得一提的是,skip-gram中的skip的是指在一個窗口內詞兩兩之間都會計算機率,無論它們之間是否間隔詞,這樣「白色汽車」和「白色的汽車」會被識別為相同的短語。在skip-gram中也用到層次softmax算法和negative sampling,和CBOW模型中的類似,這裡省略。

參數介紹

Word2vec中的參數有不少,我修改了一部分代碼,讓其在聚類時也能夠輸出詞向量,得到的參數列表如下

其中重要的幾個參數如下

–size:向量維數(一般200足夠)

–window:上下文窗口大小(介於5-10之間)

–sample:高頻詞亞採樣的閾值

–hs:是否採用層次softmax

–negative:負例數目(用於negativesampling)

–min-count:被截斷的低頻詞閾值

–alpha:開始的 learning rate

–cbow:使用CBOW算法(0為不使用)

應用介紹

前面已經提到使用Word2vec得到的詞向量是一個基礎,在上面可以玩很多花樣,下面介紹自己做過的幾個。

同義詞查找

這裡是查找同義詞,也就是要比詞聚類中同一類中的詞更接近。比如下面這幾組詞:

l 中國科學院 中科院

l 院所 科研單位 科研機構

l 院士 中科院院士

l 科研項目 科研工作 科研

l 兩會 全國兩會

l 三公 三公經費

l 中央經濟工作會議 經濟工作會議

l 高考加分政策 高考加分

l 公車改革 車改

l ……

可以看到大部分是簡稱,不過也算是同義詞了。具體方法是對詞先進行聚類(用word2vec自帶的即可),然後進行層次聚類(更細粒度的聚類),最後就能找到意思最為接近的詞對了,同義詞基本都在其中。

文本聚類

對文本進行聚類時可以考慮使用詞向量的特徵,只需要考慮如何用詞來表徵文本即可,最容易想到的就是用關鍵詞來代替文本,依據關鍵詞聚類的結果就能夠得到文本的聚類結果。關鍵詞提取用TF-IDF,然後用word2vec訓練得到關鍵詞向量,再用k-means聚類,最後文本就能夠以關鍵詞的類別進行分類了。下面就是同一個類別中的文本

對文章進行指定類別的分類也可以考慮使用詞向量,首先需要有一批標記好的數據

這些詞是人工標記出來的,其中包含了該詞屬於各個類別的機率。在這個基礎上,結合詞向量的特徵,可以求出全體詞屬於各個類別的機率。具體方法是對每個詞求出其在樣本詞表中最接近的K個詞(比如十個),統計這K個詞屬於各個類別的機率,然後就能夠得到這個詞的類別信息了。下圖就是以微信為例的結果

以上就是我對word2vec的一些思考,希望老闆會滿意吧。本文中參考了其他一些人的資料,例如有道的那篇word2vec文章,word2vec傻瓜剖析等等,很感謝他們,這裡不再一一列出了。這應該算是我關於word2vec寫的最後一篇文章,也可能是與NLP相關的最後一篇文章了。

最後再次感謝曉陽童鞋去年向我推薦word2vec這個工具,如今他已經是百度自然語言處理部門的研發工程師了,祝他在NLP領域取得更大的成績。

Related Post

廣告

Comments

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料