自然語言處理-word2vec

一.簡(jiǎn)介

Word2Vec是google在2013年推出的一個(gè)NLP工具,它的特點(diǎn)是能夠?qū)卧~轉(zhuǎn)化為向量來表示,這樣詞與詞之間就可以定量的去度量他們之間的關(guān)系,挖掘詞之間的聯(lián)系。用詞向量來表示詞并不是Word2Vec的首創(chuàng),在很久之前就出現(xiàn)了。最早的詞向量采用One-Hot編碼,又稱為一位有效編碼,每個(gè)詞向量維度大小為整個(gè)詞匯表的大小,對(duì)于每個(gè)具體的詞匯表中的詞,將對(duì)應(yīng)的位置置為1。比如我們有下面的5個(gè)詞組成的詞匯表

采用One-Hot編碼方式來表示詞向量非常簡(jiǎn)單,但缺點(diǎn)也是顯而易見的,一方面我們實(shí)際使用的詞匯表很大,經(jīng)常是百萬級(jí)以上,這么高維的數(shù)據(jù)處理起來會(huì)消耗大量的計(jì)算資源與時(shí)間。另一方面,One-Hot編碼中所有詞向量之間彼此正交,沒有體現(xiàn)詞與詞之間的相似關(guān)系

Distributed representation可以解決One-Hot編碼存在的問題,它的思路是通過訓(xùn)練,將原來One-Hot編碼的每個(gè)詞都映射到一個(gè)較短的詞向量上來,而這個(gè)較短的詞向量的維度可以由我們自己在訓(xùn)練時(shí)根據(jù)任務(wù)需要來自己指定。

下圖是采用Distributed representation的一個(gè)例子,我們將詞匯表里的詞用"Royalty","Masculinity", "Femininity"和"Age"4個(gè)維度來表示,King這個(gè)詞對(duì)應(yīng)的詞向量可能是(0.99,0.99,0.05,0.7)。當(dāng)然在實(shí)際情況中,我們并不能對(duì)詞向量的每個(gè)維度做一個(gè)很好的解釋。

有了用Distributed Representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關(guān)系了,比如我們將詞的維度降維到2維,有一個(gè)有趣的研究表明,用下圖的詞向量表示我們的詞時(shí),我們可以發(fā)現(xiàn):

可見我們只要得到了詞匯表里所有詞對(duì)應(yīng)的詞向量,那么我們就可以做很多有趣的事情了。不過,怎么訓(xùn)練才能得到合適的詞向量呢?針對(duì)這個(gè)問題,Google的Tomas Mikolov在他的論文中提出了CBOW和Skip-gram兩種神經(jīng)網(wǎng)絡(luò)模型。

二.原理

Word2Vec 的訓(xùn)練模型本質(zhì)上是只具有一個(gè)隱含層的神經(jīng)元網(wǎng)絡(luò),詞向量表示即為W_{V*N}矩陣(如下圖)。

隱層的激活函數(shù)其實(shí)是線性的,相當(dāng)于沒做任何處理(這也是 Word2vec 簡(jiǎn)化之前語言模型的獨(dú)到之處),我們要訓(xùn)練這個(gè)神經(jīng)網(wǎng)絡(luò),用反向傳播算法,本質(zhì)上是鏈?zhǔn)角髮?dǎo)。


它的輸入是采用One-Hot編碼的詞匯表向量,它的輸出也是One-Hot編碼的詞匯表向量。使用所有的樣本,訓(xùn)練這個(gè)神經(jīng)元網(wǎng)絡(luò),等到收斂之后,從輸入層到隱含層的那些權(quán)重,便是每一個(gè)詞的采用Distributed Representation的詞向量。這樣我們就把原本維數(shù)為V的詞向量變成了維數(shù)為N的詞向量(N遠(yuǎn)小于V),并且詞向量間保留了一定的相關(guān)關(guān)系。

