word2vec你可能不知道的秘密

  1. 这里并不是介绍word2vec的原理,因为原理介绍方面的资料网上多的是:推荐两个我认为很有价值的

http://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf

http://www.cnblogs.com/peghoty/p/3857839.html

  1. 首先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,可以多视角查看,如果不想搭建服务,直接访问这里

http://projector.tensorflow.org

另外可以用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 的评估方法,可以参考这里

http://www.aclweb.org/anthology/D15-1036

资源

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模型的相似度计算来把低频词转化成高频词,达到降维的效果呢?

猜你喜欢

转载自blog.csdn.net/xiaojiayudst/article/details/84668729
今日推荐