说到Word2vec,它可谓非结构化数据里面的佼佼者,尤其是在推荐和NLP当中, 足以体现它的优势所在,并且多年一直备受工业界喜爱. 那么word2vec到底是怎么个原理的, 发现身边总是有很多人问, 确不能准确的说出为什么是两个矩阵, 到底是怎么自动反向传播的, 以及对于softMax之后那么大的维度数据,是怎么加速计算的,本文就在这这里做一简单概述.
Word2vec实际是一种浅层的神经网络, 它有两种网路结构,分别是CBOW(Continus Bag of Words)和Skip-Gram.
通常我们可以都看到类似这样的一个图
对于两种模型都可以表示为输入层(Input),映射层(Projection)和输出层(Output)组成的神经网络.
在输入层,一个词转成one-hot向量,在第一个矩阵上进行计算(W1.shape=(V*N)),然后再通过第二个矩阵(W2.shape=(N*V)),最后输出的就是一个超级巨大的softmax.
对于CBOW(Continuous Bag-of-Words)这种算法,通过周围词来预测中心词,这个也是使用最广泛的,而且效果最好,对于输出的是多个词的one-hot编码,然后进多个词的one-hot求和,然后输入网络进行计算.
对于Skip-Gram,是使用当前词进行周围词的预测,其他的和CBOW一样的.
Word2Vec本质上是一个语言模型,它输出的节点数是V个,对应V个词语,理所当然是一个分类问题, 可惜, 这个分类问题不是那么容易计算的,对于中文文字大概有5000左右,也就是说模型是一个5000类的分类了, 可是对于英文呢,300K的词汇量,想象在分母上指数相加,那个啥,不切合实际吆.
理想总是丰满的,现实却是骨感的,方案是设计出来了,但是这样的计算量,那是现在的计算机能在有限的是时间内计算出来的, 提出该解决方案的作者也是厉害, 不仅提出了解决方案,还搞了两,智商完全碾压我们这些NLP小小兵.
对于第一种方案,其实细想是很简单的, 对于滑动窗口,窗口之外几百万的词完全没必要都在分母上进行计算,按照现实生活中,一个单词仅仅与其周围的单词之间有语义关联,相距太远的就没有什么关联性了,于是乎, 采用的负采样(Negative Sampling)的方案, 对于距离较远的词语,只获取部分词语, 就可以达到预期效果.
而另一种方案更里巧妙至极,作者使用一个哈夫曼树(Hierarchical Softmax),对于每一个叶子结点是一个词语的向量,对于常用词,他的在树中的深度浅一些,生僻词在树上的深度深一些,然后树上的每一个结点是一个矩阵,而每一个词语的向量就是他所在路径向量的相乘.
好了,本文大概就说到这, 站在工程的角度说理论,拒绝繁杂理论推导,争取文章越写越通俗!