word2vec中对于Negative Sampling的理解

参考地址:http://www.cnblogs.com/pinard/p/7249903.html
上一篇转载的博客详细介绍了基于Hierarchical Softmax的word2vec模型是如何产生词向量的。这篇论文则是针对那些”偏僻词”采用的用negative sampling方法产生词向量的具体步骤。


1,Hierarchical Softmax对的缺点与改进
Hierarchical softmax的缺点就是:虽然我们使用huffman树代替传统的神经网络,可以提高模型训练的效率,但是如果我们训练样本中的中心词w是一个很生僻的词,那么就需要沿着huffman树往下走很多,因为越是高频的词,越是靠近根节点。
那么negative sampling就是解决这种问题而提出的一种求解word2vec模型的方法。


2,基于negative sampling 的模型概述
它其实是采用了负采样的方法。比如我们有一个训练样本,中心词是w,他周围上下文共有2c个词,记为context(w)。由于这个中心词 w t 的确和context(w)相关存在,因此它是一个真是的正例。通过negative sampling采样,我们可以得到neg个和w不同的中心词 w i , i = 1 , 2... n e g ,这样context(w)和 w i 就组成了neg个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归,从而得到负采样对应每个词 w i 对应的模型参数 θ i 以及每个词的词向量。
从上面可以看到,negative sampling 由于没有采用Huffman树,每次都只是通过采样neg个不同的中心词做负例,就可以训练模型,因此整个过程要比hierarchical softmax简单。
那么接下来有两个问题:1)如果通过一个正例和neg个负例进行二元逻辑回归 2):如何进行负采样呢


3,基于negative sampling的模型梯度计算
negative sampling 也是采用了二元逻辑回归来求解模型参数,通过负采样,我们得到了neg个负例(context( w ), w i ), i = 1 , 2... n e g 。为了统一描述,我们将正例定义为 w 0 .
在逻辑回归中,我们的正例应该期望满足:
P ( c o n t e x t ( w 0 ) , w i ) = σ ( x w i T θ w i ) , y i = 1 , i = 0
我们的负例期望满足:
P ( c o n t e x t ( w 0 ) , w i ) = 1 σ ( x i T θ w i ) , y i = 0 , i = 1 , 2... n e g
我们期望可以最大化下式:
i = 0 n e g P ( c o n t e x t ( w 0 ) , w i ) = σ ( x 0 T θ w 0 ) i = 1 n e g ( 1 σ ( x w i T θ w i ) )

然后利用逻辑回归等知识,我们可以得出此模型的似然函数为:
i = 0 n e g σ ( x w i T θ w i ) y i ( 1 σ ( x w i T θ w i ) ) 1 y i
此时对应的似然函数为:
L = i = 0 n e g y i log ( σ ( x w i T θ w i ) ) + ( 1 y i ) log ( 1 σ ( x w i T θ w i ) )
这里和hierarchical softmax类似,我们采用随机梯度上升法,仅仅每次只用一个样本更新梯度,来进行迭代更新得到我们需要的 x w i , θ w i , i = 0 , 1 , 2.... n e g ,这里我们需要求出 x w i , θ w i , i = 0 , 1 , 2... n e g 的梯度
首先我们计算 θ w i 的梯度:
这里写图片描述


4,negative sampling的负采样方法具体细节
word2vec中的采样的方法并不复杂,如果词汇表的大小为 V ,那么我们就将一段长度为1的线段分成 V 份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短。每个词 w 的线段长度由下式决定:
这里写图片描述
总体言之,他的线段长度的计算总的思想是用每个词的出现的次数除以词的总量,但是在归一化的过程中,它把每个词的出现次数加了一个3/4幂。
然后在采样前,我们将这段长度为1的线段划分成 M 等份,这里 M >> V ,这样可以保证每个词对应的线段都会划分成对应的小块。而M份中的每一份都会落在某一个词对应的线段上。在采样的时候,我们只需要从 M 个位置中采样出neg个位置就行,此时采样到的每一个位置对应到的线段所属的词就是我们的负例词。通常 M 的取值为 10 8
这里写图片描述


5,基于negative sampling的CBOW模型
有了上面negative sampling 负采样的方法和逻辑回归求解模型参数的方法,我们就可以总结出基于negative sampling的CBOW模型模型算法流程了。梯度迭代过程使用了随机梯度上升法。

输入:基于CBOW的语料训练样本,词向量的维度大小为 M ,CBOW的上下文大小为 2 c ,步长为 γ ,负采样的个数为neg.
输出:词汇表每个词对应的模型参数 θ ,所有的词向量为 x w

  1. 随机初始化所有的模型参数 θ ,所有的词向量 w
  2. 对于每个训练样本( c o n t e x t ( w 0 ) , w 0 ),负采样出neg个负例中心词 w i , i = 1 , 2... n e g
  3. 进行梯度上升迭代训练,对于训练集中的每一个样本( c o n t e x t ( w 0 ) , w 0 , w 1 . . . . w n e g )作如下处理:
    这里写图片描述
    图片中的流程大致为:先算出2c个周围词的加和平均,然后对于每一个例子(包含正例也包含负例),都用它们来更新模型内部节点参数 θ ,同时都来更新2c个词向量。

6,基于negative sampling 的skip-gram模型

输入:基于skip-gram的训练样本,词向量的维度大小为 M ,skip-gram的上下文大小为2c,步长为 γ ,负采样的个数为neg.
输出:词汇表中的每个词对应的模型参数为 θ ,所有的词向量为 x w

这里写图片描述
流程大致可以描述如下:

对于2c个上下文词向量,每一个上下文词向量,都用他们来计算一遍对应的所有的正例(1个)和负例(neg个),同时更新上下文词向量和模型内部节点参数 θ

与CBOW模型的不同是:CBOW采用的是将这2c个上下文词向量加权求和然后作为一个,在用去处理对应的所有正例和负例。而skip-gram模型则是将这2c个词向量分别输入,相当于多了一层for循环,每一个上下文词向量都将对正负例求似然估计。

猜你喜欢

转载自blog.csdn.net/u010995990/article/details/79820146