接昨天的博客,這篇隨筆將會(huì)對(duì)本人運(yùn)行Word2Vec算法時(shí)在Gensim以及Tensorflow的不同版本下的運(yùn)行結(jié)果對(duì)比。在運(yùn)行中,參數(shù)的調(diào)節(jié)以及迭代的決定本人并沒(méi)有很好的經(jīng)驗(yàn),所以希望在展出運(yùn)行的參數(shù)以及結(jié)果的同時(shí)大家可以批評(píng)指正,多謝大家的支持!
對(duì)比背景:
對(duì)比實(shí)驗(yàn)所運(yùn)用的corpus全部都是可免費(fèi)下載的text8.txt。下載點(diǎn)這里。在訓(xùn)練時(shí),word embedding的維度被調(diào)節(jié)為200,除了word2vec_basic.py版本的step size為600001外,其余均為15個(gè)epoches。 運(yùn)行結(jié)果除basic版本外其他的均運(yùn)用了Mikolov所公開(kāi)的questions-words.txt文件來(lái)計(jì)算其精確度。該精確度計(jì)算文件的格式為每行四個(gè)詞,在計(jì)算精度時(shí),系統(tǒng)選取前三個(gè)詞的向量,計(jì)算詞2-詞1+詞3所得的向量并通過(guò)cosine similarity的方式搜尋最接近的詞,并選取top N個(gè)(N為自定義量,一般要么1要么4)來(lái)查看questions-words里每行的第四個(gè)詞是否存在于這top N個(gè)詞之中。另外,在運(yùn)行結(jié)束后,我也根據(jù)Mikolov論文中的提示運(yùn)用了幾個(gè)常見(jiàn)的向量算數(shù)測(cè)試來(lái)測(cè)驗(yàn)各模型的準(zhǔn)確度。我所運(yùn)用的測(cè)試為:
1. France, Paris, Beijing, China 或者 France, Paris, Rome, Greece
2. man, king, woman, queen
3. slow, slowly, quick, quickly
等等......
對(duì)比結(jié)果:
TensorFlow框架:
word2vec_baisc.py是Tensorflow官方版本的Sentence Embedding概念闡述的示例的代碼。該代碼用最簡(jiǎn)單的方式實(shí)現(xiàn)了Word2Vec中的部分主要功能,即Skip-Gram模型以及Negative Samping加速分類(lèi)算法。在設(shè)定word embedding維度為200以及num step為600001后,運(yùn)行結(jié)果如下:
由上圖可見(jiàn),詞向量是randomly init的,所以他認(rèn)為six跟conjuring或者analogies相近。另外,在剛init的時(shí)機(jī),loss數(shù)是302.11。在20萬(wàn)此迭代后,average loss為4.96。此時(shí)的nearest測(cè)試結(jié)果如下:
我們可見(jiàn)此時(shí),跟six相近的詞為seven, five, four和eight, 并且與has相似的有had, have等。這個(gè)結(jié)果已經(jīng)初步證明系統(tǒng)已經(jīng)學(xué)習(xí)到了一些特征,但是有的詞例如history,所對(duì)應(yīng)的詞是reginae,這個(gè)連含義都不清楚的詞和明顯跟history的意義不相關(guān)。所以可見(jiàn)系統(tǒng)并不完善,只是簡(jiǎn)單的詞兒比較容易先學(xué)到。另外,從20萬(wàn)個(gè)到第40萬(wàn)step,我們發(fā)現(xiàn)loss降低的并不明顯。在訓(xùn)練的最后,結(jié)果展示如下:
history跟culture的北美的環(huán)境里有些許相似的成分,所以可見(jiàn)系統(tǒng)窮時(shí)變得更加的好了。同時(shí),i本身作為羅馬數(shù)字的一面(即ii)和作為我的一面(即we)也被很好的展現(xiàn)了出來(lái)。這個(gè)結(jié)果是encouraging的,因?yàn)橄到y(tǒng)其實(shí)變得更好了。但是一直到60萬(wàn)step, loss還停留在4.52左右,于20萬(wàn)的4.96區(qū)別不大,由此可見(jiàn)學(xué)習(xí)進(jìn)入smoothing區(qū)域。
但系統(tǒng)到底在詞義以及詞性上的結(jié)果到底如何呢?我們通過(guò)以下一些實(shí)驗(yàn)為大家證明。具體的代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # Testing final embedding input_dictionary = dict ([(v,k) for (k,v) in reverse_dictionary.iteritems()]) #找尋france, paris和rome的word index test_word_idx_a = input_dictionary.get( 'france' ) test_word_idx_b = input_dictionary.get( 'paris' ) test_word_idx_c = input_dictionary.get( 'rome' ) #在final_embeddings(也就是我們系統(tǒng)學(xué)到的embedding)里尋找上述詞 a = final_embeddings[test_word_idx_a,:] b = final_embeddings[test_word_idx_b,:] c = final_embeddings[test_word_idx_c,:] #通過(guò)algebra的方式尋找預(yù)測(cè)詞 ans = c + (a - b) similarity = final_embeddings.dot(ans) print similarity.shape print similarity[ 0 : 10 ] #選取最近的4個(gè)詞展示出來(lái) top_k = 4 nearest = ( - similarity).argsort()[ 0 :top_k + 1 ] print nearest for k in xrange (top_k + 1 ): close_word = reverse_dictionary[nearest[k]] print (close_word) |
所得結(jié)果如下:
當(dāng)輸入a = france, b = paris, c = rome時(shí),系統(tǒng)回答我詞匯近似于[rome, france, thibetanus, mnras, schwaben]。 當(dāng)輸入為a = king, b = man, c = woman時(shí),系統(tǒng)回答為[king, woman, philip, mayr, eulemur]。這里的結(jié)果并不理想。訓(xùn)練時(shí)間上,60萬(wàn)個(gè)step時(shí)間并不是很長(zhǎng),也不短,之前沒(méi)注意記時(shí)間,但是運(yùn)算時(shí)間大體在1小時(shí)左右。
這個(gè)模型是Tensorflow對(duì)word embedding的加強(qiáng)式示例,其默認(rèn)迭代數(shù)為15次,運(yùn)行結(jié)果如下:
15 epoches之后的正確率為36.7%。 在設(shè)定迭代數(shù)量為50次后,該結(jié)果為39%, 迭代數(shù)為100時(shí),accuracy也沒(méi)超過(guò)40%,停留在39.7%。 當(dāng)運(yùn)行了200次迭代后,總算達(dá)到了40%,雖然耗時(shí)為大約7小時(shí)。至于系統(tǒng)于一些基礎(chǔ)問(wèn)題上的運(yùn)行結(jié)果,我們對(duì)15詞迭代的結(jié)果進(jìn)行了測(cè)試,結(jié)果如下:
從以上簡(jiǎn)單的測(cè)試中,我們已經(jīng)發(fā)現(xiàn)其效果一般,但比較basic版本還是要好很多的。其中,有名的king, man, queen, woman問(wèn)題系統(tǒng)并沒(méi)有回答正確。
Gensim的Word2Vec:
Gensim是一個(gè)很常用的深度學(xué)習(xí)topic modeling工具。在編寫(xiě),運(yùn)用方式以及效果上肯定會(huì)優(yōu)于Tensorflow的版本。Gensim的Word2Vec系統(tǒng)在網(wǎng)上有許多教程,這里提供一下兩個(gè)供大家參考,解釋的均很不錯(cuò),基本屬于可以直接運(yùn)用的類(lèi)型:1)http://rare-technologies.com/word2vec-tutorial/ 2)http://www.open-open.com/lib/view/open1420687622546.html
系統(tǒng)的運(yùn)行結(jié)果如下:
在運(yùn)行時(shí),我們把word_embedding的size設(shè)為128, 運(yùn)行迭代15次。訓(xùn)練完成模型后,對(duì)模型用questions-words.txt文件進(jìn)行評(píng)測(cè):
這份不僅我們觀察到其效果如何,我們更是直觀的了解了gensim的系統(tǒng)在哪些地方表現(xiàn)的不錯(cuò),哪里有不足。比如在family這個(gè)大類(lèi)中,所出現(xiàn)的問(wèn)題為[grandfather grandmother grandpa grandma],系統(tǒng)在這方面正確率頗高,為82%,但是在預(yù)測(cè)省內(nèi)的都市時(shí),效果卻僅達(dá)到18.1%。 這個(gè)直觀的系統(tǒng)讓我們快速了解了word2vec的學(xué)習(xí)效率以及學(xué)習(xí)優(yōu)缺點(diǎn),但是對(duì)于我們常用的問(wèn)題會(huì)做的如何呢?測(cè)試結(jié)果如下:
由此可見(jiàn),系統(tǒng)答對(duì)了我們?cè)儐?wèn)的全部問(wèn)題,雖然問(wèn)題基數(shù)很小,但對(duì)比之前的系統(tǒng),說(shuō)明gensim做的可以很好,也能更好!
聯(lián)系客服