word2vec 学习总结——模型总结

       word2vec的基本思想是,用目标词 w 和其上下文 context(w) 之间相互预测,在这个过程中训练得到词典中词的向量。因为是相互预测,所以就有两种不同的模型来实现这个算法:

     (1)一种是利用上下文 context(w) 来预测目标词 w 的的CBOW(continuous vag-of-words)模型

     (2)一种是利用目标词 w 来预测它的上下文的词 context(w),叫做skip-gram模型

        两种模型的形式如图所示(左边的是CBOW模型,右边的是skip-gram模型):

                                     word2vec 学习总结——模型总结      word2vec 学习总结——模型总结

        针对word2vec的模型实现,又有两种不同的框架:

      (1) 一种是 Hierarchical softmax 框架,这个框架的基础是Huffman 树,可以参考这个:word2vec 学习总结——基础知识。大概的过程是:

step 1:根据语料中的词频建立一颗Huffman 树,树的每个叶子节点对应词典中的一个词。

step 2:对于每一个训练样本 {x=(w_t-1,w_t+1,w_t-2,w_t+2 ),y=w_t},找到Huffman 树的根节点到叶子节点 w_t 的路径 l_w,这个路径上的每一个节点都是一个二分类器。

step 3:输入的 x 的几个词求和后形成新的向量作为输入,然后依次经过路径 l_w 上的每一个非叶子节点,最终到达w_t。

step 4:在这条路径的每一个节点上都会根据子节点的选择产生一个概率值,这些概率相乘之后作为最后的似然值,计算梯度,更新路径上非叶子节点的分类器的参数。

       具体的目标函数、梯度计算、参数更新,可以参考这篇文章:word2vec 中的数学原理详解(四)基于 Hierarchical Softmax 的模型

       (2)另一种是 negative sampling 框架。

         这个框架的基础是负采样,感觉这个框架下的计算跟Hierarchical softmax 框架下的计算非常像,只是在构造目标函数时的方式不一样(感觉这句话好废话),主要的过程如下:

step 1:对于每一个输入的训练样本  {x=(w_t-1,w_t+1,w_t-2,w_t+2 ),y=w_t},把它当做正样本。在词典中采样m个词,和x一起形成负样本

step 2:针对每个目标词(包括正样本和负样本),都有其对应的一个参数 θ,训练样本的 x 与相应的θ相乘,然后经过sigmod计算到对应y的概率值

step 3:第二步中的概率值相乘得到似然值,根据梯度上升更新各个参数 θ,以及输入的词向量。

       具体的负采样怎么做,目标函数、梯度计算、参数更新,可以参考这篇文章:word2vec 中的数学原理详解(五)基于 Negative Sampling 的模型

       与Hierarchical softmax 框架相比,negative sampling 框架不再使用Huffman树,而是采用随机负采样,能大幅度提高性能,同时也能在词向量的质量上有所提高。

 

参考文章:

(1)word2vec 中的数学原理详解:超级详细的word2vec模型的讲解

(2)[NLP] 秒懂词向量Word2vec的本质:从另一种“输入向量”和“输出向量”的角度去理解word2vec,也是很经典的一种理解方式