NLP笔记之word2vec算法(3)--Negative Sampling原理+数学推导

目录

1 基于Negative Sampling的模型 

2 基于Negative Sampling的数学推导

3 基于Negative Sampling的CBOW模型

4 基于Negative Sampling的Skip-gram模型

前一篇文章中,我们介绍了基于Hierarchical Softmax的模型,在word2vec中还提出了一个叫做Negative Sampling的方法,本文对Negative Sampling进行一个介绍。

首先我们先介绍一些Hierarchical Softmax存在的一些缺陷,因为Hierarchical Softmax是基于哈夫曼树的算法,相对于传统的神经网络来说,Hierarchical Softmax的确可以很大效率的提升模型的速度和效率,但是如果对于某些比较生僻的词来说,因为我们知道哈夫曼树是根据词频来进行建树的,所以对于那些词典中比较生僻的词来说,寻找的深度和时间就会比较长一些,所以就会想有没有其他的方法呢,来避免进行这么深层的查找呢?

Negative Sampling就是这样的一种方法,它直接舍弃了Hierarchical Softmax的哈夫曼树的思想,而是取而代之采用的是一种采样的方式来进行求解,我们接下来就对Negative Sampling进行一个详细的讲解。

1 基于Negative Sampling的模型 

因为Negative Sampling叫做负采样,根据名字我们就可以知道是通过一种”负“的采样方式来进行参数的更新的,所以我们在这里需要关注的点在于两部分,

①  “负”是什么意思,怎样才叫做“负”?

②  采样是什么样的形式,怎样的采样方式才是我们所需要的呢?

我们带着这样两个疑问进行学习,就可以对算法逻辑结构有个比较清晰的认识。

对于“负”的定义, 我们通过一个例子来进行讲解,比如我们存在一些训练样本,然后取出其中一个词,设置它为中心词 {w} ,那么它的周围2c个词,就为它的context,记作context({w}),因为我们知道 {w} 和 context({w})之间的确是存在上下文的紧密联系的,是真的存在关系的词,因此这里我们给(context({w}),{w}) 这样的组合取个名字,称其为正例。 然后我们通过Negative Sampling进行负采样,采样出neg个和 {w} 不同的中心词 w_{i} (i = 1,2,....,neg) ,因为这neg个词和 {w} 是不一样的词,所以它们和 {w} 的上下文context({w})之间是不存在关系的,所以我们称 (context({w}),w_{i} ),i = 1,2,....,neg  为并不真实存在的负例子。我们利用一个正例和neg个负例 ,进行二元逻辑回归,从而获得每个词 w_{i} 对应的模型参数 \theta _{i} 和每个词的词向量。 对于如何进行二元逻辑回归,我们会在数学推导的部分进行介绍。

那么对于上面所说的负采样,我们是如何进行的呢,是如何采样到neg个负样本的呢?

在word2vec中,所采用的方式其实比较简单。假设词典的大小为V,那么我们将一个长度为1的线段分成 {V} 段,  每段就对应着词典中的一个词。又因为词典中的词出现频率各不相同,因此各段的大小也不相同,高频的词就相对更长一些,低频的词就更短一些。对于每个词 {w} 的线段长度定义如下:

                           len(w) = \frac{count(w)}{\sum_{u \in vocab}{count(u)}}

在word2vec中,分子和分母都取了 \frac{3}{4} 次幂如下:

                           len(w) = \frac{count(w)^{3/4}}{\sum_{u \in vocab}{count(u)}^{3/4}}

然后再进行采样的时候,我们将这个长度为1的线段分成M等份,M > > V , 这样的做法是可以保证每个词对应的线段都能够被分成若干个部分,而 M 中的每一份都会落在某一个词对应的线段上。

在采样的时候,我们就直接从 M 个位置上采样出 neg 个位置就行了,此时所采样到的每一个位置对应的线段所属的词就是我们的负例词。在word2vec中,M取值默认为 10^{8} 。

                         NLP笔记之word2vec算法(3)--Negative Sampling原理+数学推导_第1张图片

2 基于Negative Sampling的数学推导

 