Google的Mikolov在關(guān)于Word2Vec的論文中提出了CBOW和Skip-gram兩種模型,CBOW適合于數(shù)據(jù)集較小的情況,而Skip-Gram在大型語料中表現(xiàn)更好。其中CBOW如下圖左部分所示,使用圍繞目標(biāo)單詞的其他單詞(語境)作為輸入,在映射層做加權(quán)處理后輸出目標(biāo)單詞。與CBOW根據(jù)語境預(yù)測(cè)目標(biāo)單詞不同,Skip-gram根據(jù)當(dāng)前單詞預(yù)測(cè)語境,如下圖右部分所示。假如我們有一個(gè)句子“There is an apple on the table”作為訓(xùn)練數(shù)據(jù),CBOW的輸入為(is,an,on,the),輸出為apple。而Skip-gram的輸入為apple,輸出為(is,an,on,the)。

1.CBOW

1、輸入層:上下文單詞的One-Hot編碼詞向量,V為詞匯表單詞個(gè)數(shù),C為上下文單詞個(gè)數(shù)。以上文那句話為例,這里C=4,所以模型的輸入是(is,an,on,the)4個(gè)單詞的One-Hot編碼詞向量。

2、初始化一個(gè)權(quán)重矩陣W_{V*N},然后用所有輸入的One-Hot編碼詞向量左乘該矩陣,得到維數(shù)為N的向量w_{1}、w_{2}.....w_{c} ,這里的N由自己根據(jù)任務(wù)需要設(shè)置。

3、將所得的向量w_{1}、w_{2}.....w_{c}相加求平均作為隱藏層向量h。

4、初始化另一個(gè)權(quán)重矩陣?W^{’}_{N*V},用隱藏層向量h左乘W^{’}_{N*V},再經(jīng)激活函數(shù)處理得到V維的向量y,y的每一個(gè)元素代表相對(duì)應(yīng)的每個(gè)單詞的概率分布。

5、y中概率最大的元素所指示的單詞為預(yù)測(cè)出的中間詞(target word)與true label的One-Hot編碼詞向量做比較,誤差越小越好(根據(jù)誤差更新兩個(gè)權(quán)重矩陣)

在訓(xùn)練前需要定義好損失函數(shù)(一般為交叉熵代價(jià)函數(shù)),采用梯度下降算法更新W和W'。訓(xùn)練完畢后,輸入層的每個(gè)單詞與矩陣W相乘得到的向量的就是我們想要的Distributed Representation表示的詞向量,也叫做word embedding。

2.Skip-gram

在前面的章節(jié)中,我們已經(jīng)介紹過Skip-Gram是給定input word來預(yù)測(cè)上下文,其模型結(jié)構(gòu)如上圖所示。它的做法是,將一個(gè)詞所在的上下文中的詞作為輸出,而那個(gè)詞本身作為輸入,也就是說,給出一個(gè)詞,希望預(yù)測(cè)可能出現(xiàn)的上下文的詞。通過在一個(gè)大的語料庫訓(xùn)練,得到一個(gè)從輸入層到隱含層的權(quán)重模型?!癮pple”的上下文詞是(’there’,’is’,’an’,’on’,’the’,’table’).那么以apple的One-Hot詞向量作為輸入,輸出則是(’there’,’is’,’an’,’on’,’the’,’table’)的One-Hot詞向量。訓(xùn)練完成后,就得到了每個(gè)詞到隱含層的每個(gè)維度的權(quán)重,就是每個(gè)詞的向量(和CBOW中一樣)。接下來具體介紹如何訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò)。

假如我們有一個(gè)句子“There is an apple on the table”。

1、首先我們選句子中間的一個(gè)詞作為我們的輸入詞,例如我們選取“apple”作為input word;

2、有了input word以后,我們?cè)俣x一個(gè)叫做skip_window的參數(shù),它代表著我們從當(dāng)前input word的一側(cè)(左邊或右邊)選取詞的數(shù)量。如果我們?cè)O(shè)置skip_window=2,那么我們最終獲得窗口中的詞(包括input word在內(nèi))就是[‘is’,’an’,’apple’,’on’,’the’ ]。skip_window=2代表著選取左input word左側(cè)2個(gè)詞和右側(cè)2個(gè)詞進(jìn)入我們的窗口,所以整個(gè)窗口大小span=2x2+1=5。另一個(gè)參數(shù)叫num_skips,它代表著我們從整個(gè)窗口中選取多少個(gè)不同的詞作為我們的output word,當(dāng)skip_window=2,num_skips=2時(shí),我們將會(huì)從窗口中隨機(jī)選擇兩個(gè)非中心單詞,得到兩組 (input word, output word) 形式的訓(xùn)練數(shù)據(jù),例如選擇an和on我們得到('apple', 'an'),('apple', 'on')。

