當前位置:
首頁 > 知識 > 一文詳解 Word2vec之Skip-Gram 模型

一文詳解 Word2vec之Skip-Gram 模型

AI 研習社按:這是一個關於 Skip-Gram 模型的系列教程,依次分為結構、訓練和實現三個部分,本文為第一部分:結構篇,後面兩個部分我們將陸續發布,敬請期待。原文作者天雨粟,原載於作者知乎專欄,雷鋒網 AI 研習社已獲授權。

這次的分享主要是對Word2Vec模型的兩篇英文文檔的翻譯、理解和整合,這兩篇英文文檔都是介紹Word2Vec中的Skip-Gram模型。下一篇專欄文章將會用TensorFlow實現基礎版Word2Vec的skip-gram模型,所以本篇文章先做一個理論鋪墊。

原文英文文檔請參考鏈接:

- Word2Vec Tutorial - The Skip-Gram Model

http://t.cn/Rc5RfJ2

http://t.cn/RoVEiUB

什麼是Word2Vec和Embeddings?

Word2Vec是從大量文本語料中以無監督的方式學習語義知識的一種模型,它被大量地用在自然語言處理(NLP)中。那麼它是如何幫助我們做自然語言處理呢?Word2Vec其實就是通過學習文本來用詞向量的方式表徵詞的語義信息,即通過一個嵌入空間使得語義上相似的單詞在該空間內距離很近。Embedding其實就是一個映射,將單詞從原先所屬的空間映射到新的多維空間中,也就是把原先詞所在空間嵌入到一個新的空間中去。

我們從直觀角度上來理解一下,cat這個單詞和kitten屬於語義上很相近的詞,而dog和kitten則不是那麼相近,iphone這個單詞和kitten的語義就差的更遠了。通過對辭彙表中單詞進行這種數值表示方式的學習(也就是將單詞轉換為詞向量),能夠讓我們基於這樣的數值進行向量化的操作從而得到一些有趣的結論。比如說,如果我們對詞向量kitten、cat以及dog執行這樣的操作:kitten - cat + dog,那麼最終得到的嵌入向量(embedded vector)將與puppy這個詞向量十分相近。

模型

Word2Vec模型中,主要有Skip-Gram和CBOW兩種模型,從直觀上理解,Skip-Gram是給定input word來預測上下文。而CBOW是給定上下文,來預測input word。本篇文章僅講解Skip-Gram模型。

Skip-Gram模型的基礎形式非常簡單,為了更清楚地解釋模型,我們先從最一般的基礎模型來看Word2Vec(下文中所有的Word2Vec都是指Skip-Gram模型)。

Word2Vec模型實際上分為了兩個部分,第一部分為建立模型,第二部分是通過模型獲取嵌入詞向量。Word2Vec的整個建模過程實際上與自編碼器(auto-encoder)的思想很相似,即先基於訓練數據構建一個神經網路,當這個模型訓練好以後,我們並不會用這個訓練好的模型處理新的任務,我們真正需要的是這個模型通過訓練數據所學得的參數,例如隱層的權重矩陣——後面我們將會看到這些權重在Word2Vec中實際上就是我們試圖去學習的「word vectors」。基於訓練數據建模的過程,我們給它一個名字叫「Fake Task」,意味著建模並不是我們最終的目的。

上面提到的這種方法實際上會在無監督特徵學習(unsupervised feature learning)中見到,最常見的就是自編碼器(auto-encoder):通過在隱層將輸入進行編碼壓縮,繼而在輸出層將數據解碼恢復初始狀態,訓練完成後,我們會將輸出層「砍掉」,僅保留隱層。

The Fake Task

我們在上面提到,訓練模型的真正目的是獲得模型基於訓練數據學得的隱層權重。為了得到這些權重,我們首先要構建一個完整的神經網路作為我們的「Fake Task」,後面再返回來看通過「Fake Task」我們如何間接地得到這些詞向量。

接下來我們來看看如何訓練我們的神經網路。假如我們有一個句子「The dog barked at the mailman」

首先我們選句子中間的一個詞作為我們的輸入詞,例如我們選取「dog」作為input word;

有了input word以後,我們再定義一個叫做skip_window的參數,它代表著我們從當前input word的一側(左邊或右邊)選取詞的數量。如果我們設置skip_window=2,那麼我們最終獲得窗口中的詞(包括input word在內)就是[ The , dog , barked , at ]。skip_window=2代表著選取左input word左側2個詞和右側2個詞進入我們的窗口,所以整個窗口大小span=2x2=4。另一個參數叫num_skips,它代表著我們從整個窗口中選取多少個不同的詞作為我們的output word,當skip_window=2,num_skips=2時,我們將會得到兩組(input word, output word)形式的訓練數據,即( dog , barked )( dog , the )

