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