Word2vec模型及负采样精讲

旧巷老猫 提交于 2020-02-12 21:55:03

Word2vec模型本质:是一个用来生成词向量的、简单的神经网络模型。

  通过计算相似度来降低原来输入词的维度,举个例子:

 

            图.甲

网络结构如下:

 

               图.乙

 

  如乙图所示,我们一开始输入的是one-hot编码后的向量,1位于第7位,其对应的输入层到隐藏层的权重矩阵w一定是第7行,如下图示意

 

          图.丙

   丙图示意的是第三行,我们将one-hot编码后的输入再tokenize转化回去,查找w索引值为3的行,拿出来即可,拿出来的就是词向量原来需要计算那么多次乘法,现在只需查表即可。

  图甲那张图的全过程称之为池化向量。

 

               图.丁

  图丁有一处错误,全连接层激活函数为softmax,output到预测值时的激活函数为sigmoid,此图为原始的池化向量过程。

负采样: 

  在训练神经网络时,每当接受一个训练样本,然后调整所有神经单元权重参数,来使神经网络预测更加准确。换句话说,每个训练样本都将会调整所有神经网络中的参数。
  我们词汇表的大小决定了我们skip-gram 神经网络将会有一个非常大的权重参数,并且所有的权重参数会随着数十亿训练样本不断调整。

  negative sampling (负例样本,即one-hot编码后的为0的那些位置的样本)每次让一个训练样本仅仅更新一小部分的权重参数,从而降低梯度下降过程中的计算量。

 

 

 

 

 

  如果 vocabulary 大小为1万时, 当输入样本 ( "fox", "quick") 到神经网络时, “ fox” 经过 one-hot 编码,在输出层我们期望对应 “quick” 单词的那个神经元结点输出 1,其余 9999 个都应该输出 0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们为 negative word. negative sampling 的想法也很直接 ,将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。

  在论文中作者指出指出对于小规模数据集,建议选择 5-20 个 negative words,对于大规模数据集选择 2-5个 negative words.

  如果使用了 negative sampling 仅仅去更新positive word- “quick” 和选择的其他 10 个negative words 的结点对应的权重,共计 11 个输出神经元,相当于每次只更新 300 x 11 = 3300 个权重参数。对于 3百万 的权重来说,相当于只计算了千分之一的权重,这样计算效率就大幅度提高。

选择负例样本的规则

使用 一元模型分布 (unigram distribution) 来选择 negative words,一个单词被选作 negative sample 的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words,经验公式为:

 
 

f(w) 代表 每个单词被赋予的一个权重,即 它单词出现的词频,分母 代表所有单词的权重和。公式中3/4完全是基于经验的,论文中提到这个公式的效果要比其它公式更加出色。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!