神經網路基於這些訓練數據將會輸出一個概率分布,這個概率代表著我們的詞典中的每個詞是output word的可能性。這句話有點繞,我們來看個栗子。第二步中我們在設置skip_window和num_skips=2的情況下獲得了兩組訓練數據。假如我們先拿一組數據( dog , barked )來訓練神經網路,那麼模型通過學習這個訓練樣本,會告訴我們辭彙表中每個單詞是「barked」的概率大小。

模型的輸出概率代表著到我們詞典中每個詞有多大可能性跟input word同時出現。舉個栗子,如果我們向神經網路模型中輸入一個單詞「Soviet「,那麼最終模型的輸出概率中,像「Union」, 」Russia「這種相關詞的概率將遠高於像」watermelon「,」kangaroo「非相關詞的概率。因為」Union「,」Russia「在文本中更大可能在」Soviet「的窗口中出現。我們將通過給神經網路輸入文本中成對的單詞來訓練它完成上面所說的概率計算。下面的圖中給出了一些我們的訓練樣本的例子。我們選定句子「The quick brown fox jumps over lazy dog」,設定我們的窗口大小為2(window_size=2),也就是說我們僅選輸入詞前後各兩個詞和輸入詞進行組合。下圖中,藍色代表input word,方框內代表位於窗口內的單詞。

我們的模型將會從每對單詞出現的次數中習得統計結果。例如,我們的神經網路可能會得到更多類似(「Soviet「,」Union「)這樣的訓練樣本對,而對於(」Soviet「,」Sasquatch「)這樣的組合卻看到的很少。因此,當我們的模型完成訓練後,給定一個單詞」Soviet「作為輸入,輸出的結果中」Union「或者」Russia「要比」Sasquatch「被賦予更高的概率。

模型細節

我們如何來表示這些單詞呢?首先,我們都知道神經網路只能接受數值輸入,我們不可能把一個單詞字元串作為輸入,因此我們得想個辦法來表示這些單詞。最常用的辦法就是基於訓練文檔來構建我們自己的辭彙表(vocabulary)再對單詞進行one-hot編碼。

假設從我們的訓練文檔中抽取出10000個唯一不重複的單片語成辭彙表。我們對這10000個單詞進行one-hot編碼,得到的每個單詞都是一個10000維的向量,向量每個維度的值只有0或者1,假如單詞ants在辭彙表中的出現位置為第3個,那麼ants的向量就是一個第三維度取值為1,其他維都為0的10000維的向量(ants=[0, 0, 1, 0, ..., 0])。

還是上面的例子,「The dog barked at the mailman」,那麼我們基於這個句子,可以構建一個大小為5的辭彙表(忽略大小寫和標點符號):("the", "dog", "barked", "at", "mailman"),我們對這個辭彙表的單詞進行編號0-4。那麼」dog「就可以被表示為一個5維向量[0, 1, 0, 0, 0]。

模型的輸入如果為一個10000維的向量,那麼輸出也是一個10000維度(辭彙表的大小)的向量,它包含了10000個概率,每一個概率代表著當前詞是輸入樣本中output word的概率大小。

下圖是我們神經網路的結構:

隱層沒有使用任何激活函數,但是輸出層使用了sotfmax。

我們基於成對的單詞來對神經網路進行訓練,訓練樣本是 ( input word, output word ) 這樣的單詞對,input word和output word都是one-hot編碼的向量。最終模型的輸出是一個概率分布。

隱層

說完單詞的編碼和訓練樣本的選取,我們來看下我們的隱層。如果我們現在想用300個特徵來表示一個單詞(即每個詞可以被表示為300維的向量)。那麼隱層的權重矩陣應該為10000行,300列(隱層有300個結點)。

Google在最新發布的基於Google news數據集訓練的模型中使用的就是300個特徵的詞向量。詞向量的維度是一個可以調節的超參數(在Python的gensim包中封裝的Word2Vec介面默認的詞向量大小為100, window_size為5)。

看下面的圖片,左右兩張圖分別從不同角度代表了輸入層-隱層的權重矩陣。左圖中每一列代表一個10000維的詞向量和隱層單個神經元連接的權重向量。從右邊的圖來看,每一行實際上代表了每個單詞的詞向量。

所以我們最終的目標就是學習這個隱層的權重矩陣。

我們現在回來接著通過模型的定義來訓練我們的這個模型。

上面我們提到,input word和output word都會被我們進行one-hot編碼。仔細想一下,我們的輸入被one-hot編碼以後大多數維度上都是0(實際上僅有一個位置為1),所以這個向量相當稀疏,那麼會造成什麼結果呢。如果我們將一個1 x 10000的向量和10000 x 300的矩陣相乘,它會消耗相當大的計算資源,為了高效計算,它僅僅會選擇矩陣中對應的向量中維度值為1的索引行(這句話很繞),看圖就明白。

我們來看一下上圖中的矩陣運算,左邊分別是1 x 5和5 x 3的矩陣,結果應該是1 x 3的矩陣,按照矩陣乘法的規則,結果的第一行第一列元素為0 x 17 + 0 x 23 + 0 x 4 + 1 x 10 + 0 x 11 = 10,同理可得其餘兩個元素為12,19。如果10000個維度的矩陣採用這樣的計算方式是十分低效的。

為了有效地進行計算,這種稀疏狀態下不會進行矩陣乘法計算,可以看到矩陣的計算的結果實際上是矩陣對應的向量中值為1的索引,上面的例子中,左邊向量中取值為1的對應維度為3(下標從0開始),那麼計算結果就是矩陣的第3行(下標從0開始)—— [10, 12, 19],這樣模型中的隱層權重矩陣便成了一個」查找表「(lookup table),進行矩陣計算時,直接去查輸入向量中取值為1的維度下對應的那些權重值。隱層的輸出就是每個輸入單詞的「嵌入詞向量」。

輸出層

經過神經網路隱層的計算,ants這個詞會從一個1 x 10000的向量變成1 x 300的向量,再被輸入到輸出層。輸出層是一個softmax回歸分類器,它的每個結點將會輸出一個0-1之間的值(概率),這些所有輸出層神經元結點的概率之和為1。

下面是一個例子,訓練樣本為 (input word: 「ants」, output word: 「car」) 的計算示意圖。

直覺上的理解

下面我們將通過直覺來進行一些思考。

如果兩個不同的單詞有著非常相似的「上下文」(也就是窗口單詞很相似,比如「Kitty climbed the tree」和「Cat climbed the tree」),那麼通過我們的模型訓練,這兩個單詞的嵌入向量將非常相似。

那麼兩個單詞擁有相似的「上下文」到底是什麼含義呢?比如對於同義詞「intelligent」和「smart」,我們覺得這兩個單詞應該擁有相同的「上下文」。而例如」engine「和」transmission「這樣相關的詞語,可能也擁有著相似的上下文。

實際上,這種方法實際上也可以幫助你進行詞幹化(stemming),例如,神經網路對」ant「和」ants」兩個單詞會習得相似的詞向量。

詞幹化(stemming)就是去除詞綴得到詞根的過程。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯物 的精彩文章:

你聽說過英偉達深度學習學院 DLI 嗎?
Yann LeCun 最新研究成果:可以幫助 GAN 使用離散數據的 ARAE
手把手教你用 PyTorch 辨別自然語言
一文教你如何用神經網路識別驗證碼!
谷歌開源物體檢測系統 API

TAG:唯物 |

您可能感興趣

Classical CNN models:LeNet-5 模型結構詳解
Spring Security 5.0 的 DelegatingPasswordEncoder 詳解
Spring MVC之DispatcherServlet初始化詳解
Lightroom Classic CC v7.3更新詳解
OpenCV VideoCapture.get()參數詳解
Spark2.1.0事件匯流排分析——LiveListenerBus詳解
Paint API之 Xfermode與PorterDuff詳解
詳解Pony最新妝容-Flower that booms at night
蘋果MacBook Air/Mac Mini/iPad Pro新品詳解
乾貨:詳解 Tomcat 配置文件 server.xml
SpringMVC + security模塊 框架整合詳解
FPGA與ASIC的完美結合,Achronix Speedster 7t系列詳解
Scrapy詳解之中間件(Middleware)
乾貨詳解 Linux phantomJs install course
驍龍855移動平台最佳搭檔 高通Snapdragon Elite Gaming遊戲優化詳解
SpringBoot | 第三章:springboot 配置詳解
iOS Airplay Screen Mirroring 同屏技術詳解
谷歌發文詳解Pixel 3中的拍照黑科技——Super Res Zoom
聚合查詢慢——詳解Global Ordinals與High Cardinality
MyBatis 配置 typeHandlers 詳解