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