Word2Vec-Tutorial-Part-2-Negative-Sampling

重点

  • 词组检测
    多轮操作,每一轮操作只处理2元词组, 如果词组出现的概率不低,而且相对构成词组的每个词的概率也不低,则可以当作一个词组

  • 训练样本下采样
    定义了一个基于词频的曲线,出现频率低的样本不参与下采样, 出现频率越高,被下采样的概率越高

  • Negative sampling
    原理上每个训练样本输出是10000维的one-hot编码, 只有一个是1,其他0, 可能会影响到所有输出层权重(300 x 10000个). negative sampling就是对个样本进行的训练,按照词频选择3~20个词(非输入词),作为negative words, 该样本触发的训练过程只涉及这些negative word是和输入词相关的输出层权重,以降低计算量(只要把其他维度的loss设置成0即可)

  • 下采样和negative sampling技术不仅仅是降低计算量, 对最后训练出来的词向量的质量也有很大帮助

论文

注释的源码

本教程将介绍一些对基本skip-gram模型的修改,这些修改使得模型训练的困难度大幅降低.
上一篇教程中介绍的skip-gram模型使用的神经网络尺寸很大.
教程中给出的例子中有300个词向量,10000个词. 神经网络三层,对应2个权重矩阵.每个权重矩阵的维度都是 300×10000 300 × 10000 ,包括3百万权重值.
在如此规模的神经网络上运行梯度下降算法速度会很慢,而且为了避免过拟合需要很多的训练数据.巨大的样本和参数导致训练是一场灾难.
Word2Vec在其第二篇论文中强调了这些问题.
这第二篇论文中有三点创新:
1. 把词组作为单独的词处理
2. 对训练集下采样,降低训练集尺寸
3. 用”Negative Sampling”方法修改优化目标函数,每次只更新一小部分的模型参数.
下采样和Negtive Sampling不仅仅降低计算需求,对最后词向量的质量提高也有所帮助

Word Pairs and “Phrases”

论文作者指出类似”Boston Globe”(一份报纸的名字)的词组和”Boston”,”Globe”两个单独的词含义有很大区别, 所以可以把”Boston Globe”当作一个词处理.
他们公开的模型是在Google News数据集,共100亿词,上训练出来的,加上词组总共3百万不同的词.

这里是一些对于这3百万词点的介绍,原始的词典在这里

论文中的”Learning Phrases”节介绍了词组检测,对应的代码在word2phrase.c里,这里是一份带有注释的代码.

个人认为词组检测方法并不是论文中的关键,但因为它比较直观,这里会做一些介绍.

每一轮检测只处理2个词组成的词组,但是通过多轮检测可以检测多个词构成的词组. 例如第一轮会检测到”New_York”,第二轮就会把”New_York”和”City”识别成一个词组”New_York_City”.

论文提出一个公式决定两个词是否应该被当作一个词组. 公式通过词组出现的次数,词组中每个词的出现次数计算二者构成词组的概率.同时这个公式倾向性于选择低概率的词组,以过滤掉注入”and the”和”this is”的词组.


译注: 这个公式就是 pabpapb p a b p a ∗ p b ,其中 pab p a b 是词 A A 和词B共同出现的次数, pa p a 是词 A A 出现的次数,pb是词 B B 出现的次数. 为了避免选中一些出现概率很低的词组,设置一个最小次数mincount,公式修改成 (pabmincount)papb ( p a b − m i n c o u n t ) p a ∗ p b . 最后这个比率值会乘以训练文本中词的总个数,结果和一个阈值比较,乘以总个数可以让阈值和训练集尺寸无关(???,代码中这个阈值默认值是100,阈值越大,最终生成词组越少)

另一个词组检测的方法是把Wikipedia的标题作为词组字典,匹配训练集中的可能词组.

Subsamplping Frequent Words

上一篇教程中已经介绍了如何从原始文本中生成训练样本.以下是一个例子,从”The quick brown fox jumps over the lazy dog”生成训练样本. 窗口尺寸设置为2,高亮绿色标识输入词.
这里写图片描述

对于词”the”有两个问题:
1. 词对(fox,the)对于解释fox的含义并没有太多帮助,因为”the”几乎会出现在每个词附近
2. 为了解释词the的含义,(the,…)这样的词对出现的次数将远远大于我们需要的

Word2Vec使用下采样策略处理这个问题.对于每个词我们根据其出现概率决定是否在训练集中保留它.

Sampling rate

Word2Vec中使用一个公式得到保留一个词的概率.对于词 wi w i , z(wi) z ( w i ) 是其在整个语料库中出现的比例.例如对于词”peanut”出现1000次,语料库中一共1亿个词,则 z(peanut)=1E6 z ( p e a n u t ) = 1 E − 6
另外的一个参数”sample”决定采样的频率,默认值0.001. 这个值越小,词被删除的概率越高.
P(wi) P ( w i ) 是保留词的概率,定义如下:

P(wi)=(z(wi)0.001+1)0.001z(wi) P ( w i ) = ( z ( w i ) 0.001 + 1 ) 0.001 z ( w i )

其曲线如下:
这里写图片描述

不可能有一个词的概率很高,所以曲线压制了高概率的部分.
采用默认值0.001,这个曲线有些有趣的特性:
* 当 z(wi)0.0026 z ( w i ) ≤ 0.0026 时, P(wi)=1.0 P ( w i ) = 1.0 , 出现频率低于 0.26 0.26 的词将被保留,不参下采样
* 当 z(wi)=0.00746 z ( w i ) = 0.00746 时, P(wi)=0.5 P ( w i ) = 0.5 ∗ 当 z(w_i) = 1.0 , 时 , P(w_i)=0.033$,如果语料库中只有一个词,那么整个语料库按0.033的概率下采样

Negative Sampling

训练神经网络的过程就是利用每个样本轻微的调节权重值,令网络的预测更加准确. 每个样本会影响到所有权重,如果样本数目和权重数目巨大,意味着巨大的计算量.
以样本(fox,quick)为例,因为对应的的输出是one-hot编码,只有quick对应的位是1,其他位都是0. 在negative sampling方法中,对每个样本随机选择一些”negative words”, 只更新和它们相关的权重.(“negative word”是对每个训练样本中,我们选择的一批词,这些词对应的输出位是0).同时我们也会更新和输入词”quick”相关的权重.
根据论文,对小数据集每次选择5~20个词做negative word,对大样本集选择2~5个词做negative word即可.
在我们例子中,输入层的权重矩阵 300×10000 300 × 10000 .我们选择5个negative words,外加一个输入词,总共6个输出,相关联的权重只有1800个,占总权重数3M的0.06%.
不论是否使用negative sampling即使,隐层只有和输入词相关的权重会被更新.

Selecting Negative Samples

利用unigram distribution(一元词模型)选择negative samples. 一个词被选择negative words的概率和这个词出现的频率有关,出现的频率越高,被选做negative word的概率越高. 公式如下

P(wi)=f(wi)0.75nj=0f(wj)0.75 P ( w i ) = f ( w i ) 0.75 ∑ j = 0 n f ( w j ) 0.75

其中 f(wi) f ( w i ) 是词 wi w i 在语料库中词频.
代码实现中使用一个100M个元素的数组(代码中称为nigram table), 存储的是每个词的索引值,每个词根据其词频会存储不同次数,词频越高,存储次数越多.使用时直接生成0~100M之间的随机数,从随机数对应的数组中取出词的索引值,达到按照unigram distribution选择negative sample的目的.
译注:这个100M个元素的数组应该是 Pw P w 的积分曲线的离散形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值