一、词的表示
- 离散表示 one-hot,n-gram等的缺点
- 无法衡量词向量之间的关系。
- 词表的维度随着语料库的增长而膨胀。
- 离散数据来表示文本会带来数据稀疏问题,导致丢失了信息。
- 分布式表示 词共现矩阵
用周围词表示中心词,考虑上下文信息的影响。缺点:
- 向量维数随着词典大小线性增长。
- 存储整个词典的空间消耗非常大。
- 一些模型如文本分类模型会面临稀疏性问题。
- 模型会欠稳定,每新增一份语料进来,稳定性就会变化。
Word2Vec
负采样(negative sampling)
训练一个神经网络意味着要输入训练样本并且不断调整神经元的权重。对于word2vec来说,vocabulary的大小决定了Skip-Gram神经网络将会拥有大规模的权重矩阵,因为需要由一个单词预测多个目标context词,这是非常消耗计算资源的,并且实际中训练起来会非常慢。
- 负采样是用来提高训练速度并且改善所得到词向量的质量的一种方法。负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。
当我们用训练样本 ( input word: “fox”,output word: “quick”) 来训练我们的神经网络时,“ fox”和“quick”都是经过one-hot编码的。如果我们的vocabulary大小为10000时,在输出层,我们期望对应“quick”单词的那个神经元结点输出1,其余9999个都应该输出0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们称为“negative” word。
当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的positive word进行权重更新(在我们上面的例子中,这个单词指的是”quick“)。在论文中,作者指出指出对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words。
回忆一下我们的隐层-输出层拥有300 x 10000的权重矩阵。如果使用了负采样的方法我们仅仅去更新我们的positive word-“quick”的和我们选择的其他5个negative words的结点对应的权重,共计6个输出神经元,相当于每次只更新300*6=1800个权重。对于3百万的权重来说,相当于只计算了0.06%的权重,这样计算效率就大幅度提高。
- 如何选择negative words
一个单词被选作negative sample的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words。
哈夫曼树
Word2vec模型(例如CBOW)输入层经过隐藏层最后softmax输出所有词的概率,然后反向传播梯度下降decrease loss。但这其中有一个很大的问题:从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。这样的性能显然是对于一个embedding操作来讲是得不偿失的,因此,word2vec对这里做了很精妙的优化,本文首先来介绍基于哈夫曼树的word2vec。
