一.簡(jiǎn)介
Word2Vec是google在2013年推出的一個(gè)NLP工具翎朱,它的特點(diǎn)是能夠?qū)卧~轉(zhuǎn)化為向量來(lái)表示障涯,這樣詞與詞之間就可以定量的去度量他們之間的關(guān)系贸辈,挖掘詞之間的聯(lián)系。用詞向量來(lái)表示詞并不是Word2Vec的首創(chuàng)杂穷,在很久之前就出現(xiàn)了鸟废。最早的詞向量采用One-Hot編碼猜敢,又稱為一位有效編碼,每個(gè)詞向量維度大小為整個(gè)詞匯表的大小盒延,對(duì)于每個(gè)具體的詞匯表中的詞缩擂,將對(duì)應(yīng)的位置置為1。比如我們有下面的5個(gè)詞組成的詞匯表
采用One-Hot編碼方式來(lái)表示詞向量非常簡(jiǎn)單添寺,但缺點(diǎn)也是顯而易見的胯盯,一方面我們實(shí)際使用的詞匯表很大,經(jīng)常是百萬(wàn)級(jí)以上计露,這么高維的數(shù)據(jù)處理起來(lái)會(huì)消耗大量的計(jì)算資源與時(shí)間博脑。另一方面憎乙,One-Hot編碼中所有詞向量之間彼此正交,沒有體現(xiàn)詞與詞之間的相似關(guān)系叉趣。
Distributed representation可以解決One-Hot編碼存在的問題泞边,它的思路是通過訓(xùn)練,將原來(lái)One-Hot編碼的每個(gè)詞都映射到一個(gè)較短的詞向量上來(lái)疗杉,而這個(gè)較短的詞向量的維度可以由我們自己在訓(xùn)練時(shí)根據(jù)任務(wù)需要來(lái)自己指定阵谚。
下圖是采用Distributed representation的一個(gè)例子,我們將詞匯表里的詞用"Royalty","Masculinity", "Femininity"和"Age"4個(gè)維度來(lái)表示烟具,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ò)跟伏,詞向量表示即為矩陣(如下圖)。
隱層的激活函數(shù)其實(shí)是線性的翩瓜,相當(dāng)于沒做任何處理(這也是 Word2vec 簡(jiǎn)化之前語(yǔ)言模型的獨(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在大型語(yǔ)料中表現(xiàn)更好石洗。其中CBOW如下圖左部分所示幢泼,使用圍繞目標(biāo)單詞的其他單詞(語(yǔ)境)作為輸入,在映射層做加權(quán)處理后輸出目標(biāo)單詞劲腿。與CBOW根據(jù)語(yǔ)境預(yù)測(cè)目標(biāo)單詞不同旭绒,Skip-gram根據(jù)當(dāng)前單詞預(yù)測(cè)語(yǔ)境,如下圖右部分所示焦人。假如我們有一個(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)重矩陣,然后用所有輸入的One-Hot編碼詞向量左乘該矩陣,得到維數(shù)為N的向量 嚣艇,這里的N由自己根據(jù)任務(wù)需要設(shè)置。
3华弓、將所得的向量相加求平均作為隱藏層向量。
4寂屏、初始化另一個(gè)權(quán)重矩陣?,用隱藏層向量左乘贰谣,再經(jīng)激活函數(shù)處理得到V維的向量,的每一個(gè)元素代表相對(duì)應(yīng)的每個(gè)單詞的概率分布凑保。
5冈爹、中概率最大的元素所指示的單詞為預(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來(lái)預(yù)測(cè)上下文,其模型結(jié)構(gòu)如上圖所示岸更。它的做法是鸵膏,將一個(gè)詞所在的上下文中的詞作為輸出,而那個(gè)詞本身作為輸入怎炊,也就是說谭企,給出一個(gè)詞,希望預(yù)測(cè)可能出現(xiàn)的上下文的詞评肆。通過在一個(gè)大的語(yǔ)料庫(kù)訓(xùn)練债查,得到一個(gè)從輸入層到隱含層的權(quán)重模型」贤欤“apple”的上下文詞是(’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中一樣)。接下來(lái)具體介紹如何訓(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ì)的單詞來(lái)訓(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ù)來(lái)計(jì)算輸出各個(gè)詞的概率。但在實(shí)際應(yīng)用中這種方法的訓(xùn)練開銷很大鹊汛,不具有很強(qiáng)的實(shí)用性蒲赂,因?yàn)?b>Word2vec 本質(zhì)上是一個(gè)語(yǔ)言模型,它的輸出節(jié)點(diǎn)數(shù)是 V 個(gè)刁憋,對(duì)應(yīng)了 V 個(gè)詞語(yǔ)滥嘴,本質(zhì)上是一個(gè)多分類問題,但實(shí)際當(dāng)中至耻,詞語(yǔ)的個(gè)數(shù)非常非常多若皱,會(huì)給計(jì)算造成很大困難,所以需要用技巧來(lái)加速訓(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中凶硅,我們不再需要的部分了,變成了下面的樣子:
我們把傳統(tǒng)的Softmax換成Hierarchical softmax扫皱,而Hierarchical softmax由一個(gè)Huffman樹構(gòu)成足绅。這個(gè)Huffman樹的葉節(jié)點(diǎn)是所有的單詞,構(gòu)造規(guī)則按照詞頻排序韩脑。
也就是說氢妈,現(xiàn)在輸入的單詞經(jīng)過這個(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ù)杠人,我們?cè)O(shè)隱層的參數(shù)是 勋乾,那么到第個(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回來(lái),Hierarchical softmax為什么更快伺帘?
傳統(tǒng)的Softmax要計(jì)算下面的式子:
而當(dāng)V很大的時(shí)候昭躺, 其計(jì)算量是非常大的。
但是在Hierarchical softmax中伪嫁,我們只需要計(jì)算有限個(gè)领炫,這樣就減少了計(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ù)蛛芥,自然希望的值盡可能大,而其他的的值都變小军援。
這意味這仅淑,在傳統(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ù)樣本,用原來(lái)的target word作為正樣本哮内,就得到了K+1個(gè)樣本盗棵。接下來(lái),我們依舊需要個(gè)參數(shù)北发,但是它們不再整體作為Softmax的一部分了纹因,而是分別形成V個(gè)Sigmoid。
接下來(lái)就很簡(jiǎn)單了琳拨,我們只要對(duì)K+1個(gè)Sigmoid更新參數(shù)就可以了瞭恰。
隨著對(duì)Sigmoid參數(shù)的更新,經(jīng)過反向傳播過程狱庇,前面的矩陣也會(huì)被更新惊畏,這就起到了訓(xùn)練的作用。
而K個(gè)負(fù)樣本的選擇也是有說道的密任,往往按照詞頻選擇颜启。(這體現(xiàn)了Negative Sampling和Hierarchical softmax的相似之處)
設(shè)是第個(gè)詞的頻率,這個(gè)詞被選擇到的概率為:
當(dāng)然這個(gè)3/4完全是經(jīng)驗(yàn)上的數(shù)值浪讳。
Negative Sampling之所以有效缰盏,還是因?yàn)槲覀冏钋懊嬲f到的,這個(gè)模型根本用不著真的去分類,而它的副產(chǎn)品——詞向量矩陣 才是我們需要的口猜。
參考:
https://zhuanlan.zhihu.com/p/61635013
https://zhuanlan.zhihu.com/p/95204186
https://zhuanlan.zhihu.com/p/26306795