- 这里并不是介绍word2vec的原理,因为原理介绍方面的资料网上多的是:推荐两个我认为很有价值的
http://www.cnblogs.com/peghoty/p/3857839.html
- 首先word2vec训练结果的差异主要来自什么因素?
(1)语料影响最大:
语料的场景,比如微博的语料和新闻语料训练的结果差别很大。因为微博属于个人发帖,比较随意。而新闻比较官方正式,另外新闻句式相对复杂。经过训练对比:微博这种短文,训练的相似词更多是同级别的相关词。比如 深圳 相关的是 广州 。而用新闻语料,训练得到 深圳 相关的词 更多是与 深圳 有关联的词,比如 深圳大学。
实际发现在微博,违法色情的词训练的比较好,因为黑产用这种渠道来推广;而在评论,骂人的词训练的比较好;在新闻,则是常见的正规的词训练的比较好。下面分别看一下‘评论 垃圾的相关词’跟‘新闻 垃圾的相关词’
为何差别那么大呢?
因为word2vec的原理就是一个词预测 前后词 或者 前后词 预测 当前词,使得概率最大化。这就导致如下两个结果:
一、相似的句子,相同部位的词 会相似。
比如 句子1 w1 w2 w3 w4 X w5 w6 w7.
句子2 w1 w2 w3 w5 Y w5 w6 w7.
因为 X 的向量 受 w1 w2 w3 w4 w5 w6 w7 向量影响决定, Y也是受这几个词影响决定。
所以 X Y 是相似的。
二、挨着近的词,也是相似的。
比如 句子 w1 w2 w3 w4 X Y w5 w6 w7.
这样 X Y 都是受到 来自 w1 w2 w3 w4 w5 w6 w7 向量影响决定。
所以X Y是相似的。
所以,微博和新闻的句子的整体分布是不一样的。 这里影响 结论一。
其次,新闻长文多,句式复杂,微博短文多,这里影响结论二。
(2)算法参数的影响。
算法参数对总体效果影响不大。相对来说,比较重要的参数有以下:
一、子采样(subsampling)
子采样越低,对高频词越不利,对低频词有利。可以这么理解,本来高频词 词被迭代50次,低频词迭代10次,如果采样频率降低一半,高频词失去了25次迭代,而低频词只失去了5次。一般设置成le-5。个人觉得,子采样有类似tf-idf的功能,降低高频词对上下文影响的权重。
二、语言模型
skip-gram 和cbow,之前有对比,切词效果偏重各不相同。
从效果来看,感觉cbow对词频低的词更有利。这是因为 cbow是基于周围词来预测某个词,虽然这个词词频低,但是他是基于 周围词训练的基础上,通过算法来得到这个词的向量。通过周围词的影响,周围词训练的充分,这个词就会收益。
三、窗口大小
窗口大小影响 词 和前后多少个词的关系,和语料中语句长度有关,建议可以统计一下语料中,句子长度的分布,再来设置window大小。一般设置成8。
四、min-count
最小词频训练阀值,这个根据训练语料大小设置,只有词频超过这个阀值的词才能被训练。
根据经验,如果切词效果不好,会切错一些词,比如 “在深圳”,毕竟切错的是少数情况,使得这种错词词频不高,可以通过设置相对大一点的 min-count 过滤掉切错的词。
五、向量维度
如果词量大,训练得到的词向量还要做语义层面的叠加,比如 句子 的向量表示 用 词的向量叠加,为了有区分度,语义空间应该要设置大一些,所以维度要偏大。一般 情况下200维足够用。
六、其他参数
比如学习率 可以根据需要调。
(3)word2vec 影响速度的因素有哪些?
一、语言模型:cbow 比skip-gram 更快
为什么 cbow更快,很重要的一个原因,cbow是基于周围词来预测这个单词本身 。而skip-gram是基于本身词去预测周围词。 那么,cbow只要 把窗口内的其他词相加一次作为输入来预测 一个单词。不管窗口多大,只需要一次运算。而skip-gram直接受窗口影响,窗口越大,需要预测的周围词越多。在训练中,通过调整窗口大小明显感觉到训练速度受到很大影响。
二、迭代次数
影响训练次数,语料不够的情况下,可以调大迭代次数。spark 版本有bug,迭代次数超过1,训练得到的词向量维度值超大。
三、线程数
单机版(google word2vec)可以通过设置多线程跑,集群版(spark mllib)可以设置多个 partitions.但是从经验来看,在集群上设置partitions 过多,会影响训练的效果。
四、其他参数
采样频率 影响词的训练频率
min-count 最小词频 影响 训练词的数量
Window大小 影响 skip-gram 的 预测次数。
向量维度 维度决定了训练过程中计算的维度
(4)怎样评估word2vec训练的好坏?
一、词聚类
可以采用 kmeans 聚类,看聚类簇的分布
二、词cos 相关性
查找cos相近的词
三、Analogy对比
a:b 与 c:d的cos距离 (man-king woman-queen )
四、使用tnse,pca等降维可视化展示
词的分布,推荐用google的tensorboard,可以多视角查看,如果不想搭建服务,直接访问这里
另外可以用python的matplotlib。
五、Categorization 分类 看词在每个分类中的概率
词动物食物汽车电子橘子0.110.680.120.11鸟0.660.110.130.11雅阁0.140.230.670.11苹果0.110.650.110.65
前三条来自官网的评测方法
网上也有相关的word embedding 的评估方法,可以参考这里
资源
word2vec :https://github.com/zhyq/word2vec-google
spark mllib word2vec训练,转换成google word vector形式:https://github.com/zhyq/word2vec-spark
word2vec效果展示:
Remark:
1、目前word embedding的工具有 fasttext,glove ,word2vec,elmo等,前三者对比效果差不多,关键在语料构建上面下功夫。elmo这个是基于监督的。
2、spark 版本有bug,迭代次数超过1,训练得到的词向量维度值超大。推荐用gensim,挺好用的,用spark算的话,一般语料很大了,没有迭代也没关系。
3、思考一个提问:word2vec可以用来做特征选择,相比于传统的特征选择方法能够增加语义理解。很多文章里面的解决方法是将低频词通过word2vec 映射到高频词去。那么是否是先用tfidf来将词的权重算出来,然后得到高频和低频词,这个时候再使用word2vec模型的相似度计算来把低频词转化成高频词,达到降维的效果呢?