深度學習word2vec筆記之基礎篇

garfielder007發表於2016-05-08
宣告:

1)該博文是多位博主以及多位文件資料的主人所無私奉獻的論文資料整理的。具體引用的資料請看參考文獻。具體的版本宣告也參考原文獻

2)本文僅供學術交流,非商用。所以每一部分具體的參考資料並沒有詳細對應,更有些部分本來就是直接從其他部落格複製過來的。如果某部分不小心侵犯了大家的利益,還望海涵,並聯系老衲刪除或修改,直到相關人士滿意為止。

3)本人才疏學淺,整理總結的時候難免出錯,還望各位前輩不吝指正,謝謝。

4)閱讀本文需要機器學習、語言模型等等基礎(如果沒有也沒關係了,沒有就看看,當做跟同學們吹牛的本錢)。

5)本人對語言模型也是新人,中間有些結論未必是正確的,各位如有發現,請指出,本人會盡量改正,避免誤導讀者。
6)此屬於第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。請直接回帖,本人來想辦法處理。

7)本人手上有word版的和pdf版的,已上傳到csdn,下載url:http://download.csdn.net/detail/mytestmy/8565955,或者http://download.csdn.net/detail/mytestmy/8565959,資源分1分,評論後據說可以返還的,就有勞各位幫忙攢點分吧。如果有必要可以回覆或者發郵件到郵箱beiliude@163.com,將按各位需求回覆。

一.前言

伴隨著深度學習的大紅大紫,只要是在自己的成果裡打上deep learning字樣,總會有人去看。深度學習可以稱為當今機器學習領域的當之無愧的巨星,也特別得到工業界的青睞。

在各種大舉深度學習大旗的公司中,Google公司無疑是旗舉得最高的,口號喊得最響亮的那一個。2013年末,Google釋出的word2vec工具引起了一幫人的熱捧,大家幾乎都認為它是深度學習在自然語言領域的一項了不起的應用,各種歡呼“深度學習在自然語言領域開始發力了”。

網際網路界很多公司也開始跟進,使用word2vec產出了不少成果。身為一個網際網路民工,有必要對這種炙手可熱的技術進行一定程度的理解。

好在word2vec也算是比較簡單的,只是一個簡單三層神經網路。在瀏覽了多位大牛的部落格,隨筆和筆記後,整理成自己的博文,或者說抄出來自己的博文。

二.背景知識

2.1詞向量

自然語言處理(NLP)相關任務中,要將自然語言交給機器學習中的演算法來處理,通常需要首先將語言數學化,因為機器不是人,機器只認數學符號。向量是人把自然界的東西抽象出來交給機器處理的東西,基本上可以說向量是人對機器輸入的主要方式了。

詞向量就是用來將語言中的詞進行數學化的一種方式,顧名思義,詞向量就是把一個詞表示成一個向量。

主要有兩種表示方式,下面分別介紹,主要參考了@皮果提在知乎上的問答,也就是參考文獻【2】。

2.1.1 One-Hot Representation

 

一種最簡單的詞向量方式是 one-hotrepresentation,就是用一個很長的向量來表示一個詞,向量的長度為詞典的大小,向量的分量只有一個 1,其他全為 0, 1 的位置對應該詞在詞典中的位置。舉個例子,

  “話筒”表示為 [0 0 0 1 00 0 0 0 0 0 0 0 0 0 0 ...]

  “麥克”表示為 [0 0 0 0 00 0 0 1 0 0 0 0 0 0 0 ...]

每個詞都是茫茫 0 海中的一個 1。

這種 One-hotRepresentation 如果採用稀疏方式儲存,會是非常的簡潔:也就是給每個詞分配一個數字 ID。比如剛才的例子中,話筒記為 3,麥克記為 8(假設從 0 開始記)。如果要程式設計實現的話,用 Hash 表給每個詞分配一個編號就可以了。這麼簡潔的表示方法配合上最大熵、SVM、CRF 等等演算法已經很好地完成了 NLP 領域的各種主流任務。

但這種詞表示有兩個缺點:(1)容易受維數災難的困擾,尤其是將其用於 Deep Learning 的一些演算法時;(2)不能很好地刻畫詞與詞之間的相似性(術語好像叫做“詞彙鴻溝”):任意兩個詞之間都是孤立的。光從這兩個向量中看不出兩個詞是否有關係,哪怕是話筒和麥克這樣的同義詞也不能倖免於難。

所以會尋求發展,用另外的方式表示,就是下面這種。

2.1.2 Distributed Representation

另一種就是DistributedRepresentation 這種表示,它最早是 Hinton 於 1986 年提出的,可以克服 one-hot representation 的缺點。其基本想法是直接用一個普通的向量表示一個詞,這種向量一般長成這個樣子:[0.792, −0.177, −0.107, 0.109, −0.542, ...],也就是普通的向量表示形式。維度以 50 維和 100 維比較常見。

