tensorflow在文本处理中的使用——skip-gram & CBOW原理总结
摘自:http://www.cnblogs.com/pinard/p/7160330.html
先看下列三篇,再理解此篇會更容易些(個人意見)
skip-gram,CBOW,Word2Vec
詞向量基礎
CBOW與Skip-Gram用于神經網絡語言模型
詞向量基礎
用詞向量來表示詞并不是word2vec的首創,在很久之前就出現了。最早的詞向量是很冗長的,它使用是詞向量維度大小為整個詞匯表的大小,對于每個具體的詞匯表中的詞,將對應的位置置為1。比如我們有下面的5個詞組成的詞匯表,詞"Queen"的序號為2, 那么它的詞向量就是(0,1,0,0,0)(0,1,0,0,0)。同樣的道理,詞"Woman"的詞向量就是(0,0,0,1,0)(0,0,0,1,0)。這種詞向量的編碼方式我們一般叫做1-of-N representation或者one hot representation.
One hotrepresentation用來表示詞向量非常簡單,但是卻有很多問題。最大的問題是我們的詞匯表一般都非常大,比如達到百萬級別,這樣每個詞都用百萬維的向量來表示簡直是內存的災難。這樣的向量其實除了一個位置是1,其余的位置全部都是0,表達的效率不高,能不能把詞向量的維度變小呢?
Dristributedrepresentation可以解決One hotrepresentation的問題,它的思路是通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關系。這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。
比如下圖我們將詞匯表里的詞用"Royalty","Masculinity", "Femininity"和"Age"4個維度來表示,King這個詞對應的詞向量可能是(0.99,0.99,0.05,0.7)(0.99,0.99,0.05,0.7)。當然在實際情況中,我們并不能對詞向量的每個維度做一個很好的解釋。
有了用Dristributedrepresentation表示的較短的詞向量,我們就可以較容易的分析詞之間的關系了,比如我們將詞的維度降維到2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發現:
可見我們只要得到了詞匯表里所有詞對應的詞向量,那么我們就可以做很多有趣的事情了。不過,怎么訓練得到合適的詞向量呢?一個很常見的方法是使用神經網絡語言模型。
CBOW與Skip-Gram用于神經網絡語言模型
在word2vec出現之前,已經有用神經網絡DNN來用訓練詞向量進而處理詞與詞之間的關系了。采用的方法一般是一個三層的神經網絡結構(當然也可以多層),分為輸入層,隱藏層和輸出層(softmax層)。
這個模型是如何定義數據的輸入和輸出呢?一般分為CBOW(Continuous Bag-of-Words與Skip-Gram兩種模型。
CBOW模型:訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。
Skip-Gram模型:和CBOW的思路是反著來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。
******************************************************************************************************************************
CBOW模型
input:我們的上下文大小取值為4,上下文對應的詞有8個,前后各4個,這8個詞是我們模型的輸入。由于CBOW使用的是詞袋模型,因此這8個詞都是平等的,也就是不考慮他們和我們關注的詞之間的距離大小,只要在我們上下文之內即可。
output:期望輸出詞是"Learning",輸出是所有詞的softmax概率(訓練的目標是期望訓練樣本特定詞對應的softmax概率最大)
Network:對應的CBOW神經網絡模型輸入層有8個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。
這樣當我們有新的需求,要求出某8個詞對應的最可能的輸出中心詞時,我們可以通過一次DNN前向傳播算法并通過softmax激活函數找到概率最大的詞對應的神經元即可。
Skip-Gram模型
input:特定的這個詞"Learning"是我們的輸入
output:我們的上下文大小取值為4,8個上下文詞是我們的輸出
Network:我們的輸入是特定詞, 輸出是softmax概率排前8的8個詞,對應的Skip-Gram神經網絡模型輸入層有1個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。
這樣當我們有新的需求,要求出某1個詞對應的最可能的8個上下文詞時,我們可以通過一次DNN前向傳播算法得到概率大小排前8的softmax概率對應的神經元所對應的詞即可。
以上就是神經網絡語言模型中如何用CBOW與Skip-Gram來訓練模型與得到詞向量的大概過程。但是這和word2vec中用CBOW與Skip-Gram來訓練模型與得到詞向量的過程有很多的不同。
問題:
word2vec為什么 不用現成的DNN模型,要繼續優化出新方法呢?最主要的問題是DNN模型的這個處理過程非常耗時。我們的詞匯表一般在百萬級別以上,這意味著我們DNN的輸出層需要進行softmax計算各個詞的輸出概率的的計算量很大。有沒有簡化一點點的方法呢?可以去此處找答案
總結
以上是生活随笔為你收集整理的tensorflow在文本处理中的使用——skip-gram & CBOW原理总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 时间戳最大值
- 下一篇: CAD系统变量(参数)大全