詞向量word2vec學(xué)習(xí)記錄

前言

最近又系統(tǒng)的學(xué)習(xí)了一遍詞向量的一些基礎(chǔ)知識(shí),鞏固了基礎(chǔ)知識(shí)的同時(shí)又有了一些新的收貨,在此想記錄下學(xué)習(xí)過程中的筆記,寫的不好的地方請(qǐng)見諒,如有錯(cuò)誤歡迎指正

一 語言模型

首先我們回顧一些基礎(chǔ)的知識(shí)與概念,什么是語言模型呢?語言模型就是用來預(yù)測(cè)句子在語言中出現(xiàn)的概率(比如機(jī)器翻譯),假設(shè)一門語言中所有的可能的句子都服從某個(gè)概率分布,每個(gè)句子出現(xiàn)的概率加起來為1,語言模型的任務(wù)預(yù)測(cè)每個(gè)句子在語言中的概率。傳統(tǒng)的語言模型只會(huì)預(yù)測(cè)句子出現(xiàn)的概率而不會(huì)理解句子的含義,沒法告訴我們兩句話的意思是否相似。

語言模型的計(jì)算:

eg: 我? 今天? 下午? 打? 羽毛球

如果使用語言模型計(jì)算這句話的概率

P(S) = P(W_{1},W_{2},...,W_{m})

       =P(W_{1}).P(W_{2},...,W_{m}|W_{1})

=P(W_{1}).P(W_{2}|W_{1}).P(W_{3},...,W_{m}|W_{1},W_{2})

=P(W_{1}).P(W_{2}|W_{1}).P(W_{3}|W_{1},W_{2})...P(W_{m}|W_{1},W_{2},...,W_{m-1})

=P(W_{1}).\prod_{i=2}^mP(W_{i}|W_{1},W_{2},...,W_{i-1})

其中S為句子,W表示其中的單詞,P(S)被稱為語言模型,用來計(jì)算一個(gè)句子是句子的概率的模型,簡(jiǎn)單的看就是一個(gè)聯(lián)合概率的計(jì)算。

如果直接對(duì)上式計(jì)算有2個(gè)缺點(diǎn),一是數(shù)據(jù)過于稀疏;二是參數(shù)空間大(由數(shù)據(jù)稀疏導(dǎo)致);為了解決這兩個(gè)問題我們使用N-gram模型。

二 N-gram模型

為了解決上文中提到了數(shù)據(jù)稀疏以及參數(shù)空間大的問題,我們基于馬爾科夫的假設(shè)(類似齊次馬爾可夫假設(shè)):下一個(gè)詞的出現(xiàn)依賴于它前面的一個(gè)或幾個(gè)詞(通常我們說話的過程中的詞只與前幾個(gè)詞相關(guān)),減少參數(shù)空間。

假設(shè)下一個(gè)詞的出現(xiàn)依賴它前面的一個(gè)詞,則有:

P(S) = P(W_{1}).P(W_{2}|W_{1}).P(W_{3}|W_{1},W_{2})...P(W_{n}|W_{1},...W_{n-1})

=P(W_{1}).P(W_{2}|W_{1}).P(W_{3}|W_{2})....P(W_{n}|W_{n-1})

假設(shè)下一個(gè)詞的出現(xiàn)依賴它前面的兩個(gè)詞,則有:

P(S) = P(W_{1}).P(W_{2}|W_{1}).P(W_{3}|W_{1},W_{2})...P(W_{n}|W_{1},...W_{n-1})

=P(W_{1}).P(W_{2}|W_{1}).P(W_{3}|W_{2},W_{1})....P(W_{n}|W_{n-1},W_{n-2})

n-gram模型:假設(shè)當(dāng)前詞的出現(xiàn)的概率只與它前面的N-1個(gè)詞有關(guān),n=1是我們稱為unigram,n=2時(shí)叫做bigram,n=3時(shí)叫做trigram。

如何選擇n:

更大的n:對(duì)下一個(gè)詞出現(xiàn)的約束信息更多,具有更大的辨別力。

更小的n:在訓(xùn)練語料庫出現(xiàn)的次數(shù)更多,具有更可靠的統(tǒng)計(jì)信息,具有更高的可靠性。

構(gòu)造語言模型:最大似然估計(jì)

P(W_{i}|W_{1},W_{2},...,W_{i-1}) = \frac{Count(W_{1},...,W_{i})}{Count(W_{1},...W_{i-1})}

Count(X)在訓(xùn)練語料庫單詞序列X在訓(xùn)練語料中出現(xiàn)的次數(shù)。有些序列在實(shí)際訓(xùn)練中不會(huì)出現(xiàn),我們使用平滑處理防止概率相乘為0。

三 詞向量簡(jiǎn)介

One-hot representation: 獨(dú)熱向量編碼,對(duì)應(yīng)詞位置為1,其它為0,比較簡(jiǎn)單就不多介紹了。

one-hot向量的缺點(diǎn):1.語義鴻溝的問題,意思相近的詞計(jì)算相似度(比如余弦相似度)為0;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.維數(shù)災(zāi)難、稀疏,向量中大多數(shù)列為0,消耗計(jì)算資源;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.無法表示未出現(xiàn)的詞匯;

分布式表示:通過訓(xùn)練將每個(gè)詞(one-hot形式)映射成K維的實(shí)數(shù)向量,通過余弦相似度、歐式判斷他們之間的相似度。詞向量的表示的核心,利用上下文信息進(jìn)行詞的表示,與語言的表現(xiàn)形式無關(guān)。

如何訓(xùn)練詞向量:并沒有直接的模型可以訓(xùn)練得到分布式表示的詞向量,可以通過訓(xùn)練語言模型的同時(shí)得到詞向量,為了選擇摸個(gè)某個(gè)模型刻畫目標(biāo)詞匯與上下文的關(guān)系,我們需要在詞向量中抓取到一個(gè)詞的上下文信息,所以構(gòu)建上下文與目標(biāo)詞匯的關(guān)系,最自然的方式就是使用語言模型。

如何使用語言模型訓(xùn)練得到詞向量呢?

我們可以使用NNLM、RNNLM、CBOW和Skip-gram,下面我們來分別介紹一下這幾個(gè)模型。

四 訓(xùn)練詞向量使用的語言模型

1.NNLM(神經(jīng)網(wǎng)絡(luò)語言模型)

我們使用N-gram模型時(shí),當(dāng)N取值大時(shí),參數(shù)會(huì)比較稀疏,參數(shù)空間大,計(jì)算成本昂貴。我們采用新思路使用模型參數(shù)化的方式構(gòu)造語言模型去完成這個(gè)事情,我們不在記住所有的概率,而是用一組參數(shù)去描述這個(gè)事情,這樣真正需要計(jì)算概率的時(shí)候只需要把所有的詞喂給模型,過一遍神經(jīng)網(wǎng)絡(luò)就能拿到這樣一個(gè)概率,所以2003年提出了NNLM神經(jīng)網(wǎng)絡(luò)語言模型(w2v的前身),從語言模型觸發(fā)將模型最優(yōu)化問題轉(zhuǎn)化為詞向量求解的過程。

目標(biāo)函數(shù):L(\theta ) = \sum_{t}log(P(W_{t}|W_{t-n+1},...,W_{t-1}))

根據(jù)前n-1個(gè)單詞,預(yù)測(cè)第t個(gè)位置單詞的概率

使用了非對(duì)稱的前向窗函數(shù),窗的長(zhǎng)度為n-1

滑動(dòng)窗口便利整個(gè)語料庫求和,計(jì)算量正比于語料庫的大小

概率P滿足歸一化(一般使用softmax)條件,這樣不同位置t處的概率才能相加及即:


模型結(jié)構(gòu)圖:


我們來簡(jiǎn)單介紹一下模型的結(jié)構(gòu),上述模型其中模型的輸入在訓(xùn)練的過程中使用詞的ont-hot向量(假設(shè)維度為V,V為詞表大小)與我們隨機(jī)初始化的一個(gè)投影矩陣C(在訓(xùn)練過程中會(huì)不斷更新,假設(shè)維度為D)相乘,假設(shè)輸入為3個(gè)詞經(jīng)過映射得到3個(gè)詞向量維度為D,然后NNLM會(huì)將它們拼接成一個(gè)3D維的向量然后經(jīng)過一個(gè)hidden layer(隱層)做全連接(神經(jīng)元的數(shù)量由用戶自己定義在這里我們假設(shè)為H),再接上一個(gè)輸出層(神經(jīng)元的數(shù)量等于V,詞表的大小),再做softmax歸一化處理。從結(jié)構(gòu)上來看還是很簡(jiǎn)單的,模型的每個(gè)訓(xùn)練樣本的計(jì)算復(fù)雜Q:

