Word2vec模型及负采样精讲
Word2vec模型本质:是一个用来生成词向量的、简单的神经网络模型。
通过计算相似度来降低原来输入词的维度,举个例子:
图.甲
网络结构如下:
图.乙
如乙图所示,我们一开始输入的是one-hot编码后的向量,1位于第7位,其对应的输入层到隐藏层的权重矩阵w一定是第7行,如下图示意
图.丙
丙图示意的是第三行,如果输入one-hot编码过了,那就将one-hot编码后的输入再tokenize转化回去(如果没有one-hot的话,直接tokenize获取索引即可),查找w索引值为3的行,拿出来即可,拿出来的就是词向量原来需要计算那么多次乘法,现在只需查表即可。
图甲那张图的全过程称之为池化向量。
图.丁
图丁,全连接层是没有激活函数的,output到预测值时的激活函数为softmax,也可以为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,经验公式为:
![](http://upload-images.jianshu.io/upload_images/1531909-c40a30953caa9f9e.png?imageMogr2/auto-orient/strip|imageView2/2/w/368/format/webp)
f(w) 代表 每个单词被赋予的一个权重,即 它单词出现的词频,分母 代表所有单词的权重和。公式中3/4完全是基于经验的,论文中提到这个公式的效果要比其它公式更加出色。