这篇论文便是word2vec的原论文,是入门NLP的必读论文之一。1986年Hinton提出了 Distributed Representation 这个概念,2003年 Bengio提出的NNLM首次使用了词向量,而这篇论文提出了两种新的模型结构对以前学习词向量的方式进行改进。
Previous Work
在这篇论文之前,已经有了一些 Distributed Representation 的工作,比如 Bengio 在03年提出的 NNLM(Neural Net Language Model)模型,以及作者之前的工作 RNNLM(Recurrent Neural Net Language Model) 。它们作为神经网络语言模型,同时还能学习词向量,但它们作为早期学习词向量的模型,还是存在一些问题的,比如训练时间长、学习出的词向量效果一般等。
可以简单计算下 NNLM 和 RNNLM模型的计算复杂度。
NNLM模型输入层将词映射成向量,相当于一个 1 × V 1 \times V 1×V 的 one-hot向量乘以一个 V × D V \times D V×D 的向量得到一个 1 × D 1 \times D 1×D 的向量,而假设输入前 N 个词,输出N个词向量拼接在一起的 1 × N D 1 \times ND 1×ND 向量,这一步的计算复杂度为 N × D N \times D N×D;隐藏层是一个以tanh为激活函数的全连接层,此时将前面的向量映射为 1 × H 1 \times H 1×H 的向量,此时的计算复杂度为 N × D × H N \times D \times H N×D×H;输出层是一个全连接层,后面接一个softmax函数来生成概率分布,此时是将隐层向量映射成 1 × V 1 \times V 1×V 的向量,此时的计算复杂度为 H × V H \times V H×V,这样总的计算复杂度为:
Q = N × D + N × D × H + H × V Q = N \times D + N \times D \times H + H \times V Q=N×D+N×D×H+H×V
再来看 RNNLM的计算复杂度。RNNML模型没有 projection层,只有输入、隐层和输出层。隐藏层将当前的词向量和前一时间步的状态向量映射为隐层向量,这里的词向量维度和隐层向量的维度相等,此时的计算复杂度为 H × H + D × H H \times H + D \times H H×H+D×H;输出层为一个全连接层,后面接一个softmax函数来生成概率分布,此时的计算复杂度为 H × V H \times V H×V,这样总的计算复杂度为:
Q = H × H + H × V Q = H \times H + H \times V Q=H×H+H×V
这里不难看出,两个模型的计算复杂度都以输出层主导,而采用softmax函数来计算全量word的概率,这里使得计算效率非常低,因为通常 V V V 都很大。那么一个优化输出层softmax计算的方式是 Hierarchical Softmax,这个技巧最早在 Bengio 05年的工作 [2] 中提出,它的思路是将softmax分解成多个sigmoid,并通过构建出一棵二叉树,下一个word