skip-gram负采样

自然语言处理领域中,判断两个单词是不是一对上下文词(context)与目标词(target),如果是一对,则是正样本,如果不是一对,则是负样本。

采样得到一个上下文词和一个目标词,生成一个正样本(positive example),生成一个负样本(negative example),则是用与正样本相同的上下文词,再在字典中随机选择一个单词,这就是负采样(negative sampling)。

下图为cbow和skip-gram模型:
skip-gram负采样原理
skip-gram模型输入:
举个例子:
我们知道对于每个input word来说,有多个output word(上下文)。例如我们的输入是【熟悉】,上下文是[熟练掌握, java, python, shell],那么【熟悉】这一个batch中就有四个训练样本[熟悉, 熟练掌握], [熟悉, java], [熟悉, python], [熟悉, shell]。
但是神经网络模型只能接受数值输入,所以必须进行one-hot编码,假设我们在训练数据中只能取出10000个不重复的单词作为词汇表,那么我们对每个单词编码都是1 *10000的向量。

模型的输入是10000维的向量,那么输出也是10000维(词汇表的大小)向量,它包含了10000个概率,每一个概率代表着当前词是输入样本中output word的概率大小。如下图,神经网络架构:
skip-gram负采样原理
对于输出层用softmax,计算量很大,通常用“nagative sampling"(负采样)计算,这样,每个训练样本 只能更新一小部分模型权重,从而减轻计算负担。

当我们用训练样本(input word:“fox”, output word:“quick”)来训练我们的神经网络时,“fox”和“quick”都是经过one-hot编码的。如果我们的vocabulary大小为10000时,在输出层,我们希望“quick”单词那个位置输出1,其余都是0。这些其余我们期望输出0的位置所对应的单词我们成为“negative” word。
当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的positive word进行权重更新(上面的例子指的是"quick")

在论文中,作者指出指出对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words。

相关文章: