在nlp领域,文本词的向量表示往往是第一步,笔者在做一些推荐相关性的工作中也用到了其中很常见的word2vec模型,因此也具体学习了一下word2vec的具体实现原理,本文主要参考了github开源的c语言版的word2vec源码以及相关的博客。
一、要解决的问题
对于语料中的每一个词,最简单的表达方式就是one-hot,即利用位数编码的方式每个词占据一个“1”位,其余为0,。这样做虽然简单,但由于工业上语料往往非常大,词语很多时候会达到百万甚至更多,对于单个词而言百万级别的维度表达显然是效率不高的,因此,目前往往都会使用word embedding的方式将词降维压缩至可计算的维度。这个降维的过程有很多实现的方式,今天就来探讨一下其中目前最火的神经网络语言模型-word2vec。
二、CBOW与Skip-Gram
在word2vev中,对于数据的训练目标而言有两种方式:CBOW和Skip-Gram。CBOW表示基于上下文来预测目标词,即输入是2c个上下文词(c表示窗口大小),输出是目标词的概率;Skip-Gram则是恰恰相反,输入是当前的目标词,输出则是上下文词的概率。
在确定了输入输出之后,其实训练的方式也就很明显了,(例如CBOW)输入层经过隐藏层最后softmax输出所有词的概率,然后反向传播梯度下降decrease loss。但这其中有一个很大的问题:从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。这样的性能显然是对于一个embedding操作来讲是得不偿失的,因此,word