在word2vec原理(一) CBOW與Skip-Gram模型基礎中,咱們講到了使用神經網絡的方法來獲得詞向量語言模型的原理和一些問題,如今咱們開始關注word2vec的語言模型如何改進傳統的神經網絡的方法。因爲word2vec有兩種改進方法,一種是基於Hierarchical Softmax的,另外一種是基於Negative Sampling的。本文關注於基於Hierarchical Softmax的改進方法,在下一篇討論基於Negative Sampling的改進方法。html
咱們先回顧下傳統的神經網絡詞向量語言模型,裏面通常有三層,輸入層(詞向量),隱藏層和輸出層(softmax層)。裏面最大的問題在於從隱藏層到輸出的softmax層的計算量很大,由於要計算全部詞的softmax機率,再去找機率最大的值。這個模型以下圖所示。其中VV是詞彙表的大小,git
word2vec對這個模型作了改進,首先,對於從輸入層到隱藏層的映射,沒有采起神經網絡的線性變換加激活函數的方法,而是採用簡單的對全部輸入詞向量求和並取平均的方法。好比輸入的是三個4維詞向量:(1,2,3,4),(9,6,11,8),(5,10,7,12)(1,2,3,4),(9,6,11,8),(5,10,7,12),那麼咱們word2vec映射後的詞向量就是(5,6,7,8)(5,6,7,8)。因爲這裏是從多個詞向量變成了一個詞向量。github
第二個改進就是從隱藏層到輸出的softmax層這裏的計算量個改進。爲了不要計算全部詞的softmax機率,word2vec採樣了霍夫曼樹來代替從隱藏層到輸出softmax層的映射。咱們在上一節已經介紹了霍夫曼樹的原理。如何映射呢?這裏就是理解word2vec的關鍵所在了。算法
因爲咱們把以前全部都要計算的從輸出softmax層的機率計算變成了一顆二叉霍夫曼樹,那麼咱們的softmax機率計算只須要沿着樹形結構進行就能夠了。以下圖所示,咱們能夠沿着霍夫曼樹從根節點一直走到咱們的葉子節點的詞w2w2。網絡
和以前的神經網絡語言模型相比,咱們的霍夫曼樹的全部內部節點就相似以前神經網絡隱藏層的神經元,其中,根節點的詞向量對應咱們的投影后的詞向量,而全部葉子節點就相似於以前神經網絡softmax輸出層的神經元,葉子節點的個數就是詞彙表的大小。在霍夫曼樹中,隱藏層到輸出層的softmax映射不是一會兒完成的,而是沿着霍夫曼樹一步步完成的,所以這種softmax取名爲"Hierarchical Softmax"。函數
如何「沿着霍夫曼樹一步步完成」呢?在word2vec中,咱們採用了二元邏輯迴歸的方法,即規定沿着左子樹走,那麼就是負類(霍夫曼樹編碼1),沿着右子樹走,那麼就是正類(霍夫曼樹編碼0)。判別正類和負類的方法是使用sigmoid函數,即:優化
P(+)=σ(xTwθ)=11+e−xTwθP(+)=σ(xwTθ)=11+e−xwTθ編碼
其中xwxw是當前內部節點的詞向量,而θθ則是咱們須要從訓練樣本求出的邏輯迴歸的模型參數。spa
使用霍夫曼樹有什麼好處呢?首先,因爲是二叉樹,以前計算量爲VV,如今變成了log2Vlog2V。第二,因爲使用霍夫曼樹是高頻的詞靠近樹根,這樣高頻詞須要更少的時間會被找到,這符合咱們的貪心優化思想。3d
容易理解,被劃分爲左子樹而成爲負類的機率爲P(−)=1−P(+)P(−)=1−P(+)。在某一個內部節點,要判斷是沿左子樹仍是右子樹走的標準就是看P(−),P(+)P(−),P(+)誰的機率值大。而控制P(−),P(+)P(−),P(+)誰的機率值大的因素一個是當前節點的詞向量,另外一個是當前節點的模型參數θθ。
對於上圖中的w2w2,若是它是一個訓練樣本的輸出,那麼咱們指望對於裏面的隱藏節點n(w2,1)n(w2,1)的P(−)P(−)機率大,n(w2,2)n(w2,2)的P(−)P(−)機率大,n(w2,3)n(w2,3)的P(+)P(+)機率大。
回到基於Hierarchical Softmax的word2vec自己,咱們的目標就是找到合適的全部節點的詞向量和全部內部節點θθ, 使訓練樣本達到最大似然。那麼如何達到最大似然呢?
咱們使用最大似然法來尋找全部節點的詞向量和全部內部節點θθ。先拿上面的w2w2例子來看,咱們指望最大化下面的似然函數:
∏i=13P(n(wi),i)=(1−11+e−xTwθ1)(1−11+e−xTwθ2)11+e−xTwθ3∏i=13P(n(wi),i)=(1−11+e−xwTθ1)(1−11+e−xwTθ2)11+e−xwTθ3
對於全部的訓練樣本,咱們指望最大化全部樣本的似然函數乘積。
爲了便於咱們後面通常化的描述,咱們定義輸入的詞爲ww,其從輸入層詞向量求和平均後的霍夫曼樹根節點詞向量爲xwxw, 從根節點到ww所在的葉子節點,包含的節點總數爲lwlw, ww在霍夫曼樹中從根節點開始,通過的第ii個節點表示爲pwipiw,對應的霍夫曼編碼爲dwi∈{0,1}diw∈{0,1},其中i=2,3,...lwi=2,3,...lw。而該節點對應的模型參數表示爲θwiθiw, 其中i=1,2,...lw−1i=1,2,...lw−1,沒有i=lwi=lw是由於模型參數僅僅針對於霍夫曼樹的內部節點。
定義ww通過的霍夫曼樹某一個節點j的邏輯迴歸機率爲P(dwj|xw,θwj−1)P(djw|xw,θj−1w),其表達式爲:
P(dwj|xw,θwj−1)={σ(xTwθwj−1)1−σ(xTwθwj−1)dwj=0dwj=1P(djw|xw,θj−1w)={σ(xwTθj−1w)djw=01−σ(xwTθj−1w)djw=1
那麼對於某一個目標輸出詞ww,其最大似然爲:
∏j=2lwP(dwj|xw,θwj−1)=∏j=2lw[σ(xTwθwj−1)]1−dwj[1−σ(xTwθwj−1)]dwj∏j=2lwP(djw|xw,θj−1w)=∏j=2lw[σ(xwTθj−1w)]1−djw[1−σ(xwTθj−1w)]djw
在word2vec中,因爲使用的是隨機梯度上升法,因此並無把全部樣本的似然乘起來獲得真正的訓練集最大似然,僅僅每次只用一個樣本更新梯度,這樣作的目的是減小梯度計算量。這樣咱們能夠獲得ww的對數似然函數LL以下:
L=log∏j=2lwP(dwj|xw,θwj−1)=∑j=2lw((1−dwj)log[σ(xTwθwj−1)]+dwjlog[1−σ(xTwθwj−1)])L=log∏j=2lwP(djw|xw,θj−1w)=∑j=2lw((1−djw)log[σ(xwTθj−1w)]+djwlog[1−σ(xwTθj−1w)])
要獲得模型中ww詞向量和內部節點的模型參數θθ, 咱們使用梯度上升法便可。首先咱們求模型參數θwj−1θj−1w的梯度:
∂L∂θwj−1=(1−dwj)(σ(xTwθwj−1)(1−σ(xTwθwj−1)σ(xTwθwj−1)xw−dwj(σ(xTwθwj−1)(1−σ(xTwθwj−1)1−σ(xTwθwj−1)xw=(1−dwj)(1−σ(xTwθwj−1))xw−dwjσ(xTwθwj−1)xw=(1−dwj−σ(xTwθwj−1))xw(1)(2)(3)(1)∂L∂θj−1w=(1−djw)(σ(xwTθj−1w)(1−σ(xwTθj−1w)σ(xwTθj−1w)xw−djw(σ(xwTθj−1w)(1−σ(xwTθj−1w)1−σ(xwTθj−1w)xw(2)=(1−djw)(1−σ(xwTθj−1w))xw−djwσ(xwTθj−1w)xw(3)=(1−djw−σ(xwTθj−1w))xw
若是你們看過以前寫的邏輯迴歸原理小結,會發現這裏的梯度推導過程基本相似。
一樣的方法,能夠求出xwxw的梯度表達式以下:
∂L∂xw=∑j=2lw(1−dwj−σ(xTwθwj−1))θwj−1∂L∂xw=∑j=2lw(1−djw−σ(xwTθj−1w))θj−1w
有了梯度表達式,咱們就能夠用梯度上升法進行迭代來一步步的求解咱們須要的全部的θwj−1θj−1w和xwxw。
因爲word2vec有兩種模型:CBOW和Skip-Gram,咱們先看看基於CBOW模型時, Hierarchical Softmax如何使用。
首先咱們要定義詞向量的維度大小MM,以及CBOW的上下文大小2c2c,這樣咱們對於訓練樣本中的每個詞,其前面的cc個詞和後面的cc個詞做爲了CBOW模型的輸入,該詞自己做爲樣本的輸出,指望softmax機率最大。
在作CBOW模型前,咱們須要先將詞彙表創建成一顆霍夫曼樹。
對於從輸入層到隱藏層(投影層),這一步比較簡單,就是對ww周圍的2c2c個詞向量求和取平均便可,即:
xw=12c∑i=12cxixw=12c∑i=12cxi
第二步,經過梯度上升法來更新咱們的θwj−1θj−1w和xwxw,注意這裏的xwxw是由2c2c個詞向量相加而成,咱們作梯度更新完畢後會用梯度項直接更新原始的各個xi(i=1,2,,,,2c)xi(i=1,2,,,,2c),即:
θwj−1=θwj−1+η(1−dwj−σ(xTwθwj−1))xwθj−1w=θj−1w+η(1−djw−σ(xwTθj−1w))xw
xw=xw+η∑j=2lw(1−dwj−σ(xTwθwj−1))θwj−1(i=1,2..,2c)xw=xw+η∑j=2lw(1−djw−σ(xwTθj−1w))θj−1w(i=1,2..,2c)
其中ηη爲梯度上升法的步長。
這裏總結下基於Hierarchical Softmax的CBOW模型算法流程,梯度迭代使用了隨機梯度上升法:
輸入:基於CBOW的語料訓練樣本,詞向量的維度大小MM,CBOW的上下文大小2c2c,步長ηη
輸出:霍夫曼樹的內部節點模型參數θθ,全部的詞向量ww
1. 基於語料訓練樣本創建霍夫曼樹。
2. 隨機初始化全部的模型參數θθ,全部的詞向量ww
3. 進行梯度上升迭代過程,對於訓練集中的每個樣本(context(w),w)(context(w),w)作以下處理:
a) e=0, 計算xw=12c∑i=12cxixw=12c∑i=12cxi
b) for j = 2 to lwlw, 計算:
f=σ(xTwθwj−1)f=σ(xwTθj−1w)
g=(1−dwj−f)ηg=(1−djw−f)η
e=e+gθwj−1e=e+gθj−1w
θwj−1=θwj−1+gxwθj−1w=θj−1w+gxw
c) 對於context(w)context(w)中的每個詞向量xixi(共2c個)進行更新:
xi=xi+exi=xi+e
d) 若是梯度收斂,則結束梯度迭代,不然回到步驟3繼續迭代。
如今咱們先看看基於Skip-Gram模型時, Hierarchical Softmax如何使用。此時輸入的只有一個詞ww,輸出的爲2c2c個詞向量context(w)context(w)。
咱們對於訓練樣本中的每個詞,該詞自己做爲樣本的輸入, 其前面的cc個詞和後面的cc個詞做爲了Skip-Gram模型的輸出,,指望這些詞的softmax機率比其餘的詞大。
Skip-Gram模型和CBOW模型實際上是反過來的,在上一篇已經講過。
在作CBOW模型前,咱們須要先將詞彙表創建成一顆霍夫曼樹。
對於從輸入層到隱藏層(投影層),這一步比CBOW簡單,因爲只有一個詞,因此,即xwxw就是詞ww對應的詞向量。
第二步,經過梯度上升法來更新咱們的θwj−1θj−1w和xwxw,注意這裏的xwxw周圍有2c2c個詞向量,此時若是咱們指望P(xi|xw),i=1,2...2cP(xi|xw),i=1,2...2c最大。此時咱們注意到因爲上下文是相互的,在指望P(xi|xw),i=1,2...2cP(xi|xw),i=1,2...2c最大化的同時,反過來咱們也指望P(xw|xi),i=1,2...2cP(xw|xi),i=1,2...2c最大。那麼是使用P(xi|xw)P(xi|xw)好仍是P(xw|xi)P(xw|xi)好呢,word2vec使用了後者,這樣作的好處就是在一個迭代窗口內,咱們不是隻更新xwxw一個詞,而是xi,i=1,2...2cxi,i=1,2...2c共2c2c個詞。這樣總體的迭代會更加的均衡。由於這個緣由,Skip-Gram模型並無和CBOW模型同樣對輸入進行迭代更新,而是對2c2c個輸出進行迭代更新。
這裏總結下基於Hierarchical Softmax的Skip-Gram模型算法流程,梯度迭代使用了隨機梯度上升法:
輸入:基於Skip-Gram的語料訓練樣本,詞向量的維度大小MM,Skip-Gram的上下文大小2c2c,步長ηη
輸出:霍夫曼樹的內部節點模型參數θθ,全部的詞向量ww
1. 基於語料訓練樣本創建霍夫曼樹。
2. 隨機初始化全部的模型參數θθ,全部的詞向量ww,
3. 進行梯度上升迭代過程,對於訓練集中的每個樣本(w,context(w))(w,context(w))作以下處理:
a) for i =1 to 2c:
i) e=0
ii)for j = 2 to lwlw, 計算:
f=σ(xTiθwj−1)f=σ(xiTθj−1w)
g=(1−dwj−f)ηg=(1−djw−f)η
e=e+gθwj−1e=e+gθj−1w
θwj−1=θwj−1+gxiθj−1w=θj−1w+gxi
iii)
xi=xi+exi=xi+e
b)若是梯度收斂,則結束梯度迭代,算法結束,不然回到步驟a繼續迭代。
這裏給出上面算法和word2vec源碼中的變量對應關係。
在源代碼中,基於Hierarchical Softmax的CBOW模型算法在435-463行,基於Hierarchical Softmax的Skip-Gram的模型算法在495-519行。你們能夠對着源代碼再深刻研究下算法。
在源代碼中,neule對應咱們上面的ee, syn0對應咱們的xwxw, syn1對應咱們的θij−1θj−1i, layer1_size對應詞向量的維度,window對應咱們的cc。
另外,vocab[word].code[d]指的是,當前單詞word的,第d個編碼,編碼不含Root結點。vocab[word].point[d]指的是,當前單詞word,第d個編碼下,前置的結點。
以上就是基於Hierarchical Softmax的word2vec模型,下一篇咱們討論基於Negative Sampling的word2vec模型。