天天看點

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

我以前寫過一篇關于word2vec的文章,說實話,寫的一坨,我決定以後寫部落格認認真真的去寫。

我的部落格來自于網上各位前輩的資料的整理,

這位 和這位翻譯的 讓我對word2vec有了深入的了解。word2vec有兩種模型,一個是skip-gram,一個是cbow。這兩個模型應該是在一起講的。cbow是輸入詞向量求平均,二skip-gram輸入隻有一個,不要求平均。首先說一點,cbow和skip-gram的目标函數,下圖是cbow的,skip-gram反過來而已
word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分
word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

詞向量基礎

詞向量很早以前就有了。最早的詞向量成為one-hot representation,它使用的詞向量次元大小為整個詞彙表的大小,對于詞彙表中每個具體的詞,對應位置置為1,其餘位置為0。例如,我們得到一個為2000大小的詞彙表,“dog”的詞序為3,那麼它的詞向量表示為(0,0,1,0,...,0)。是不是感覺這樣很蠢,隻是将改詞所在的位置表示出來,而其餘位置都沒有啥意義,占用存儲空間。如果上千萬大小的詞彙表,一個詞就需要上千萬的位置,将會導緻次元災難。

于是,人們搞出一個Distributed representation,它的思路是通過訓練,将每個詞都映射到一個較短的詞向量上,所有的詞向量就構成了向量空間,進而可以用統計學的方法研究詞和詞之間的關系。比如谷歌用google news訓練的詞向量,次元為300,一般次元自己指定。

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

上圖僅僅展示了一個詞彙表中詞向量的一部分,可以看出“Man”這個詞和“Woman”這個詞在“Gender”所占的比重還是很大的,在其他屬性占的比重小。當然實際上,我們并不能對詞向量的每一個次元做很好的解釋。

使用t-SNE算法對詞向量進行非線性降維,可得到下面映射結果:

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

可以看到同一類的詞,基本上聚集在了一起。例如,給定對應關系“man”對“woman”,要求機器類比出“King”對應的詞彙,可發現詞向量存在數學關系“Man - Woman = King - Queen”

第一部分

模型

在word2vec模型中,主要有Skip-Gram和CBOW兩種模型。CBOW是給定上下文,來預測input word,而Skip-Gram是給定input word來預測上下文。

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

我暫時文章沒怎麼看懂,就看懂了最後一篇翻譯的,是以暫時隻寫skip-gram。

Skip-Gram實際上分為了兩個部分,第一部分為建立模型,第二部分為通過模型擷取嵌入詞向量。word2vec的整個模組化過程實際上與自編碼器(auto-encoder)相似,即先基于訓練資料建構一個神經網絡,當這個模型訓練号以後,我們并不會用這個訓練好的模型處理新的任務,我們需要的是這個模型通過訓練所學到的參數,如隐層的權值矩陣-----這些權重在word2vec中實際上就是我們試圖學習的“word vectors(詞向量)”。基于訓練資料模組化的過程,我們給它取一個名字叫“Fake Task”,意味着模組化不是最終目的。

上面提到的這種方法實際上會在無監督特征學習(unsupervised feature learning)中見到,最常見的是自編碼器(auto-enconder):通過在隐層将輸入進行編碼壓縮,繼而在輸出層将資料解碼回複到初始狀态,訓練完成後,我們将會去掉輸出層,隻保留隐層。(ps:讓我想起了生成對抗網絡)

The Fake Task

“fake task”就是建構網絡,但隻要訓練資料得到的隐層。它的完整過程如下:

假如我們有一個句子“The fox jumps over the lazy dog”。

  • 首先我們選取句子中的一個詞作為輸入詞(實際訓練過程中,是依次将句子中的每個詞作為輸入詞建構訓練對的),例如選取“fox”作為input word;
  • 有了input word後,我們再定義一個叫skip_window的參數,它代表我們從目前input word的一側選取詞的數量。如果設定skip_window = 2,那麼我們最終獲得視窗中的詞(包括input word在内)就是['The', 'fox', 'jumps', 'over']。那麼整個視窗大小span =
    word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分
    = 4。另外一個參數叫num_skips,它代表我們選取多少個不同的詞作為我們的output word,當skip_window = 2,num_skips = 2時,我們将會得到兩組(input word,output word)形式的訓練資料,即('fox', 'jumps'),('fox', 'the')
  • 神經網絡基于這些訓練資料将會輸出一個機率分布,這個機率代表着我們詞典中的每個詞是output word的可能性。例如,上面我們得到兩組資料。我們先用一組資料('fox', 'jumps')來訓練神經網絡,那麼模型通過前面學習這個訓練樣本,會告訴我們詞彙表中其他單詞的機率大小和“jumps”的機率大小。

模型的輸出機率代表着我們的詞典中每個詞有多大可能跟input word同時出現。例如,我們向神經網絡模型中輸入一個單詞“Soviet”,那麼最終模型的輸出機率中,像“Union”,“Russia”這些相關詞的機率遠遠高于“dog”,“love”這些非相關詞的機率。

我們将通過給神經網絡輸入文本中成對的單詞來訓練它完成上面所說的機率計算。下面的圖給出了一個完整的例子。我們標明句子“The quick brown fox jumps over lazy dog”,設定視窗大小為2(skip_window = 2)。下圖中,藍色代表input_word,方框内代表位于視窗内的單詞。

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

模型細節

首先,神經網絡隻能接受數值輸入,是以我們必須将單詞進行one-hot編碼,上面我們介紹的詞向量發揮作用了。假設我們在訓練資料中隻能取出10000個不重複的單詞作為詞彙表,那麼我們對每個單詞編碼都是

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

的向量。在上面的例子中,如果“** The dog barked at the mailman**”,按照簡單的情況,每個單詞在詞彙表的位置為1,2,3,4,5,6,那麼這6個單詞将會被編碼成

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

次元的向量,為了表示友善,我隻寫出前2個

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

模型的輸入是10000為的向量,那麼輸出也是10000維(詞彙表的大小)向量,它包含了10000個機率,每一個機率代表着目前詞是輸入樣本中output word的機率大小。如下圖,神經網絡架構:

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

隐層不使用任何激活函數,但是輸出層用來softmax

第二部分

上面結尾我們說輸出層用softmax,但是要知道,如果真的用softmax來算,計算量大的驚人。是以可以用這三個方法來減少計算量:

  • 将常見的單詞組合(word pairs)或者詞組作為單個“words”來使用。
  • 對高頻詞進行抽樣來減少訓練樣本的個數
  • 最後最重要的一點,就是“nagative sampling”方法,這樣每個訓練樣本隻會更新一小部分模型權重,進而降低計算負擔。

其他的我不想講,原作者部落格中有,我想講講nagative sampling(負采樣)。不同于原本每個訓練樣本更新所有的權重,負采樣每次讓一個訓練樣本僅僅更新一部分的權重,這樣就好降低梯度下降過程中的計算量。

當我們用訓練樣本(input word:"fox", output word:"quick")來訓練我們的神經網絡時,“fox”和“quick”都是經過one-hot編碼的。如果我們的vocabulary大小為10000時,在輸出層,我們希望“quick”單詞那個位置輸出1,其餘都是0。這些其餘我們期望輸出0的位置所對應的單詞我們成為“negative” word。

當使用負采樣時,我們将随機選擇一小部分的negative words(比如選5個negative words)來更新對應的權重。我們也會對我們的positive word進行權重更新(上面的例子指的是"quick")。

  • 在論文中,作者指出指出對于小規模資料集,選擇5-20個negative words會比較好,對于大規模資料集可以僅選擇2-5個negative words。

回憶一下我們的隐層-輸出層擁有300 x 10000的權重矩陣。如果使用了負采樣的方法我們僅僅去更新我們的positive word-“quick”的和我們選擇的其他5個negative words的結點對應的權重,共計6個輸出神經元,相當于每次隻更新300

word2vec -- 負采樣 -- skip-gram詞向量基礎第一部分第二部分

6 = 1800個權重。對于3百萬的權重來說,相當于隻計算了0.06%的權重,這樣計算效率就大幅度提高。

寫到這裡,其實還有很多東西沒說明白。但這個主題說大了,我暫時先擱置着,等研究透了再來修改增加。

上一篇: 單調棧
下一篇: Morris周遊

繼續閱讀