Q = N*D + N*D*H + H*V

其中N為輸入的單詞數(shù)

2 RNNLM(循環(huán)神經(jīng)網(wǎng)絡(luò)語言模型)

基于循環(huán)神經(jīng)網(wǎng)絡(luò)的語言模型,所以具有RNN的特性,我們可以充分使用上下文的信息預(yù)測(cè)單詞

結(jié)構(gòu)圖

結(jié)構(gòu)簡(jiǎn)介:w(t)表示第t個(gè)時(shí)刻的當(dāng)前輸入單詞,維度假設(shè)為V,V是詞典大小,one-hot表示。

s(t-1)代表隱層的前一次輸出

y(t)表示模型輸出

計(jì)算復(fù)雜度:

Q = H*H + H*V

H為隱層的神經(jīng)元數(shù)

缺點(diǎn):RNNLM在形式上看起來不錯(cuò),但是因?yàn)槭褂昧薘NN實(shí)際難以優(yōu)化(梯度消失、梯度爆炸等),優(yōu)化不好導(dǎo)致會(huì)丟失長(zhǎng)距離的信息,只能記住短距離的信息,效果可能不如其他模型。

接下來我們介紹一下CBOW與Skip-gram看它們解決了一些什么問題

3 CBOW連續(xù)詞袋模型

Continuous Bag of Words,連續(xù)詞袋模型,即利用中心詞(Wt)的上下文(context)來預(yù)測(cè)中心詞(Wt)

結(jié)構(gòu)圖:


目標(biāo)函數(shù):L = \sum_{w\in C} log p(w|Context(w))

特點(diǎn)

沒有隱層

訓(xùn)練過程中使用雙向上下文窗口

上下文詞序無關(guān)(BOW)

輸入層直接使用低緯稠密向量表示

投影層簡(jiǎn)化為求和平均

模型結(jié)構(gòu)介紹:

CBOW可以描述為簡(jiǎn)化版的神經(jīng)網(wǎng)絡(luò)語言模型,計(jì)算流程,輸入上下文單詞one-hot表示,然后經(jīng)過投影矩陣映射為詞向量加起來求平均,再經(jīng)過一個(gè)全連接層維度為詞表大小,在再通過softmax輸出每個(gè)詞的概率;計(jì)算復(fù)雜度:Q = N \ast D + D \ast V , D為投影矩陣維度, N為輸入單詞數(shù),其中V我們可以通過分層softmax方法優(yōu)化到對(duì)數(shù)級(jí)別為Q = N \ast D + D \ast \log_2 V

可以看出來計(jì)算復(fù)雜度以及參數(shù)數(shù)量相較于神經(jīng)網(wǎng)絡(luò)語言模型減少的很多

4 Skip-gram

跳字模型,是根據(jù)中心詞(Wt)來預(yù)測(cè)周圍的詞,即預(yù)測(cè)上下文(context)。

結(jié)構(gòu)圖:


目標(biāo)函數(shù)

輸出層:只含當(dāng)前樣本的中心詞w的詞向量

投影層:恒等投影,為了和CBOW模型對(duì)比

輸出層: 和CBOW模型一樣


相比于NNLM,CBOW和Skip-gram使用較少的計(jì)算代價(jià)就可以獲得質(zhì)量更高的詞向量;

但是CBOW和Skip-gram也有自己的缺點(diǎn):

一是對(duì)每個(gè)局部上下文窗口單獨(dú)訓(xùn)練,沒有利用包含在全局的共現(xiàn)矩陣中的統(tǒng)計(jì)信息;而是對(duì)多義詞無法很好的表示和處理,因?yàn)槭褂昧宋ㄒ坏脑~向量; 解決方案Glove:利用全局信息編碼詞向量,這個(gè)我們本文不做討論。接下來我們來研究一下2個(gè)常用的優(yōu)化計(jì)算的方法層次softmax以及負(fù)采樣。

