本文记录的目的是方便自己学习和复习,有误之处请谅解,欢迎指出。
Negative Sampling(负采样)其实理解起来不是很难,个人觉得比分层Softmax相对简单一些。上一篇讲到了分层Softmax训练,它把传统神经网络语言模型的计算量从降低到了,但是存在一个缺点,再极端情况下,如果中心词属于不频繁词,那么它离根节点的距离相对较远,需要计算路径上很多节点参数,计算量也不简单。
这样就出现了另外一种训练Word2vec的方法。它不使用哈夫曼树模型代替Softmax,而是使用负采样思路。我的理解为降低输出负神经元个数,仅选择几个具有代表性的负样本训练即可,例如原来softmax需要输出一个正样本,和n-1个负样本,但是现在对负样本进行有策略的采样,不输出所有负样本概率。
一、正负样本
假定一个训练样本,中心词为,窗口周围有个词,记。
(1)正样本:根据中心词与是存在相关性,所以记为正样本。
(2)负样本:通过负采样得到个负样本,即与不存在相关性,这样组成个负样本,。
(3)现在得到了训练样本,利用个样本对每个词向量和词向量对应从模型参数进行训练。
(4)获得每个词向量
二、负采样方式
负采样的基本思路是在词典中出现频率高的词被采样概率越大,生僻词采样的概率小,这就是一个带权采样的问题。任何采样算法都应该保证频次越高的样本越容易被采样出来。基本的思路是对于长度为1的线段,根据词语的词频将其公平地分配给每个词语:
这样线段就被每个词平分了。然后我们将这段长度为1的线段划分成M等份,这里,表示词典中词的数量,接下来生成一个0-1之间的随机数,看落在那个那个等分的词线段中,就取出该词作为负样本即可。
三、Negative Sampling梯度计算
怎么更新模型参数和词向量呢?Negative Sampling采用二元逻辑回归来求解模型参数,与逻辑回归推导差不多,利用极大似然函数来求解参数。
对于正例概率我们期望满足下式:
对于负例样本满足:
所以,对于所有样本满足:
与逻辑回归类似,模型的似然函数为:
对似然函数取对数:
现在对词向量和词向量参数求偏导(计算一个偏导即可,另外一个同理),得: