1. 程式人生 > >Word2vec——文字深度表示模型

Word2vec——文字深度表示模型

簡介

Word2vec 是 Google 在 2013 年年中開源的一款將詞表徵為實數值向量的高效工具, 其利用深度學習的思想,可以通過訓練,把對文字內容的處理簡化為 K 維向量空間中的向量運算,而向量空間上的相似度可以用來表示文字語義上的相似度。Word2vec輸出的詞向量可以被用來做很多 NLP 相關的工作,比如聚類、找同義詞、詞性分析等等。如果換個思路, 把詞當做特徵,那麼Word2vec就可以把特徵對映到 K 維向量空間,可以為文字資料尋求更加深層次的特徵表示 。

Word2vec 使用的是 Distributed representation 的詞向量表示方式。Distributed representation 最早由 Hinton在 1986 年提出[4]。其基本思想是 通過訓練將每個詞對映成 K 維實數向量

(K 一般為模型中的超引數),通過詞之間的距離(比如 cosine 相似度、歐氏距離等)來判斷它們之間的語義相似度.其採用一個 三層的神經網路 ,輸入層-隱層-輸出層。有個核心的技術是 根據詞頻用Huffman編碼 ,使得所有詞頻相似的詞隱藏層啟用的內容基本一致,出現頻率越高的詞語,他們啟用的隱藏層數目越少,這樣有效的降低了計算的複雜度。而Word2vec大受歡迎的一個原因正是其高效性,Mikolov 在論文[2]中指出,一個優化的單機版本一天可訓練上千億詞。

這個三層神經網路本身是 對語言模型進行建模 ,但也同時 獲得一種單詞在向量空間上的表示 ,而這個副作用才是Word2vec的真正目標。

與潛在語義分析(Latent Semantic Index, LSI)、潛在狄立克雷分配(Latent Dirichlet Allocation,LDA)的經典過程相比,Word2vec利用了詞的上下文,語義資訊更加地豐富。

樣例實驗

在伺服器上部署有Word2Vec系統,可以試試玩一玩

cd /home/liwei/word2vec/trunk

./demo-analogy.sh # Interesting properties of the word vectors (try apple red mango / Paris France Italy)

./demo-phrases.sh # vector representation of larger pieces of text using the word2phrase tool
./demo-phrase-accuracy.sh # measure quality of the word vectors ./demo-classes.sh # Word clustering ./distance GoogleNews-vectors-negative300.bin # Pre-trained word and phrase vectors ./distance freebase-vectors-skipgram1000-en.bin # Pre-trained entity vectors with Freebase naming

詳細使用方法見 官網

模型分析

傳統的統計語言模型是表示語言基本單位(一般為句子)的概率分佈函式,這個概率分佈也就是該語言的生成模型。一般語言模型可以使用各個詞語條件概率的形式表示:

p(s)=p(w_1^T )=p(w_1,w_2,…,w_T )=∏_t p(w_t |context)

Word2vec採用的是__層次化Log-Bilinear語言模型__,其中一種是CBOW(Continuous Bag-of-Words Model)模型,由上下文預測下一個詞為w_t的公式為:

p(w_t |context)=p(w_t |w_(t-k),w_(t-k+1),…,w_(t-1),w_(t+1),…,w_(t+k-1),w_(t+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]。

cbow

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

word2vec層次softmax網路示意圖

對於語料庫中的某個詞w_t,對應著二叉樹的某個葉子節點,因此它必然有一個二進位制編碼,如"010011"。在訓練階段,當給定上下文,要預測後面的詞w_t的時候,我們就從二叉樹的根節點開始遍歷,這裡的目標就是預測這個詞的二進位制編號的每一位。即對於給定的上下文,我們的目標是使得預測詞的二進位制編碼概率最大。形象地說,我們希望在根節點,詞向量和與根節點相連經過logistic計算得到bit=1的概率儘量接近0,在第二層,希望其bit=1的概率儘量接近1,這麼一直下去,我們把一路上計算得到的概率相乘,即得到目標詞w_t在當前網路下的概率P(w_t),那麼對於當前這個sample的殘差就是1-P(w_t),於是就可以使用梯度下降法訓練這個網路得到所有的引數值了。顯而易見,按照目標詞的二進位制編碼計算到最後的概率值就是歸一化的。

Hierarchical Softmax用Huffman編碼構造二叉樹,其實藉助了分類問題中,使用一連串二分類近似多分類的思想。例如我們是把所有的詞都作為輸出,那麼“桔子”、“汽車”都是混在一起。給定w_t的上下文,先讓模型判斷w_t是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是“桔子”。

但是在訓練過程中,模型會賦予這些抽象的中間結點一個合適的向量,這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,所以Hierarchical Softmax方法和原始問題並不是等價的,但是這種近似並不會顯著帶來效能上的損失同時又使得模型的求解規模顯著上升。

沒有使用這種二叉樹,而是直接從隱層直接計算每一個輸出的概率——即傳統的Softmax,就需要對|V|中的每一個詞都算一遍,這個過程時間複雜度是O(|V|)的。而使用了二叉樹(如Word2vec中的Huffman樹),其時間複雜度就降到了O(log2(|V|)),速度大大地加快了。

參考

官方資料

理論資料

實踐資料

使用word2vec訓練的模型,能夠很好的語義表述query,不需要query之間一定有字面交集。如:“特警15秒鐘內開槍擊倒5暴徒”和“車站事件"和”3.1昆明事件"有很強的語義關聯,這是 傳統的 tf-idf方法是達不到的。

而在醫療專案中,如診斷報告和檢查報告,短文字很常見,因此word2vec可能會達到很好的語義表徵效果

如果能夠結合口腔醫院的語料,得到例如這樣的詞語相似度結果,甚至把傳統的TF/IDF特徵表示對映到新的向量空間中,將是很有意義的