當然一個詞怎麼表示成這麼樣的一個向量是要經過一番訓練的,訓練方法較多,word2vec是其中一種,在後面會提到,這裡先說它的意義。還要注意的是每個詞在不同的語料庫和不同的訓練方法下,得到的詞向量可能是不一樣的。

詞向量一般維數不高,很少有人閒著沒事訓練的時候定義一個10000維以上的維數,所以用起來維數災難的機會現對於one-hot representation表示就大大減少了。

由於是用向量表示,而且用較好的訓練演算法得到的詞向量的向量一般是有空間上的意義的,也就是說,將所有這些向量放在一起形成一個詞向量空間,而每一向量則為該空間中的一個點,在這個空間上的詞向量之間的距離度量也可以表示對應的兩個詞之間的“距離”。所謂兩個詞之間的“距離”,就是這兩個詞之間的語法,語義之間的相似性。

一個比較爽的應用方法是,得到詞向量後,假如對於某個詞A,想找出這個詞最相似的詞,這個場景對人來說都不輕鬆,畢竟比較主觀,但是對於建立好詞向量後的情況,對計算機來說,只要拿這個詞的詞向量跟其他詞的詞向量一一計算歐式距離或者cos距離,得到距離最小的那個詞,就是它最相似的。

這樣的特性使得詞向量很有意義,自然就會吸引比較多的人去研究,前有Bengio發表在JMLR上的論文《A Neural Probabilistic Language Model》,又有Hinton的層次化Log-Bilinear模型,還有google的TomasMikolov 團隊搞的word2vec,等等。

詞向量在機器翻譯領域的一個應用,就是google的TomasMikolov 團隊開發了一種詞典和術語表的自動生成技術,該技術通過向量空間,把一種語言轉變成另一種語言,實驗中對英語和西班牙語間的翻譯準確率高達90%。

介紹演算法工作原理的時候舉了一個例子:考慮英語和西班牙語兩種語言,通過訓練分別得到它們對應的詞向量空間 E 和 S。從英語中取出五個詞 one,two,three,four,five,設其在 E 中對應的詞向量分別為 v1,v2,v3,v4,v5,為方便作圖,利用主成分分析(PCA)降維,得到相應的二維向量 u1,u2,u3,u4,u5,在二維平面上將這五個點描出來,如下圖左圖所示。類似地,在西班牙語中取出(與 one,two,three,four,five 對應的) uno,dos,tres,cuatro,cinco,設其在 S 中對應的詞向量分別為 s1,s2,s3,s4,s5,用 PCA 降維後的二維向量分別為 t1,t2,t3,t4,t5,將它們在二維平面上描出來(可能還需作適當的旋轉),如下圖右圖所示:


觀察左、右兩幅圖,容易發現:五個詞在兩個向量空間中的相對位置差不多,這說明兩種不同語言對應向量空間的結構之間具有相似性,從而進一步說明了在詞向量空間中利用距離刻畫詞之間相似性的合理性。


2.2語言模型

2.2.1基本概念

語言模型其實就是看一句話是不是正常人說出來的。這玩意很有用,比如機器翻譯、語音識別得到若干候選之後,可以利用語言模型挑一個儘量靠譜的結果。在 NLP 的其它任務裡也都能用到。

語言模型形式化的描述就是給定一個T個詞的字串s,看它是自然語言的概率P(w1,w2,…,wt)。w1 到 wT 依次表示這句話中的各個詞。有個很簡單的推論是:

  {\rm{p}}\left( s \right) = {\rm{p}}\left( {{w_1},{w_2}, \cdots {w_T}} \right)  = {\rm{p}}\left( {{w_1}} \right){\rm{p(}}{w_2}{\rm{|}}{w_1}){\rm{p}}({w_3}|{w_1},{w_2}) \cdots {\rm{p}}({w_t}|{w_1},{w_2}, \cdots {w_{T - 1}})              (1)

上面那個概率表示的意義是:第一個詞確定後,看後面的詞在前面的詞出現的情況下出現的概率。如一句話“大家喜歡吃蘋果”,總共四個詞“大家”,“喜歡”,“吃”,“蘋果”,怎麼分詞現在不討論,總之詞已經分好,就這四個。那麼這句話是一個自然語言的概率是:

P(大家,喜歡,吃,蘋果)=p(大家)p(喜歡|大家)p(吃|大家,喜歡)p(蘋果|大家,喜歡,吃)

p(大家)表示“大家”這個詞在語料庫裡面出現的概率;

p(喜歡|大家)表示“喜歡”這個詞出現在“大家”後面的概率;

p(吃|大家,喜歡)表示“吃”這個詞出現在“大家喜歡”後面的概率;

p(蘋果|大家,喜歡,吃)表示“蘋果”這個詞出現在“大家喜歡吃”後面的概率。

