假设有一句话:Negative Sampling 负采样详解,由n个词组成的一句话,我们需要最大化窗口中上下文词的概率:

                                                                    Negative Sampling 负采样详解

这里的Negative Sampling 负采样详解表示中心词的context words,我们在计算的时候,可以把相乘的元素转换成对数函数:

                                                                    Negative Sampling 负采样详解

我们把概率函数可以进行展开就可以得到: 

                                                                 Negative Sampling 负采样详解

这个式子可以表示成:
                                              Negative Sampling 负采样详解

我们可以看到这个式子第二项,因为Negative Sampling 负采样详解 要遍历整个词库,所以复杂度非常高,所以我们要简化这一步的计算,减小运算的复杂度。这里的Negative Sampling 负采样详解Negative Sampling 负采样详解表示Negative Sampling 负采样详解的上下文向量,Negative Sampling 负采样详解表示中心词Negative Sampling 负采样详解的向量。

为了减小上述表达式的复杂度,我们不妨改变一下上述概率的表达方式,原来的Negative Sampling 负采样详解表示以Negative Sampling 负采样详解为中心词的时候Negative Sampling 负采样详解出现的概率这里我们用Negative Sampling 负采样详解表示Negative Sampling 负采样详解Negative Sampling 负采样详解 作为上下文词出现的概率,Negative Sampling 负采样详解表示Negative Sampling 负采样详解Negative Sampling 负采样详解 不作为上下文词出现的概率。

由上述新的表达式可以写出新的目标函数:

                                                Negative Sampling 负采样详解

这里的 Negative Sampling 负采样详解表示上下文词的集合,Negative Sampling 负采样详解Negative Sampling 负采样详解表示非上下文的集合,我们来举一个例子,这里有一句话:“川建国同志是一名优秀的党员”,这句话分词去停之后变成: 川建国 同志 一名 优秀 党员。那么 DDD 表示上下文集合,我们假设 window size为1,那么可以写出:Negative Sampling 负采样详解 = {(川建国,同志),(同志,川建国),(同志,一名),(一名,同志),(一名,优秀),(优秀,一名),(优秀,党员)}
Negative Sampling 负采样详解 = {(川建国,一名),(川建国,优秀),(川建国,党员),(同志,优秀),(同志,党员),(一名,川建国),(一名,党员),(优秀,川建国),(优秀,同志),(党员,川建国),(党员,同志),(党员,一名)}。
上述的 Negative Sampling 负采样详解表示正样本,Negative Sampling 负采样详解  表示负样本。我们可以继续表示上述的目标函数,我们可以吧正负样本的概率表示成softmax的表达形式:
Negative Sampling 负采样详解

在词库数量级为Negative Sampling 负采样详解 的时候,正样本加负样本Negative Sampling 负采样详解的数量级可以达到Negative Sampling 负采样详解 左右,里面绝大部分都是负样本,所以我们需要降低负样本计算中的时间复杂度,这就是Negative Sampling 负采样的核心。负采样就是对于一个中心词,我们从中心词对应的负样本中随机抽取几组来做梯度下降。还是川建国的例子,对于正样本(川建国,同志),我们随机抽取负样本(川建国,一名),(川建国,党员)来做训练,不用全部的负样本都拿来训练,这就是负采样,减小了计算的复杂度。所以,上述的目标函数可以写成:

                                              Negative Sampling 负采样详解

从上述表达式可以看出,负样本我们不需要取所有的都拿来训练,我们只需要每个中心词抽几个负样本就可以了,这样可以大大降低计算的复杂度。这就是word2vec训练过程中的Negative Sampling 负采样技巧,可以大大减小梯度下降的时间复杂度,这就有点像SGD随机梯度下降,就是随机一个样本进行梯度下降,大体的方向还是朝着最低点下降。
接着我来解答一下上述这个表达式,一起来看看是如何进行梯度下降的,首先我们假设:

                                                  Negative Sampling 负采样详解

接下来我们需要对该表达式求偏导:

Negative Sampling 负采样详解

 然后整体的梯度下降可以表示成:

                                                                            Negative Sampling 负采样详解

相关文章: