美文网首页
Word2Vec原理(二)-Negative Sampling与

Word2Vec原理(二)-Negative Sampling与

作者: MashoO | 来源:发表于2019-04-11 17:11 被阅读0次

    上文提到了word2vec的核心原理,本质上是对bengio的NNLM模型进行的改进, 介绍了cbow与skipgram以及Hierarchical Softmax这一实现细节.此处将继续介绍另一个重要的细节:Negative Sampling, 再补充下工具包的一些参数以及个人使用过程中的一些心得.

    从论文出发

    以前对Negative Sampling的认识非常浅显,简单地认为,就是随机地增加几个负样本到模型里,以加速收敛.
    翻阅部分网上博客跟知乎回答,发现并不是那么简单的问题,然后我把w2v的三篇论文以及NNLM的论文翻了出来,简单阅读了一下,下面综合了部分论文阅读的粗略见解与网上资料.
    从工具包作者的论文可以知道, Negative Sampling是Hierarchical Softmax的一个替代品, 目的也是为了提升训练效率.此外,针对NNLM不关心词序,不能表述词组的问题,又给出了相应的解决办法.

    Negative Sampling

    • 为什么要Negative Sampling
    1. 提升效率
      假设训练的词典大小为1000, 那么在Softmax层,每一个训练样本需要更新1000个神经元的参数,Hierarchical Softmax也是为了缓解这个问题,使用了霍夫曼树后,需要更新的神经元数的期望值变成了log1000, 作者觉得这个还不够狠,毕竟谷歌的语料非常非常地大.
    2. 加速收敛
      另外还有个问题就是更新全部神经元必定会在收敛过程中走出折线,为什么?因为假设有一条数据是(我, 要), 中心词是我,那么在更新的时候,如果更新全部神经元,其实是相当于把(我,想),(我,得)这些都当做负样本,反之亦然.这样的话,不可避免会在收敛过程中走弯路.
    • Negative Sampling的灵感来源
      作者在文中提到,NCE(Noise Contrastive Estimation)噪声对比估计是Hierarchical Softmax的一个替代方案,这也是前人的论文里使用的方法, 所以在tensorflow版本的word2vec里,直接用的就是nce loss.作者从工程实现的角度,想了个办法去模拟NCE,这个办法就是Negative Sampling.
    • 什么是NCE
      此处查了资料,由于本人数学水平限制,还有少量细节没有明白,有机会再补充了.可以参考[4]以及这个油管上的视频
      ,讲的很好.
    • Negative Sampling怎么做
      首先,输出层的softmax换成二元逻辑回归,这里的做法就是借鉴了NCE的方法.
      其次,每个训练样本看做正样本,并采取一定的策略进行采样,引入一些负样本.
      对于word2vec来说,Negative Sampling核心的内容其实就是这个采样策略.
    • 如何采样
      对词频进行平缓处理后,按照新的权重随机采样.
      平衡的权重为P_{w_i}=\frac{count(w_i)^c}{\sum{}{}count(w_j)^c}, 作者经过大量尝试最终确定此处的超参数为0.75时为最佳,并没有包含理论推导,主要是工程实践的经验值.

    论文的其他细节

    本文最初提到了,论文作者针对NNLM不关心词序,不能表述词组的问题, 给出了词组的解决方案.

    • 词组学习
      取2-gram,给定打分函数,求出所有成对出现的词组的分数,分数超过设定的阀值的,在训练过程中当做词组,替换为特定的token,但是在工具包的输出文件中,有一个word2phase,可以从语料中提取词组.
      打分函数为score(w_i,w_j)=\frac{count(w_i,w_j)-\delta}{count(w_i)*count(w_j)}
    • 高频词的下采样
      语料中,经常出现诸如:的,这,那....之类的高频词,其实意义并不大,同时又会拖慢训练速度,根据论文中给出的基于词频的概率公式,每个词都有一定概率在迭代过程中被忽略掉.

    参数说明

    我们现在项目中使用的是官方的c原版工具包,下载地址.因此下面的介绍也从官方包出发.
    这是官方包里的demo脚本,下面简单说明参数的含义与用的时候的一些经验.

    time ./word2vec -train huashu.txt -min-count 1 -output $SAVEPATH
     -cbow 0 -size 100 -window 7 -negative 0 -hs 1 -binary 1 -iter 50 -threads 20
    

    我的工作背景是垂直领域下的意图识别与槽位抽取.举个最简单的栗子,系统输入一句话:北京今天天气怎么样, 我的任务是识别出意图:查询天气;识别槽位:city=北京.经验性内容也主要来自日常工作,毕竟是个超级学渣.

    参数名 意义 经验值
    train 输入路径 文本格式为按空格切分的语料
    min-count 最小词频 语料库大的时候建议3以上,小的时候1,防止信息丢失
    output 输出路径 输出为.bin文件,其实就是每行一个向量,第一行为元信息
    cbow 是否使用cbow 为0时使用skipgram
    size 输出维度 50以上就行
    window 窗口大小 需要尝试,3456效果都还可以,如果语料已分词建议小点
    negative 是否使用负采样 为1使用
    hs 是否使用层序softmax 为1时使用
    binary 是否输出二进制文件 1使用.默认为1就行
    iter 迭代次数 我们一般在100以上,语料库大的时候建议小点,
    sample 下采样时的超参数 越大则对高频词影响越大,默认为1e-3

    根据官网的说明,工具包内还提供了一个效果评测的工具,根据名字就知道是一个类比方法,也就是验证诸如:国王-王后==男-女,这个评价标准其实也来自于论文,实际工作中的效果还是得看具体的任务.

    参考文献

    [1]刘建平Pinard.word2vec原理(三) 基于Negative Sampling的模型[EB/OL].http://www.cnblogs.com/pinard/p/7249903.html,2017-07-28.
    [2]yuyuqi.word2vec(cbow+skip-gram+hierarchical softmax+Negative sampling)模型深度解析[EB/OL].https://zhuanlan.zhihu.com/p/35074402,2018-03-29.
    [3]有道团队.Deep Learning实战之word2vec[EB/OL].http://techblog.youdao.com/?p=915#LinkTarget_699,2014-02-27.
    [4]苏剑林.“噪声对比估计”杂谈:曲径通幽之妙[EB/OL].https://spaces.ac.cn/archives/5617/comment-page-1,2018-06-13.

    相关文章

      网友评论

          本文标题:Word2Vec原理(二)-Negative Sampling与

          本文链接:https://www.haomeiwen.com/subject/zpwbiqtx.html