1. 程式人生 > >word2vec模型cbow與skip-gram的比較

word2vec模型cbow與skip-gram的比較

老師 使用 調整 窗口 詞向量 word 算法實現 ont 原理

cbow和skip-gram都是在word2vec中用於將文本進行向量表示的實現方法,具體的算法實現細節可以去看word2vec的原理介紹文章。我們這裏大體講下兩者的區別,尤其註意在使用當中的不同特點。

在cbow方法中,是用周圍詞預測中心詞,從而利用中心詞的預測結果情況,使用GradientDesent方法,不斷的去調整周圍詞的向量。當訓練完成之後,每個詞都會作為中心詞,把周圍詞的詞向量進行了調整,這樣也就獲得了整個文本裏面所有詞的詞向量。

要註意的是, cbow的對周圍詞的調整是統一的:求出的gradient的值會同樣的作用到每個周圍詞的詞向量當中去。

可以看到,cbow預測行為的次數跟整個文本的詞數幾乎是相等的(每次預測行為才會進行一次backpropgation, 而往往這也是最耗時的部分),復雜度大概是O(V);

而skip-gram是用中心詞來預測周圍的詞。在skip-gram中,會利用周圍的詞的預測結果情況,使用GradientDecent來不斷的調整中心詞的詞向量,最終所有的文本遍歷完畢之後,也就得到了文本所有詞的詞向量。

可以看出,skip-gram進行預測的次數是要多於cbow的:因為每個詞在作為中心詞時,都要使用周圍詞進行預測一次。這樣相當於比cbow的方法多進行了K次(假設K為窗口大小),因此時間的復雜度為O(KV),訓練時間要比cbow要長。

但是在skip-gram當中,每個詞都要收到周圍的詞的影響,每個詞在作為中心詞的時候,都要進行K次的預測、調整。因此, 當數據量較少,或者詞為生僻詞出現次數較少時, 這種多次的調整會使得詞向量相對的更加準確。因為盡管cbow從另外一個角度來說,某個詞也是會受到多次周圍詞的影響(多次將其包含在內的窗口移動),進行詞向量的跳幀,但是他的調整是跟周圍的詞一起調整的,grad的值會平均分到該詞上, 相當於該生僻詞沒有收到專門的訓練,它只是沾了周圍詞的光而已。

因此,從更通俗的角度來說:

在skip-gram裏面,每個詞在作為中心詞的時候,實際上是 1個學生 VS K個老師,K個老師(周圍詞)都會對學生(中心詞)進行“專業”的訓練,這樣學生(中心詞)的“能力”(向量結果)相對就會紮實(準確)一些,但是這樣肯定會使用更長的時間;

cbow是 1個老師 VS K個學生,K個學生(周圍詞)都會從老師(中心詞)那裏學習知識,但是老師(中心詞)是一視同仁的,教給大家的一樣的知識。至於你學到了多少,還要看下一輪(假如還在窗口內),或者以後的某一輪,你還有機會加入老師的課堂當中(再次出現作為周圍詞),跟著大家一起學習,然後進步一點。因此相對skip-gram,你的業務能力肯定沒有人家強,但是對於整個訓練營(訓練過程)來說,這樣肯定效率高,速度更快。

所以,這兩者的取舍,要看你自己的需求是什麽了。

word2vec模型cbow與skip-gram的比較