Negative Sampling 負採樣詳解

在word2vec中,爲了簡化訓練的過程,經常會用到Negative Sampling負採樣這個技巧,這個負採樣到底是怎麼樣的呢?之前在我的博文 word2vec算法理解和數學推導 中對於word2vec有了很詳細的數學推導,這裏主要講解一下負採樣是如何降低word2vec的複雜度的。
首先我們直接寫出word2vec的目標函數,假設有一句話:query=w1,w2,w3,..,wnquery = {w_1},{w_2},{w_3},..,{w_n},由n個詞組成的一句話,我們需要最大化窗口中上下文詞的概率:
argmaxθwquerycc(w)P(cw;θ)\arg \mathop {\max }\limits_\theta \prod\limits_{w \in query} {\prod\limits_{c \in c(w)} {P(c|w;\theta )} }
這裏的c(w)c(w)表示中心詞的context words,我們在計算的時候,可以把相乘的元素轉換成對數函數:
argmaxθwquerycc(w)P(cw;θ)\arg \mathop {\max }\limits_\theta \sum\limits_{w \in query} {\sum\limits_{c \in c(w)} {P(c|w;\theta )} }
我們把概率函數可以進行展開就可以得到:
argmaxθwquerycc(w)logeucvwcvocabeucvw\arg \mathop {\max }\limits_\theta \sum\limits_{w \in query} {\sum\limits_{c \in c(w)} {\log \frac{{{e^{{u_c} \cdot {v_w}}}}}{{\sum\limits_{c' \in vocab} {{e^{{u_{c'}} \cdot {v_w}}}} }}} }
這個式子可以表示成:
argmaxθwquerycc(w)(eucvwlogcvocabeucvw)\arg \mathop {\max }\limits_\theta \sum\limits_{w \in query} {\sum\limits_{c \in c(w)} {({e^{{u_c} \cdot {v_w}}} - \log \sum\limits_{c' \in vocab} {{e^{{u_{c'}} \cdot {v_w}}}} )} }
我們可以看到這個式子第二項,因爲cc'要遍歷整個詞庫,所以複雜度非常高,所以我們要簡化這一步的計算,減小運算的複雜度。這裏的ucu_c表示cc的上下文向量,vwv_w表示中心詞ww的向量。
爲了減小上述表達式的複雜度,我們不妨改變一下上述概率的表達方式,原來的 p(wiwj)p({w_i}|{w_j}) 表示以 wjw_j 爲中心詞的時候 wiw_i 出現的概率,這裏我們用 p(D=1wi,wj;θ)p(D = 1|{w_i},{w_j};\theta ) 表示 wiw_iwjw_j 作爲上下文詞出現的概率,p(D=0wi,wj;θ)p(D = 0|{w_i},{w_j};\theta ) 表示 wiw_iwjw_j 不作爲上下文詞出現的概率。
由上述新的表達式可以寫出新的目標函數:
argmaxθ(w,c)Dp(D=1w,c;θ)(w,c)D~p(D=0w,c;θ)\arg \mathop {\max }\limits_\theta \prod\limits_{(w,c) \in D} {p(D = 1|w,c;\theta )\prod\limits_{(w,c) \in \tilde D} {p(D = 0|w,c;\theta )} }
這裏的 DD 表示上下文詞的集合,D~\tilde D 表示非上下文的集合,我們來舉一個例子,這裏有一句話:“川建國同志是一名優秀的黨員”,這句話分詞去停之後變成: 川建國 同志 一名 優秀 黨員。那麼 DD 表示上下文集合,我們假設 window size爲1,那麼可以寫出:
DD = {(川建國,同志),(同志,川建國),(同志,一名),(一名,同志),(一名,優秀),(優秀,一名),(優秀,黨員)}
D~\tilde D = {(川建國,一名),(川建國,優秀),(川建國,黨員),(同志,優秀),(同志,黨員),(一名,川建國),(一名,黨員),(優秀,川建國),(優秀,同志),(黨員,川建國),(黨員,同志),(黨員,一名)}。
上述的 DD 表示正樣本,D~\tilde D 表示負樣本。我們可以繼續表示上述的目標函數,我們可以吧正負樣本的概率表示成softmax的表達形式:
argmaxθ(w,c)D11+eucvw(w,c)D~(111+eucvw)=argmaxθ(w,c)Dlogσ(ucvw)+(w,c)D~logσ(ucvw)\arg \mathop {\max }\limits_\theta \prod\limits_{(w,c) \in D} {\frac{1}{{1 + {e^{ - {u_c} \cdot {v_w}}}}}\prod\limits_{(w,c) \in \tilde D} {(1 - \frac{1}{{1 + {e^{ - {u_c} \cdot {v_w}}}}})} } = \arg \mathop {\max }\limits_\theta \sum\limits_{(w,c) \in D} {\log \sigma ({u_c} \cdot {v_w})} + \sum\limits_{(w,c) \in \tilde D} {\log \sigma ( - {u_c} \cdot {v_w})}
在詞庫數量級爲10510^5的時候,正樣本加負樣本D~\tilde D的數量級可以達到101010^{10}左右,裏面絕大部分都是負樣本,所以我們需要降低負樣本計算中的時間複雜度,這就是Negative Sampling 負採樣的核心。負採樣就是對於一箇中心詞,我們從中心詞對應的負樣本中隨機抽取幾組來做梯度下降。還是川建國的例子,對於正樣本(川建國,同志),我們隨機抽取負樣本(川建國,一名),(川建國,黨員)來做訓練,不用全部的負樣本都拿來訓練,這就是負採樣,減小了計算的複雜度。所以,上述的目標函數可以寫成:
argmaxθ(w,c)D[logσ(ucvw)+cN(w)logσ(ucvw)] \approx \arg \mathop {\max }\limits_\theta \sum\limits_{(w,c) \in D} {[\log \sigma ({u_c} \cdot {v_w}) + \sum\limits_{c' \in N(w)} {\log \sigma ( - {u_{c'}} \cdot {v_w})} ]}
從上述表達式可以看出,負樣本我們不需要取所有的都拿來訓練,我們只需要每個中心詞抽幾個負樣本就可以了,這樣可以大大降低計算的複雜度。這就是word2vec訓練過程中的Negative Sampling 負採樣技巧,可以大大減小梯度下降的時間複雜度,這就有點像SGD隨機梯度下降,就是隨機一個樣本進行梯度下降,大體的方向還是朝着最低點下降。
接着我來解答一下上述這個表達式,一起來看看是如何進行梯度下降的,首先我們假設:
L(θ)=logσ(ucvw)+cN(w)logσ(ucvw)L(\theta ) = \log \sigma ({u_c} \cdot {v_w}) + \sum\limits_{c' \in N(w)} {\log \sigma ( - {u_{c'}} \cdot {v_w})}
接下來我們需要對該表達式求偏導:
L(θ)uc=σ(ucvw)[1σ(ucvw)]vwσ(ucvw)=[1σ(ucvw)]vw\frac{{\partial L(\theta )}}{{\partial {u_c}}} = \frac{{\sigma ({u_c} \cdot {v_w})[1 - \sigma ({u_c} \cdot {v_w})] \cdot {v_w}}}{{\sigma ({u_c} \cdot {v_w})}} = [1 - \sigma ({u_c} \cdot {v_w})] \cdot {v_w}
L(θ)uc=σ(ucvw)[1σ(ucvw)](vw)σ(ucvw)=[σ(ucvw)1]vw\frac{{\partial L(\theta )}}{{\partial {u_{c'}}}} = \frac{{\sigma ( - {u_{c'}} \cdot {v_w})[1 - \sigma ( - {u_{c'}} \cdot {v_w})] \cdot ( - {v_w})}}{{\sigma ( - {u_{c'}} \cdot {v_w})}} = [\sigma ({u_{c'}} \cdot {v_w}) - 1] \cdot {v_w}
L(θ)vw=σ(ucvw)[1σ(ucvw)]ucσ(ucvw)+cN(w)(ucvw)[1σ(ucvw)](uc)(ucvw)=[1σ(ucvw)]uc+cN(w)[σ(ucvw)1]uc\frac{{\partial L(\theta )}}{{\partial {v_w}}} = \frac{{\sigma ({u_c} \cdot {v_w})[1 - \sigma ({u_c} \cdot {v_w})] \cdot {u_c}}}{{\sigma ({u_c} \cdot {v_w})}} + \sum\limits_{c' \in N(w)} {\frac{{\partial ( - {u_{c'}} \cdot {v_w})[1 - \sigma ( - {u_{c'}} \cdot {v_w})] \cdot ( - {u_{c'}})}}{{\partial ( - {u_{c'}} \cdot {v_w})}} = [1 - \sigma ({u_c} \cdot {v_w})] \cdot {u_c} + \sum\limits_{c' \in N(w)} {[\sigma ( - {u_{c'}} \cdot {v_w}) - 1] \cdot {u_{c'}}} }
然後整體的梯度下降可以表示成:
uc:=uc+ηL(θ)uc{u_c}: = {u_c} + \eta \frac{{\partial L(\theta )}}{{\partial {u_c}}}
uc:=uc+ηL(θ)uc{u_{c'}}: = {u_{c'}} + \eta \frac{{\partial L(\theta )}}{{\partial {u_{c'}}}}
vw:=vw+ηL(θ)vw{v_w}: = {v_w} + \eta \frac{{\partial L(\theta )}}{{\partial {v_w}}}
這就是word2vec訓練過程中的負採樣技巧,希望可以通過細緻的講解能夠幫助大家深刻地理解負採樣,碼字不易,如有轉載請註明出處,文中如有紕漏,也請各位讀者不吝指教,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章