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

對于語料庫中的某個詞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 Homepage
- Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013
理論資料
實踐資料
使用word2vec訓練的模型,能夠很好的語義表述query,不需要query之間一定有字面交集。這是 傳統的 tf-idf方法是達不到的。
而在醫療項目中,如診斷報告和檢查報告,短文本很常見,因此word2vec可能會達到很好的語義表征效果
如果能夠結合口腔醫院的語料,得到例如這樣的詞語相似度結果,甚至把傳統的TF/IDF特征表示映射到新的向量空間中,將是很有意義的。
來自:http://suanfazu.com/t/wen-ben-shen-du-biao-shi-mo-xing-word2vec/258