在各種大舉深度學(xué)習(xí)大旗的公司中蔗彤,Google公司無(wú)疑是旗舉得最高的息裸,口號(hào)喊得最響亮的那一個(gè)乎芳。2013年末,Google發(fā)布的word2vec工具引起了一幫人的熱捧苦始,大家?guī)缀醵颊J(rèn)為它是深度學(xué)習(xí)在自然語(yǔ)言領(lǐng)域的一項(xiàng)了不起的應(yīng)用寞钥,各種歡呼“深度學(xué)習(xí)在自然語(yǔ)言領(lǐng)域開(kāi)始發(fā)力了”,互聯(lián)網(wǎng)界很多公司也開(kāi)始跟進(jìn)陌选,使用word2vec產(chǎn)出了不少成果理郑,所有我們很有必要學(xué)會(huì)使用word2vec,讓其成為自己的工具咨油,去開(kāi)拓未知的世界您炉。
首先我們需要了解什么叫做詞向量:
自然語(yǔ)言處理(NLP)相關(guān)任務(wù)中,要將自然語(yǔ)言交給機(jī)器學(xué)習(xí)中的算法來(lái)處理役电,通常需要首先將語(yǔ)言數(shù)學(xué)化邻吭,因?yàn)闄C(jī)器不是人,機(jī)器只認(rèn)數(shù)學(xué)符號(hào)宴霸。向量是人把自然界的東西抽象出來(lái)交給機(jī)器處理的東西,基本上可以說(shuō)向量是人對(duì)機(jī)器輸入的主要方式膏蚓。
詞向量就是用來(lái)將語(yǔ)言中的詞進(jìn)行數(shù)學(xué)化的一種方式瓢谢,顧名思義,詞向量就是把一個(gè)詞表示成一個(gè)向量驮瞧。而表示的方式主要有兩種氓扛,下面一一介紹。
一種最簡(jiǎn)單的詞向量方式是one-hotrepresentation论笔,就是用一個(gè)很長(zhǎng)的向量來(lái)表示一個(gè)詞采郎,向量的長(zhǎng)度為詞典的大小,向量的分量只有一個(gè) 1狂魔,其他全為 0蒜埋, 1 的位置對(duì)應(yīng)該詞在詞典中的位置。比如:
'中國(guó)'表示為 [00010000000......]
'美國(guó)'表死為[0000000010000...]
每個(gè)詞都是茫茫 0 海中的一個(gè) 1最楷。這種 One-hotRepresentation 如果采用稀疏方式存儲(chǔ)整份,會(huì)是非常的簡(jiǎn)潔:也就是給每個(gè)詞分配一個(gè)數(shù)字 ID。比如剛才的例子中籽孙,中國(guó)記為 3烈评,美國(guó)記為 8(假設(shè)從 0 開(kāi)始記)。如果要編程實(shí)現(xiàn)的話(huà)犯建,用 Hash 表給每個(gè)詞分配一個(gè)編號(hào)就可以了讲冠。這么簡(jiǎn)潔的表示方法配合上最大熵、SVM适瓦、CRF 等等算法已經(jīng)很好地完成了 NLP 領(lǐng)域的各種主流任務(wù)竿开。
但這種詞表示有兩個(gè)缺點(diǎn):(1)容易受維數(shù)災(zāi)難的困擾谱仪,尤其是將其用于 Deep Learning 的一些算法時(shí);(2)不能很好地刻畫(huà)詞與詞之間的相似性(術(shù)語(yǔ)好像叫做“詞匯鴻溝”):任意兩個(gè)詞之間都是孤立的德迹。光從這兩個(gè)向量中看不出兩個(gè)詞是否有關(guān)系芽卿,哪怕是丈夫和老公這樣的同義詞也不能幸免于難。所以會(huì)尋求發(fā)展胳搞,用另外的方式表示卸例,就是下面這種。
另一種就是DistributedRepresentation 這種表示肌毅,它最早是 Hinton 于 1986 年提出的筷转,可以克服 one-hot representation 的缺點(diǎn)。其基本想法是直接用一個(gè)普通的向量表示一個(gè)詞悬而,這種向量一般長(zhǎng)成這個(gè)樣子:[0.792, ?0.177, ?0.107, 0.109, ?0.542, ...]呜舒,也就是普通的向量表示形式。維度以 50 維和 100 維比較常見(jiàn)笨奠。
當(dāng)然一個(gè)詞怎么表示成這么樣的一個(gè)向量是要經(jīng)過(guò)一番訓(xùn)練的袭蝗,訓(xùn)練方法較多,word2vec是其中一種般婆,在后面會(huì)提到到腥,這里先說(shuō)它的意義。還要注意的是每個(gè)詞在不同的語(yǔ)料庫(kù)和不同的訓(xùn)練方法下蔚袍,得到的詞向量可能是不一樣的乡范。
詞向量一般維數(shù)不高,很少有人閑著沒(méi)事訓(xùn)練的時(shí)候定義一個(gè)10000維以上的維數(shù)啤咽,所以用起來(lái)維數(shù)災(zāi)難的機(jī)會(huì)現(xiàn)對(duì)于one-hot representation表示就大大減少了晋辆。
由于是用向量表示,而且用較好的訓(xùn)練算法得到的詞向量的向量一般是有空間上的意義的宇整,也就是說(shuō)瓶佳,將所有這些向量放在一起形成一個(gè)詞向量空間,而每一向量則為該空間中的一個(gè)點(diǎn)鳞青,在這個(gè)空間上的詞向量之間的距離度量也可以表示對(duì)應(yīng)的兩個(gè)詞之間的“距離”涩哟。所謂兩個(gè)詞之間的“距離”,就是這兩個(gè)詞之間的語(yǔ)法盼玄,語(yǔ)義之間的相似性贴彼。
一個(gè)比較實(shí)用的場(chǎng)景是找同義詞,得到詞向量后埃儿,假如對(duì)于詞老婆來(lái)說(shuō)器仗,想找出與這個(gè)詞相似的詞,這個(gè)場(chǎng)景對(duì)人來(lái)說(shuō)都不輕松,畢竟比較主觀精钮,但是對(duì)于建立好詞向量后的情況威鹿,對(duì)計(jì)算機(jī)來(lái)說(shuō),只要拿這個(gè)詞的詞向量跟其他詞的詞向量一一計(jì)算歐式距離或者cos距離轨香,得到距離小于某個(gè)值那些詞忽你,就是它的同義詞。
這個(gè)特性使詞向量很有意義臂容,自然會(huì)吸引很多人去研究科雳,google的word2vec模型也是基于這個(gè)做出來(lái)的。
google的word2vec模型使用在機(jī)器翻譯領(lǐng)域無(wú)疑是一個(gè)很成功的實(shí)例脓杉。比如:
考慮英語(yǔ)和西班牙語(yǔ)兩種語(yǔ)言糟秘,通過(guò)訓(xùn)練分別得到它們對(duì)應(yīng)的詞向量空間 E 和 S。從英語(yǔ)中取出五個(gè)詞 one球散,two尿赚,three,four蕉堰,five凌净,設(shè)其在 E 中對(duì)應(yīng)的詞向量分別為 v1,v2屋讶,v3冰寻,v4,v5丑婿,為方便作圖,利用主成分分析(PCA)降維没卸,得到相應(yīng)的二維向量 u1羹奉,u2,u3约计,u4诀拭,u5,在二維平面上將這五個(gè)點(diǎn)描出來(lái)煤蚌,如下圖左圖所示耕挨。類(lèi)似地,在西班牙語(yǔ)中取出(與 one尉桩,two筒占,three,four蜘犁,five 對(duì)應(yīng)的) uno翰苫,dos,tres,cuatro奏窑,cinco导披,設(shè)其在 S 中對(duì)應(yīng)的詞向量分別為 s1,s2埃唯,s3撩匕,s4,s5墨叛,用 PCA 降維后的二維向量分別為 t1止毕,t2,t3巍实,t4滓技,t5,將它們?cè)诙S平面上描出來(lái)(可能還需作適當(dāng)?shù)男D(zhuǎn))棚潦,如下圖右圖所示:
觀察左令漂、右兩幅圖,容易發(fā)現(xiàn):五個(gè)詞在兩個(gè)向量空間中的相對(duì)位置差不多丸边,這說(shuō)明兩種不同語(yǔ)言對(duì)應(yīng)向量空間的結(jié)構(gòu)之間具有相似性叠必,從而進(jìn)一步說(shuō)明了在詞向量空間中利用距離刻畫(huà)詞之間相似性的合理性。
那么妹窖,什么是word2vec纬朝?你可以理解為word2vec就是將詞表征為實(shí)數(shù)值向量的一種高效的算法模型,其利用深度學(xué)習(xí)的思想骄呼,可以通過(guò)訓(xùn)練共苛,把對(duì)文本內(nèi)容的處理簡(jiǎn)化為 K 維向量空間中的向量運(yùn)算,而向量空間上的相似度可以用來(lái)表示文本語(yǔ)義上的相似蜓萄。
Word2vec輸出的詞向量可以被用來(lái)做很多 NLP 相關(guān)的工作隅茎,比如聚類(lèi)、找同義詞嫉沽、詞性分析等等辟犀。如果換個(gè)思路,把詞當(dāng)做特征绸硕,那么Word2vec就可以把特征映射到 K 維向量空間堂竟,可以為文本數(shù)據(jù)尋求更加深層次的特征表示。
那我們現(xiàn)在來(lái)看看word2vec算法是怎樣設(shè)計(jì)的玻佩。
Word2vec 使用的詞向量是 Distributed representation 的詞向量表示方式出嘹。其基本思想是通過(guò)訓(xùn)練將每個(gè)詞映射成 K 維實(shí)數(shù)向量(K 一般為模型中的超參數(shù)),通過(guò)詞之間的距離(比如 cosine 相似度咬崔、歐氏距離等)來(lái)判斷它們之間的語(yǔ)義相似度.其采用一個(gè)三層的神經(jīng)網(wǎng)絡(luò)疚漆,輸入層-隱層-輸出層。有個(gè)核心的技術(shù)是根據(jù)詞頻用Huffman編碼,使得所有詞頻相似的詞隱藏層激活的內(nèi)容基本一致娶聘,出現(xiàn)頻率越高的詞語(yǔ)闻镶,他們激活的隱藏層數(shù)目越少,這樣有效的降低了計(jì)算的復(fù)雜度丸升。而Word2vec大受歡迎的一個(gè)原因正是其高效性铆农,Mikolov 在論文中指出,一個(gè)優(yōu)化的單機(jī)版本一天可訓(xùn)練上千億詞狡耻。
這個(gè)三層神經(jīng)網(wǎng)絡(luò)本身是對(duì)語(yǔ)言模型進(jìn)行建模墩剖,但也同時(shí)獲得一種單詞在向量空間上的表示,而這個(gè)副作用才是Word2vec的真正目標(biāo)夷狰。
與潛在語(yǔ)義分析(Latent Semantic Index, LSI)岭皂、潛在狄立克雷分配(Latent Dirichlet Allocation,LDA)的經(jīng)典過(guò)程相比沼头,Word2vec利用了詞的上下文爷绘,語(yǔ)義信息更加地豐富。
Word2Vec實(shí)際上是兩種不同的方法:Continuous Bag of Words (CBOW)和Skip-gram进倍。CBOW的目標(biāo)是根據(jù)上下文來(lái)預(yù)測(cè)當(dāng)前詞語(yǔ)的概率土至。Skip-gram剛好相反:根據(jù)當(dāng)前詞語(yǔ)來(lái)預(yù)測(cè)上下文的概率(如下圖所示)。這兩種方法都利用人工神經(jīng)網(wǎng)絡(luò)作為它們的分類(lèi)算法猾昆。起初陶因,每個(gè)單詞都是一個(gè)隨機(jī) N 維向量。經(jīng)過(guò)訓(xùn)練之后垂蜗,該算法利用 CBOW 或者 Skip-gram 的方法獲得了每個(gè)單詞的最優(yōu)向量楷扬。
取一個(gè)適當(dāng)大小的窗口當(dāng)做語(yǔ)境,輸入層讀入窗口內(nèi)的詞贴见,將它們的向量(K維烘苹,初始隨機(jī))加和在一起,形成隱藏層K個(gè)節(jié)點(diǎn)蝇刀。輸出層是一個(gè)巨大的二叉 樹(shù)螟加,葉節(jié)點(diǎn)代表語(yǔ)料里所有的詞(語(yǔ)料含有V個(gè)獨(dú)立的詞徘溢,則二叉樹(shù)有|V|個(gè)葉節(jié)點(diǎn))吞琐。而這整顆二叉樹(shù)構(gòu)建的算法就是Huffman樹(shù)。這樣然爆,對(duì)于葉節(jié)點(diǎn)的 每一個(gè)詞站粟,就會(huì)有一個(gè)全局唯一的編碼,形如"010011"曾雕,不妨記左子樹(shù)為1奴烙,右子樹(shù)為0。接下來(lái),隱層的每一個(gè)節(jié)點(diǎn)都會(huì)跟二叉樹(shù)的內(nèi)節(jié)點(diǎn)有連邊切诀,于是 對(duì)于二叉樹(shù)的每一個(gè)內(nèi)節(jié)點(diǎn)都會(huì)有K條連邊揩环,每條邊上也會(huì)有權(quán)值。
對(duì)于語(yǔ)料庫(kù)中的某個(gè)詞w_t幅虑,對(duì)應(yīng)著二叉樹(shù)的某個(gè)葉子節(jié)點(diǎn)丰滑,因此它必然有一個(gè)二進(jìn)制編碼,如"010011"倒庵。在訓(xùn)練階段褒墨,當(dāng)給定上下文,要預(yù)測(cè)后 面的詞w_t的時(shí)候擎宝,我們就從二叉樹(shù)的根節(jié)點(diǎn)開(kāi)始遍歷郁妈,這里的目標(biāo)就是預(yù)測(cè)這個(gè)詞的二進(jìn)制編號(hào)的每一位。即對(duì)于給定的上下文绍申,我們的目標(biāo)是使得預(yù)測(cè)詞的二 進(jìn)制編碼概率最大噩咪。形象地說(shuō),我們希望在根節(jié)點(diǎn)失晴,詞向量和與根節(jié)點(diǎn)相連經(jīng)過(guò) logistic 計(jì)算得到 bit=1 的概率盡量接近 0剧腻,在第二層,希望其 bit=1 的概率盡量接近1涂屁,這么一直下去书在,我們把一路上計(jì)算得到的概率相乘,即得到目標(biāo)詞w_t在當(dāng)前網(wǎng)絡(luò)下的概率P(w_t)拆又,那么對(duì)于當(dāng)前這個(gè) sample的殘差就是1-P(w_t)儒旬,于是就可以使用梯度下降法訓(xùn)練這個(gè)網(wǎng)絡(luò)得到所有的參數(shù)值了。顯而易見(jiàn)帖族,按照目標(biāo)詞的二進(jìn)制編碼計(jì)算到最后的概率 值就是歸一化的栈源。
Hierarchical Softmax用Huffman編碼構(gòu)造二叉樹(shù),其實(shí)借助了分類(lèi)問(wèn)題中竖般,使用一連串二分類(lèi)近似多分類(lèi)的思想甚垦。例如我們是把所有的詞都作為輸出,那么“桔 子”涣雕、“汽車(chē)”都是混在一起艰亮。給定w_t的上下文,先讓模型判斷w_t是不是名詞挣郭,再判斷是不是食物名迄埃,再判斷是不是水果,再判斷是不是“桔子”兑障。
但是在訓(xùn)練過(guò)程中侄非,模型會(huì)賦予這些抽象的中間結(jié)點(diǎn)一個(gè)合適的向量蕉汪,這個(gè)向量代表了它對(duì)應(yīng)的所有子結(jié)點(diǎn)。因?yàn)檎嬲膯卧~公用了這些抽象結(jié)點(diǎn)的向量逞怨,所 以Hierarchical Softmax方法和原始問(wèn)題并不是等價(jià)的者疤,但是這種近似并不會(huì)顯著帶來(lái)性能上的損失同時(shí)又使得模型的求解規(guī)模顯著上升。
沒(méi)有使用這種二叉樹(shù)叠赦,而是直接從隱層直接計(jì)算每一個(gè)輸出的概率——即傳統(tǒng)的Softmax宛渐,就需要對(duì)|V|中的每一個(gè)詞都算一遍,這個(gè)過(guò)程時(shí)間復(fù)雜 度是O(|V|)的眯搭。而使用了二叉樹(shù)(如Word2vec中的Huffman樹(shù))窥翩,其時(shí)間復(fù)雜度就降到了O(log2(|V|)),速度大大地加快了鳞仙。
現(xiàn)在這些詞向量已經(jīng)捕捉到上下文的信息寇蚊。我們可以利用基本代數(shù)公式來(lái)發(fā)現(xiàn)單詞之間的關(guān)系(比如,“國(guó)王”-“男人”+“女人”=“王后”)棍好。這些詞向量可 以代替詞袋用來(lái)預(yù)測(cè)未知數(shù)據(jù)的情感狀況仗岸。該模型的優(yōu)點(diǎn)在于不僅考慮了語(yǔ)境信息還壓縮了數(shù)據(jù)規(guī)模(通常情況下,詞匯量規(guī)模大約在300個(gè)單詞左右而不是之前 模型的100000個(gè)單詞)借笙。因?yàn)樯窠?jīng)網(wǎng)絡(luò)可以替我們提取出這些特征的信息扒怖,所以我們僅需要做很少的手動(dòng)工作。但是由于文本的長(zhǎng)度各異业稼,我們可能需要利用 所有詞向量的平均值作為分類(lèi)算法的輸入值盗痒,從而對(duì)整個(gè)文本文檔進(jìn)行分類(lèi)處理。
然而低散,即使上述模型對(duì)詞向量進(jìn)行平均處理俯邓,我們?nèi)匀缓雎粤藛卧~之間的排列順序?qū)η楦蟹治龅挠绊憽<瓷鲜龅膚ord2vec只是基于詞的維度進(jìn)行"語(yǔ)義分析"的熔号,而并不具有上下文的"語(yǔ)義分析"能力稽鞭。
作為一個(gè)處理可變長(zhǎng)度文本的總結(jié)性方法,Quoc Le 和 Tomas Mikolov 提出了Doc2Vec方法引镊。除了增加一個(gè)段落向量以外朦蕴,這個(gè)方法幾乎等同于 Word2Vec。和 Word2Vec 一樣弟头,該模型也存在兩種方法:Distributed Memory(DM) 和 Distributed Bag of Words(DBOW)吩抓。DM 試圖在給定上下文和段落向量的情況下預(yù)測(cè)單詞的概率。在一個(gè)句子或者文檔的訓(xùn)練過(guò)程中亮瓷,段落 ID 保持不變琴拧,共享著同一個(gè)段落向量降瞳。DBOW 則在僅給定段落向量的情況下預(yù)測(cè)段落中一組隨機(jī)單詞的概率嘱支。想深入了解的可以多搜搜相關(guān)資料蚓胸。
到這里,無(wú)限感嘆人類(lèi)的智慧啊除师,是不是說(shuō)智慧本身并不是人類(lèi)特有沛膳,而是存在大量的數(shù)據(jù)中,存在隱藏層中汛聚,存在數(shù)學(xué)公式里面锹安。今天小冰讓我驚艷了,加油加油倚舀,趕上這個(gè)技術(shù)的風(fēng)口叹哭。
今天就先到這里,晚安痕貌。