1. 程式人生 > >word2Vec基礎背景知識

word2Vec基礎背景知識

從自然語言模型談起

1 詞向量

1.1詞向量

自然語言處理就是將自然語言交給機器的演算法來處理,首要的任務就是把語言數字化,詞向量就是將詞語轉換為向量的一種方法。詞向量主要有以下兩種表示方法。

  • one-hot編碼
  • Distribted Representation

one-hot編碼是用一整串0 1來表示某個詞語,向量到的長度為詞典的大小,某個詞的詞向量只有一個元素位置為1,其餘均為0。缺點就是維度太大,而且任意兩個向量之間沒有任何關係。假設整個語料有兩句話,++我愛中國人++和++趙鴻寧愛我++,那麼分詞之後可能一共有“我,愛,中國,人,趙洪寧”這個5個詞,愛這個詞的詞向量大概是這種形式:

x=[0,1,0,0,0]
Distributed Representation方法是用一個普通的向量表示一個詞,相對長度要短很多,”我“這個詞向量大概長這樣:

x=[0.111,0.342,0.4521,0.4311,...]

很明顯這種詞向量並不能直接由語料得到,必須經過相應的訓練和學習得到。但是我們不能隨便瞎訓練,一個比較好的方式就是相似的詞語它們的詞向量在空間上也比較接近,這裡的接近體現在幾何意義上就是向量的歐式距離較小。以二維向量為例,就是他們的夾角越小越好。代表的方法有Bingo發表的NNLM模型和Google的word2Vec模型。

1.2 詞袋(bag of words)

詞袋是詞語的另外一種表示方法,核心思想就是給每個詞語一個索引,比如剛剛那個例子,可能會有一個索引{0,1,2,3,4}來表示語料中的5個詞語。一般來說可以用hash雜湊的方式得到某個詞的索引,比如可以定義我的索引:index(我) = hashcode(我),當然這種雜湊方式會存在衝突,衝突的解決方法就是雜湊中的方法了。

2 自然語言模型

上面提到了詞向量的Distributed Representation,那麼我們怎麼能夠得到這種向量呢?怎麼通過模型的訓練得到這種向量呢?這就不得不提到自然語言模型了。首先要明確一點,不管是word2vec還是其他模型得到的詞向量,這些==詞向量不是模型訓練的任務,只是模型訓練的附屬品。==

2.1 基本概念

在實際的應用中,我們通常需要解決這樣的一類問題:如何計算一個句子的概率?比如:

  • 機器翻譯:P(high winds tonite)>P(large winds tonite)
  • 語音識別:P(I saw a van)>P(eyes awe of an)

所有的這些問題都可以歸結於計算一個由T個單片語成的完整的句子的概率:

P(S)=P(w1,w2,w3,....wn)=P(w1)P(w2|w1)P(w3|w1w2)...P(wn|w1w2..wn1)

=i=1TP(wi|contex(wi))

最原始的做法是基於統計的方式,用現有的語料庫去估計給我們的一句話出現的概率。

但是語料庫太大,統計起來太麻煩,所以也就有了N-gram模型,它是基於馬爾可夫假設,即每個詞出現的概率並不是跟它前面的所有詞有關,我們只取離它最近的N個詞語,也就是:

P(wi|contex(wi))=P(wi|wi1...wi1n)

但是這也帶來了問題,因為它是從語料庫中數出相應的個數,用count(wi)/count(wi-1….),所以主要有兩個缺點:首先是如果N選的太大,語料經常不足,而且語料庫太大。其次是可能會出現某些Gram在語料中不存在的情況,這時候概率值相乘就為0,解決方法有兩個:平滑法(平滑法,即給分子分母都加1)和回退法(利用n-1元組去估計n元組)。

2.2 模型的問題和目標

如果都是用最原始的直接統計數數的方式去計算,這樣的語言模型沒有引數,直接計算,但是通常模型是帶有引數的,比如n-gram中如果採用平滑法,分子分母分別加上的常數是什麼。

另外一種解決方式就是我們是把contex(wi)和wi直接帶入到某個函式中求解出來的,不再是數數數出來的概率。一般會基於現有的訓練資料樣本,用函式去擬合出概率值:

P(wi|contex(wi))

優化的思想就是極大似然估計,也就是我們利用極大似然估計作為我們的優化策略,讓目標預測值等於實際值的概率儘可能的大,這裡的意思是既然某句話已經出現了,那麼我們就讓這句話出現的概率最大。至於為什麼要取對數,一個原因是可能隨著自變數的增大,因變數的方差越來越大,我們需要把它拉回到一個正常的數值,資料變得更加平滑。所以,優化的目標是:

f=maxiTlog(P(wi|contex(wi))

2.3 NNLM模型

首先介紹2003年Bingo發表的論文中所描述的神經網路模型

NNLM模型

一共分為四層:==輸入層,投影層,隱藏層,輸出層==。輸入層輸入的是單詞wi的上下文,一般會定義一個視窗的大小,假設我們只看每個詞的前面四個詞,那麼投影層,會取出這4個詞對應的詞向量前後拼接在一起。假設語料庫大小為10000,矩陣C的維度為300x10000,其中300代表著每一個詞向量的維度。對應的投影層的結果就是4個300維的向量然後經過拼接變成的隱藏層1200維向量。然後隱藏層神經元連線到輸出層,輸出向量的維度為1w的向量,向量每個位置的數值表示P(w_i|contex(w_i)),因為wi一共有1w中可能,所以向量的維數為1w。

優化的目標函式是:

f=maxiTlog(P(wi|contex(wi))

X=(C(wi1),C(wi2),...C(win+1))

y=b+WX+Utanh(HX+d)

P(wi|contex(wi))=eywiieyi

輸出層要經過一次softmax,才能變成概率的含義,這樣1w維向量每個位置的值就表示為概率。正常來說,語料一般有多句話,每句話都有多個詞語,我們的目標函式寫的比較簡單,實際中應該是每句話的概率都要最大。雖然每句話給進我們的模型中,它的句子不同,上下文也不同,但是大家都有相同的b,W,U,C,d,通過在求解f的過程中,就可以更新出這些引數。