把這些概率連乘起來,得到的就是這句話平時出現的概率。

如果這個概率特別低,說明這句話不常出現,那麼就不算是一句自然語言,因為在語料庫裡面很少出現。如果出現的概率高,就說明是一句自然語言。

看到了上面的計算,看有多麻煩:只有四個詞的一句話,需要計算的是p(大家),p(喜歡|大家),p(吃|大家,喜歡),p(蘋果|大家,喜歡,吃)這四個概率,這四個概率還要預先計算好,考慮詞的數量,成千上萬個,再考慮組合數,p(吃|大家,喜歡)這個有“大家”、“喜歡”和“吃”的組合,總共會上億種情況吧;再考慮p(蘋果|大家,喜歡,吃)這個概率,總共也會超過萬億種。

從上面的情況看來,計算起來是非常麻煩的,一般都用偷懶的方式。

為了表示簡單,上面的公式(1)用下面的方式表示

{\rm{p}}\left( {\rm{s}} \right) = {\rm{p}}\left( {{w_1},{w_2}, \cdots {w_T}} \right) =  \prod \limits_{i = 1}^T p({w_i}|Contex{t_i})

其中,如果Contexti是空的話,就是它自己p(w),另外如“吃”的Context就是“大家”、“喜歡”,其餘的對號入座。

符號搞清楚了,就看怎麼偷懶了。

2.2.2 N-gram模型

接下來說怎麼計算p({w_i}|Contex{t_i}),上面看的是跟據這句話前面的所有詞來計算,那麼就得計算很多了,比如就得把語料庫裡面p(蘋果|大家,喜歡,吃)這種情況全部統計一遍,那麼為了計算這句話的概率,就上面那個例子,都得掃描四次語料庫。這樣一句話有多少個詞就得掃描多少趟,語料庫一般都比較大,越大的語料庫越能提供準確的判斷。這樣的計算速度在真正使用的時候是萬萬不可接受的,線上掃描一篇文章是不是一推亂七八糟的沒有序列的文字都得掃描很久,這樣的應用根本沒人考慮。

最好的辦法就是直接把所有的p({w_i}|Contex{t_i})提前算好了,那麼根據排列組上面的來算,對於一個只有四個詞的語料庫,總共就有4!+3!+2!+1!個情況要計算,那就是24個情況要計算;換成1000個詞的語料庫,就是\sum \limits_{i = 1}^{1000} i!個情況需要統計,對於計算機來說,計算這些東西簡直是開玩笑。

這就誕生了很多偷懶的方法,N-gram模型是其中之一了。N-gram什麼情況呢?上面的context都是這句話中這個詞前面的所有詞作為條件的概率,N-gram就是隻管這個詞前面的n-1個詞,加上它自己,總共n個詞,計算p({w_i}|Contex{t_i})只考慮用這n個詞來算,換成數學的公式來表示,就是

{\rm{p}}\left( {{w_i}{\rm{|}}Contex{t_i}} \right) = {\rm{p}}({w_i}|{w_{i - n + 1}},{w_{i - n + 2}}, \cdots ,{w_{i - 1}})

這裡如果n取得比較小的話,就比較省事了,當然也要看到n取得太小,會特別影響效果的,有可能計算出來的那個概率很不準。怎麼平衡這個效果和計算就是大牛們的事情了,據大牛們的核算,n取2效果都還湊合,n取3就相當不錯了,n取4就頂不住了。看下面的一些資料,假設詞表中詞的個數 |V| = 20,000 詞,那麼有下面的一些資料。


照圖中的資料看去,取n=3是目前計算能力的上限了。在實踐中用的最多的就是bigram和trigram了,而且效果也基本夠了。

N-gram模型也會有寫問題,總結如下:

1、n不能取太大,取大了語料庫經常不足,所以基本是用降級的方法

2、無法建模出詞之間的相似度,就是有兩個詞經常出現在同一個context後面,但是模型是沒法體現這個相似性的。

3、有些n元組(n個詞的組合,跟順序有關的)在語料庫裡面沒有出現過,對應出來的條件概率就是0,這樣一整句話的概率都是0了,這是不對的,解決的方法主要是兩種:平滑法(基本上是分子分母都加一個數)和回退法(利用n-1的元組的概率去代替n元組的概率)

2.2.3N-pos模型

當然學術是無止境的,有些大牛覺得這還不行,因為第i個詞很多情況下是條件依賴於它前面的詞的語法功能的,所以又弄出來一個n-pos模型,n-pos模型也是用來計算的,但是有所改變,先對詞按照詞性(Part-of-Speech,POS)進行了分類,具體的數學表達是

{\rm{p}}\left( {{w_i}{\rm{|}}Contex{t_i}} \right) ={\rm{p}}\left( {{w_i}|{\rm{c}}\left( {{w_{i - n + 1}}} \right),{\rm{c}}\left( {{w_{i - n + 2}}} \right), \cdots ,{\rm{c}}\left( {{w_{i - 1}}} \right)} \right)

其中c是類別對映函式,功能是把V個詞對映到K個類別(1=<K<=V)。這樣搞的話,原來的V個詞本來有{V^n}種n元組減少到了{\rm{V}} \times {{\rm{K}}^{n - 1}}種。

其他的模型還很多,不一一介紹了。

2.2.4模型的問題與目標

如果是原始的直接統計語料庫的語言模型,那是沒有引數的,所有的概率直接統計就得到了。但現實往往會帶一些引數,所有語言模型也能使用極大似然作為目標函式來建立模型。下面就討論這個。

假設語料庫是一個由T個片語成的詞序列s(這裡可以保留疑問的,因為從很多資料看來是不管什麼多少篇文件,也不管句子什麼的,整個語料庫就是一長串詞連起來的,或許可以根據情況拆成句子什麼的,這裡就往簡單裡說),其中有V個詞,則可以構建下面的極大似然函式

{\rm{L}} =  \prod \limits_{i = 1}^T p\left( {{w_i}{\rm{|}}Contex{t_i}} \right)

另外,做一下對數似然

{\rm{l}} = {\rm{logL}} = \frac{1}{V} \sum \limits_{i = 1}^T logp\left( {{w_i}{\rm{|}}Contex{t_i}} \right)

對數似然還有些人稱為交叉熵,這裡不糾結也不介紹。

上面的問題跟正常的情況不太符合,來看看下一種表達。假設語料庫是有S個句子組成的一個句子序列(順序不重要),同樣是有V個詞,似然函式就會構建成下面的樣子

{\rm{L}} =  \prod \limits_j^{\rm{S}} \left( { \prod \limits_{{i_j} = 1}^{{T_j}} p\left( {{w_{{i_j}}}{\rm{|}}Contex{t_{{i_j}}}} \right)} \right)

對數似然就會是下面的樣子

{\rm{l}} = {\rm{logL}} = \frac{1}{V} \sum \limits_{j = 1}^{\rm{S}} \left( { \sum \limits_{{i_j} = 1}^{{T_j}} logp\left( {{w_{{i_j}}}{\rm{|}}Contex{t_{{i_j}}}} \right)} \right)

有意向的同學可以擴充套件到有文件的樣子,這裡就不介紹了。

為啥要注意這個問題呢?原因有多種,計算p({w_i}|Contex{t_i})這個東西的引數是主要的原因。

為啥會有引數呢?在計算p({w_i}|Contex{t_i})這個東西的過程中,有非常多的方法被開發出來了,如上面的平滑法,回退法上面的,但這些都是硬統計一下基本就完了;這就帶來一些需要求的引數,如平滑法中使用的分子分母分別加上的常數是什麼?

這還不夠,假如用的是trigram,還得儲存一個巨大的元組與概率的對映(如果不儲存,就得再進行使用的時候實際統計,那太慢了),存這個東西可需要很大的記憶體,對計算機是個大難題。

這都難不倒大牛們,他們考慮的工作是利用函式來擬合計算p({w_i}|Contex{t_i}),換句話說,不是根據語料庫統計出來的,而是直接把context和wi代到一個函式裡面計算出來的,這樣在使用的時候就不用去查那個巨大的對映集了(或者取語料庫裡面統計這個概率)。用數學的方法描述就是

p\left( {{w_i}{\rm{|}}Contex{t_i}} \right) = {\rm{f}}\left( {{w_i},Contex{t_i};{\rm{\theta }}} \right)

這樣的工作也體現了科學家們的價值——這幫人終於有點東西可以忙了。

那麼探索這個函式的具體形式就是主要的工作了,也是後面word2vec的工作的主要內容。函式的形式實在太多了,線性的還好,非線性真叫一個多,高維非線性的就更多了。

探索一個函式的具體形式的術語叫做擬合。

然後就有人提出了用神經網路來擬合這個函式,就有了各種方法,word2vec是其中的一種。


致謝

多位Google公司的研究員無私公開的資料。

多位博主的部落格資料。


參考文獻

[1]http://techblog.youdao.com/?p=915  Deep Learning實戰之word2vec,網易有道的pdf

[2] http://www.zhihu.com/question/21714667/answer/19433618 @皮果提在知乎上的問答

[3]http://www.zhihu.com/question/21661274/answer/19331979  @楊超在知乎上的問答《Word2Vec的一些理解》

[4] ​第​五​章​ ​n​-​g​r​a​m​語​言​模​型  百度文庫上的一個資料

[5] 主題:統計自然語言處理的數學基礎  百度文庫上的一個資料


from: http://blog.csdn.net/mytestmy/article/details/26961315

相關文章