對word2vec的理解及資料整理
無他,在網上看到好多對word2vec的介紹,當然也有寫的比較認真的,但是自己學習過程中還是看了好多才明白,這里按照自己整理梳理一下資料,形成提綱以便學習。
介紹較好的文章:
https://www.cnblogs.com/iloveai/p/word2vec.html
http://www.dataguru.cn/article-13488-1.html
http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
http://www.cnblogs.com/pinard/p/7160330.html
http://www.cnblogs.com/pinard/p/7243513.html
https://www.cnblogs.com/pinard/p/7249903.html
一、什么是Word2Vec?
簡單地說就是講單詞word轉換成向量vector來表示,通過詞向量來表征語義信息。
在常見的自然語言處理系統中,單詞的編碼是任意的,因此無法向系統提供各個符號之間可能存在關系的有用信息,還會帶來數據稀疏問題。使用向量對詞進行表示可以克服其中的一些障礙。
2013年,Google團隊發表了word2vec工具。
Word2Vec其實就是通過學習文本來用詞向量的方式表征詞的語義信息,即通過一個嵌入空間(低維)使得語義上相似的單詞在該空間內距離很近。
Word2Vec是從大量文本語料中以無監督的方式學習語義知識的一種模型,它被大量地用在自然語言處理(NLP)中。
二、整體思路
先從宏觀上介紹Word2Vec產生的整體思路。然后介紹Word2Vec使用的Skip-Gram模型,最后介紹為提高訓練效率采用的兩種優化方法:負采樣(negative sampling)和層序softmax(hierarchical softmax)。
為解決傳統的詞表示是one-hot向量無法表征語義信息、數據稀疏、維度災難等問題。出現了詞的分布式表示(Distributional Representation),用一個連續的稠密向量去刻畫一個word的特征。word2vec作為詞分布式表示的一種,將詞語表示為低維的向量實現詞嵌入,在一個嵌入空間中進行表達。word2vec算法的背后是一個淺層神經網絡。當我們在說word2vec算法或模型的時候,其實指的是其背后用於計算word vector的CBoW模型和Skip-gram模型。很多人以為word2vec指的是一個算法或模型,這也是一種謬誤。為了提高訓練效率,word2vec使用了負采樣(negative sampling)和層序softmax(hierarchical softmax)兩種優化方法。
Word2Vec模型中,主要有Skip-Gram和CBOW兩種模型,Skip-Gram是給定input word來預測上下文。而CBOW( Continuous Bagof-Words)是給定上下文,來預測input word。這兩個模型均是用來進行預測的,直接目的並不是詞向量。只是在訓練這兩個模型的過程中便會產生的參數矩陣——隱層的權重矩陣,便是Word2Vec中實際上就是我們試圖去學習的“word vectors”
三、NLP中詞的兩種表示方法
1.利用one-hot向量表示詞:
這種方法把每個詞表示為一個很長的向量。詞向量維度大小為整個詞匯表的大小,對於每個具體的詞匯表中的詞,將對應的位置為1,其余位置為0,這個向量就代表了當前的詞。
如:
“可愛”表示為 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]
“面包”表示為 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]
缺點:
- one-hot向量的維度等於詞典的大小。這在動輒上萬甚至百萬詞典的實際應用中,面臨着巨大的維度災難問題(the curse of dimensionality)
- 任意兩個詞之間都是孤立的,無法表示語義層面上詞匯之間的相關信息,而這一點是致命的。
- 數據稀疏問題
2.分布式表示(distributed representation)和詞嵌入(Word Embedding)
- 分布式表示(distributed representation):
觀其伴,知其意。(Firth, J. R. 1957.11)
詞的分布式表示基於這樣一個“分布假說”:上下文相似的詞,其語義也相似。
這一設想由Harris在1954年提出。Firth在1957年對分布假說進行了進一步闡述和明確:詞的語義由其上下文決定。
可以直接刻畫詞與詞之間的相似度,還可以建立一個從向量到概率的平滑函數模型,使得相似的詞向量可以映射到相近的概率空間上。
有一種簡單地方法,通過構建co-occurrence共現矩陣來定義word representation。基於Distributional Hypothesis構造一個word-context的矩陣,通過統計一個事先指定大小的窗口內的word共現次數,不僅可以刻畫word的語義信息,還在一定程度上反應了word的語法結構信息。如在一篇文檔中可能有如下矩陣:
矩陣里的元素是列向量所代表的word出現在行向量所代表的word的上下文里的次數。(注意,我們並沒有對句首或句尾的詞做任何特殊的處理:比如增加一個S或E的標記Token作為句首或句尾的padding。
co-occurrence矩陣定義的詞向量在一定程度上緩解了one-hot向量相似度為0的問題,但得到的詞向量的維度等於詞典的大小,沒有解決數據稀疏性和維度災難的問題。為了解決這些問題可以利用奇異值分解(SVD)進行降維,除此之外,還可以在對原始矩陣X的處理上,還有很多簡單但很好用的Hacks。比如對原始矩陣中高頻詞的降頻處理;帶權重的統計窗口(距離越近的詞對詞義的貢獻越大);用Pearson相關性系數替代簡單的詞頻統計等。
概括起來,詞的分布式表示主要可以分為三類:基於矩陣的分布表示、基於聚類的分布表示和基於神經網絡的分布表示。
word2vec工具采用的便是基於神經網絡的分布方法。它直接從原始的語料庫中學習到低維詞向量的表達。與直接從co-occurrence矩陣里提取詞向量的SVD算法不同,word2vec模型背后的基本思想是對出現在上下文環境里的詞進行預測(事實上,后面會看到,這種對上下文環境的預測本質上也是一種對co-occurrence統計特征的學習)。
- 詞嵌入(Word Embedding):
Embedding其實就是一個映射,將單詞從原先所屬的空間映射到新的多維空間中,也就是把原先詞所在空間嵌入到一個新的空間中去。
用詞向量的方式表征詞的語義信息,在這個嵌入空間中,語義上相似的單詞距離較近。
- Word embedding的訓練方法大致可以分為兩類【參考】:
(1)無監督或弱監督的預訓練 優點:不需要大量的人工標記樣本就可以得到質量還不錯的embedding向量 缺點:准確率有待提高 解決辦法:得到預訓練的embedding向量后,用少量人工標注的樣本再去優化整個模型 典型代表:word2vec和auto-encoder (這里解釋一下AutoEncoder,AutoEncoder也可以用於訓練詞向量,先將one hot映射成一個hidden state,再映射回原來的維度,令輸入等於輸出,取中間的hidden vector作為詞向量,在不損耗原表達能力的前提下壓縮向量維度,得到一個壓縮的向量表達形式。)
(2)端對端(end to end)的有監督訓練。 優點:學習到的embedding向量也往往更加准確 缺點:模型在結構上往往更加復雜 應用:通過一個embedding層和若干個卷積層連接而成的深度神經網絡以實現對句子的情感分類,可以學習到語義更豐富的詞向量表達。
word2vec不關心后續的應用場景,其學習到的是就是根據共現信息得到的單詞的表達,用n-gram信息來監督,在不同的子task間都會有一定效果。而end2end訓練的embedding其和具體子task的學習目標緊密相關,直接遷移到另一個子task的能力非常弱。
- 常用的word embedding分為dense(稠密)和sparse(稀疏)兩種形式:
常見的sparse就比如 co-occurence(共現) 或者one-hot的形式;對sparse embedding進行一些降維運算比如SVD、PCA就可以得到dense。
下面將介紹由神經網絡分布式表示和word2vec。
3.神經網絡分布式表示和word2vec
注意:
- 無論是one-hot向量表示,還是分布式表示,其實都是詞向量(word vector)。
- 詞的神經網絡分布式表示是詞分布式表示方法的一種
- 神經網絡語言模型是自然語言處理常用的模型,並不是只能用來訓練詞向量。而神經網絡模型也有很多種, CBOW模型和Skip-gram模型只是其中兩種。
- 神經網絡語言模型並不直接用來表示詞向量,詞向量是模型在訓練過程中得到到參數矩陣,因此詞向量可以認為是神經網絡訓練語言模型的副產品。
(1) 基於神經網絡的分布表示:
核心依然是上下文的表示以及上下文與目標詞之間的關系的建模。2001年, Bengio 等人正式提出神經網絡語言模型( Neural Network Language Model ,NNLM),從而奠定了包括word2vec在內后續研究word representation learning的基礎。 NNLM模型的基本思想可以概括如下:
- 假定詞表中的每一個word都對應着一個連續的特征向量;
- 假定一個連續平滑的概率模型,輸入一段詞向量的序列,可以輸出這段序列的聯合概率;
- 同時學習詞向量的權重和概率模型里的參數。
通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關系。這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。
優點:
- 分布式表示具有非常強大的表征能力,比如n維向量每維k個值,可以表征k的n次方個概念。
- 解決了維度災難問題,向量的維度由詞匯表的大小降低到一個較小的空間維度下。
- 解決了數據稀疏問題,值得大小不再只是0和1構成,采用了一個緊湊平滑的向量空間來表示
(2) word2vec
word2vec是谷歌提出的一種word embedding的NLP具體手段,它可以將所有的詞向量化,這樣詞與詞之間就可以定量的去度量他們之間的關系,挖掘詞之間的聯系。word2vec主要包含兩個模型跳字模型(skip-gram)和連續詞袋模型(continuous bag of words,簡稱CBOW)。以及兩種高效的訓練方法負采樣(negative sampling),層序softmax(hierarchical softmax)。
Skip-Gram模型:給定輸入詞來預測上下文,
CBOW模型:給定上下文來預測輸入詞
- Skip-Gram和CBOW模型的產生【參考】:
NNLM模型只能處理定長的序列。在03年的論文里,Bengio等人將模型能夠一次處理的序列長度N提高到了5,雖然相比bigram和trigram已經是很大的提升,但依然缺少靈活性。
因此,Mikolov等人在2010年提出了一種RNNLM模型,用遞歸神經網絡代替原始模型里的前向反饋神經網絡,並將embedding層與RNN里的隱藏層合並,從而解決了變長序列的問題。
NNLM和NNLM的訓練都太慢了。Mikolov注意到,原始的NNLM模型的訓練其實可以拆分成兩個步驟:用一個簡單模型訓練出連續的詞向量;基於詞向量的表達,訓練一個連續的Ngram神經網絡模型。 而NNLM模型的計算瓶頸主要是在第二步。如果我們只是想得到word的連續特征向量,是不是可以對第二步里的神經網絡模型進行簡化呢?
Mikolov在2013年對原始的NNLM模型做如下改造:(1)移除前向反饋神經網絡中非線性的hidden layer,直接將中間層的embedding layer與輸出層的softmax layer連接;(2)忽略上下文環境的序列信息:輸入的所有詞向量均匯總到同一個embedding layer;(3)將future words納入上下文環境。得到CBoW模型,
反過來,也可以得到Skip-gram模型,Skip-gram模型的本質是計算輸入word的input vector與目標word的output vector之間的余弦相似度,並進行softmax歸一化。我們要學習的模型參數正是這兩類詞向量.
直接對詞典里的V個詞計算相似度並歸一化,顯然是一件極其耗時的impossible mission。為此,Mikolov引入了兩種優化算法:層次Softmax(Hierarchical Softmax)和負采樣(Negative Sampling)
比較常見的組合為 skip-gram+負采樣方法。本文后面要講的也是Skip-Gram模型和兩種優化算法。
四、Skip-Gram 模型 【參考】
Word2Vec模型實際上分為了兩個部分,第一部分為建立模型,第二部分是通過模型獲取嵌入詞向量。Word2Vec的整個建模過程實際上與自編碼器(auto-encoder)的思想很相似,即先基於訓練數據構建一個神經網絡,當這個模型訓練好以后,我們並不會用這個訓練好的模型處理新的任務,我們真正需要的是這個模型通過訓練數據所學得的參數,例如隱層的權重矩陣——后面我們將會看到這些權重在Word2Vec中實際上就是我們試圖去學習的“word vectors”。基於訓練數據建模的過程,我們給它一個名字叫“Fake Task”,意味着建模並不是我們最終的目的。
The Fake Task
訓練模型的真正目的是獲得模型基於訓練數據學得的隱層權重。為了得到這些權重,我們首先要構建一個完整的神經網絡作為我們的“Fake Task”,后面再返回來看通過“Fake Task”我們如何間接地得到這些詞向量。
接下來我們來看看如何訓練我們的神經網絡。假如我們有一個句子“The dog barked at the mailman”。
- 首先我們選句子中間的一個詞作為我們的輸入詞,例如我們選取“dog”作為input word;
- 有了input word以后,我們再定義一個叫做skip_window的參數,它代表着我們從當前input word的一側(左邊或右邊)選取詞的數量。如果我們設置skip_window=2,那么我們最終獲得窗口中的詞(包括input word在內)就是['The', 'dog','barked', 'at']。skip_window=2代表着選取左input word左側2個詞和右側2個詞進入我們的窗口,所以整個窗口大小span=2x2=4。另一個參數叫num_skips,它代表着我們從整個窗口中選取多少個不同的詞作為我們的output word,當skip_window=2,num_skips=2時,我們將會得到兩組 (input word, output word) 形式的訓練數據,即 ('dog', 'barked'),('dog', 'the')。
- 神經網絡基於這些訓練數據將會輸出一個概率分布,這個概率代表着我們的詞典中的每個詞是output word的可能性。這句話有點繞,我們來看個栗子。第二步中我們在設置skip_window和num_skips=2的情況下獲得了兩組訓練數據。假如我們先拿一組數據 ('dog', 'barked') 來訓練神經網絡,那么模型通過學習這個訓練樣本,會告訴我們詞匯表中每個單詞是“barked”的概率大小。
模型的輸出概率代表着到我們詞典中每個詞有多大可能性跟input word同時出現。舉個栗子,如果我們向神經網絡模型中輸入一個單詞“Soviet“,那么最終模型的輸出概率中,像“Union”, ”Russia“這種相關詞的概率將遠高於像”watermelon“,”kangaroo“非相關詞的概率。因為”Union“,”Russia“在文本中更大可能在”Soviet“的窗口中出現。我們將通過給神經網絡輸入文本中成對的單詞來訓練它完成上面所說的概率計算。下面的圖中給出了一些我們的訓練樣本的例子。我們選定句子“The quick brown fox jumps over lazy dog”,設定我們的窗口大小為2(window_size=2),也就是說我們僅選輸入詞前后各兩個詞和輸入詞進行組合。下圖中,藍色代表input word,方框內代表位於窗口內的單詞。
The quick brown fox jumps over the lazy dog
我們的模型將會從每對單詞出現的次數中習得統計結果。例如,我們的神經網絡可能會得到更多類似(“Soviet“,”Union“)這樣的訓練樣本對,而對於(”Soviet“,”Sasquatch“)這樣的組合卻看到的很少。因此,當我們的模型完成訓練后,給定一個單詞”Soviet“作為輸入,輸出的結果中”Union“或者”Russia“要比”Sasquatch“被賦予更高的概率。
- 注意:構建的神經網絡Fake Task作用是根據input word預測output word。只是在該神經網絡構建過程中會產生隱層權重,該隱層權重即是我們要找的詞向量。
模型細節
Skip-Gram模型使用一個淺層的神經網絡,用一個只具有一個隱藏層的神經網絡來學習詞嵌入。網絡首先會隨機地初始化它的權重,然后使用單詞來預測它的語境,在最小化它所犯錯誤的訓練過程中去迭代調整這些權重。在一個比較成功的訓練過程之后,能夠通過網絡權重矩陣和單詞的 one-hot 向量的乘積來得到每一個單詞的詞向量。
我們如何來表示這些單詞呢?首先,我們都知道神經網絡只能接受數值輸入,我們不可能把一個單詞字符串作為輸入,因此我們得想個辦法來表示這些單詞。最常用的辦法就是基於訓練文檔來構建我們自己的詞匯表(vocabulary)再對單詞進行one-hot編碼。
假設從我們的訓練文檔中抽取出10000個唯一不重復的單詞組成詞匯表。我們對這10000個單詞進行one-hot編碼,得到的每個單詞都是一個10000維的向量,向量每個維度的值只有0或者1,假如單詞ants在詞匯表中的出現位置為第3個,那么ants的向量就是一個第三維度取值為1,其他維都為0的10000維的向量(ants=[0, 0, 1, 0, ..., 0])
還是上面的例子,“The dog barked at the mailman”,那么我們基於這個句子,可以構建一個大小為5的詞匯表(忽略大小寫和標點符號):("the", "dog", "barked", "at", "mailman"),我們對這個詞匯表的單詞進行編號0-4。那么”dog“就可以被表示為一個5維向量[0, 1, 0, 0, 0]。
模型的輸入如果為一個10000維的向量,那么輸出也是一個10000維度(詞匯表的大小)的向量,它包含了10000個概率,每一個概率代表着當前詞是輸入樣本中output word的概率大小。
下圖是我們神經網絡的結構:
隱層沒有使用任何激活函數,但是輸出層使用了sotfmax。
我們基於成對的單詞來對神經網絡進行訓練,訓練樣本是 ( input word, output word ) 這樣的單詞對,input word和output word都是one-hot編碼的向量。最終模型的輸出是一個概率分布。
隱層
說完單詞的編碼和訓練樣本的選取,我們來看下我們的隱層。如果我們現在想用300個特征來表示一個單詞(即每個詞可以被表示為300維的向量)。那么隱層的權重矩陣應該為10000行,300列(隱層有300個結點)。
Google在最新發布的基於Google news數據集訓練的模型中使用的就是300個特征的詞向量。詞向量的維度是一個可以調節的超參數(在Python的gensim包中封裝的Word2Vec接口默認的詞向量大小為100, window_size為5)。
看下面的圖片,左右兩張圖分別從不同角度代表了輸入層-隱層的權重矩陣。左圖中每一列代表一個10000維的詞向量和隱層單個神經元連接的權重向量。從右邊的圖來看,每一行實際上代表了每個單詞的詞向量。
所以我們最終的目標就是學習這個隱層的權重矩陣。
我們現在回來接着通過模型的定義來訓練我們的這個模型。
上面我們提到,input word和output word都會被我們進行one-hot編碼。仔細想一下,我們的輸入被one-hot編碼以后大多數維度上都是0(實際上僅有一個位置為1),所以這個向量相當稀疏,那么會造成什么結果呢。如果我們將一個1 x 10000的向量和10000 x 300的矩陣相乘,它會消耗相當大的計算資源,為了高效計算,它僅僅會選擇矩陣中對應的向量中維度值為1的索引行(這句話很繞),看圖就明白。
我們來看一下上圖中的矩陣運算,左邊分別是1 x 5和5 x 3的矩陣,結果應該是1 x 3的矩陣,按照矩陣乘法的規則,結果的第一行第一列元素為0 x 17 + 0 x 23 + 0 x 4 + 1 x 10 + 0 x 11 = 10,同理可得其余兩個元素為12,19。如果10000個維度的矩陣采用這樣的計算方式是十分低效的。
為了有效地進行計算,這種稀疏狀態下不會進行矩陣乘法計算,可以看到矩陣的計算的結果實際上是矩陣對應的向量中值為1的索引,上面的例子中,左邊向量中取值為1的對應維度為3(下標從0開始),那么計算結果就是矩陣的第3行(下標從0開始)—— [10, 12, 19],這樣模型中的隱層權重矩陣便成了一個”查找表“(lookup table),進行矩陣計算時,直接去查輸入向量中取值為1的維度下對應的那些權重值。隱層的輸出就是每個輸入單詞的“嵌入詞向量”。
輸出層
經過神經網絡隱層的計算,ants這個詞會從一個1 x 10000的向量變成1 x 300的向量,再被輸入到輸出層。輸出層是一個softmax回歸分類器,它的每個結點將會輸出一個0-1之間的值(概率),這些所有輸出層神經元結點的概率之和為1。
下面是一個例子,訓練樣本為 (input word: “ants”, output word: “car”) 的計算示意圖。
上圖展示了輸入詞為ants,計算輸出詞為car的概率。
直覺上的理解
如果兩個不同的單詞有着非常相似的“上下文”(也就是窗口單詞很相似,比如“Kitty climbed the tree”和“Cat climbed the tree”),那么通過我們的模型訓練,這兩個單詞的嵌入向量將非常相似。
那么兩個單詞擁有相似的“上下文”到底是什么含義呢?比如對於同義詞“intelligent”和“smart”,我們覺得這兩個單詞應該擁有相同的“上下文”。而例如”engine“和”transmission“這樣相關的詞語,可能也擁有着相似的上下文。
實際上,這種方法實際上也可以幫助你進行詞干化(stemming),例如,神經網絡對”ant“和”ants”兩個單詞會習得相似的詞向量。
詞干化(stemming)就是去除詞綴得到詞根的過程。
模型訓練【參考】
將輸入層到隱層的權重矩陣、隱層到輸出層的舉證分別寫成矩陣。神經網絡圖就是下面的樣子:
隱藏層中有N個神經元,也就是說輸入詞被表示為N維的一個向量。隱藏層中的權重矩陣大小為V*N,一個V維的one-hot輸入詞通過權重矩陣映射到了一個V維的向量,而這個向量正是所謂的word vector,對應於上圖中右邊的每一行。
如上圖所示,網絡的輸入是一個單詞,V維的one-hot向量,最終輸出的結果也是一個V維的向量,其中的值表示對應的詞作為輸入詞的上下文的概率,也就是說最后輸出的是輸入詞的鄰近詞的概率分布。這里使用的是softmax回歸,最終輸出的結果所有概率之和為1。
那么如何來訓練Skip-Gram模型呢?通過逐一選定句子中的單詞作為輸入詞,將與之相鄰的詞提取出來,進行學習。圖中的窗口大小為2,也即每次向前和向后各看2個詞(如果存在的話)。
五、兩種加速方法——負采樣(negative sampling)和層序softmax(hierarchical softmax)
在第一部分講解完成后,我們會發現Word2Vec模型是一個超級大的神經網絡(權重矩陣規模非常大)。
舉個栗子,我們擁有10000個單詞的詞匯表,我們如果想嵌入300維的詞向量,那么我們的輸入-隱層權重矩陣和隱層-輸出層的權重矩陣都會有 10000 x 300 = 300萬個權重,在如此龐大的神經網絡中進行梯度下降是相當慢的。更糟糕的是,你需要大量的訓練數據來調整這些權重並且避免過擬合。百萬數量級的權重矩陣和億萬數量級的訓練樣本意味着訓練這個模型將會是個災難(太凶殘了)。
Word2Vec 的作者在它的第二篇論文中強調了這些問題,下面是作者在第二篇論文中的三個創新:
- 將常見的單詞組合(word pairs)或者詞組作為單個“words”來處理。
- 對高頻次單詞進行抽樣來減少訓練樣本的個數。
- 對優化目標采用“negative sampling”方法,這樣每個訓練樣本的訓練只會更新一小部分的模型權重,從而降低計算負擔。
下面主要介紹兩種方法優化訓練過程。
1.層序softmax(Hierarchical Softmax)【基於Hierarchical Softmax的模型】
層序softmax也是解決這個問題的一種方法。
大家都知道哈夫曼樹是帶權路徑最短的樹,一般神經網絡語言模型在預測的時候,輸出的是預測目標詞的概率(每一次預測都要基於全部的數據集進行計算,很大的時間開銷)。
Hierarchical Softmax是一種對輸出層進行優化的策略,輸出層從原始模型的利用softmax計算概率值改為了利用Huffman樹計算概率值。一開始我們可以用以詞表中的全部詞作為葉子節點,詞頻作為節點的權,構建Huffman樹,作為輸出。從根節點出發,到達指定葉子節點的路徑是的。Hierarchical Softmax正是利用這條路徑來計算指定詞的概率,而非用softmax來計算。
即Hierarchical Softmax:把 N 分類問題變成 log(N)次二分類
Hierarchical Softmax可以參考基於Negative Sampling的模型
2.負采樣(negative sampling)【Word2Vec Tutorial Part 2 - Negative Sampling】
負采樣(negative sampling)解決了這個問題,它是用來提高訓練速度並且改善所得到詞向量的質量的一種方法。不同於原本每個訓練樣本更新所有的權重,負采樣每次讓一個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。至於具體的細節我在這里就不在介紹了。關於負采樣介紹參考基於Negative Sampling的模型,Word2Vec Tutorial Part 2 - Negative Sampling,一文詳解 Word2vec 之 Skip-Gram 模型(訓練篇)
負采樣可以參考基於Negative Sampling的模型
六、Word2Vec的應用
word2vec詞向量可以較好地表達不同詞之間的相似和類比關系。如:v("King")−v("Man")+v("Woman")=v("Queen")
word2vec是其他自然語言處理的基礎,將詞用詞向量表示后,可以進行其他其他任務,如推薦系統等。
七、利用TensorFlow實現Word2Vec
關於Word2Vec的詳細介紹終於結束了,相信看完本文章你會理解Word2Vec的來龍去脈。下面讀者可以查看下面的章節用TensorFlow來實現Word2Vec。
參考文獻
CBOW模型學習https://iksinc.online/tag/continuous-bag-of-words-cbow/
- https://www.cnblogs.com/micrari/p/9115426.html
- http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
- http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/
- https://www.jianshu.com/p/a2e6a487b385
- https://www.cnblogs.com/baiting/p/5840017.html
- https://blog.csdn.net/yu5064/article/details/79601683
- https://www.cnblogs.com/iloveai/p/word2vec.html
- https://www.cnblogs.com/iloveai/p/cs224d-lecture2-note.html









