word2vec的经验总结

1. word2vec 是word embedding 最好的工具吗?

  • word2vec并非是效果最好的word embedding 工具。

  • 最容易看出的就是word2vec没有考虑语序,这里会有训练效果损失。

  • 由于 word2vec 训练速度快 ,易用,google出品 等,使得word2vec使用的人多。

  • 训练快是因为 word2vec只有输入层和输出层,砍去了神经网络中,隐藏层的耗时计算(所以word2vec并不算是一个深度学习算法)。另外,阅读word2vec的google的源码,会发现里面有一些提速的trick。如 sigmod函数,采用一次计算,以后查表,减去了大量的重复计算。如词典hash存储, 层次softmax等。

  • 易用是因为word2vec 公布了word2vec的代码。在tensorflow,gensim,spark mllib包中都有集成,使用方便。

2. word2vec 训练结果的差异主要来自什么因素?

2.1 语料影响最大

  • 语料的场景,比如微博的语料和新闻语料训练的结果差别很大。因为微博属于个人发帖,比较随意。而新闻比较官方正式,另外新闻句式相对复杂。经过训练对比:微博这种短文,训练的相似词更多是同级别的相关词。比如 深圳 相关的是 广州 。而用新闻语料,训练得到 深圳 相关的词 更多是与 深圳 有关联的词,比如 深圳大学。
  • 实际发现在微博,违法色情的词训练的比较好,因为黑产用这种聚到来推广。而在评论,骂人的词训练的比较好,在新闻,则是常见的正规的词训练的比较好。

2.2 为什么会出现这种情况呢?

因为 word2vec 的原理就是 一个词预测前后词 或者 前后词预测当前词,使得概率最大化
这就导致如下两个结果:

  • 2.1.1 相似的句子,相同部位的词会相似。

比如:

句子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 是相似的。

  • 2.1.2 挨着近的词,也是相似的。
句子 w1 w2 w3 w4 X Y w5 w6 w7.

这样 X Y 都是受到 来自 w1 w2 w3 w4 w5 w6 w7 向量影响决定。

所以X Y是相似的

所以,微博和新闻的句子的整体分布是不一样的。 影响 结论 2.1.1.

其次,新闻长文多,句式复杂,微博短文多,影响 结论2.1.2.

2.3 算法参数的影响。

算法参数对总体效果影响不大。相对来说,比较重要的参数有以下:

  • 2.3.1 负采样(subsampling)

    负采样越低,对高频词越不利,对低频词有利。可以这么理解,本来高频词 词被迭代50次,低频词迭代10次,如果采样频率降低一半,高频词失去了25次迭代,而低频词只失去了5次。一般设置成le-5。个人觉得,负采样有类似tf-idf的功能,降低高频词对上下文影响的权重。

  • 2.3.2 语言模型

    skip-gram 和cbow,之前有对比,切词效果偏重各不相同。
    从效果来看,感觉skim-gram对词频低的词更有利。如果计算相似度的话,还是选择cbow比较好。

  • 2.3.3 窗口大小

    窗口大小影响 词 和前后多少个词的关系,和语料中语句长度有关,建议可以统计一下语料中,句子长度的分布,再来设置window大小。一般设置成8。

  • 2.3.4 min-count

    最小词频训练阀值,这个根据训练语料大小设置,只有词频超过这个阀值的词才能被训练。

    根据经验,如果切词效果不好,会切错一些词,比如 “在深圳”,毕竟切错的是少数情况,使得这种错词词频不高,可以通过设置相对大一点的 min-count 过滤掉切错的词

  • 2.3.5 向量维度

    如果词量大,训练得到的词向量还要做语义层面的叠加,比如 句子 的向量表示 用 词的向量叠加,为了有区分度,语义空间应该要设置大一些,所以维度要偏大。一般 情况下200维够用

  • 2.3.6 其他参数

    比如学习率 可以根据需要调。

3 word2vec 影响速度的因素有哪些?

  • 3.1 语言模型:cbow 比skip-gram 更快
    为什么 cbow更快,很重要的一个原因,cbow是基于周围词来预测这个单词本身 。而skip-gram是基于本身词去预测周围词。 那么,cbow只要 把窗口内的其他词相加一次作为输入来预测 一个单词。不管窗口多大,只需要一次运算。而skip-gram直接受窗口影响,窗口越大,需要预测的周围词越多。在训练中,通过调整窗口大小明显感觉到训练速度受到很大影响。

  • 3.2 迭代次数
    影响训练次数,语料不够的情况下,可以调大迭代次数。spark 版本有bug,迭代次数超过1,训练得到的词向量的数值超大。在训练集语料库不大的情况下,建议使用gensim中的word2vec;当然,如果语料库很大,那么可以采用spark的word2vec,令maxiter=1,因为当语料库达到分布式所需的体量时,w2v迭代已经不重要了,但是,需要注意:spark实现的word2vec只能使用skip-gram+层次softamax的方法

  • 3.3 线程数
    单机版(google word2vec)可以通过设置多线程跑,集群版(spark mllib)可以设置多个 partitions.但是从经验来看,在集群上设置partitions 过多,会影响训练的效果。

  • 3.4 其他参数
    采样频率 影响词的训练频率
    min-count 最小词频 影响 训练词的数量
    Window大小 影响 skip-gram 的 预测次数。
    向量维度 维度决定了训练过程中计算的维度

4 怎样评估word2vec训练的好坏?

  • 4.1 词聚类
    可以采用 kmeans 聚类,看聚类簇的分布

  • 4.2 词cos 相关性
    查找cos相近的词

  • 4.3 Analogy对比
    a:b 与 c:d的cos距离 (man-king woman-queen )

  • 4.4 使用tnse,pca等降维可视化展示
    词的分布,推荐用google的tensorboard,可以多视角查看,如果不想搭建服务,直接访问链接: http://projector.tensorflow.org/.。另外可以用python的matplotlib。
    在这里插入图片描述

5. 注意点:

  • 5.1 word2vec怎么区别文本里的不同句子? 如果我把一个文本进行训练,那么上下句子之间不是会造成划窗到一起的情况吗?这样不是会降低训练效果吗?
    当窗口滑动到其他句子时,最终结果影响不大。因为当语料很大的时候,上下文相关的词会经常共现,而和这个词无关的词,共现的概率很小,会出现各种各样不同的词和这个词共现,对最终结果影响不大。
  • 5.2
    默认sg=0;sg=1是skip-gram算法,对低频词敏感;不过这里因为是计算近似词所以要选择CBOW(sg=0);
  • 5.3
    size是向量的维数,太小的话词映射后会因为冲突而影响结果。但如果太大则会吃更多内存并让算法计算变慢;
  • 5.4
    window是前后看词的单位,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机);这里因为语料的句子太短,设置过大的window会导致结果并不那么理想。
  • 5.5
    negative和sample根据训练结果微调即可,sample采样虽然根据官网介绍设置1e-5,不过如果训练语料略少,不能降低太多高频词的采样率
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值