1.word2vec簡介
word2vec,即詞向量,就是一個詞用一個向量來表示。是2013年Google提出的。word2vec工具主要包含兩個模型:跳字模型(skip-gram)和連續詞袋模型(continuous bag of words,簡稱CBOW),以及兩種高效訓練的方法:負采樣(negative sampling)和層序softmax(hierarchical softmax)。word2vec詞向量可以較好地表達不同詞之間的相似和類比關系。word2vec是一個NLP工具,它可以將所有的詞向量化,這樣詞與詞之間就可以定量的去度量他們之間的關系,挖掘詞之間的聯系。
NLP(自然語言處理)里面,最細粒度的是詞語,詞語組成句子,句子再組成段落、篇章、文檔。所以處理 NLP 的問題,首先要先處理詞語。詞語,是人類的抽象總結,是符號形式的(比如中文、英文、拉丁文等等),所以需要把他們轉換成數值形式,或者說——嵌入到一個數學空間里,這種嵌入方式,就叫詞嵌入(word embedding),而 Word2vec,就是詞嵌入( word embedding) 的一種。簡單點來說就是把一個詞語轉換成對應向量的表達形式,來讓機器讀取數據。
2.語言模型
首先我們需要先思考這樣一個問題:如何計算一段文本序列在某種語言下出現的概率?之所為稱其為一個基本問題,是因為它在很多NLP任務中都扮演着重要的角色。例如,在機器翻譯的問題中,如果我們知道了目標語言中每句話的概率,就可以從候選集合中挑選出最合理的句子做為翻譯結果返回。
統計語言模型給出了這一類問題的一個基本解決框架。對於一段文本序列S=w1,w2,…,wT,它的概率可以表示為:
p(S)=p(w1,w2,w3,w4,w5,…,wt)
=p(w1)p(w2|w1)p(w3|w1,w2)…p(wt|w1,w2,…,wt-1)
即將序列的聯合概率轉化為一系列條件概率的乘積。問題變成了如何去預測這些給定previous words下的條件概率p(wt|w1,w2,…,wt−1)。常見的統計語言模型有N元文法模型(N-gram Model)
基於馬爾科夫假設(Markov Assumption):下一個詞的出現僅依賴於它前面的一個或幾個詞。
假設下一個詞的出現依賴它前面的一個詞,則有:
p(S)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|w1,w2,…,wn-1)=p(w1)p(w2|w1)p(w3|w2)…p(wn|wn-1) // bigram
假設下一個詞的出現依賴它前面的兩個詞,則有:
p(S)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|w1,w2,…,wn-1)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|wn-1,wn-2) // trigram
那么,我們在面臨實際問題時,如何選擇依賴詞的個數,即n。
更大的n:對下一個詞出現的約束信息更多,具有更大的辨別力;
更小的n:在訓練語料庫中出現的次數更多,具有更可靠的統計信息,具有更高的可靠性。
理論上,n越大越好,經驗上,trigram用的最多,盡管如此,原則上,能用bigram解決,絕不使用trigram。
3. CBOW和skip-gram模型介紹
假設我們輸入的一句話為 The quick brown fox jumps over the lazy dog.
設定我們的窗口大小為2(window_size=2),也就是說我們僅選輸入詞前后各兩個詞和輸入詞進行組合。
3.1 CBOW
CBOW模型如下圖所示,該模型的特點是輸入已知上下文,輸出對當前單詞的預測。
假設window_size取2時,利用CBOW模型可以得到:
首先輸入的是one-hot向量,第一層是一個全連接層,然后沒有激活函數,輸出層是一個softmax層,輸出一個概率分布,表示詞典中每個詞出現的概率。
- 1 輸入層:上下文單詞的onehot. {假設單詞向量空間dim為V,上下文單詞個數為C},假定要預測的單詞是fox,那么輸入層為quick、brown、jumps、over,采用one-hot編碼,分別為[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]、[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]、[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]、[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
- 2 所有onehot分別乘以共享的輸入權重矩陣W. {V*N矩陣,N為自己設定的數,初始化權重矩陣W}
- 3 所得的向量 {因為是onehot所以為向量} 相加求平均作為隱層向量, size為1*N.
- 4 乘以輸出權重矩陣W' {N*V}
- 5 得到向量 {1*V} 激活函數處理得到V-dim概率分布 {其中的每一維度代表着一個單詞}
- 6 概率最大的index所指示的單詞為預測出的中間詞(target word)與true label的onehot做比較,誤差越小越好(根據誤差更新權重矩陣)
所以,需要定義loss function(一般為交叉熵代價函數),采用梯度下降算法更新W和W'。訓練完畢后,輸入層的每個單詞與矩陣W相乘得到的向量的就是我們想要的詞向量,這個矩陣也叫做look up table,也就是說,任何一個單詞的onehot乘以這個矩陣都將得到自己的詞向量。
3.2 skip_gram
skip-gram只是逆轉了CBOW的因果關系而已,即已知當前詞語,預測上下文。
下圖中,藍色代表input word,方框內代表位於窗口內的單詞。Training Samples(輸入, 輸出)
假設window_size取2時,利用CBOW模型可以得到:
4. 高效訓練方法
在CBOW和skip-gram講解完成后,我們會發現Word2Vec模型是一個超級大的神經網絡(權重矩陣規模非常大)。
舉個例子,我們擁有10000個單詞的詞匯表,我們如果想嵌入300維的詞向量,那么我們的輸入-隱層權重矩陣和隱層-輸出層的權重矩陣都會有 10000 x 300 = 300萬個權重,在如此龐大的神經網絡中進行梯度下降是相當慢的。更糟糕的是,你需要大量的訓練數據來調整這些權重並且避免過擬合。百萬數量級的權重矩陣和億萬數量級的訓練樣本意味着訓練這個模型將會是個災難。
下面主要介紹兩種方法優化訓練過程。
1.負采樣(negative sampling)
負采樣解決了這個問題,它是用來提高訓練速度並且改善所得到詞向量的質量的一種方法。不同於原本每個訓練樣本更新所有的權重,負采樣每次讓一個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。
2.層序softmax也是解決這個問題的一種方法。
具體細節下次分享~
參考文獻:
https://blog.csdn.net/yu5064/article/details/79601683
https://www.jianshu.com/p/471d9bfbd72f