NLP ——Negative Sampling
-
如果我们的训练样本里的中心词𝑤是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久了。能不能不用搞这么复杂的一颗霍夫曼树,将模型变的更加简单呢?
Negative sampling 解决了这个问题,每次我们就修改了其中一小部分weight,而不是全部。将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。下面我们就来看看Negative Sampling的求解思路。比如我们有一个训练样本,中心词是𝑤,它周围上下文共有2𝑐个词,记为𝑐𝑜𝑛𝑡𝑒𝑥𝑡(𝑤)。由于这个中心词𝑤,的确和𝑐𝑜𝑛𝑡𝑒𝑥𝑡(𝑤)相关存在,因此它是一个真实的正例。通过Negative Sampling采样,我们得到neg个和𝑤不同的中心词𝑤𝑖,𝑖=1,2,…𝑛𝑒𝑔,这样𝑐𝑜𝑛𝑡𝑒𝑥𝑡(𝑤)和𝑤𝑖就组成了neg个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归,得到负采样对应每个词𝑤𝑖对应的模型参数𝜃𝑖,和每个词的词向量。
从上面的描述可以看出,Negative Sampling由于没有采用霍夫曼树,每次只是通过采样neg个不同的中心词做负例,就可以训练模型,因此整个过程要比Hierarchical Softmax简单。
不过有两个问题还需要弄明白:1)如果通过一个正例和neg个负例进行二元逻辑回归呢? 2) 如何进行负采样呢?
(1)
(2)现在我们来看看如何进行负采样,得到neg个负例。word2vec采样的方法并不复杂,negative sample也是根据他们出现概率来选的,而这个概率又和他们出现的频率有关。更常出现的词,更容易被选为negative sample。如果词汇表的大小为𝑉,那么我们就将一段长度为1的线段分成𝑉份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短。每个词𝑤的线段长度由下式决定: