天天看點

秒懂詞向量Word2vec的本質

秒懂詞向量Word2vec的本質

1. word2vec參考資料總結

(以下都是我踩過的坑,建議先跳過本節,閱讀正文部分,讀完全文回頭再來看)

先大概說下我深挖 word2vec 的過程:先是按照慣例,看了 mikolov 關于 word2vec 的兩篇原始論文,然而發現看完依然是一頭霧水,似懂非懂,主要原因是這兩篇文章省略了太多理論背景和推導細節;然後翻出 bengio 03年那篇jmlr和 ronan 11年那篇jmlr,看完對語言模型、用cnn處理nlp任務有所了解,但依然無法完全吃透 word2vec;這時候我開始大量閱讀中英文部落格,其中 北漂浪子 的一篇閱讀量很多的部落格吸引了我的注意,裡面非常系統地講解了 word2vec 的前因後果,最難得的是深入剖析了代碼的實作細節,看完之後細節方面了解了很多,不過還是覺得有些迷霧;終于,我在 quora 上看到有人推薦 xin rong 的那篇英文paper,看完之後隻覺醍醐灌頂,酣暢淋漓,相見恨晚,成為我首推的 word2vec 參考資料。下面我将詳細列出我閱讀過的所有 word2vec 相關的參考資料,并給出評價。

mikolov 兩篇原論文:

『distributed representations of sentences and documents』

在前人基礎上提出更精簡的語言模型(language model)架構并用于生成詞向量,這個架構就是 word2vec

『efficient estimation of word representations in vector space』

專門講訓練 word2vec 中的兩個trick:hierarchical softmax 和 negative sampling

優點:word2vec 開山之作,兩篇論文均值得一讀

缺點:隻見樹木,不見森林和樹葉,讀完不得要義。這裡『森林』指 word2vec 模型的理論基礎——即 以神經網絡形式表示的語言模型,『樹葉』指具體的神經網絡形式、理論推導、hierarchical softmax 的實作細節等等

北漂浪子的部落格:『深度學習word2vec 筆記之基礎篇』

優點:非常系統,結合源碼剖析,語言平實易懂

缺點:太啰嗦,有點抓不住精髓

yoav goldberg 的論文:『word2vec explained- deriving mikolov et al.’s negative-sampling word-embedding method』

優點:對 negative-sampling 的公式推導非常完備

缺點:不夠全面,而且都是公式,沒有圖示,略顯幹枯

xin rong 的論文:『word2vec parameter learning explained』:

!重點推薦!

理論完備由淺入深非常好懂,且直擊要害,既有 high-level 的 intuition 的解釋,也有細節的推導過程

一定要看這篇paper!一定要看這篇paper!一定要看這篇paper!

來斯惟的博士論文『基于神經網絡的詞和文檔語義向量表示方法研究』以及他的部落格(網名:licstar)

可以作為更深入全面的擴充閱讀,這裡不僅僅有 word2vec,而是把詞嵌入的所有主流方法通通梳理了一遍

幾位大牛在知乎的回答:『word2vec 相比之前的 word embedding 方法好在什麼地方?』

劉知遠、邱錫鵬、李韶華等知名學者從不同角度發表對 word2vec 的看法,非常值得一看

sebastian 的部落格:『on word embeddings - part 2: approximating the softmax』

詳細講解了 softmax 的近似方法,word2vec 的 hierarchical softmax 隻是其中一種

2. 正文

你會在本文看到:

提綱挈領地講解 word2vec 的理論精髓

學會用gensim訓練詞向量,尋找相似詞,并對模型調優

你不會在本文看到

神經網絡訓練過程的推導

hierarchical softmax/negative sampling 等 trick 的理論和實作細節

2.1. 什麼是 word2vec?

在聊 word2vec 之前,先聊聊 nlp (自然語言處理)。nlp 裡面,最細粒度的是詞語,詞語組成句子,句子再組成段落、篇章、文檔。是以處理 nlp 的問題,首先就要拿詞語開刀。

舉個簡單例子,判斷一個詞的詞性,是動詞還是名詞。用機器學習的思路,我們有一系列樣本(x,y),這裡 x 是詞語,y 是它們的詞性,我們要建構 f(x)->y 的映射,但這裡的數學模型 f(比如神經網絡、svm)隻接受數值型輸入,而 nlp 裡的詞語,是人類的抽象總結,是符号形式的(比如中文、英文、拉丁文等等),是以需要把他們轉換成數值形式,或者說——嵌入到一個數學空間裡,這種嵌入方式,就叫詞嵌入(word embedding),而 word2vec,就是詞嵌入( word embedding) 的一種

我在前作『都是套路: 從上帝視角看透時間序列和資料挖掘』提到,大部分的機器學習模型,都可以歸結為:

f(x)->y

在 nlp 中,把 x 看做一個句子裡的一個詞語,y 是這個詞語的上下文詞語,那麼這裡的 f,便是 nlp 中經常出現的『主題模型』,這個模型的目的,就是判斷 (x,y) 這個樣本,是否符合自然語言的法則,更通俗點說就是:詞語x和詞語y放在一起,是不是人話。

word2vec 正是來源于這個思想,但它的最終目的,不是要把 f 訓練得多麼完美,而是隻關心模型訓練完後的副産物——模型參數(這裡特指神經網絡的權重),并将這些參數,作為輸入 x 的某種向量化的表示,這個向量便叫做——詞向量(這裡看不懂沒關系,下一節我們詳細剖析)。

我們來看個例子,如何用 word2vec 尋找相似詞:

對于一句話:『她們 誇 吳彥祖 帥 到 沒朋友』,如果輸入 x 是『吳彥祖』,那麼 y 可以是『她們』、『誇』、『帥』、『沒朋友』這些詞

現有另一句話:『她們 誇 我 帥 到 沒朋友』,如果輸入 x 是『我』,那麼不難發現,這裡的上下文 y 跟上面一句話一樣

進而 f(吳彥祖) = f(我) = y,是以大資料告訴我們:我 = 吳彥祖(完美的結論)

2.2. skip-gram 和 cbow 模型

上面我們提到了語言模型

如果是用一個詞語作為輸入,來預測它周圍的上下文,那這個模型叫做『skip-gram 模型』

而如果是拿一個詞語的上下文作為輸入,來預測這個詞語本身,則是 『cbow 模型』

2.2.1 skip-gram 和 cbow 的簡單情形

我們先來看個最簡單的例子。上面說到, y 是 x 的上下文,是以 y 隻取上下文裡一個詞語的時候,語言模型就變成:

用目前詞 x 預測它的下一個詞 y

但如上面所說,一般的數學模型隻接受數值型輸入,這裡的 x 該怎麼表示呢? 顯然不能用 word2vec,因為這是我們訓練完模型的産物,現在我們想要的是 x 的一個原始輸入形式。

答案是:one-hot encoder

所謂 one-hot encoder,其思想跟特征工程裡處理類别變量的 one-hot 一樣(參考我的前作『資料挖掘比賽通用架構』、『深挖one-hot和dummy背後的玄機』)。本質上是用一個隻含一個 1、其他都是 0 的向量來唯一表示詞語。

我舉個例子,假設全世界所有的詞語總共有 v 個,這 v 個詞語有自己的先後順序,假設『吳彥祖』這個詞是第1個詞,『我』這個單詞是第2個詞,那麼『吳彥祖』就可以表示為一個 v 維全零向量、把第1個位置的0變成1,而『我』同樣表示為 v 維全零向量、把第2個位置的0變成1。這樣,每個詞語都可以找到屬于自己的唯一表示。

ok,那我們接下來就可以看看 skip-gram 的網絡結構了,x 就是上面提到的 one-hot encoder 形式的輸入,y 是在這 v 個詞上輸出的機率,我們希望跟真實的 y 的 one-hot encoder 一樣。

秒懂詞向量Word2vec的本質

首先我們要訓練這個神經網絡,用反向傳播算法,本質上是鍊式求導,在此不展開說明了,隻給出一個直覺的圖示(不用看懂,這不是本文重點,但這個圖畫的真的很好,出自我司謝博士之手,特别感謝)

秒懂詞向量Word2vec的本質

當模型訓練完後,最後得到的其實是神經網絡的權重,比如現在輸入一個 x 的 one-hot encoder: [1,0,0,…,0],對應剛說的那個詞語『吳彥祖』,則在輸入層到隐含層的權重裡,隻有對應 1 這個位置的權重被激活,這些權重的個數,跟隐含層節點數是一緻的,進而這些權重組成一個向量 vx 來表示x,而因為每個詞語的 one-hot encoder 裡面 1 的位置是不同的,是以,這個向量 vx 就可以用來唯一表示 x。

注意:上面這段話說的就是 word2vec 的精髓!!

