word2vec是google在2013年推出的一個NLP工具余佃,它是將所有的詞向量化暮刃,這樣詞與詞之間就可以定量的去度量他們之間的關(guān)系,挖掘詞之間的聯(lián)系爆土。
1 詞向量基礎(chǔ)
用詞向量來表示詞并不是word2vec的首創(chuàng)椭懊,在很久之前就出現(xiàn)了。最早的詞向量是很冗長的步势,它使用是詞向量維度大小為整個詞匯表的大小氧猬,對于每個具體的詞匯表中的詞,將對應(yīng)的位置置為1坏瘩。比如我們有下面的5個詞組成的詞匯表盅抚,詞"Queen"的序號為2, 那么它的詞向量就是(0,1,0,0,0)倔矾。同樣的道理妄均,詞"Woman"的詞向量就是(0,0,0,1,0)。這種詞向量的編碼方式我們一般叫做1-of-N representation或者one hot representation.
One hot?representation用來表示詞向量非常簡單哪自,但是卻有很多問題丰包。最大的問題是詞匯表一般都非常大,比如達到百萬級別壤巷,這樣每個詞都用百萬維的向量來表示簡直是內(nèi)存的災(zāi)難邑彪。這樣的向量其實除了一個位置是1,其余的位置全部都是0隙笆,表達的效率不高锌蓄。
能不能把詞向量的維度變小呢升筏?
Dristributed?representation可以解決One hot?representation的問題撑柔,它的思路是通過訓練,將每個詞都映射到一個較短的詞向量上來您访。所有的這些詞向量就構(gòu)成了向量空間铅忿,進而可以用普通的統(tǒng)計學的方法來研究詞與詞之間的關(guān)系。
這個較短的詞向量維度是多大呢灵汪?這個一般需要我們在訓練時自己來指定(比如200-300dim)檀训。
比如下圖我們將詞匯表里的詞用"Royalty","Masculinity", "Femininity"和"Age"4個維度來表示柑潦,King這個詞對應(yīng)的詞向量可能是(0.99,0.99,0.05,0.7)。當然在實際情況中峻凫,我們并不能對詞向量的每個維度做一個很好的解釋渗鬼。
有了用Dristributed?representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關(guān)系了荧琼,比如我們將詞的維度降維到2維譬胎,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時命锄,我們可以發(fā)現(xiàn)向量化的King?Man+Woman=Queen?
可見我們只要得到了詞匯表里所有詞對應(yīng)的詞向量堰乔,那么我們就可以做很多有趣的事情了。
不過脐恩,怎么訓練得到合適的詞向量呢镐侯?
一個很常見的方法是使用神經(jīng)網(wǎng)絡(luò)語言模型。
2 CBOW與Skip-Gram 用于神經(jīng)網(wǎng)絡(luò)語言模型
在word2vec出現(xiàn)之前驶冒,已經(jīng)有用深度神經(jīng)網(wǎng)絡(luò)(DNN)來用訓練詞向量進而處理詞與詞之間的關(guān)系了苟翻。采用的方法一般是一個三層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)(當然也可以多層),分為輸入層骗污,隱藏層和輸出層(softmax層)袜瞬。
這個模型是如何定義數(shù)據(jù)的輸入和輸出呢?
一般分為CBOW(Continuous Bag-of-Words?與 Skip-Gram 兩種模型身堡。從直觀上理解邓尤,Skip-Gram是給定input word來預(yù)測上下文。而CBOW是給定上下文贴谎,來預(yù)測input word汞扎。
CBOW模型的訓練輸入是某一個特征詞的上下文相關(guān)的詞對應(yīng)的詞向量,而輸出就是這特定的一個詞的詞向量擅这。
這樣我們這個CBOW的例子里结笨,我們的輸入是8個詞向量,輸出是所有詞的softmax概率(訓練的目標是期望訓練樣本特定詞對應(yīng)的softmax概率最大),對應(yīng)的CBOW神經(jīng)網(wǎng)絡(luò)模型輸入層有8個神經(jīng)元炕吸,輸出層有詞匯表大小個神經(jīng)元伐憾。隱藏層的神經(jīng)元個數(shù)我們可以自己指定。通過深度神經(jīng)網(wǎng)絡(luò)(DNN)的反向傳播算法赫模,我們可以求出DNN模型的參數(shù)树肃,同時得到所有的詞對應(yīng)的詞向量。這樣當我們有新的需求瀑罗,要求出某8個詞對應(yīng)的最可能的輸出中心詞時扫外,我們可以通過一次DNN前向傳播算法并通過softmax激活函數(shù)找到概率最大的詞對應(yīng)的神經(jīng)元即可。
Skip-Gram模型和CBOW的思路是反著來的廓脆,即輸入是特定的一個詞的詞向量筛谚,而輸出是特定詞對應(yīng)的上下文詞向量。還是上面的例子停忿,我們的上下文大小取值為4驾讲,?特定的這個詞"Learning"是我們的輸入,而這8個上下文詞是我們的輸出席赂。
這樣我們這個Skip-Gram的例子里吮铭,我們的輸入是特定詞, 輸出是softmax概率排前8的8個詞颅停,對應(yīng)的Skip-Gram神經(jīng)網(wǎng)絡(luò)模型輸入層有1個神經(jīng)元谓晌,輸出層有詞匯表大小個神經(jīng)元。隱藏層的神經(jīng)元個數(shù)我們可以自己指定癞揉。通過DNN的反向傳播算法纸肉,我們可以求出DNN模型的參數(shù),同時得到所有的詞對應(yīng)的詞向量喊熟。這樣當我們有新的需求柏肪,要求出某1個詞對應(yīng)的最可能的8個上下文詞時,我們可以通過一次DNN前向傳播算法得到概率大小排前8的softmax概率對應(yīng)的神經(jīng)元所對應(yīng)的詞即可芥牌。
以上就是神經(jīng)網(wǎng)絡(luò)語言模型中如何用CBOW與Skip-Gram來訓練模型與得到詞向量的大概過程烦味。但是這和word2vec中用CBOW與Skip-Gram來訓練模型與得到詞向量的過程有很多的不同。
word2vec為什么不用現(xiàn)成的DNN模型壁拉,要繼續(xù)優(yōu)化出新方法呢谬俄?
最主要的問題是DNN模型的這個處理過程非常耗時。我們的詞匯表一般在百萬級別以上弃理,這意味著我們DNN的輸出層需要進行softmax計算各個詞的輸出概率的的計算量很大溃论。
有沒有簡化一點點的方法呢?
3 Word2vec優(yōu)化之霍夫曼樹
word2vec使用了CBOW與Skip-Gram來訓練模型與得到詞向量案铺,但是并沒有使用傳統(tǒng)的深度神經(jīng)網(wǎng)絡(luò)(DNN)模型蔬芥。最先優(yōu)化使用的數(shù)據(jù)結(jié)構(gòu)是用霍夫曼樹來代替隱藏層和輸出層的神經(jīng)元梆靖。霍夫曼樹的葉子節(jié)點起到輸出層神經(jīng)元的作用控汉,葉子節(jié)點的個數(shù)即為詞匯表的大小笔诵。 而內(nèi)部節(jié)點則起到隱藏層神經(jīng)元的作用。
霍夫曼樹的建立其實并不難姑子,過程如下:
輸入:權(quán)值為(w1,w2,...wn)的n個節(jié)點
輸出:對應(yīng)的霍夫曼樹
? ? ? ? ? ? ? 1)將(w1,w2,...wn)看做是有n棵樹的森林乎婿,每個樹僅有一個節(jié)點。
2)在森林中選擇根節(jié)點權(quán)值最小的兩棵樹進行合并街佑,得到一個新的樹谢翎,這兩顆樹分布作為新樹的左右子樹。新樹的根節(jié)點權(quán)重為左右子樹的根節(jié)點權(quán)重之和沐旨。
3) 將之前的根節(jié)點權(quán)值最小的兩棵樹從森林刪除森逮,并把新樹加入森林。
4)重復步驟2)和3)直到森林里只有一棵樹為止磁携。
下面我們用一個具體的例子來說明霍夫曼樹建立的過程褒侧,我們有(a,b,c,d,e,f)共6個節(jié)點,節(jié)點的權(quán)值分布是(16,4,8,6,20,3)谊迄。
首先是最小的b和f合并闷供,得到的新樹根節(jié)點權(quán)重是7.此時森林里5棵樹,根節(jié)點權(quán)重分別是16,8,6,20,7统诺。此時根節(jié)點權(quán)重最小的6,7合并歪脏,得到新子樹,依次類推粮呢,最終得到下面的霍夫曼樹婿失。
那么霍夫曼樹有什么好處呢?
一般得到霍夫曼樹后我們會對葉子節(jié)點進行霍夫曼編碼啄寡,由于權(quán)重高的葉子節(jié)點越靠近根節(jié)點移怯,而權(quán)重低的葉子節(jié)點會遠離根節(jié)點,這樣我們的高權(quán)重節(jié)點編碼值較短这难,而低權(quán)重值編碼值較長舟误。這保證的樹的帶權(quán)路徑最短,也符合我們的信息論姻乓,即我們希望越常用的詞擁有更短的編碼嵌溢。如何編碼呢?一般對于一個霍夫曼樹的節(jié)點(根節(jié)點除外)蹋岩,可以約定左子樹編碼為0赖草,右子樹編碼為1.如上圖,則可以得到c的編碼是00剪个。
在word2vec中秧骑,約定編碼方式和上面的例子相反,即約定左子樹編碼為1,右子樹編碼為0乎折,同時約定左子樹的權(quán)重不小于右子樹的權(quán)重绒疗。?
4 Word2vec優(yōu)化之Hierarchical Softmax
使用神經(jīng)網(wǎng)絡(luò)的方法來得到詞向量語言模型的原理和一些問題,現(xiàn)在我們開始關(guān)注word2vec的語言模型如何改進傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)的方法骂澄。由于word2vec有兩種改進方法吓蘑,一種是基于Hierarchical Softmax的,另一種是基于Negative Sampling的坟冲。
5 Word2vec優(yōu)化之Negative Sampling
5.1 Hierarchical Softmax的缺點與改進
在講基于Negative Sampling的word2vec模型前磨镶,我們先看看Hierarchical Softmax的的缺點。的確健提,使用霍夫曼樹來代替?zhèn)鹘y(tǒng)的神經(jīng)網(wǎng)絡(luò)琳猫,可以提高模型訓練的效率。但是如果我們的訓練樣本里的中心詞w是一個很生僻的詞私痹,那么就得在霍夫曼樹中辛苦的向下走很久脐嫂。
能不能不用搞這么復雜的一顆霍夫曼樹,將模型變的更加簡單呢侄榴?
Negative Sampling就是這么一種求解word2vec模型的方法雹锣,它摒棄了霍夫曼樹,采用了Negative Sampling(負采樣)的方法來求解癞蚕,下面我們就來看看Negative Sampling的求解思路蕊爵。
5.2 基于Negative Sampling的模型概述
既然名字叫Negative Sampling(負采樣),那么肯定使用了采樣的方法桦山。采樣的方法有很多種攒射,比如大名鼎鼎的MCMC。我們這里的Negative Sampling采樣方法并沒有MCMC那么復雜恒水。
比如我們有一個訓練樣本会放,中心詞是w,它周圍上下文共有2c個詞,記為context(w)钉凌。由于這個中心詞w咧最,的確和context(w)相關(guān)存在,因此它是一個真實的正例御雕。通過Negative Sampling采樣矢沿,我們得到neg個和w不同的中心詞wi,i=1,2,..neg,這樣context(w)和$$w_i$就組成了neg個并不真實存在的負例酸纲。利用這一個正例和neg個負例捣鲸,我們進行二元邏輯回歸,得到負采樣對應(yīng)每個詞$w_i$對應(yīng)的模型參數(shù)$\theta_{i}$闽坡,和每個詞的詞向量栽惶。
從上面的描述可以看出愁溜,Negative Sampling由于沒有采用霍夫曼樹,每次只是通過采樣neg個不同的中心詞做負例外厂,就可以訓練模型冕象,因此整個過程要比Hierarchical Softmax簡單。
不過有兩個問題還需要弄明白:1)如果通過一個正例和neg個負例進行二元邏輯回歸呢酣衷? 2) 如何進行負采樣呢交惯?
參考
CS224n筆記2 詞的向量表示:word2vec: http://www.hankcs.com/nlp/word-vector-representations-word2vec.html
word2vec原理(一) CBOW與Skip-Gram模型基礎(chǔ): https://www.cnblogs.com/pinard/p/7160330.html?