skip-gram与负采样

1. skip-gram模型

skip-gram是word2vec中的主要模型之一(另一个模型是CBOW)。简单来说,CBOW是给定上下文,来预测input-word;而skip-gram是给定input-word,来预测上下文。

下面我们来理解skip-gram模型。首先,给定句子如下

The man who passes the sentence should swing the sword.-

选择passes为中心词,window-size设置为3,则训练过程如下图

skip-gram与负采样_第1张图片

通过该图可以大致理解skip-gram的过程。

2. 为什么需要负采样

通过上图可知,skip-gram中需要使用softmax来计算语料中各个词出现的概率。并且字典的大小决定了神经网络的权重也会很大,更新权重非常耗时。

这是一个非常耗时的计算。一般语料中都有几千万个单词,计算量非常的大,所以才要引入负采样来降低计算量。

3. 负采样具体过程

负采样(Negative Sampling)是构造了一个新的有监督学习问题:给定两个单词,比如orange和juice,去预测这是否是一对上下文词-目标词对(context-target),即是否这两个词会在一句话中相连出现,这也是一个二分类问题。

负采样其实是改变了1中的整个数据构建-训练过程的,他的具体过程如下:

  1. 假设给定一个text
  • I want a glass of orange juice to go along with my cereal.
  1. 通过对这个text中的词对进行采样,组成正负样本对
  • 假设当前采样到单词 orange,则juice与其组成正样本对,在下表中标记为1
  • 负样本对可以从字典中随机选择
  • 假设当前采样到单词 orange,则king与其组成负样本对,在下表中标记为0
  • 对于一个正样本对,要随机在字典中选择k个负样本,这里k取值为4(数据集越小,k越大)
context word target
orange juice 1
orange king 0
orange book 0
orange the 0
orange off 0
  1. 接下来,构造一个有监督学习任务
  • 输入两个单词,比如orange和juice
  • 输出他们是否属于context-target

要解决这个任务,我们有很多种训练方式,比如

(1). 用上一步构建的所有语料来训练一个复杂神经网络,输入context,输出其与字典中各个词是否为context-target的概率。但这样的做法,训练模型的代价很高。

(2)训练很多个二分类器,每个二分类器只需要计算给定context与k+1个词是否属于context-target。这样做的优点在于,每个二分类器都很容易计算,所以这比计算一个很大的softmax代价要低。

所以我们选择(2)进行训练,每个二分类器(logistic),只需要输入k+1个词。比如对句子中的每一个词(选中某一个词作为context),进行训练时,给定的数据集为上面2中所示。

就是对orange训练一个二分类器,其输入为(juice,king,book,the,off),输出为target(1,0,0,0,0)。此时只更新网络中对应部分的权重,其他部分的权重不更新。

4. 总结

所谓负采样,就是你有一个正样本,比如orange和juice,然后你再随机采用得到k个负样本,比如orange和king。最终对每个context(比如这里是orange)按照“训练一个小型二分类器”的思路来更新网络中对应部分的权重。

5. 参考

  • Andrew Ng Sequence Models video
  • https://zhuanlan.zhihu.com/p/39684349
  • https://www.jianshu.com/p/ed15e2adbfad

你可能感兴趣的:(神经网络,NLP)