前言
首先推薦一個(gè)英文版的Word2Vec的教程们豌,從原理到實(shí)現(xiàn)都講得十分透徹和清晰弟头。它分為了幾個(gè)部分講,當(dāng)時(shí)我也是看的這個(gè)教程入門的踩验,建議英文比較好的同學(xué)可以參考一下鸥诽。本文創(chuàng)作的目的也是想寫一個(gè)類似這樣的教程,達(dá)到一文理解Word2Vec的目的箕憾。
為什么要表示詞(Why Embdding?)
在進(jìn)行自然語言處理方面的研究時(shí)牡借,特別時(shí)在使用深度學(xué)習(xí)方法的時(shí)候,我們幾乎不可能直接將每個(gè)詞輸入到模型中袭异,因?yàn)橛?jì)算機(jī)看不懂一個(gè)一個(gè)的字符串钠龙,因此需要將詞用數(shù)字表示(通常是向量),以讓機(jī)器能夠讀懂御铃,理解自然語言碴里。表征得是否易懂,信息是否足夠等都是Embedding需要考慮的因素上真。下面介紹兩種表示詞的方法以加深理解咬腋。
詞嵌入的兩種方式
我這里標(biāo)題使用了詞嵌入的說法,我認(rèn)為是指將每個(gè)詞背后的語義信息嵌入到了詞向量中睡互,所以叫嵌入根竿,還是很形象的 :)陵像。
One-Hot表示
估計(jì)是每個(gè)NLPer最先接觸到的表征方式了。
它是這么做的:
- 統(tǒng)計(jì)一下語料庫里一共有多少不重復(fù)的詞(假設(shè)為N個(gè)詞)寇壳。
- 初始化一個(gè)N維的0向量(每一維代表一個(gè)詞)醒颖。
- 哪一維為1,表示這個(gè)向量代表哪個(gè)詞壳炎。
十分簡(jiǎn)單泞歉,但問題也十分明顯。
1.維度太大匿辩,又很稀疏腰耙,一個(gè)幾萬維的向量只有一個(gè)1,感受一下撒汉。
2.沒有啥信息量沟优,只能簡(jiǎn)單區(qū)分出兩個(gè)單詞。
Word2Vec
Word2Vec在13年橫空出世睬辐,幾乎那以后的所有文章都以Word2Vec為基礎(chǔ)挠阁,這篇文章的引用在今天(18年11月)已經(jīng)有8318了:)。足以說明它有多強(qiáng)悍溯饵。
先看一眼Word2Vec訓(xùn)練出來的詞向量:
稠不稠侵俗?密不密?除了解決了稠密性問題丰刊,而且這些向量的維度也一般控制在低維隘谣。(50-300維這樣)因此在輸入到后續(xù)模型時(shí)不需要太擔(dān)心性能問題。
此外這些詞還包含了豐富的語義信息啄巧,相似的詞的詞向量一般距離會(huì)比較近寻歧,還有就是那個(gè)經(jīng)典的例子:
Queen - Woman = King - Man
總之,Word2Vec學(xué)到了詞語的稠密低維表示秩仆,又蘊(yùn)含有較多的語義信息码泛。
Word2Vec原理
Word2Vec有兩種實(shí)現(xiàn)方式,Skip-gram 和 CBOW澄耍。本文以Skip-gram為例進(jìn)行講解噪珊,CBOW其實(shí)和Skip-gram的區(qū)別很小,理解了Skip-gram齐莲,CBOW也就理解了痢站。
很多文章都以一個(gè)三層的神經(jīng)網(wǎng)絡(luò)來介紹Word2Vec的原理,本文嘗試以另外一個(gè)視角進(jìn)行理解选酗,但其實(shí)質(zhì)都是一樣的阵难。
任務(wù)
首先明確一下Word2Vec的任務(wù)是什么。為了使得相似的詞有相似的詞向量星掰,而相似的詞往往有相似的語境多望,因此Skip-gram采用了預(yù)測(cè)背景詞作為任務(wù)嫩舟。
例如氢烘,當(dāng)輸入詞“York”怀偷,與“New”,“Slow”, "Flower"這些詞比較的時(shí)候播玖,我的模型需要告訴我“New”與"York"一起出現(xiàn)的可能性較大椎工,而與“Slow”和"Flower"同時(shí)出現(xiàn)的可能性較小。
Skip-gram使用了很簡(jiǎn)單的方式來完成這個(gè)任務(wù)蜀踏。
構(gòu)造數(shù)據(jù)集
以上面的句子為例维蒙,給出了"York"希望模型預(yù)測(cè)"New"的概率要大一些。"York"就是輸入果覆,"New"就是label颅痊,標(biāo)簽。我們首先需要在給定的語料中構(gòu)建這樣的數(shù)據(jù)集局待。
Skip-gram字面上就是跳過gram斑响,這里跳過的是模型的輸入,即中心詞钳榨,需要預(yù)測(cè)的是附近(window size內(nèi)的)的詞舰罚。
上圖中的window size設(shè)為了2,表示將前2和后2的詞作為標(biāo)簽薛耻,中心詞作為輸入营罢,來構(gòu)建數(shù)據(jù)集。
訓(xùn)練
先提出一個(gè)假設(shè):
每個(gè)詞有兩個(gè)詞向量,一個(gè)稱為中心詞向量,一個(gè)稱為背景詞向量
如果有N個(gè)詞淋肾,為每個(gè)詞隨機(jī)初始化兩個(gè)詞向量跳昼,因此最終我們有2*N個(gè)詞向量需要訓(xùn)練。
再提出一個(gè)規(guī)則:
同一個(gè)詞胚鸯,作為輸入(中心詞)時(shí),使用中心詞向量,作為輸出(背景詞)時(shí)伙菊,使用背景詞向量。
現(xiàn)在我們來看輸入一個(gè)樣本(New, York)時(shí)的訓(xùn)練過程:
訓(xùn)練時(shí)敌土,將New的中心詞向量镜硕,分別與所有詞的背景詞向量進(jìn)行點(diǎn)積。假設(shè)有N個(gè)詞返干,那么這一步操作將會(huì)產(chǎn)生N個(gè)值兴枯,然后再將這N個(gè)值進(jìn)行Softmax歸一化。最終將N個(gè)值轉(zhuǎn)換為輸入New矩欠,輸出每個(gè)詞的概率财剖。
例如:假設(shè)Dot("New", "Man")=42悠夯,歸一化后P("New", "Man")=0.001,意味著輸入“New”躺坟,輸出“Man”的概率是0.001沦补。
但是別忘了,輸入的訓(xùn)練樣本是("New", "York")咪橙,因此我們希望提升P("New", "York")夕膀,打壓P("New", “其他所有詞”)。這樣美侦,這個(gè)樣本就訓(xùn)練完了产舞。需要強(qiáng)調(diào)的是,此時(shí)"New"用的是它的中心詞向量菠剩,而“其他所有詞”使用的是背景詞向量易猫。
后續(xù)
到目前為止,本文介紹了Word2Vec是什么具壮,能做什么准颓,以及它是怎么訓(xùn)練的。但是一些訓(xùn)練中的細(xì)節(jié)還未涉及到嘴办,而這些細(xì)節(jié)也是Word2Vec能夠work的關(guān)鍵瞬场,比如這么大的模型怎么才能train起來?10000個(gè)詞的200維詞向量就需要有200100002 = 4000000個(gè)參數(shù)涧郊。這些細(xì)節(jié)將在一文理解Word2Vec-part2會(huì)進(jìn)行介紹贯被。其實(shí)這樣的訓(xùn)練方式不止Google想到了,甚至可能有其他的研究人員在他們之前想到這樣的做法妆艘,但是只有Google把細(xì)節(jié)做到了極致彤灶,才有了今天的Word2Vec。