3、神經(jīng)網(wǎng)絡(luò)基于這些訓(xùn)練數(shù)據(jù)中每對(duì)單詞出現(xiàn)的次數(shù)習(xí)得統(tǒng)計(jì)結(jié)果,并輸出一個(gè)概率分布,這個(gè)概率分布代表著到我們?cè)~典中每個(gè)詞有多大可能性跟input word同時(shí)出現(xiàn)。舉個(gè)例子,如果我們向神經(jīng)網(wǎng)絡(luò)模型中輸入一個(gè)單詞“中國(guó)“,那么最終模型的輸出概率中,像“英國(guó)”, ”俄羅斯“這種相關(guān)詞的概率將遠(yuǎn)高于像”蘋果“,”蟈蟈“非相關(guān)詞的概率。因?yàn)椤庇?guó)“,”俄羅斯“在文本中更大可能在”中國(guó)“的窗口中出現(xiàn)。我們將通過給神經(jīng)網(wǎng)絡(luò)輸入文本中成對(duì)的單詞來訓(xùn)練它完成上面所說的概率計(jì)算。

4、通過梯度下降和反向傳播更新矩陣W

5、W中的行向量即為每個(gè)單詞的Word embedding表示

三.改進(jìn)

我們介紹了CBOW和Skip-gram最理想情況下的實(shí)現(xiàn),即訓(xùn)練迭代兩個(gè)矩陣W和W’,之后在輸出層采用softmax函數(shù)來計(jì)算輸出各個(gè)詞的概率。但在實(shí)際應(yīng)用中這種方法的訓(xùn)練開銷很大,不具有很強(qiáng)的實(shí)用性,因?yàn)?b>Word2vec 本質(zhì)上是一個(gè)語言模型,它的輸出節(jié)點(diǎn)數(shù)是 V 個(gè),對(duì)應(yīng)了 V 個(gè)詞語,本質(zhì)上是一個(gè)多分類問題,但實(shí)際當(dāng)中,詞語的個(gè)數(shù)非常非常多,會(huì)給計(jì)算造成很大困難,所以需要用技巧來加速訓(xùn)練。為了使得模型便于訓(xùn)練,有學(xué)者提出了Hierarchical Softmax和Negative Sampling兩種改進(jìn)方法。

1.hierarchical softmax

改進(jìn)點(diǎn)1

改進(jìn)輸入向量求和方式

第一點(diǎn)是從輸入層到隱藏層的映射,沒有采用原先的與矩陣W相乘然后相加求平均的方法,而是直接對(duì)所有輸入的詞向量求和。假設(shè)輸入的詞向量為(0,1,0,0)和(0,0,0,1),那么隱藏層的向量為(0,1,0,1)。

改進(jìn)點(diǎn)2

通過采用Huffman tree把N分類問題變成 log(N)次二分類

還記得最原始的網(wǎng)絡(luò)模型是長(zhǎng)這樣的:

而在Hierarchical softmax中,我們不再需要W^{’}_{N*V}的部分了,變成了下面的樣子:

我們把傳統(tǒng)的Softmax換成Hierarchical softmax,而Hierarchical softmax由一個(gè)Huffman樹構(gòu)成。這個(gè)Huffman樹的葉節(jié)點(diǎn)是所有的單詞,構(gòu)造規(guī)則按照詞頻排序。

也就是說,現(xiàn)在輸入的單詞經(jīng)過W_{V*N}這個(gè)矩陣,轉(zhuǎn)化成了隱層的一堆參數(shù)。

這些參數(shù)輸入到一個(gè)Huffman樹中,最終期望它選到對(duì)應(yīng)的單詞。

這是不是很像決策樹?

當(dāng)然這個(gè)Huffman樹的結(jié)構(gòu)是已經(jīng)實(shí)現(xiàn)決定好的(按照詞頻)。

