Negative Sampling 负采样详解

假设有一句话:query = w_{1},w_{2},w_{3},...w_{n},由n个词组成的一句话,我们需要最大化窗口中上下文词的概率:

                                                                    

这里的c(w)表示中心词的context words,我们在计算的时候,可以把相乘的元素转换成对数函数:

                                                                    

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

                                                                 

这个式子可以表示成:
                                              

我们可以看到这个式子第二项,因为c^{'} 要遍历整个词库,所以复杂度非常高,所以我们要简化这一步的计算,减小运算的复杂度。这里的u_{c}表示c的上下文向量,v_{w}表示中心词w的向量。

为了减小上述表达式的复杂度,我们不妨改变一下上述概率的表达方式,原来的p\left (w_{i} |w_{j} \right )表示以w_{j}为中心词的时候w_{i}出现的概率这里我们用p\left (D = 1 |w_{i},w_{j}:\Theta \right )表示w_{i}w_{j} 作为上下文词出现的概率,p\left (D = 0 |w_{i},w_{j}:\Theta \right )表示w_{i}w_{j} 不作为上下文词出现的概率。

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

                                                

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

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

                                              

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

                                                  

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

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

                                                                            

猜你喜欢

转载自blog.csdn.net/devil_son1234/article/details/107303243
今日推荐