上文提到了word2vec的核心原理,本质上是对bengio的NNLM模型进行的改进, 介绍了cbow与skipgram以及Hierarchical Softmax这一实现细节.此处将继续介绍另一个重要的细节:Negative Sampling, 再补充下工具包的一些参数以及个人使用过程中的一些心得.
从论文出发
以前对Negative Sampling的认识非常浅显,简单地认为,就是随机地增加几个负样本到模型里,以加速收敛.
翻阅部分网上博客跟知乎回答,发现并不是那么简单的问题,然后我把w2v的三篇论文以及NNLM的论文翻了出来,简单阅读了一下,下面综合了部分论文阅读的粗略见解与网上资料.
从工具包作者的论文可以知道, Negative Sampling是Hierarchical Softmax的一个替代品, 目的也是为了提升训练效率.此外,针对NNLM不关心词序,不能表述词组的问题,又给出了相应的解决办法.
Negative Sampling
- 为什么要Negative Sampling
- 提升效率
假设训练的词典大小为1000, 那么在Softmax层,每一个训练样本需要更新1000个神经元的参数,Hierarchical Softmax也是为了缓解这个问题,使用了霍夫曼树后,需要更新的神经元数的期望值变成了log1000, 作者觉得这个还不够狠,毕竟谷歌的语料非常非常地大. - 加速收敛
另外还有个问题就是更新全部神经元必定会在收敛过程中走出折线,为什么?因为假设有一条数据是(我, 要), 中心词是我,那么在更新的时候,如果更新全部神经元,其实是相当于把(我,想),(我,得)这些都当做负样本,反之亦然.这样的话,不可避免会在收敛过程中走弯路.
- Negative Sampling的灵感来源
作者在文中提到,NCE(Noise Contrastive Estimation)噪声对比估计是Hierarchical Softmax的一个替代方案,这也是前人的论文里使用的方法, 所以在tensorflow版本的word2vec里,直接用的就是nce loss.作者从工程实现的角度,想了个办法去模拟NCE,这个办法就是Negative Sampling. - 什么是NCE
此处查了资料,由于本人数学水平限制,还有少量细节没有明白,有机会再补充了.可以参考[4]以及这个油管上的视频
,讲的很好. - Negative Sampling怎么做
首先,输出层的softmax换成二元逻辑回归,这里的做法就是借鉴了NCE的方法.
其次,每个训练样本看做正样本,并采取一定的策略进行采样,引入一些负样本.
对于word2vec来说,Negative Sampling核心的内容其实就是这个采样策略. - 如何采样
对词频进行平缓处理后,按照新的权重随机采样.
平衡的权重为, 作者经过大量尝试最终确定此处的超参数为0.75时为最佳,并没有包含理论推导,主要是工程实践的经验值.
论文的其他细节
本文最初提到了,论文作者针对NNLM不关心词序,不能表述词组的问题, 给出了词组的解决方案.
- 词组学习
取2-gram,给定打分函数,求出所有成对出现的词组的分数,分数超过设定的阀值的,在训练过程中当做词组,替换为特定的token,但是在工具包的输出文件中,有一个word2phase,可以从语料中提取词组.
打分函数为 - 高频词的下采样
语料中,经常出现诸如:的,这,那....之类的高频词,其实意义并不大,同时又会拖慢训练速度,根据论文中给出的基于词频的概率公式,每个词都有一定概率在迭代过程中被忽略掉.
参数说明
我们现在项目中使用的是官方的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.