前面讲到是采用二元逻辑回归的方式来求解模型参数的,前面我们通过负采样得到了 neg 个 负例 (context({w}),w_{i} ),i = 1,2,....,neg 。 这里为了统一描述更方便,我们将正例定义为 w_{0} 。

在逻辑回归中,我们的正例应该期望满足:

                         

我们的负例应该期望满足:

           

然后我们期望最大化下面的式子:

                  

我们将上式写成似然函数:

                                        

此时对应的对数似然函数为:

                      

和Hierarchical Softmax类似,这里采用的是随机梯度上升法,每次仅仅只用一个样本更新梯度,来迭代更新我们的需要的参数 x_{w_{i}} , \theta ^{w_{i}}i = 0,1,2,...neg,这里我们需要求出  x_{w_{0}} ,\theta ^{w_{i}} ,i = 0,1,2,...,neg 的梯度。

首先计算 \theta ^{w_{i}} 的梯度:

                        NLP笔记之word2vec算法(3)--Negative Sampling原理+数学推导_第2张图片

然后同样的方式,计算出 x_{w_{0}} 的梯度:

                                          NLP笔记之word2vec算法(3)--Negative Sampling原理+数学推导_第3张图片

有了梯度表达式,我们就可以利用梯度上升法进行迭代来一步步求解我们需要的  x_{w_{0}}  ,\theta ^{w_{i}} ,i = 0,1,2,...,neg 。

3 基于Negative Sampling的CBOW模型

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

               输入:基于CBOW的语料训练样本,词向量的维度大小 M ,CBOW的上下文大小 2c ,步长 \eta , 负采样的个数 neg

    输出:词汇表每个词对应的模型参数 \theta,所有的词向量 x_{w}

    1. 随机初始化所有的模型参数 \theta ,所有的词向量 w

    2. 对于每个训练样本(context(w_{0}),w_{0} ),负采样出neg个负例中心词 w_{i} ,i = 1,2,...neg 

    3. 进行梯度上升迭代过程,对于训练集中的每一个样本 (context(w_{0}),w_{0}w_{1}w_{2},....,w_{neg} ) 做如下处理:

                       (1) e = 0,计算  x_{w} = \frac{1}{2c} \sum_{i=1}^{2c} x_{i}

                       (2) for i = 0 to neg,计算:

                                            NLP笔记之word2vec算法(3)--Negative Sampling原理+数学推导_第4张图片 

                       (3) 对于context(w) 中的每一个词向量 x_{k} (共2c个)进行更新:

                                                      x_{k} = x_{k} + e 

                       (4) 如果梯度收敛,则结束梯度迭代,否则回到步骤3继续迭代。

4 基于Negative Sampling的Skip-gram模型

有了上一节CBOW的基础和上一篇基于Hierarchical Softmax的Skip-Gram模型基础,我们也可以总结出基于Negative Sampling的Skip-Gram模型算法流程了。梯度迭代过程使用了随机梯度上升法:

              输入:基于Skip-gram的语料训练样本,词向量的维度大小 M ,Skip-gram的上下文大小 2c ,步长 \eta , 负采样的个数 neg

    输出:词汇表每个词对应的模型参数 \theta,所有的词向量 x_{w}

    1. 随机初始化所有的模型参数 \theta ,所有的词向量 w

    2. 对于每个训练样本(context(w_{0}),w_{0} ),负采样出neg个负例中心词 w_{i} ,i = 1,2,...neg 

    3. 进行梯度上升迭代过程,对于训练集中的每一个样本 (context(w_{0}),w_{0}w_{1}w_{2},....,w_{neg} ) 做如下处理:

                    (1) for i = 1 to 2c :

                           a) e = 0

                           b) for j = 0 to neg ,计算:

                                           NLP笔记之word2vec算法(3)--Negative Sampling原理+数学推导_第5张图片

                           c) 词向量更新:

                                                                   x_{w_{0i}}  =   x_{w_{0i}}   +   e

                    (2) 如果梯度收敛,则结束梯度迭代,算法结束,否则回到步骤(1)继续迭代。 

 

参考地址:https://www.cnblogs.com/pinard/p/7249903.html

你可能感兴趣的:(NLP,深度学习,word2vec,神经网络,机器学习,算法,自然语言处理)