word2vec的通俗理解
在自然語言處理領(lǐng)域中,本文向量化是文本表示的一種重要方式。在當前階段,對文本的大部分研究都是通過詞向量化實現(xiàn)的,但同時也有一部分研究將句子作為文本處理的基本單元,也就是doc2vec和str2vec技術(shù)。
1. word2vec簡介
大家很熟悉的詞袋(bag of words)模型是最早的以詞語為基本處理單元的文本向量化算法,所謂的詞袋模型就是借助于詞典把文本轉(zhuǎn)化為一組向量,下面是兩個簡單的文本示例:
- john likes to watch movies, mary likes too.
- john also likes to watch football games.
現(xiàn)假設(shè)詞典如下:
{"john":1,"likes":2,"to":3,"watch":4, "movies":5,"also":6,"football":7,"games":8,"mary":9 "too":10}
在這個自己構(gòu)建的詞典中,每個單詞都有一個唯一的索引,那么上述的兩個文本就可以基于這個暫時的詞典來構(gòu)建其文本的向量表示,如下:
[1,2,1,1,1,0,0,0,0,1,1]
[1,1,1,1,0,1,1,1,0,0]
由此可以看出此向量的構(gòu)建是根據(jù)該詞在詞典出現(xiàn)的次數(shù)而構(gòu)成的,比如第一條文本中的”likes”,這個詞在文本中出現(xiàn)了2次,所以基于詞袋的文本向量是根據(jù)詞出現(xiàn)的餓次數(shù)構(gòu)建的。但是此向量與文本中單詞出現(xiàn)的順序沒有關(guān)系,只是一種頻率的表示,該方法容易實現(xiàn),但是有很大的問題:
- 維數(shù)災(zāi)難:假如詞典包含10000個單詞,那么每個文本需要使用10000維的向量表示,那么向量的很多位置必定是0,如此稀疏的高維向量會嚴重影響計算速度。
- 這樣構(gòu)成的向量無法保存詞序信息,而詞序?qū)τ谧匀徽Z言處理又是那么的重要。
- 存在語義鴻溝
例如:關(guān)于數(shù)據(jù)稀疏的問題
自然語言處理經(jīng)常把字詞轉(zhuǎn)為離散的單獨的符號,也就是One-Hot Encoder。
比如上面的這個例子,在語料庫中,杭州、上海、寧波、北京各對應(yīng)一個向量,向量中只有一個值為1,其余都為0。但是使用One-Hot Encoder有以下問題。一方面,城市編碼是隨機的,向量之間相互獨立,看不出城市之間可能存在的關(guān)聯(lián)關(guān)系。其次,向量維度的大小取決于語料庫中字詞的多少。如果將世界所有城市名稱對應(yīng)的向量合為一個矩陣的話,那這個矩陣過于稀疏,并且會造成維度災(zāi)難。
現(xiàn)在隨著互聯(lián)網(wǎng)的發(fā)展,大量的無標注數(shù)據(jù)產(chǎn)生,此時的word2vec技術(shù)即是利用神經(jīng)網(wǎng)絡(luò)從大量的無標注的文本中提取有用的信息而產(chǎn)生的。
為什么說word2vec能提取有用的信息呢?
我們知道詞語是表達語義的基本單元,而詞袋模型只是簡單的將詞語符號化,舉個不太恰當?shù)谋扔骶褪?#xff1a;現(xiàn)在有”一麻袋”的詞語,而我們要處理的文本就像是從一個麻袋中無序得(不分先后順序)抽出麻袋中所有的詞,再查看文本中出現(xiàn)的個數(shù),注意這里的從麻袋中抽取詞的過程是無序的,也就是只是簡單的統(tǒng)計文本中有沒有出現(xiàn)該詞和該詞出現(xiàn)了幾次,所以對于詞袋模型,文本的語序特征就喪失了,也就喪失了語義的信息。
此時我們需要一個模型就是能在使文本向量化的同時也保留了詞序的信息。分布式假說的提出就是解決了語義信息的問題。該方法的思想是:上下文相似的詞,其語義也相似,隨后就有了基于上下文分布表示詞義的方法,這就是“詞空間模型“。Word2Vec可以將One-Hot Encoder轉(zhuǎn)化為低維度的連續(xù)值,也就是稠密向量,并且其中意思相近的詞將被映射到向量空間中相近的位置。而使用神經(jīng)網(wǎng)絡(luò)可以靈活的對上下文進行建模,也因此成為用的比較多的方法。
2. 模型簡介
one-hot向量作為word2vec的輸入,通過word2vec訓(xùn)練低維詞向量(word embedding)
輸入層:One-Hot Vector
隱藏層:沒有激活函數(shù),也就是線性的單元。
輸出層:維度跟輸入層的維度一樣,用的是Softmax回歸。
我們要獲取的dense vector其實就是Hidden Layer的輸出單元。有的地方定為Input Layer和Hidden Layer之間的權(quán)重,其實說的是一回事。
下面用具體的例子看下:
可以看出:
輸入層:5個神經(jīng)元
隱藏層:3個神經(jīng)元
所以權(quán)重矩陣是5x3的大小,可以看出權(quán)重矩陣中的[10,12,19]和前向傳播后[10,12,19]是一樣的。
3. CBOW模式
word2vec主要分為CBOW(Continuous Bag of Words)和Skip-Gram兩種模式。CBOW是從原始語句推測目標字詞;而Skip-Gram正好相反,是從目標字詞推測出原始語句。CBOW對小型數(shù)據(jù)庫比較合適,而Skip-Gram在大型語料中表現(xiàn)更好。
CBOW模型的理解:
CBOW模型結(jié)構(gòu)圖
- 輸入層:上下文單詞的onehot. {假設(shè)單詞向量空間dim為V,也就是詞典的大小。上下文單詞個數(shù)為C}。
- 所有onehot分別乘以共享的輸入權(quán)重矩陣W(V*N矩陣,N為自己設(shè)定的數(shù),N也是隱藏層的神經(jīng)元個數(shù),初始化權(quán)重矩陣W)。
- 所得的向量 {因為是onehot所以為向量} 相加求平均作為隱層向量, size為1*N。
- 乘以輸出權(quán)重矩陣W′W′(N*V)。
- 得到向量 (1*V) ,激活函數(shù)處理得到V-dim概率分布,概率最大的index所指示的單詞為預(yù)測出的中間詞(target word)。
- 與true label的onehot做比較,誤差越小越好。
所以,需要定義loss function(一般為交叉熵代價函數(shù)),采用梯度下降算法更新W和W′W′。訓(xùn)練完畢后,輸入層的每個單詞與矩陣W相乘得到的向量的就是我們想要的詞向量(word embedding),這個矩陣(所有單詞的word embedding)也叫做look up table(其實這個look up table就是矩陣W自身),也就是說,任何一個單詞的onehot乘以這個矩陣都將得到自己的詞向量。有了look up table就可以免去訓(xùn)練過程直接查表得到單詞的詞向量了。
案例:
5. Skip-Gram模式
從直觀上理解,Skip-Gram是給定input word來預(yù)測上下文。
接下來我們來看看如何訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò)。假如我們有一個句子“The dog barked at the mailman”。
首先我們選句子中間的一個詞作為我們的輸入詞,例如我們選取“dog”作為input word;
有了input word以后,我們再定義一個叫做skip_window的參數(shù),它代表著我們從當前input word的一側(cè)(左邊或右邊)選取詞的數(shù)量。如果我們設(shè)置skip_window=2,那么我們最終獲得窗口中的詞(包括input word在內(nèi))就是[‘The’, ‘dog’,’barked’, ‘a(chǎn)t’]。skip_window=2代表著選取左input word左側(cè)2個詞和右側(cè)2個詞進入我們的窗口,所以整個窗口大小span=2x2=4。另一個參數(shù)叫num_skips,它代表著我們從整個窗口中選取多少個不同的詞作為我們的output word,當skip_window=2,num_skips=2時,我們將會得到兩組 (input word, output word) 形式的訓(xùn)練數(shù)據(jù),即 (‘dog’, ‘barked’),(‘dog’, ‘the’)。
神經(jīng)網(wǎng)絡(luò)基于這些訓(xùn)練數(shù)據(jù)將會輸出一個概率分布,這個概率代表著我們的詞典中的每個詞是output word的可能性。這句話有點繞,我們來看個栗子。第二步中我們在設(shè)置skip_window和num_skips=2的情況下獲得了兩組訓(xùn)練數(shù)據(jù)。假如我們先拿一組數(shù)據(jù) (‘dog’, ‘barked’) 來訓(xùn)練神經(jīng)網(wǎng)絡(luò),那么模型通過學(xué)習(xí)這個訓(xùn)練樣本,會告訴我們詞匯表中每個單詞是“barked”的概率大小。
模型的輸出概率代表著到我們詞典中每個詞有多大可能性跟input word同時出現(xiàn)。舉個栗子,如果我們向神經(jīng)網(wǎng)絡(luò)模型中輸入一個單詞“中國“,那么最終模型的輸出概率中,像“英國”, ”俄羅斯“這種相關(guān)詞的概率將遠高于像”蘋果“,”蟈蟈“非相關(guān)詞的概率。因為”英國“,”俄羅斯“在文本中更大可能在”中國“的窗口中出現(xiàn)。我們將通過給神經(jīng)網(wǎng)絡(luò)輸入文本中成對的單詞來訓(xùn)練它完成上面所說的概率計算。
面的圖中給出了一些我們的訓(xùn)練樣本的例子。我們選定句子“The quick brown fox jumps over lazy dog”,設(shè)定我們的窗口大小為2(window_size=2),也就是說我們僅選輸入詞前后各兩個詞和輸入詞進行組合。下圖中,藍色代表input word,方框內(nèi)代表位于窗口內(nèi)的單詞。Training Samples(輸入, 輸出)
我們的模型將會從每對單詞出現(xiàn)的次數(shù)中習(xí)得統(tǒng)計結(jié)果。例如,我們的神經(jīng)網(wǎng)絡(luò)可能會得到更多類似(“中國“,”英國“)這樣的訓(xùn)練樣本對,而對于(”英國“,”蟈蟈“)這樣的組合卻看到的很少。因此,當我們的模型完成訓(xùn)練后,給定一個單詞”中國“作為輸入,輸出的結(jié)果中”英國“或者”俄羅斯“要比”蟈蟈“被賦予更高的概率。
再次提醒,最終我們需要的是訓(xùn)練出來的權(quán)重矩陣。
5. 訓(xùn)練優(yōu)化
此時注意到,這個訓(xùn)練過程的參數(shù)規(guī)模非常巨大。
假設(shè)語料庫中有30000個不同的單詞,hidden layer取128,word2vec兩個權(quán)值矩陣維度都是[30000,128],在使用SGD對龐大的神經(jīng)網(wǎng)絡(luò)進行學(xué)習(xí)時,將是十分緩慢的。而且,你需要大量的訓(xùn)練數(shù)據(jù)來調(diào)整許多權(quán)重,避免過度擬合。數(shù)以百萬計的重量數(shù)十億倍的訓(xùn)練樣本意味著訓(xùn)練這個模型將是一個野獸。
一般來說,有兩種加速算法:Hierarchical Softmax、Negative Sampling等方式來解決。
參考:
https://blog.csdn.net/mylove0414/article/details/61616617
https://blog.csdn.net/free356/article/details/79445895
總結(jié)
以上是生活随笔為你收集整理的word2vec的通俗理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝安区(说一说宝安区的简介)
- 下一篇: 知识图谱资源-NLP