五 計(jì)算優(yōu)化方法

1.?hierarchical-softmax(層次softmax)

一般輸出層計(jì)算單詞的概率的計(jì)算復(fù)雜度為O(V),V為詞表的大小,我們可以使用二叉樹結(jié)構(gòu)來減少計(jì)算量。我們可以把常規(guī)的softmax當(dāng)做一個(gè)深度只有1,葉子節(jié)點(diǎn)為V的樹, 計(jì)算每一個(gè)單詞softmax的概率, 需要標(biāo)準(zhǔn)化所有的V個(gè)葉子節(jié)點(diǎn),如果我們使用二叉樹來代替這個(gè)結(jié)構(gòu)(葉子節(jié)點(diǎn)為單詞),我們只需要隨著路徑來找到相應(yīng)的單詞,不需要考慮其他的葉子節(jié)點(diǎn);又因?yàn)橐粋€(gè)標(biāo)準(zhǔn)的二叉樹的深度為\log_2 V所以我們最多只需要計(jì)算\log_2 V個(gè)節(jié)點(diǎn)的來得到最后的單詞的概率,需要注意的是這里的概率已經(jīng)被標(biāo)準(zhǔn)化過了,所有葉子節(jié)點(diǎn)的概率相加為1, 因?yàn)樵诙鏄浞至训阶詈鬀]有概率丟失,所以相加為1。更具體一點(diǎn)來說就是我們穿過樹時(shí),我們需要計(jì)算出每個(gè)節(jié)點(diǎn)向左或者向右時(shí)的概率,因此我們?yōu)槊總€(gè)節(jié)點(diǎn)分配一個(gè)向量分布表示v_{w‘},相較于普通的softmax我們不再有為每一個(gè)單詞的輸出embadding v_{w},反而我們?yōu)槊恳粋€(gè)節(jié)點(diǎn)生成一個(gè)唯一的向量分布表示v_{w‘},層次softmax的參數(shù)數(shù)量與普通的softmax差不多。

我們定義給定節(jié)點(diǎn)n,以及上下文c的條件下節(jié)點(diǎn)向左(或向右)的概率為:

P(right|n,c) = \sigma (h^Tv’_{n})

這里的計(jì)算與常規(guī)softmax中的計(jì)算相同;相比于普通softmax上下文向量與整個(gè)輸出詞匯向量做點(diǎn)積輸出所有詞的概率,現(xiàn)在計(jì)算的是h與每個(gè)節(jié)點(diǎn)之間的點(diǎn)積,最后只會(huì)輸出一個(gè)概率,其中h為輸入上下文的向量,相反的節(jié)點(diǎn)王座的概率為:1-P(right|n,c)

圖例:

cat詞的概率為節(jié)點(diǎn)1向左的概率、節(jié)點(diǎn)2向右的概率以及節(jié)點(diǎn)5向右的概率乘積。

顯然,樹的結(jié)構(gòu)很重要,實(shí)際上我們可以使用符號(hào)來索引每個(gè)幾點(diǎn),假設(shè)0為向左轉(zhuǎn),1為向右轉(zhuǎn),比如上圖中的cat可以用011來表示,balanced 二叉樹的路徑長(zhǎng)度為\log_2 V,假設(shè)V=10000,則平均路徑長(zhǎng)度為13.3。在信息論中,我們可以用13.3來表示每個(gè)字的位數(shù)。

這里引入信息內(nèi)容函數(shù)I(W), 為概率的負(fù)對(duì)數(shù)

I(w) = -\log_2 p(w)

熵 H為語料庫里所有單詞的信息增益:

H = \sum\nolimits_{i\in V}p(w_{i})I(w_{i})

假設(shè)一棵平衡二叉樹,V =10000, 所有葉子節(jié)點(diǎn)的概率都相同?

H = -\sum\nolimits_{i\in V}\frac{1}{10000}\log_2 \frac{1}{10000}=13.3

我們可以使用熵來作為每個(gè)單詞的平均編碼位數(shù)

樹的結(jié)構(gòu)很重要,我們可以根據(jù)所有單詞的信息增益來編碼我們的樹結(jié)構(gòu),我們可以將信息量較少的單詞采用較短的路徑。也可以使用單詞的概率,由于某些單詞比其他單詞更有可能出現(xiàn)(比如“the”),因此也可以采用較短的路徑來加快計(jì)算。

