Word2Vec在Tensorflow上的版本以及与Gensim之间的运行对比
接昨天的博客,这篇随笔将会对本人运行Word2Vec算法时在Gensim以及Tensorflow的不同版本下的运行结果对比。在运行中,参数的调节以及迭代的决定本人并没有很好的经验,所以希望在展出运行的参数以及结果的同时大家可以批评指正,多谢大家的支持!
对比背景:
对比实验所运用的corpus全部都是可免费下载的text8.txt。下载点这里。在训练时,word embedding的维度被调节为200,除了word2vec_basic.py版本的step size为600001外,其余均为15个epoches。 运行结果除basic版本外其他的均运用了Mikolov所公开的questions-words.txt文件来计算其精确度。该精确度计算文件的格式为每行四个词,在计算精度时,系统选取前三个词的向量,计算词2-词1+词3所得的向量并通过cosine similarity的方式搜寻最接近的词,并选取top N个(N为自定义量,一般要么1要么4)来查看questions-words里每行的第四个词是否存在于这top N个词之中。另外,在运行结束后,我也根据Mikolov论文中的提示运用了几个常见的向量算数测试来测验各模型的准确度。我所运用的测试为:
1. France, Paris, Beijing, China 或者 France, Paris, Rome, Greece
2. man, king, woman, queen
3. slow, slowly, quick, quickly
等等......
对比结果:
TensorFlow框架:
word2vec_baisc.py是Tensorflow官方版本的Sentence Embedding概念阐述的示例的代码。该代码用最简单的方式实现了Word2Vec中的部分主要功能,即Skip-Gram模型以及Negative Samping加速分类算法。在设定word embedding维度为200以及num step为600001后,运行结果如下:
由上图可见,词向量是randomly init的,所以他认为six跟conjuring或者analogies相近。另外,在刚init的时机,loss数是302.11。在20万此迭代后,average loss为4.96。此时的nearest测试结果如下:
我们可见此时,跟six相近的词为seven, five, four和eight, 并且与has相似的有had, have等。这个结果已经初步证明系统已经学习到了一些特征,但是有的词例如history,所对应的词是reginae,这个连含义都不清楚的词和明显跟history的意义不相关。所以可见系统并不完善,只是简单的词儿比较容易先学到。另外,从20万个到第40万step,我们发现loss降低的并不明显。在训练的最后,结果展示如下:
history跟culture的北美的环境里有些许相似的成分,所以可见系统穷时变得更加的好了。同时,i本身作为罗马数字的一面(即ii)和作为我的一面(即we)也被很好的展现了出来。这个结果是encouraging的,因为系统其实变得更好了。但是一直到60万step, loss还停留在4.52左右,于20万的4.96区别不大,由此可见学习进入smoothing区域。
但系统到底在词义以及词性上的结果到底如何呢?我们通过以下一些实验为大家证明。具体的代码如下:
# 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(也就是我们系统学到的embedding)里寻找上述词
a = final_embeddings[test_word_idx_a,:]
b = final_embeddings[test_word_idx_b,:]
c = final_embeddings[test_word_idx_c,:] #通过algebra的方式寻找预测词
ans = c + (a - b)
similarity = final_embeddings.dot(ans) print similarity.shape
print similarity[0:10] #选取最近的4个词展示出来
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)
所得结果如下:
当输入a = france, b = paris, c = rome时,系统回答我词汇近似于[rome, france, thibetanus, mnras, schwaben]。 当输入为a = king, b = man, c = woman时,系统回答为[king, woman, philip, mayr, eulemur]。这里的结果并不理想。训练时间上,60万个step时间并不是很长,也不短,之前没注意记时间,但是运算时间大体在1小时左右。
这个模型是Tensorflow对word embedding的加强式示例,其默认迭代数为15次,运行结果如下:
15 epoches之后的正确率为36.7%。 在设定迭代数量为50次后,该结果为39%, 迭代数为100时,accuracy也没超过40%,停留在39.7%。 当运行了200次迭代后,总算达到了40%,虽然耗时为大约7小时。至于系统于一些基础问题上的运行结果,我们对15词迭代的结果进行了测试,结果如下:
从以上简单的测试中,我们已经发现其效果一般,但比较basic版本还是要好很多的。其中,有名的king, man, queen, woman问题系统并没有回答正确。
Gensim的Word2Vec:
Gensim是一个很常用的深度学习topic modeling工具。在编写,运用方式以及效果上肯定会优于Tensorflow的版本。Gensim的Word2Vec系统在网上有许多教程,这里提供一下两个供大家参考,解释的均很不错,基本属于可以直接运用的类型:1)http://rare-technologies.com/word2vec-tutorial/ 2)http://www.open-open.com/lib/view/open1420687622546.html
系统的运行结果如下:
在运行时,我们把word_embedding的size设为128, 运行迭代15次。训练完成模型后,对模型用questions-words.txt文件进行评测:
这份不仅我们观察到其效果如何,我们更是直观的了解了gensim的系统在哪些地方表现的不错,哪里有不足。比如在family这个大类中,所出现的问题为[grandfather grandmother grandpa grandma],系统在这方面正确率颇高,为82%,但是在预测省内的都市时,效果却仅达到18.1%。 这个直观的系统让我们快速了解了word2vec的学习效率以及学习优缺点,但是对于我们常用的问题会做的如何呢?测试结果如下:
由此可见,系统答对了我们询问的全部问题,虽然问题基数很小,但对比之前的系统,说明gensim做的可以很好,也能更好!
Word2Vec在Tensorflow上的版本以及与Gensim之间的运行对比的更多相关文章
- 全网最详细的大数据集群环境下多个不同版本的Cloudera Hue之间的界面对比(图文详解)
不多说,直接上干货! 为什么要写这么一篇博文呢? 是因为啊,对于Hue不同版本之间,其实,差异还是相对来说有点大的,具体,大家在使用的时候亲身体会就知道了,比如一些提示和界面. 安装Hue后的一些功能 ...
- Paragraph Vector在Gensim和Tensorflow上的编写以及应用
上一期讨论了Tensorflow以及Gensim的Word2Vec模型的建设以及对比.这一期,我们来看一看Mikolov的另一个模型,即Paragraph Vector模型.目前,Mikolov以及B ...
- tensorflow 安装GPU版本,个人总结,步骤比较详细【转】
本文转载自:https://blog.csdn.net/gangeqian2/article/details/79358543 手把手教你windows安装tensorflow的教程参考另一篇博文ht ...
- git reset revert 回退回滚取消提交返回上一版本
git reset revert 回退回滚取消提交返回上一版本 总有一天你会遇到下面的问题. (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你 ...
- 【转】.NET 安装和部署(Installer) 如何卸载上一个版本
前言 当使用.NET“安装项目”打包的安装文件,再次安装的时候会弹出如下提示,这个时候会让我们很郁闷,怎样才能自动卸载上一个安装的版本呢?方法很简单,只需简单的两个操作步骤即可解决. 操作步骤 主要由 ...
- dfa最小化,修正了上个版本的一些错误。
上个版本测试的时候,只用了两个非常简单的测试用例,所以好多情况有问题却没有测试出来 bug1:在生成diff_matrix的时候,循环变量少循环了一次,导致最后一个节点在如果无法与其他点合并的情况下, ...
- GIT用服务器上的版本强制覆盖掉本地的版本(转)
以前在机子上使用git下载了linux git版本库上的源代码,由于在阅读源代码的过程中,难免会对本地的文件进行修改,这样就导致本地文件与服务器上的文件版本不一致,我想做的就是用服务器上的版本强制覆盖 ...
- ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库
ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库. 与现有的主要针对监督任务设计的深度学习库不同,ZhuSuan 的特点是深入到贝叶斯推理中,从而支持各种生成模式:传 ...
- 持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本
持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...
随机推荐
- C#:获取时间年月日时分秒格式
//获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().ToStri ...
- SPRING中事务的配置
采用这种配置策略,完全可以避免增量式配置,所有的事务代理由系统自动创建.容器中的目标bean自动消失,避免需要使用嵌套bean来保证目标bean不可被访问.这 种配置方式依赖于Spring提供的bea ...
- JAVA 年老代收集器 第10节
JAVA 年老代收集器 第10节 上一章我们讲了新生代的收集器,那么这一章我们要讲的就是关于老年代的一些收集器.老年代的存活的一般是大对象以及生命很顽强的对象,因此新生代的复制算法很明显不能适应该区域 ...
- shared_ptr智能指针源码剖析
(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档 (http://www.boost.org/doc/ ...
- mysql学习(三)
//解决linux下不能远程登陆的方法 http://www.blogjava.net/jasmine214--love/archive/2011/01/14/342981.html mysql数据类 ...
- 关于 MyBatis MyBatis-Spring Jdbc 批量插入的各种比较分析
因为目前SME项目中编写了一套蜘蛛爬虫程序,所以导致插入数据库的数据量剧增.就项目中使用到的3种DB插入方式进行了一个Demo分析: 具体代码如下: 1: MyBatis 开启Batch方式,最普通的 ...
- Could not find class 'XXX.activity‘', referenced from method 'YYYY'
Could not find class 'XXX.activity‘', referenced from method 'YYYY'的解决方案: 出现这个错误.是由于eclipse升级ADT所导致的 ...
- VB 字符串函数总结
'###################################################### 1. ASC(X),Chr(X):转换字符字符码 [格式]: P=Asc(X) 返回字符 ...
- 升级linux内核(2.6.32->3.10.81),安装docker
1.内核升级环境准备 #查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库: yum grouplist #一般是安装这两个软件包组,这样做会确定你拥有编译时所需的一切工具 ...
- Oracle EBS-SQL (SYS-14):查询表空间1.sql
SELECT d.status "状态", d.tablespace_name "名称", d.contents &qu ...