閱讀大概需要9分鐘
跟隨小博主,每天進步一丟丟 word2vec主要實現(xiàn)方法是Skip-gram和CBOW,CBOW的目標是根據(jù)上下文來預測當前詞的概率,且上下文所有的詞對當前詞出現(xiàn)概率的影響的權重是一樣的,因此叫做continuous bag-of-words模型。如在袋子中取詞,去取出數(shù)量足夠的詞就可以了,與取出詞的先后順序無關。Skip-gram剛好相反,其是根據(jù)當前詞來預測上下文概率的。在實際應用中算法并無高下之分,主要根據(jù)呈現(xiàn)的效果來進行算法選擇。這里介紹Skip-gram,并通過例子來理解Skip-gram是如何實現(xiàn)預測上下文,并如何訓練得到詞向量。skip-gram模型是根據(jù)中心詞預測上下文m個詞的算法,m是用戶自己定義的預測窗口大小,比如一句話“I love natural language processing”,假設詞典庫就是{“I”,“ love”,“ natural”,“ language”,“ processing”},這些詞事先都用one-hot編碼。中心詞為“natural”作為輸入,給定窗口2,那么就要通過Skip-gram 模型預測出上下文為“I”,“l(fā)ove”,“l(fā)anguage”,“processing”。skip-gram需要做的就是使得概率P({“I”,“ love”,“ language”,“ processing”|“ natural”)最大。由于詞語詞之間相互獨立,所以可以將概率公式轉(zhuǎn)化為:P(“I'∣“natural')?P(“l(fā)ove'∣“natural')?P(“l(fā)anguage'∣“natural')?P(“processing'∣“natural')下圖是skip-gram的神經(jīng)網(wǎng)絡結構,隱含層沒有使用任何激活函數(shù),隱藏層到輸出層進行全連接,然后是一個softmax,輸出概率。過程比較簡單,一個Forward Propagation,一個Backward Propagation。完成參數(shù)的更新。看到這里可能會覺得云里霧里的,舉個例子來看看skip-gram是如何預測上下文和實現(xiàn)word2vec的。1.one-hot編碼:one-hot編碼是一個(V * V)的矩陣,其中V代表字典庫的大小。假設字典庫就是{“I”,“ love”,“ natural”,“ language”,“ processing”},對應的one-hot編碼如下: 中心詞向量矩陣也叫輸入層到隱含層的權重矩陣W(d*V)。由于one-hot編碼的稀疏性以及無法計算詞與詞之間的相似性等缺點,所以我們希望通過一個稠密的向量來表示詞語,即將詞語映射到低維的向量表示,我們把這種映射叫做詞嵌入(word embedding)。那么如何做到embedding呢?如果我們現(xiàn)在把一個詞典庫的10000個單詞(V=10000)分別用300個特征(d=300)來表示的話,那么隱含層就有300個神經(jīng)元,看下面的圖片,左右兩張圖分別從不同角度代表了輸入層-隱層的權重矩陣。左圖中每一列代表一個10000維的詞向量和隱層單個神經(jīng)元連接的權重向量。從右邊的圖來看,每一行實際上代表了每個單詞的詞向量。用剛剛的例子解釋一下,將每個詞的one-hot編碼向量乘以一個學習好的低維的共享矩陣W(V *d)。比如要把例子5維向量(這里V=5)表示的詞語映射到3維向量(d=3),假設學習好的W為:中心詞“nature”one-hot編碼的向量和共享矩陣相乘就得到它的詞向量,用Vc表示,對向量進行歸一化得到Vc=(0.46 0.15 0.39):類似詞典中心詞向量矩陣,但這里的詞向量中d個維度儲存的抽象信息,是作為上下文的詞而言,它與中心詞之間的對應關系信息,對于詞典中的每一個詞都對應一個上下文向量矩陣。比如nature的上下文你向量矩陣是W’,(3 12 8),(13 11 26),(20 32 23),(8 22 12)分別是“I”,“ love”,“ language”,“ processing”相對“ natural”的上下文向量。將中心詞(nature)的詞向量和學習好的權重矩陣的其他詞做內(nèi)積,此時會得到每個詞的計算結果: 4.softmax 輸出層是一個softmax回歸分類器,它的每個結點將會輸出一個0-1之間的值(概率),是詞典中每個詞成為當前指定中心詞的上下文的概率,這些所有輸出層神經(jīng)元結點的概率之和為1。計算方法為: 這個例子的softmax計算結果如下,有些地方分母會是包括中心詞的五個數(shù)相加,但這樣并不會影響結果:“I”是“nature”的上下文的概率為0.226,以此類推,選擇4個(2*2)softmax最大的詞作為當前中心詞的上下文,因為這個例子詞典庫就5個詞語,所以剩下4個都作為natural的上下文。上面的例子是在已經(jīng)學習好了中心詞向量矩陣和上下文向量矩陣完成的,那么在這之前就要訓練模型學習這兩個矩陣,訓練的過程就是一個BP算法。在學習的過程是一個監(jiān)督學習,對于一個中心詞我們是有明確的上下文的,我們期望窗口內(nèi)的詞的輸出概率最大。在此之前我們學習另一種目標函數(shù)的表示方法。對于一個句子:S=(w1 w2 w3 w4 w5 w6).有六個單詞分別問w1~w6,我們用P(D=1|wi,wj;θ)表示wi,wj作為上下文的概率,其中θ為模型參數(shù),后文會接著解釋模型參數(shù)。如果wi,wj作為上下文,我們就希望下面這個概率公式越大越好,其中概率公式表示是條件概率的邏輯回歸表示,其中u和v分別代表中心詞向量和上下文向量:那么目標函數(shù)就是要最大化下面這個函數(shù),其中w是文章T中的詞,c是中心詞w對應的所有上下文單詞:對于剛剛說的要學習中心詞向量矩陣W和上下文向量矩陣W’就是要更新目標函數(shù)的 ,這兩個參數(shù)也正是上面提到的模型參數(shù)θ。將目標函數(shù)用L(θ)表示,用梯度下降法分別計算這兩個參數(shù)的梯度:然后更新 :接著更新兩個向量矩陣即可。每一次迭代都把詞典庫中的所有詞學習完,并更新兩個矩陣,當達到最大迭代次數(shù)時,也就完成了word2vec的工作了。中心詞向量矩陣跟one-hot編碼是有關系的,只要將one-hot編碼和W相乘就是我們要查的那個單詞的word embedding了,這個也叫查表(Lookup table)。通常語義比較相近的詞出現(xiàn)在上下文的概率是比較大的,word2vec模型會把兩個語義相近的詞的word embedding訓練的比較接近。[1] Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.[2]《Python自然語言處理實戰(zhàn)》涂銘、劉詳、劉樹春 著
|