只說人話,不砌公式,讓非數(shù)學(xué)專業(yè)讀者能看明白的Word2Vec废恋。
1. Word2Vec的作用
顧名思義,Word2Vec就是把單詞轉(zhuǎn)換成向量扒寄。它本質(zhì)上是一種單詞聚類的方法鱼鼓,是實(shí)現(xiàn)單詞語義推測(cè)、句子情感分析等目的一種手段该编。
選取訓(xùn)練后的單詞向量的其中任意3個(gè)維度迄本,放到坐標(biāo)系中展示,會(huì)發(fā)現(xiàn)語義相似的詞匯在空間坐標(biāo)中的位置會(huì)十分接近课竣,而語義無關(guān)的詞之間則相距較遠(yuǎn)嘉赎。這種性質(zhì)可以用來對(duì)單詞和句子進(jìn)行更加泛化的分析置媳。
一些研究還發(fā)現(xiàn),計(jì)算有相似關(guān)系的單詞之間的位移向量也會(huì)十分相似公条,例如從“Man”到“Wonman”的向量拇囊,與從“King”到“Queen”之間的向量幾乎相同。這對(duì)語言和語義學(xué)的研究提供一種新的途徑靶橱。
關(guān)于更多Word2Vec的應(yīng)用場(chǎng)景寥袭,請(qǐng)看:
知乎:word2vec有什么應(yīng)用?
CSDN:深度學(xué)習(xí)word2vec筆記之應(yīng)用篇
2. 傳統(tǒng)方法
單詞變向量其實(shí)可以不通過神經(jīng)網(wǎng)絡(luò)直接得到抓韩。假設(shè)我們有一個(gè)足夠大的語料庫(其中包含各種各樣的句子纠永,比如維基百科詞庫就是很好的語料來源),通常語義比較接近的詞周邊經(jīng)常出現(xiàn)的詞也應(yīng)該差不多谒拴,所以判斷一個(gè)詞和哪些詞比較像尝江,就是找到這個(gè)詞周圍的詞和哪些詞周圍的詞比較像。那么最笨(但很管用)的辦法莫過于將語料庫里的所有句子掃描一遍英上,挨個(gè)數(shù)出每個(gè)單詞周圍出現(xiàn)其它單詞的次數(shù)炭序,做成下面這樣的表格就可以了。
做這個(gè)表格時(shí)候苍日,語料庫里的單詞量可能多大幾十萬種惭聂,做這么大的表格實(shí)在太費(fèi)勁。實(shí)際的做法是只選出其中一部分詞匯(比如統(tǒng)計(jì)出在語料庫里詞頻最高的一部分詞匯)相恃,其余(出現(xiàn)頻率很低)的詞都用一個(gè)特殊符號(hào)代替掉辜纲。比如選5萬個(gè)詞,把這個(gè)表格保存成矩陣拦耐,就是5萬x5萬的矩陣耕腾,矩陣的每行就是相應(yīng)詞的一個(gè)5萬維向量表示。有了空間向量杀糯,兩個(gè)詞的關(guān)系就可以用數(shù)學(xué)關(guān)系表示了扫俺,比如向量的距離和相對(duì)空間關(guān)系。
但是這個(gè)向量實(shí)在太大固翰,并且過于稀疏狼纬,且不說矩陣中的絕大多數(shù)數(shù)據(jù)都是0,光是計(jì)算兩個(gè)詞的距離就需要5萬次減法骂际、5萬次乘法疗琉、49999次加法以及1次開方。所以在真正用的時(shí)候歉铝,還需要對(duì)向量進(jìn)行降維(主成分分析)處理没炒。方形矩陣的主成分分析可以使用特征值分解或者奇異值分解實(shí)現(xiàn),比如保留特征最大的50個(gè)分量,最終得到5萬x50的矩陣送火,每個(gè)詞的向量就只有50維,并且最大化的保留了各矩陣之間的位置關(guān)系先匪。這個(gè)矩陣被稱為“嵌入(Embedding)矩陣”种吸。
關(guān)于主成分分析以后另起一篇文章介紹,先推薦兩篇網(wǎng)絡(luò)上寫得比較好的:
主成分分析降維(MNIST數(shù)據(jù)集)
強(qiáng)大的矩陣奇異值分解(SVD)及其應(yīng)用
看起來不錯(cuò)呀非,不過計(jì)算這樣的一個(gè)原始矩陣需要多少內(nèi)存呢坚俗?假設(shè)矩陣的每個(gè)數(shù)字都用標(biāo)準(zhǔn)32位Int表示,那么完整保存一個(gè)5萬x5萬維的矩陣岸裙,大約需要10,000,000,000個(gè)byte猖败,也就是10GB的內(nèi)存(且隨著詞匯量增加程平方倍增長,漢語常用詞匯大約有20萬個(gè))降允。雖然還有一些優(yōu)化的空間恩闻,比如說使用稀疏矩陣來保存這些數(shù)據(jù),即便如此剧董,在性能和內(nèi)存開銷上依然差強(qiáng)人意幢尚。從最終結(jié)果來看,我們其實(shí)想要的那個(gè)降維后的嵌入矩陣翅楼,有沒辦法不要生成這個(gè)原始矩陣尉剩,直接得到嵌入矩陣呢?使用傳統(tǒng)的方法是辦不到了毅臊。
3. 神經(jīng)網(wǎng)絡(luò)
既然傳統(tǒng)方法做不了理茎,只能另辟蹊徑。這個(gè)時(shí)候Google發(fā)表的一篇論文祭出了神經(jīng)網(wǎng)絡(luò)大法管嬉,論文原文見這個(gè)鏈接:
Exploiting Similarities among Languages for Machine Translation
這個(gè)論文里的模型后來被人們稱為“Word2Vec”皂林,其實(shí)是因?yàn)镚oogle論文開源的Git代碼倉庫名字就叫叫“Word2Vec”。在論文里的計(jì)算模型包括兩種:Continuous Bag of Words(CBOW)和Skip-Gram宠蚂,別看這兩個(gè)模型名字相差這么大式撼,在論文的附圖里看起來也差別那么大,其實(shí)兩者在實(shí)現(xiàn)上的差別僅僅是調(diào)換一下訓(xùn)練詞和目標(biāo)詞的位置求厕。除去代碼和模型里面的一些算法優(yōu)化部分著隆,Word2Vec的最簡單版本,可以認(rèn)為是邏輯回歸網(wǎng)絡(luò)的一種變形呀癣。
以CBOW為例美浦,還是每次挨個(gè)把語料庫的詞取出來,作為該次訓(xùn)練的目標(biāo)项栏,然后把這個(gè)詞所在位置的前后N個(gè)詞(N通常用1或者2浦辨,數(shù)字越大學(xué)習(xí)到的模型信息量越豐富,但需要的訓(xùn)練時(shí)間越長)依次作為訓(xùn)練的輸入沼沈。比如N值為2流酬,每取出一個(gè)詞(作為中心詞)币厕,就要使用該詞的前后各2個(gè)詞(作為環(huán)境詞),分別放到網(wǎng)絡(luò)訓(xùn)練一次芽腾,一共要取4個(gè)環(huán)境詞旦装。還是以識(shí)別5萬個(gè)詞的向量為例,具體訓(xùn)練過程如下:
- 首先預(yù)處理數(shù)據(jù)摊滔,把所有需要進(jìn)行訓(xùn)練的詞匯編上序號(hào)阴绢,比如1-50000
- 隨機(jī)初始化一個(gè)維度為50000x50的矩陣,作為待訓(xùn)練的嵌入矩陣
- 每次取出一個(gè)中心詞和它的其中一個(gè)環(huán)境詞
- 以環(huán)境詞編號(hào)作行數(shù)艰躺,從詞向量矩陣?yán)锶〕鲞@一行數(shù)據(jù)(50維向量)
- 將這個(gè)50維向量作為邏輯回歸網(wǎng)絡(luò)的輸入呻袭,訓(xùn)練目標(biāo)是中心詞編號(hào)相應(yīng)的One-Hot向量
- 在訓(xùn)練的反向傳播時(shí)計(jì)算,不但更新邏輯回歸網(wǎng)絡(luò)的權(quán)重矩陣腺兴,還要往前多傳遞一級(jí)左电,把取出的50維向量的值也根據(jù)目標(biāo)梯度進(jìn)行更新
- 將更新過的50維向量重新更新到嵌入矩陣相應(yīng)的行
- 重復(fù)以上過程,直到所有的中心詞都已經(jīng)被遍歷一遍含长,此時(shí)嵌入矩陣值的計(jì)算就完成了
你沒看錯(cuò)券腔,那個(gè)50000x50維的向量就是嵌入矩陣,整個(gè)訓(xùn)練過程就是直接對(duì)這個(gè)矩陣進(jìn)行更新拘泞。Skip-Gram的算法就是把第3步的輸入詞和第4步的目標(biāo)詞對(duì)調(diào)一下纷纫。雖然對(duì)于生成嵌入矩陣而言,兩種方法效果基本相同(統(tǒng)計(jì)數(shù)據(jù)表明陪腌,Skip-gram在訓(xùn)練數(shù)據(jù)量較大時(shí)得到的詞向量效果比CBOW略佳)辱魁,需要指出的是兩種模型本身所蘊(yùn)含的意義是不太一樣的。CBOW用環(huán)境詞預(yù)測(cè)中心詞诗鸭,得到邏輯回歸網(wǎng)絡(luò)可以用來預(yù)測(cè)類似“一句話中缺少了一個(gè)單詞染簇,這個(gè)單詞最可能是什么”這樣的問題。而Skip-Gram使用中心詞來預(yù)測(cè)環(huán)境詞强岸,因此它可以用來預(yù)測(cè)類似“給定一個(gè)單詞锻弓,它周邊最可能出現(xiàn)哪些單詞”的問題。
由于神經(jīng)網(wǎng)絡(luò)計(jì)算過程的模糊性蝌箍,對(duì)Work2Vec和其他同類實(shí)現(xiàn)的效果曾經(jīng)有過一些爭(zhēng)議青灼,但隨后就有些第三方機(jī)構(gòu)提供了測(cè)試數(shù)據(jù)來支撐Word2Vec理論的可靠性。其中比較有意思的是2014在美國計(jì)算機(jī)語言學(xué)協(xié)會(huì)年度會(huì)議上提出的論文《Don’t count, predict!》
4. 真實(shí)的Word2Vec
前面部分介紹的簡化版Word2Vec過程實(shí)際上是為了便于大家理解而概括出來的妓盲。這個(gè)理想的模型當(dāng)中存在一些無法回避的問題杂拨,比如輸出的部分是一個(gè)50000維的One-Hot向量,因此數(shù)據(jù)經(jīng)過網(wǎng)絡(luò)后應(yīng)該得到的也是一個(gè)50000維的向量悯衬,對(duì)這個(gè)輸出向量進(jìn)行Softmax計(jì)算所需的工作量將是一個(gè)天文數(shù)字弹沽。
Google論文里真實(shí)實(shí)現(xiàn)的Word2Vec對(duì)模型提出了兩種改進(jìn)思路,即Hierarchical Softmax模型和Negative Sampling模型。
Hierarchical Softmax是用輸出值的霍夫曼編碼代替原本的One-Hot向量策橘,用霍夫曼樹替代Softmax的計(jì)算過程炸渡。
Negative Sampling(簡稱NEG)使用隨機(jī)采用替代Softmax計(jì)算概率,它是另一種更嚴(yán)謹(jǐn)?shù)某闃幽P蚇CE的簡化版本役纹。
關(guān)于Hierarchical Softmax和Negative Sampling的原理細(xì)節(jié)(包含太多數(shù)學(xué)公式偶摔,白話不出來了,誰要能幫我把這部分講清楚促脉,我請(qǐng)吃飯_)可參看以下文章:
word2vec 代碼實(shí)現(xiàn)(1) – Skip gram
word2vec 代碼實(shí)現(xiàn)(2) – CBOW
word2vec原理篇
深度學(xué)習(xí)word2vec筆記之算法篇
將這兩種算法與前面的兩個(gè)模型組合,在Google的論文里一共包含了4種Word2Vec的實(shí)現(xiàn)策州。
- Hierarchical Softmax CBOW 模型
- Hierarchical Softmax Skip-Gram 模型
- Negative Sampling CBOW 模型
- Negative Sampling Skip-Gram 模型
在Tensorflow里最常見的實(shí)現(xiàn)例子是Negative Sampling Skip-Gram瘸味,比如:
其中的抽樣算法封裝在了tf.nn.nce_loss
方法里面。
最后附上網(wǎng)絡(luò)上一個(gè)對(duì)Word2Vec講解比較具有系統(tǒng)性的系列博客“word2vec中的數(shù)學(xué)原理詳解”:
前言
預(yù)備知識(shí)
背景知識(shí)
基于 Hierarchical Softmax 的模型
基于 Negative Sampling 的模型
若干源碼細(xì)節(jié)