关闭

Word2Vec教程(2)- Negative Sampling

标签: word2vec深度学习
2824人阅读 评论(0) 收藏 举报
分类:

原帖地址:http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/

在word2vec第二部分教程中(这里是第一部分part1
我将会讨论一些在原有skip-gram 模型基础上 额外的小trick,使模型训练可行。

当你读到skip-gram model 的时候,你可能会觉得它是一个很大的网络。(译者按:其实对于现在6G/8G/12G的GPU来说,还是挺小的)

在例子中,我给出了 300个神经元,和10,000个词的词典。考虑输入层和输出层,他们各自会产生 300×10,000=3,000,000 个权重。

在神经网络上跑梯度下降 将会很慢。 更不利的是,你需要大量的数据来调整这些权重,防止过拟合。百万数量级的权重,和千万数量级的训练数据,意味着很难训练这个网络。

Word2Vec的作者在他们第二篇paper中解决了这个问题,有3个创新点:
1.把常见的词组作为一个单词。
2.少采样常见的词 (译者按:A the 啥的都滚粗)
3.修改优化目标函数,这个策略成为“Negative Sampling“,使得每个训练样本只去更新模型中一小部分的weights。

值得注意的是 2和3 不仅仅减少了训练的计算量,而且提升了最后word vector的质量。

词组

作者指出像“Boston Globe“(一家报社)这种词对,和两个单词 Boston/Globe有着完全不同语义。所以更合理的是把“Boston Globe“看成一个单词,有他自己的word vector。

你可以从公开的model中看到,GoogleNews 上有100bilion个单词。额外的词组使得词典达到了 3milion 个单词。

如果你对词典有兴趣去你可以看。

词组检测是另外一个问题

降采样常用词

在part1中,我展示了如何从句子中产生训练样本,这里我再重复一下。例子为“The quick brown fox jumps over the lazy dog.“
这里写图片描述

比如像“the“这种常见的词,我们会遇到两个问题:
1. 比如(fox,the)其实没有传递我们关于 fox的信息。‘the‘出现得太多了。
2. 我们有太多 (‘the‘,…)的样本,多于我们真的需要的。
所以word2vec采用了降采样的策略。对于每个我们在训练样本中遇到的词,我们有一个概率去删除它。这个概率与单词出现的频率相关。

如果我们采用window size = 10,同时我们删除“the“:
1. 当我们再去训练剩下的词,我们就不会再遇到‘the‘了;
2. 我们减少了10个包含‘the‘的样本
注意到这两个特点,使得我们可以解决之前提到的两个问题。

采样率

word2vec 的C代码使用了一个等式来计算是否留着这个word。

我们使用 wi 来表示单词,z(wi) 表示它出现在词库中的概率。比如花生在1bilion的词库中出现了1,000词,那么z()=1E6

然后有个叫‘sample‘的参数控制了降采样的程度,一般设置为0.001。这个值越小代表更容易扔掉一些词。
下面这个等式 P(wi) 代表保留这个词的概率
P(wi)=(z(wi)/0.001+1)×0.001/z(wi)
可以看到如果单词出现频率很低,
z(wi)<=0.0026 的情况下,P(wi)=1,我们不会把这些词扔掉;

z(wi)<=0.00746 的情况下,P(wi)=0.5;

如果出现频率很高,z(wi)==1 的情况下,P(wi)=0.033, 有很低的概率我们keep这个word。当然,如果每个训练样本对都有这个词,这种情况不会出现。

你可能注意到论文中提到的这个函数和C代码中的不同。但是我发现C代码中的函数可能更authoritative。

Negative Sampling

训练神经网络 意味着输入一个训练样本调整weight,让它预测这个训练样本更准。换句话说,每个训练样本将会影响网络中所有的weight。

像我们之前讨论的一样,我们词典的大小意味着我们有好多weight,所有都要轻微的调整。

Negative sampling 解决了这个问题,每次我们就修改了其中一小部分weight,而不是全部。

当训练(fox,quick)这个词对的时候,quick这个词的概率是1,其他的都是0。通过negative sample,我们只是随机的选了一部分negative词(假设是5个)来update weight。(这些negative 词就是我们希望是0的。)

论文中说5-20个词适合小数据集, 2-5个词适合大数据集。

回忆我们原来模型每次运行都需要 300×10,000 (译者按,其实没有减少数量,但是运行过程中,减少了需要载入的数量。) 现在只要 300×(1+5) 减少了好多。
而在输出层始终只要update 输入单词的weight 就好了。(不论有没有采用negative sampling)
译者按:因为输入层就像lookup table,当然其他的都不影响的。

选择 negative samples

问题来了,如何选择5个negative sample呢。

negative sample也是根据他们出现频率来选的。更常出现的词,更容易被选为negative sample。

在word2vec的C实现中,你可以看到一个等式来表达这个概率。每个词给了一个和它频率相关的权重。这个概率公式为
P(wi)=f(wi)0.75nj=0(f(wj)0.75)
在paper中说0.75这个超参是试出来的,这个函数performance比其他函数好。

而这个实现方式在C代码。采用的就是一个100M的查找表,这个表里,按概率填入每个词,每个词填空的个数为 P(wi)tabelsize 。每次选副样本,只要随机一个整数,然后查找表读就好了。因为高频词出现的更多,所以你更可能选到那些词。

5
0
查看评论

Word2Vec学习笔记(四)——Negative Sampling 模型

前面讲了Hierarchical softmax 模型,现在来说说Negative Sampling 模型的CBOW和Skip-gram的原理。它相对于Hierarchical softmax 模型来说,不再采用huffman树,这样可以大幅提高性能。一、Negative Sampling ...
  • chunyun0716
  • chunyun0716
  • 2016-06-20 17:27
  • 4132

word2vec 中的数学原理详解(五)基于 Negative Sampling 的模型

word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单、高效,因此引起了很多人的关注。由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神...
  • peghoty
  • peghoty
  • 2014-07-20 23:44
  • 53836

word2vec 中的数学原理详解-基于 Negative Sampling 的模型

转自:http://blog.csdn.net/itplus/article/details/37998797我之前写的是基于Hierarchical Softmax的模型。而在word2vec中,还有一种基于Negative Sampling的模型。我虽然没写,但是觉得这种方法还是蛮有用的,所以把...
  • u014595019
  • u014595019
  • 2016-07-20 17:35
  • 4614

Word2Vec学习笔记(五)——Negative Sampling 模型(续)

本来这部分内容不多,是想写在negative sampling 中和cbow一起的,但是写了后不小心按了删除键,浏览器直接回退,找不到了,所以重新写新的,以免出现上述情况(接上)三、Negative Sampling 模型——Skip-gram    这部分内...
  • chunyun0716
  • chunyun0716
  • 2016-06-21 15:43
  • 2180

生成sample_negative.dat AdaBoost训练

fp = fopen('F:\sample_negative.dat','wt'); imgPath = 'F:/boost5/negative_samples/';        % 图像库路径 imgDir...
  • forest_world
  • forest_world
  • 2017-05-02 15:42
  • 405

word2vec训练参数说明

训练命令:./word2vec -train text8 -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 0 -iter 15 ./distance...
  • baidu_26550817
  • baidu_26550817
  • 2015-09-22 14:36
  • 4678

深度学习(四十二)word2vec词向量学习笔记

一、使用原版word2vec工具训练 1、到官网到下载,然后选择export 到github 2、编译:make 3、下载测试数据http://mattmahoney.net/dc/text8.zip,并解压 4、输入命令train起来:time ./word2vec -train text8 -o...
  • hjimce
  • hjimce
  • 2016-06-02 10:57
  • 5633

读懂Word2Vec之Skip-Gram

本教程将介绍Word2Vec的skip gram神经网络体系结构。我这篇文章的目的是跳过对Word2Vec的一般的介绍和抽象见解,并深入了解其细节。具体来说,我正在深入skipgram神经网络模型。模型介绍skip-gram神经网络模型其最基本的形式实际上是惊人的简单; Word2Vec使用了一个你...
  • rlnLo2pNEfx9c
  • rlnLo2pNEfx9c
  • 2017-12-08 00:00
  • 363

Word2Vec的一些理解

我之前写的一篇笔记: Word2Vec的一些理解 最近几位google的研究人员发布了一个工具包叫word2vec,利用神经网络为单词寻找一个连续向量空间中的表示。这里整理一下思路,供有兴趣的同学参考。 这里先回顾一下大家比较熟悉的N-gram语言模型。 在自然语言任务里...
  • fengxinzi344
  • fengxinzi344
  • 2013-12-05 11:18
  • 5753

用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践

转处:https://zhuanlan.zhihu.com/p/25928551 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践 清凇 2 个月前 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕...
  • xiewenbo
  • xiewenbo
  • 2017-05-31 20:29
  • 1823
    个人资料
    • 访问:76951次
    • 积分:1155
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:0篇
    • 译文:3篇
    • 评论:45条
    文章分类
    关于我