一直在用Word2vec和Doc2vec做Word Embedding和Sentence/Document EMbedding,但是刚开始用的时候对其原理一直是一知半解,只是知道怎么用而已。古人云:既要知其然,也要知其所以然。所以,结合作者论文,以及网上各位前辈的博客和开源代码之后,抽空写写自己对Word2vec和Doc2vec原理的理解,以及结合代码做一些分析。希望能够有用,有错误也请各位朋友批评指正!
将Deep Learning运用到NLP领域的朋友们肯定都接触过Embedding这个概念,Embedding其实是将词或者句子/文档向量化。想要让机器理解自然语言,首先肯定要找到一种方法将自然语言(符号)数学化。
NLP中最直观常用的一种词表示方法是one-hot方法,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
举个例子来说:“科比”可能表示为[0001000000.....],而“篮球”可以表示为[0000000100000......]
one-hot的表示方法是一种稀疏表示方式,虽然在很多情况下one-hot表示方法已经取得了不错的效果,但是这种词表示方法也引起了一些问题。首先,one-hot表示方法可能造成维数灾难,如果词表很大,则每一个词就表示为除了该词所在的索引处为1外,其他全为0的一个很长的向量,这会给机器运算造成很大的困难。其次,one-hot表示方法表示的两个词的词向量是孤立的,不能从两个词的向量中看出两个词之间的语义关系。
为了解决one-hot的这两个缺点,又逐渐发展出了Distributed representation词向量表示方法,以及现在最火最好用的Word2vec词向量表示方法。
Word2vec
Word2vec其实是语言模型训练的一个副产品,传统的统计词向量模型使用单词在特定上下文中出现的概率表征这个句子是自然语言的概率:p(sentence) = p(word|context)。上下文context是指单词前面的特定的单词。N-gram模型又称为n元组模型, 所谓n元组是单词和它的上下文(即它前面的n-1个单词)组成的词组。
N-gram模型的另一个问题在于计算量过大, 计算一次条件概率就要扫描一遍语料库, 使得可以实际应用的深度(N值)一般为2或3。这个问题可以采用拟合的方法来解决即预测法。神经网络模型即计算部分概率值用于训练神经网络, 然后使用神经网络预测其它概率值。
其实,Word2vec的训练过程可以看做是通过神经网络机器学习算法来训练N-gram 语言模型,并在训练过程中求出word所对应的vector的方法。根据语言模型的不同,又可分为“CBOW”和“Skip-gram”两种模型。而根据两种降低训练复杂度的方法又可分为“Hierarchical Softmax”和“Negative Sampling”。两种模式和两种方法进行组合,所以实际上是有四种实现。
接下来我们先看看“CBOW”和“Skip-gram”这两种模型:
CBOW
CBOW(Continuous Bag-of-Word Model)又称连续词袋模型,是