1. 程式人生 > >Word2Vec教程

Word2Vec教程

這個教程包含 訓練word2vec的 skip-gram 模型。通過這個教程,我希望跳過常規Word2Vec 的介紹和抽象理解, 而是去討論一些細節。特別是skip gram的網路結構。

模型

skipgram model 常常讓人驚訝於它的簡單結構。我認為基本沒啥彎路,或者需要複雜的模型解釋。

讓我們從高層語義開始。Word2Vec 使用了一個小trick,你可能在其他machine learning問題中見過。我們訓練一個簡單的網路來執行一個任務,但是最乎我們實際上並沒有用這個網路 來預測 test中的任務。而是,利用這個任務(目標)去學習網路中的權重W。我們將看到這些學出來的權重W就是我們所要的詞向量(word vectors)。

你可能會見到這個trick,的另一個地方是 auto-encoder。 auto-encoder 常常用來壓縮一個輸入,然後再把壓縮後的結果解壓回去。在訓練完成之後,你可以把解壓的網路扔掉,只使用壓縮的網路。這就是一個trick來獲得 無監督下 好的影象特徵。

假任務

那現在我們來討論一下我們所要建立網路的訓練任務(假任務)。然後我們再來討論為什麼這個任務可以間接地學習到想要的word vector。

給定句子中一個特定的詞(input word),隨機選它附近的一個詞。網路的目標是預測 我們選到這個附近詞的概率。

實際上這個“附近“,是一個視窗。一個常用的視窗大小為5,意味著 輸入詞前方的5個詞,後方的5個詞。

輸出的概率實際上關係到周圍的每一個詞。比如,如果你給出一個詞蘇聯(Soviet),那麼概率很高的輸出 應該是 聯合(Union)和俄羅斯(Russia)而不是西瓜或者袋鼠。

我們通過給網路 輸入我們在訓練文字中 找到的詞對,來訓練網路。下面這個例子展示了從“The quick brown fox jumps over the lazy dog.“ 中找到的一些詞對. 我使用了window size=2,而藍色標出的詞為輸入詞。
這裡寫圖片描述

網路將會去學這些pair出現的統計概率。舉個例子來說,網路會得到很多 (蘇聯,聯合)的概率多過(蘇聯,大腳怪)。所以當訓練完成的時候,當你輸入了蘇聯這個詞,聯合會得到比大腳怪更高的預測概率。

模型細節

首先,你不能把word變成一個string輸入給網路,所以我們要找另外一個形式。所以我們首先建立一個word的詞典,比如我們有10,000個不同的詞,那麼我們就建立一個10,000的詞典。

“ants“就可以變成一個10,000維的向量。這個向量每一維代表一個詞,我們把代表“ants“的那一維置為1,其他維置為0。

而網路的輸出也是一樣也是一個 10,000維的向量,代表每個詞預測的概率。

網路結構如下圖:
這裡寫圖片描述
網路中沒有啟用函式,輸出使用的是softmax。我們等下再回來討論。

當使用這個網路來訓練詞pair的時候,訓練的輸入是one-hot向量 訓練的目標輸出也是一個one-hot向量。但實際test這個網路的時候,輸出會是一個概率分佈。
(譯者按:打個比方,蘇聯只 和 聯合/俄羅斯 有交集,所以會收斂到 50%, 50% 的分佈。而不是 聯合就是100%。 當然test的時候也可以找最高概率的結果,那也是one-hot。)

隱層

我們需要學習300維的word vector。所以我們使用的隱層將是 10,000行 (詞典中詞的數量)和 300列的 (每個隱層神經元)。

300Google公佈出來在Google news 上訓練使用的維數,你可以通過這個連結([https://code.google.com/archive/p/word2vec/]) 下載(需翻牆)。這書300是個超參,可以按你的實際需求修改。

如果你從行的角度看,這個隱層的W實際上就是我們要的word vector。
這裡寫圖片描述

所以最終目標就是 讓網路學習 隱層中的權重。當我們訓練完成的時候,我們就可以把後半部分 output層給去掉了。

好,讓我們回到之前的模型的定義。

現在你可能在問自己,one-hot向量就是基本全是0,只有一個是1的向量,那麼這會產生什麼結果呢? 當你用 1×10,00010,000×300 的矩陣,他相當於只選擇了那一行‘1‘的。下面是一個簡單的例子:
這裡寫圖片描述

這意味著這個網路的隱層實際上就是像一個 查詢表(lookup table)一樣。輸出的300維就是這個詞的word vector。

輸出層

‘ant‘的1×300 的word vector 然後傳到了輸出層。輸出層是一個softmax 的分類器(譯者按:我認為不是regression,就是classification吧)主旨就是把每個輸出normal到0~1之間,並且這些輸出的和為1。

更具體的來說,每個word vector(1×300)將會乘一個W(300×10,000)再次對映到 10,000維,每一維代表臨近詞的概率。而這些概率做一個softmax的normal(就是圖中的exp 的函式,來歸一化)。 下面是一張說明圖。
這裡寫圖片描述

需要注意的是,神經網路彬不知道輸出詞對於輸入詞的位置。輸出詞常常在輸入詞的前面還是後面。舉個例子來說,雖然York 100%是跟在 New的後面,但是訓練出來的網路 用York 作為輸入,New 並不是100%的,還可能是其詞。

直覺

讓我們對這個網路做一個直覺上的感受。

如果兩個不同的詞有相同的上下文,那麼我們的模型會需要預測類似的輸出。那麼網路為了輸出類似的預測,他就會使這兩個不同詞的word vector儘可能相似。所以,如果兩個詞有相同的上下文,我們就可以得到比較接近的word vector。

那麼什麼詞有相同的上下文? 比如一些近義詞 smart 和intelligent 再比如 一些相關的詞 engine 和 transmission。

這也可以幫你處理一些形式變化。比如 ant 和ants 因為他們應該有類似的上下文。

下一步

你可能注意到 skip-gram 有很多權重需要學習。 舉個例子說,300維特徵,10,000的詞表, 3MB×2 的權重需要去學習,輸入輸出層各一個。
所以如果在一個更大的詞典上學習,word2vec的作者引入了一些trick 讓訓練更可行。這將會在下一章中介紹。(我也做了翻譯,歡迎大家繼續看~)