那么如何決定每個(gè)節(jié)點(diǎn)的選擇的呢?如何判斷在某個(gè)節(jié)點(diǎn)上是往左走還是往右走?

實(shí)際上,在每個(gè)節(jié)點(diǎn)上,都有一組不同的參數(shù)\theta _{i},我們?cè)O(shè)隱層的參數(shù)是x_{w} ,那么到第i個(gè)節(jié)點(diǎn)上,由sigmoid函數(shù)決定往左走還是往右走:


而Hierarchical softmax的好處是加快了選擇的速度,同時(shí)它不會(huì)更改所有的節(jié)點(diǎn)的參數(shù)。

例如下面的例子:

如果groun truth(也就是正例)是would,那么Huffman編碼是11100,梯度下降會(huì)改變經(jīng)過的節(jié)點(diǎn)上的參數(shù)?θ?,而不會(huì)改變其他參數(shù)。

而傳統(tǒng)的Softmax則是調(diào)整了所有的參數(shù)的。

我們?cè)僬f回來,Hierarchical softmax為什么更快?

傳統(tǒng)的Softmax要計(jì)算下面的式子:

而當(dāng)V很大的時(shí)候, 其計(jì)算量是非常大的。

但是在Hierarchical softmax中,我們只需要計(jì)算有限個(gè)e^{W^{T}_{x}}\theta _{i},這樣就減少了計(jì)算量,同時(shí)因?yàn)椴粫?huì)更改其他的θ,因此更有優(yōu)勢(shì)。

2.Negative Sampling

Negative Sampling和Hierarchical softmax的想法類似,也是想只更新一部分參數(shù)

負(fù)采樣這個(gè)詞在神經(jīng)網(wǎng)絡(luò)中并不經(jīng)常出現(xiàn)。因?yàn)橥ǔ5姆诸惾蝿?wù)中并沒有負(fù)采樣的概念。

在分類任務(wù)中,我們用one-hot表示類別,我們通過極大似然優(yōu)化網(wǎng)絡(luò)參數(shù),自然希望y_{k}的值盡可能大,而其他的y_{i}的值都變小。

這意味這,在傳統(tǒng)的Softmax中,如果我們的vocabulary大小為10000時(shí),在輸出層,我們期望某一個(gè)神經(jīng)元結(jié)點(diǎn)輸出1,其余9999個(gè)都應(yīng)該輸出0。在這里,這9999個(gè)我們期望輸出為0的神經(jīng)元結(jié)點(diǎn)所對(duì)應(yīng)的單詞我們稱為negative word

而Negative Sampling的想法是不全部計(jì)算所有的negative word,只從中采樣一部分進(jìn)行計(jì)算。我們?cè)谡麄€(gè)字典中采樣?K個(gè)詞作為負(fù)樣本,用原來的target word作為正樣本,就得到了K+1個(gè)樣本。接下來,我們依舊需要N×V個(gè)參數(shù),但是它們不再整體作為Softmax的一部分了,而是分別形成V個(gè)Sigmoid

接下來就很簡(jiǎn)單了,我們只要對(duì)K+1個(gè)Sigmoid更新參數(shù)就可以了。

隨著對(duì)Sigmoid參數(shù)的更新,經(jīng)過反向傳播過程,前面的W_{V*N}矩陣也會(huì)被更新,這就起到了訓(xùn)練的作用。

而K個(gè)負(fù)樣本的選擇也是有說道的,往往按照詞頻選擇。(這體現(xiàn)了Negative Sampling和Hierarchical softmax的相似之處)

設(shè) f(w_{i}) 是第i個(gè)詞的頻率,這個(gè)詞被選擇到的概率為:

當(dāng)然這個(gè)3/4完全是經(jīng)驗(yàn)上的數(shù)值。

Negative Sampling之所以有效,還是因?yàn)槲覀冏钋懊嬲f到的,這個(gè)模型根本用不著真的去分類,而它的副產(chǎn)品——詞向量矩陣 W_{V*N}才是我們需要的。


參考:

https://zhuanlan.zhihu.com/p/61635013

https://zhuanlan.zhihu.com/p/95204186

https://zhuanlan.zhihu.com/p/26306795

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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