簡(jiǎn)單總結(jié)一下層次softmax與常規(guī)softmax的不同點(diǎn):

1.輸出層節(jié)點(diǎn)采用二叉樹結(jié)構(gòu),減少了計(jì)算的次數(shù);

2.只輸出一個(gè)概率,常規(guī)softmax輸出所有概率;

3.常規(guī)softmax是將上下文向量與V個(gè)(V為詞表大小)輸出詞向量相乘,層次softmax是將上下文向量與V-1個(gè)節(jié)點(diǎn)連接相乘

2.負(fù)采樣

Negative Sampling也是一種生成詞向量的高效方法,我們使用Skip-gram模型舉例,它優(yōu)化的是另一個(gè)不同的目標(biāo)函數(shù);

我們假設(shè)(w,c)是一對(duì)單詞還有上下文,

p(D=1|w,c)是這對(duì)數(shù)據(jù)屬于訓(xùn)練數(shù)據(jù)里的正確的樣本的概率,

相反的p(D=0|w,c) = 1 - p(D=1|w,c)?是這對(duì)數(shù)據(jù)為負(fù)樣本(即不屬于這個(gè)訓(xùn)練數(shù)據(jù)里的)的概率

我們假設(shè)有個(gè)參數(shù)\theta 控制著他們的概率分布:p(D=1|w,c;\theta )

我們的目標(biāo)是找到參數(shù)\theta ?最大化所有訓(xùn)練樣本屬于訓(xùn)練集的概率:


p(D=1|w,c;\theta )的概率我們可以使用sigmoid函數(shù)這樣定義:

p(D=1|w,c;\theta ) = \frac{1}{1+e^{-v_{c}.v_{w}} }

其中v_{c}為上下文對(duì)應(yīng)的輸入詞向量(在skip-gram中就是中心詞通過one-hot映射得到的低緯詞向量),v_{w}為輸出層該詞對(duì)應(yīng)的輸出詞向量

得到最終公式為:


這個(gè)公式有一個(gè)小問題就是,我們可以通過設(shè)置參數(shù)\theta 使得p(D=1|w,c;\theta ) =1.這個(gè)是很容易實(shí)現(xiàn)的我們可以設(shè)置v_{c} = v_{w} 并且 v_{c}.v_{w} = K對(duì)于所有的v_{c},v_{w},當(dāng)K足夠大時(shí)概率就接近1了,事實(shí)上當(dāng)K約等于40時(shí),概率就已經(jīng)接近1了。

所以我們需要一種技巧來防止所有的向量的值相同,比如可以禁止一些(w,c)的組合出現(xiàn)。有一種方法就是給模型提供一些(w,c)組合它們的p(D=1|w,c;\theta ) 非常小,比如提供一些(w,c)組合沒有在訓(xùn)練數(shù)據(jù)里面出現(xiàn)的,把它們?nèi)考僭O(shè)為負(fù)樣本(negative sampling的名字來源于此,給模型提供一個(gè)負(fù)樣本數(shù)據(jù)集通過隨機(jī)采樣獲?。┧晕覀兊哪繕?biāo)函數(shù)變?yōu)橐韵滦问剑?/p>


其中數(shù)據(jù)D'為負(fù)樣本樣本集合,D為正樣本集合

假設(shè)我們讓\sigma (x) = \frac{1}{1 + e^{-x}} ?可以得到:


我們需要通過調(diào)整參數(shù)\theta 來最大化這個(gè)概率

我們采樣一個(gè)正樣本,一般會(huì)采樣K個(gè)負(fù)樣本有,negative sampling最關(guān)鍵的地方在于反向傳播時(shí)它更新的過程,相比于常規(guī)的更新所有詞匯集,負(fù)采樣只會(huì)更新(w,c)\in D和(w,c)\in DD\cup D這個(gè)集合上的詞對(duì)應(yīng)的參數(shù),詞匯量的大小變小了。所以大大減少了計(jì)算量。


參考文章

1.Ef?cientEstimationofWordRepresentationsin VectorSpace CBOW和Skip-gram經(jīng)典論文

2.word2vec Explained: Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method 這篇論文詳細(xì)講了negative sampling

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容