此外,我們剛說了,輸出 y 也是用 v 個節點表示的,對應v個詞語,是以其實,我們把輸出節點置成 [1,0,0,…,0],它也能表示『吳彥祖』這個單詞,但是激活的是隐含層到輸出層的權重,這些權重的個數,跟隐含層一樣,也可以組成一個向量 vy,跟上面提到的 vx 次元一樣,并且可以看做是詞語『吳彥祖』的另一種詞向量。而這兩種詞向量 vx 和 vy,正是 mikolov 在論文裡所提到的,『輸入向量』和『輸出向量』,一般我們用『輸入向量』。

需要提到一點的是,這個詞向量的次元(與隐含層節點數一緻)一般情況下要遠遠小于詞語總數 v 的大小,是以 word2vec 本質上是一種降維操作——把詞語從 one-hot encoder 形式的表示降維到 word2vec 形式的表示。

2.2.2. skip-gram 更一般的情形

上面讨論的是最簡單情形,即 y 隻有一個詞,當 y 有多個詞時,網絡結構如下:

秒懂詞向量Word2vec的本質

可以看成是 單個x->單個y 模型的并聯,cost function 是單個 cost function 的累加(取log之後)

如果你想深入探究這些模型是如何并聯、 cost function 的形式怎樣,不妨仔細閱讀參考資料4. 在此我們不展開。

2.2.3 cbow 更一般的情形

跟 skip-gram 相似,隻不過:

skip-gram 是預測一個詞的上下文,而 cbow 是用上下文預測這個詞

網絡結構如下

秒懂詞向量Word2vec的本質

更 skip-gram 的模型并聯不同,這裡是輸入變成了多個單詞,是以要對輸入處理下(一般是求和然後平均),輸出的 cost function 不變,在此依然不展開,建議你閱讀參考資料4.

2.3. word2vec 的訓練trick

相信很多初次踩坑的同學,會跟我一樣陷入 mikolov 那篇論文(參考資料1.)裡提到的 hierarchical softmax 和 negative sampling 裡不能自拔,但其實,它們并不是 word2vec 的精髓,隻是它的訓練技巧,但也不是它獨有的訓練技巧。 hierarchical softmax 隻是 softmax 的一種近似形式(詳見參考資料7.),而 negative sampling 也是從其他方法借鑒而來。

為什麼要用訓練技巧呢? 如我們剛提到的,word2vec 本質上是一個模型,它的輸出節點數是 v 個,對應了 v 個詞語,本質上是一個多分類問題,但實際當中,詞語的個數非常非常多,會給計算造成很大困難,是以需要用技巧來加速訓練。

這裡我總結了一下這兩個 trick 的本質,有助于大家更好地了解,在此也不做過多展開,有興趣的同學可以深入閱讀參考資料1.~7.

hierarchical softmax

本質是把 n 分類問題變成 log(n)次二分類

negative sampling

本質是預測總體類别的一個子集

2.4. 擴充

很多時候,當我們面對林林總總的模型、方法時,我們總希望總結出一些本質的、共性的東西,以建構我們的知識體系,比如我在前作『分類和回歸的本質』裡,原創性地梳理了分類模型和回歸模型的本質聯系,比如在詞嵌入領域,除了 word2vec之外,還有基于共現矩陣分解的 glove 等等詞嵌入方法。

深入進去我們會發現,神經網絡形式表示的模型(如 word2vec),跟共現矩陣分解模型(如 glove),有理論上的相通性,這裡我推薦大家閱讀參考資料5. ——來斯惟博士在它的博士論文附錄部分,證明了 skip-gram 模型和 glove 的 cost fucntion 本質上是一樣的。是不是一個很有意思的結論? 是以在實際應用當中,這兩者的差别并不算很大,尤其在很多 high-level 的 nlp 任務(如句子表示、命名體識别、文檔表示)當中,經常把詞向量作為原始輸入,而到了 high-level 層面,差别就更小了。

鑒于詞語是 nlp 裡最細粒度的表達,是以詞向量的應用很廣泛,既可以執行詞語層面的任務,也可以作為很多模型的輸入,執行 high-levl 如句子、文檔層面的任務,包括但不限于:

計算相似度

尋找相似詞

資訊檢索

作為 svm/lstm 等模型的輸入

中文分詞

命名體識别

句子表示

情感分析

文檔表示

文檔主題判别

原文釋出時間為:2017-04-13

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号

繼續閱讀