1. 程式人生 > >Word2Vec演算法詳解(相關背景介紹)

Word2Vec演算法詳解(相關背景介紹)

本節開始將介紹幾種比較前言的NLP演算法,主要是和神經網路進行結合的,和深度學習進行結合的演算法原理和思想,前面的NLP演算法都是傳統的經典NLP演算法思想,都沒有涉及到實戰方面的,實戰方面的我計劃明年開始進行,所以這個系列的都是理論,本人一直很注重理論方面的學習,因為只有搞懂演算法的原理你才有可能去改進去創新,本節開始講解目前使用比較成熟效果比較好的演算法即Word2Vec演算法,這個演算法,和神經網路很好的結合了在一起,本節主要涉及到一些背景知識,大家需要搞懂這些背景才有可能深入理解Word2Vec演算法,好,廢話不多說,下面開始:

Word2Vec演算法背景

Word2Vec是Google公司於2013年釋出的一個開源詞向量工具包。該專案的演算法理論參考了Bengio在2003年設計的神經網路語言模型。由於此神經網路模型使用了兩次非線性變換,網路引數很多,訓練緩慢,因此不適合大語料。Mikolov團隊對其做了簡化,實現了Word2Vec詞向量模型。它簡單、高效,特別適合從大規模、超大規模的語料中獲取高精度的詞向量表示。因此,專案一經發布就引起了業界的廣泛重視,並在多種NLP任務中獲得了良好的效果,成為NLP在語義相似度計算中的重大突破。Word2Vec及同類的詞向量模型都基於如下假設:衡量兩個詞在語義上的相似性,決定於其鄰居詞分佈是否類似。顯然這是源於認知語言學中的“距離象似性”原理:詞彙與其上下文構成了一個“象”。當從語料中訓練出相同或相近的兩個“象”時,無論這兩個“象”的中心詞彙在字面上是否一致,它們在語義上都是相似的。

自從Word2Vec框架釋出之後,無論是在國外還是在國內,該框架都引起了巨大的反響。由於TomasMikolov在相關的論文中並沒有談及太多的演算法細節,因此對許多NLP的研究人員來說,對該演算法的研究一度成為重要的課題。經過兩三年的研究,到目前為止,根據釋出出來的研究成果,對相關理論的研究己經非常充分,在網路上可以很容易地找到。

詞向量及其表達

詞的向量化就是將語言中的詞進行數學化,也即把一個詞表示成一個向量。詞的向量化主要有以下2種表達方式。

(1)one-hot  representation方式
這是一種最簡單的方式,用一個很長的向量來表示一個詞。向量的長度為詞典的大 小(通 常 達 到 \large 10^{5}

),向 量 的 分 量只有一個1,其餘全為0,1的位置對應該詞在詞典中的位置。比如,“土豆”表示為[0 0 0 0 0 1 0 0 0 0 0 0 0 00 … ],而 “馬 鈴 薯 ”表 示 為 [0 1 0 0 0 0 0 0 00 0 0 0 0 0 …]。這種方式雖然可以 簡 單 明 了 地 表 達 一個詞語,但是卻無法有效表達它們的語義資訊。“土豆”和“馬鈴薯”雖然是同一種食物,但利用常規的向量距離公式,比如歐幾里德距離或者餘弦距離公式,都無法有效計算它們的相似度,顯然這種方式不能很好地表達詞之間的相似性。

(2)Distributed representation (詞向量)
這種方式能很好地克服one-hot  representation方式的缺點,最早由 Hinton提出,它是將詞對映到一個低維、稠密的實數向量空間中(空間大小一般為100或者200),使得詞義越相近的詞在空間的距離越近。上面的例子可以類似地表達如下
,“土 豆”可 以 表 示 為:[0.843 -0.125 0.734 -0.3450.654 …],而“馬鈴薯”為[0.923 -0.231 0.698 -0.233 0.743 …],顯然,這種表示方式有利於使用距離向量公式比較詞向量之間的相似度。

下面我們在系統的講解一下,在NLP任務中,我們將自然語言交給機器學習演算法來處理,但機器無法直接理解人類的語言,因此首先要做的事情就是將語言數學化,如何對自然語言進行數學化呢?詞向量提供了一種很好的方式.一種最簡單的詞向量是one-hot representation就是用一個很長的向量來表示一個詞,向量的長度為詞典的大小N,向量的分量只有一個1,其它全為0,1的位置對應該詞在詞典中的索引,但這種詞向量表示有一些缺點,如容易受維數災難的困擾,尤其是將其用於DeepLearning場景時;又如,它不能很好地刻畫詞與詞之間的相似性,另一種詞向量是Distributed Representation,它最早是Hinton於1986年提出的,可以克服one-hot representation的上述缺點,其基本想法是:通過訓練將某種語言中的每一個詞對映成一個固定長度的短向量(當然這裡的“短"是相對於one-hot representation的“長”而言的),所有這些向量構成一個詞向量空間,而每一向量則可視為該空間中的一個點,在這個空間上引人“距離",就可以根據詞之間的距離來判斷它們之間的(詞法、語義上的)相似性了.word2vec中採用的就是這種Distributed Representation的詞向量.

為什麼叫做Distributed Representation?很多人問到這個問題.我的一個理解是這樣的:對於one-hot representation,向量中只有一個非零分量,非常集中(有點孤注一擲的感覺);而對於Distributed Representation,向量中有大量非零分量,相對分散(有點風險平攤的感覺),把詞的資訊分佈到各個分量中去了.這一點,跟平行計算裡的分散式並行很像.為更好地理解上述思想,我們來舉一個通俗的例子.
假設在二維平面上分市有a個不同的點,給定其中的某個點,現在想在平面上找到與這個點最相近的一個點.我們是怎麼做的呢?首建立一個直角座標系,基於該座標系其上的每個點就唯一地對應一個座標\large (x,y).接著引入歐式距;最後分別計算這個詞與其他\large a-1個詞之間的距離,對應最小距離值的那個(或那些)詞便是我們要找的詞了·上面的例子中,座標\large (x,y)的地位就相當於詞向量,它用來將平面上一個點的位置在數學上作量化,座標系建立好以後,要得到某個點的座標是很容易的,然而,在NLP任務中,要得到詞向量就複雜得多了,而且詞向量並不唯一,其質量依賴於訓練語料、訓練演算法等因素。

考慮英語和西班牙語兩種語言,通過訓練分別得到它們對應的詞向量空間(Enghsh)和(Spanish).從英語中取出五個詞one,two,three,four,five,設其在E中對應的詞向量分別為uno,dos,tres,cuatro,cinco,為方便作圖,利用主成分分析(PCA)降維,得到相應的二維向量,在二維平面上將這五個點描出來,如圖7左圖所示.類似地:在西班牙語中取出(與one,two,three,fo些five對應的)uno,dos,tres,cuatro,cinco,設其在S中對應的詞向量分別為\large s_1,s_2,s_3,s_4,s_5,用PCA降維後的二維向量分別為
\large t_1,t_2,t_3,t_4,t_5,將它們在二維平面上描出來(可能還需作適當的旋轉),如圖7右圖所示.觀察左、右兩幅圖:容易發現:五個詞在兩個向量空間中的相對位置差不多,這說明兩種不同語言對應向量空間的結構之間具有相似性,從而進一步說明了在詞向量空間中利用距離刻畫詞之間相似性的合理性,注意,詞向量只是針對“詞”來提的,事實上,我們也可以針對更細粒度或更粗粒度來進行推廣,如字向量,句子向量和文件向量,它們能為字、句子、文件等單元捍供更好的表示.

這裡就不介紹了n-gram模型了,不懂的請自行百度吧,下面直接看神經概率語言模型。

神經概率語言模型

Bengio等人在文《A neural probabilistic language model. Journal Of  Machine Learning Research》(2003)中提出的一種神經概率語言模型。該模型中用到了一個重要的工具一詞向量.
什麼是詞向量呢?簡單來說就是,對詞典D中的任意詞\large w,指定一個固定長度的實值向量\large v(w)\in R^m,\large v(m)就稱為\large w的詞向量,m為詞向量的長度.這裡我們知道了詞向量其實就是把一個詞使用一個向量的實值函式去表示這個詞,這樣就可以計算各個詞向量的歐氏距離了,這樣就可以判斷他們的相關性。既然是神經概率語模型,其中當然要用到一個神經網路啦.圖給出了這個神經網路的結構示意圖,它包括四個層:輸人(Input)層、投影(Projection)層、隱藏(Hidden)層和輸出(Output)層、其中\large W,U分別為投影層與隱藏層以及隱藏層和輸出層之間的權值矩陣,\large p,q分別為隱藏層和輸出層上的偏置向量.

對於語料C中的任意一個詞w,將\large context(w)取為其前而的\large n-1個詞(類似於n-gram),這樣二元對\large (context(w),w)就是一個訓練樣本了.接下來,討論樣本\large context(w),經過上圖所示的神經網路時是如何參與運算的.注意,一旦語料c和詞向量長度m給定後,投影層和輸出層的規模就確定了,前者為\large (n-1)m,後者為\large N=|D|即語料C的詞彙量大小.而隱藏層的規模\large n_h是可調引數由使用者指定.
為什麼投影層的規模是\large (n-1)m呢?因為輸人層包含\large context(w)\large n-1個詞的詞向量,而投影層的向量,是這樣構造的:將輸人層的\large n-1個詞向量按順序首尾相接地拼起來形成一個長向量,其長度當然就是\large (n-1)m了.有了向量\large x_ w,接下來的計算過程就很平凡了,具體為 

其中tanh為雙曲正切函式用來做隱藏層的啟用函式,上式中,tanh作用在向量上表示它作用在向量的每一個分量上.

 上式的待求引數為:

詞向量:\large v(w)\in R^m\large w\in D以及填充向量.
神經網路引數:

這些引數均通過訓練演算法得到.值得一提的是,通常的機器學習演算法中,輸人都是已知的,而在上述神經概率語言模型中,輸人v(w)也需要通過訓練才能得到.接下來,簡要地分析一下上述模型的運算量.在如圖所示的神經網路中,投影層、隱藏層和輸出層的規模分別為\large (n-1)m,n_h,N,依次看看其中涉及的引數:
(1)   n是一個詞的上下文中包含的詞數,通常不超過5;
(2)m是詞向量長度,通常是10~100量級;
(3)由使用者指定,通常不需取得太大,如100量級;
  (4)N是語料詞彙量的大小,與語料相關,但通常是10000~100000量級.

結合上式,不難發現,整個模型的大部分計算集中在隱藏層和輸出層之間的矩陣向量運算,以及輸出層上的softmax歸一化運算.因此後續的相關研究工作中,有很多是針對這一部分進行優化的,其中就包括了word2vec的工乍與n-gram模型相比,神經概率語言模型有什麼優勢呢?主要有以下兩點:

1.詞語之間的相似性可以通過詞向量來體現
舉例來說,如果某個(英語)語料中s1="A dog is running in the room”出現了10000次,而s2="A cat is running in the room”只出現了1次.按照n-gram模型的做法,\large P(s_1)肯定會遠大於\large P(s_2).注意,\large P(s_1)\large P(s_2)的唯一區別在於dog和cat,而這兩個詞無論是句法還是語義上都扮演了相同的角色,因此,\large P(s_1)\large P(s_2)應該很相近才對,然而,由神經概率語言模型算得的\large P(s_1)\large P(s_2)是大致相等的.原因在於:(1)在神經概率語言模型中假定了“相似的”的詞對應的詞向量也是相似的;(2)概率函式關於詞向量是光滑的,即詞向量中的一個小變化對概率的影響也只是一個小變化.這樣一來,對於下面這些句子:

只要語料中出現一次,其他的概率也會增大。這就把語言的相關性表現出來了。

下一節我們將介紹 Word2Vec演算法。

這裡參考了這篇文章《Word2Vec中的數學》,大家找到這篇文章,好好看看你會深入理解的。