在各種大舉深度學習大旗的公司中,Google公司無疑是旗舉得最高的,口號喊得最響亮的那一個。2013年末,Google發(fā)布的word2vec工具引起了一幫人的熱捧,大家?guī)缀醵颊J為它是深度學習在自然語言領域的一項了不起的應用,各種歡呼“深度學習在自然語言領域開始發(fā)力了”,互聯(lián)網(wǎng)界很多公司也開始跟進,使用word2vec產(chǎn)出了不少成果,所有我們很有必要學會使用word2vec,讓其成為自己的工具,去開拓未知的世界。
首先我們需要了解什么叫做詞向量:
自然語言處理(NLP)相關任務中,要將自然語言交給機器學習中的算法來處理,通常需要首先將語言數(shù)學化,因為機器不是人,機器只認數(shù)學符號。向量是人把自然界的東西抽象出來交給機器處理的東西,基本上可以說向量是人對機器輸入的主要方式。
詞向量就是用來將語言中的詞進行數(shù)學化的一種方式,顧名思義,詞向量就是把一個詞表示成一個向量。而表示的方式主要有兩種,下面一一介紹。
一種最簡單的詞向量方式是one-hotrepresentation,就是用一個很長的向量來表示一個詞,向量的長度為詞典的大小,向量的分量只有一個 1,其他全為 0, 1 的位置對應該詞在詞典中的位置。比如:
'中國'表示為 [00010000000......]
'美國'表死為[0000000010000...]
每個詞都是茫茫 0 海中的一個 1。這種 One-hotRepresentation 如果采用稀疏方式存儲,會是非常的簡潔:也就是給每個詞分配一個數(shù)字 ID。比如剛才的例子中,中國記為 3,美國記為 8(假設從 0 開始記)。如果要編程實現(xiàn)的話,用 Hash 表給每個詞分配一個編號就可以了。這么簡潔的表示方法配合上最大熵、SVM、CRF 等等算法已經(jīng)很好地完成了 NLP 領域的各種主流任務。
但這種詞表示有兩個缺點:(1)容易受維數(shù)災難的困擾,尤其是將其用于 Deep Learning 的一些算法時;(2)不能很好地刻畫詞與詞之間的相似性(術語好像叫做“詞匯鴻溝”):任意兩個詞之間都是孤立的。光從這兩個向量中看不出兩個詞是否有關系,哪怕是丈夫和老公這樣的同義詞也不能幸免于難。所以會尋求發(fā)展,用另外的方式表示,就是下面這種。
另一種就是DistributedRepresentation 這種表示,它最早是 Hinton 于 1986 年提出的,可以克服 one-hot representation 的缺點。其基本想法是直接用一個普通的向量表示一個詞,這種向量一般長成這個樣子:[0.792, ?0.177, ?0.107, 0.109, ?0.542, ...],也就是普通的向量表示形式。維度以 50 維和 100 維比較常見。
當然一個詞怎么表示成這么樣的一個向量是要經(jīng)過一番訓練的,訓練方法較多,word2vec是其中一種,在后面會提到,這里先說它的意義。還要注意的是每個詞在不同的語料庫和不同的訓練方法下,得到的詞向量可能是不一樣的。
詞向量一般維數(shù)不高,很少有人閑著沒事訓練的時候定義一個10000維以上的維數(shù),所以用起來維數(shù)災難的機會現(xiàn)對于one-hot representation表示就大大減少了。
由于是用向量表示,而且用較好的訓練算法得到的詞向量的向量一般是有空間上的意義的,也就是說,將所有這些向量放在一起形成一個詞向量空間,而每一向量則為該空間中的一個點,在這個空間上的詞向量之間的距離度量也可以表示對應的兩個詞之間的“距離”。所謂兩個詞之間的“距離”,就是這兩個詞之間的語法,語義之間的相似性。
一個比較實用的場景是找同義詞,得到詞向量后,假如對于詞老婆來說,想找出與這個詞相似的詞,這個場景對人來說都不輕松,畢竟比較主觀,但是對于建立好詞向量后的情況,對計算機來說,只要拿這個詞的詞向量跟其他詞的詞向量一一計算歐式距離或者cos距離,得到距離小于某個值那些詞,就是它的同義詞。
這個特性使詞向量很有意義,自然會吸引很多人去研究,google的word2vec模型也是基于這個做出來的。
google的word2vec模型使用在機器翻譯領域無疑是一個很成功的實例。比如:
考慮英語和西班牙語兩種語言,通過訓練分別得到它們對應的詞向量空間 E 和 S。從英語中取出五個詞 one,two,three,four,five,設其在 E 中對應的詞向量分別為 v1,v2,v3,v4,v5,為方便作圖,利用主成分分析(PCA)降維,得到相應的二維向量 u1,u2,u3,u4,u5,在二維平面上將這五個點描出來,如下圖左圖所示。類似地,在西班牙語中取出(與 one,two,three,four,five 對應的) uno,dos,tres,cuatro,cinco,設其在 S 中對應的詞向量分別為 s1,s2,s3,s4,s5,用 PCA 降維后的二維向量分別為 t1,t2,t3,t4,t5,將它們在二維平面上描出來(可能還需作適當?shù)男D),如下圖右圖所示:
觀察左、右兩幅圖,容易發(fā)現(xiàn):五個詞在兩個向量空間中的相對位置差不多,這說明兩種不同語言對應向量空間的結構之間具有相似性,從而進一步說明了在詞向量空間中利用距離刻畫詞之間相似性的合理性。
那么,什么是word2vec?你可以理解為word2vec就是將詞表征為實數(shù)值向量的一種高效的算法模型,其利用深度學習的思想,可以通過訓練,把對文本內(nèi)容的處理簡化為 K 維向量空間中的向量運算,而向量空間上的相似度可以用來表示文本語義上的相似。
Word2vec輸出的詞向量可以被用來做很多 NLP 相關的工作,比如聚類、找同義詞、詞性分析等等。如果換個思路,把詞當做特征,那么Word2vec就可以把特征映射到 K 維向量空間,可以為文本數(shù)據(jù)尋求更加深層次的特征表示。
那我們現(xiàn)在來看看word2vec算法是怎樣設計的。
Word2vec 使用的詞向量是 Distributed representation 的詞向量表示方式。其基本思想是通過訓練將每個詞映射成 K 維實數(shù)向量(K 一般為模型中的超參數(shù)),通過詞之間的距離(比如 cosine 相似度、歐氏距離等)來判斷它們之間的語義相似度.其采用一個三層的神經(jīng)網(wǎng)絡,輸入層-隱層-輸出層。有個核心的技術是根據(jù)詞頻用Huffman編碼,使得所有詞頻相似的詞隱藏層激活的內(nèi)容基本一致,出現(xiàn)頻率越高的詞語,他們激活的隱藏層數(shù)目越少,這樣有效的降低了計算的復雜度。而Word2vec大受歡迎的一個原因正是其高效性,Mikolov 在論文中指出,一個優(yōu)化的單機版本一天可訓練上千億詞。
這個三層神經(jīng)網(wǎng)絡本身是對語言模型進行建模,但也同時獲得一種單詞在向量空間上的表示,而這個副作用才是Word2vec的真正目標。
與潛在語義分析(Latent Semantic Index, LSI)、潛在狄立克雷分配(Latent Dirichlet Allocation,LDA)的經(jīng)典過程相比,Word2vec利用了詞的上下文,語義信息更加地豐富。
Word2Vec實際上是兩種不同的方法:Continuous Bag of Words (CBOW)和Skip-gram。CBOW的目標是根據(jù)上下文來預測當前詞語的概率。Skip-gram剛好相反:根據(jù)當前詞語來預測上下文的概率(如下圖所示)。這兩種方法都利用人工神經(jīng)網(wǎng)絡作為它們的分類算法。起初,每個單詞都是一個隨機 N 維向量。經(jīng)過訓練之后,該算法利用 CBOW 或者 Skip-gram 的方法獲得了每個單詞的最優(yōu)向量。
取一個適當大小的窗口當做語境,輸入層讀入窗口內(nèi)的詞,將它們的向量(K維,初始隨機)加和在一起,形成隱藏層K個節(jié)點。輸出層是一個巨大的二叉 樹,葉節(jié)點代表語料里所有的詞(語料含有V個獨立的詞,則二叉樹有|V|個葉節(jié)點)。而這整顆二叉樹構建的算法就是Huffman樹。這樣,對于葉節(jié)點的 每一個詞,就會有一個全局唯一的編碼,形如"010011",不妨記左子樹為1,右子樹為0。接下來,隱層的每一個節(jié)點都會跟二叉樹的內(nèi)節(jié)點有連邊,于是 對于二叉樹的每一個內(nèi)節(jié)點都會有K條連邊,每條邊上也會有權值。
對于語料庫中的某個詞w_t,對應著二叉樹的某個葉子節(jié)點,因此它必然有一個二進制編碼,如"010011"。在訓練階段,當給定上下文,要預測后 面的詞w_t的時候,我們就從二叉樹的根節(jié)點開始遍歷,這里的目標就是預測這個詞的二進制編號的每一位。即對于給定的上下文,我們的目標是使得預測詞的二 進制編碼概率最大。形象地說,我們希望在根節(jié)點,詞向量和與根節(jié)點相連經(jīng)過 logistic 計算得到 bit=1 的概率盡量接近 0,在第二層,希望其 bit=1 的概率盡量接近1,這么一直下去,我們把一路上計算得到的概率相乘,即得到目標詞w_t在當前網(wǎng)絡下的概率P(w_t),那么對于當前這個 sample的殘差就是1-P(w_t),于是就可以使用梯度下降法訓練這個網(wǎng)絡得到所有的參數(shù)值了。顯而易見,按照目標詞的二進制編碼計算到最后的概率 值就是歸一化的。
Hierarchical Softmax用Huffman編碼構造二叉樹,其實借助了分類問題中,使用一連串二分類近似多分類的思想。例如我們是把所有的詞都作為輸出,那么“桔 子”、“汽車”都是混在一起。給定w_t的上下文,先讓模型判斷w_t是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是“桔子”。
但是在訓練過程中,模型會賦予這些抽象的中間結點一個合適的向量,這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,所 以Hierarchical Softmax方法和原始問題并不是等價的,但是這種近似并不會顯著帶來性能上的損失同時又使得模型的求解規(guī)模顯著上升。
沒有使用這種二叉樹,而是直接從隱層直接計算每一個輸出的概率——即傳統(tǒng)的Softmax,就需要對|V|中的每一個詞都算一遍,這個過程時間復雜 度是O(|V|)的。而使用了二叉樹(如Word2vec中的Huffman樹),其時間復雜度就降到了O(log2(|V|)),速度大大地加快了。
現(xiàn)在這些詞向量已經(jīng)捕捉到上下文的信息。我們可以利用基本代數(shù)公式來發(fā)現(xiàn)單詞之間的關系(比如,“國王”-“男人”+“女人”=“王后”)。這些詞向量可 以代替詞袋用來預測未知數(shù)據(jù)的情感狀況。該模型的優(yōu)點在于不僅考慮了語境信息還壓縮了數(shù)據(jù)規(guī)模(通常情況下,詞匯量規(guī)模大約在300個單詞左右而不是之前 模型的100000個單詞)。因為神經(jīng)網(wǎng)絡可以替我們提取出這些特征的信息,所以我們僅需要做很少的手動工作。但是由于文本的長度各異,我們可能需要利用 所有詞向量的平均值作為分類算法的輸入值,從而對整個文本文檔進行分類處理。
然而,即使上述模型對詞向量進行平均處理,我們?nèi)匀缓雎粤藛卧~之間的排列順序對情感分析的影響。即上述的word2vec只是基于詞的維度進行"語義分析"的,而并不具有上下文的"語義分析"能力。
作為一個處理可變長度文本的總結性方法,Quoc Le 和 Tomas Mikolov 提出了Doc2Vec方法。除了增加一個段落向量以外,這個方法幾乎等同于 Word2Vec。和 Word2Vec 一樣,該模型也存在兩種方法:Distributed Memory(DM) 和 Distributed Bag of Words(DBOW)。DM 試圖在給定上下文和段落向量的情況下預測單詞的概率。在一個句子或者文檔的訓練過程中,段落 ID 保持不變,共享著同一個段落向量。DBOW 則在僅給定段落向量的情況下預測段落中一組隨機單詞的概率。想深入了解的可以多搜搜相關資料。
到這里,無限感嘆人類的智慧啊,是不是說智慧本身并不是人類特有,而是存在大量的數(shù)據(jù)中,存在隱藏層中,存在數(shù)學公式里面。今天小冰讓我驚艷了,加油加油,趕上這個技術的風口。
今天就先到這里,晚安。