《通俗理解Word2Vec》目录

简述Word2Vec     

CBOW模型用层级softmax实现

CBOW模型负采样方式实现


简述Word2Vec     

     首先,我们都知道Word2Vec是用来产生词向量的,词向量就是用一长串数字表示一个单词或者词语。一般这个过程是作为NLP的前导工作。基础性的东西在这不讲了。  

     Word2Vec有两个典型的模型:COBW模型和Skip-gram模型。COBW模型是根据上下文去预测中心词,Skip-gram是根据中心词预测上下文。下面是这两种模型的结构:

      针对这两种模型又有两种实现方式:Hierarchical softmax(层级softmax),Negative Sampling(负采样)。我们这里只讨论CBOW模型是如何通过这两种方式实现的。

 

CBOW模型用层级softmax实现

看上图,我们发现模型有三层,分别为:输入层,投影层(有的人叫隐层), 输出层。

我们分别从三个层的输入和输出讲起:

输入层:因为CBOW模型是根据上下文去预测中心词,所以,我们这里是输入上下文的词向量(妈呀,我们要得到词向量,你这里让我输入词向量,你是不是有病?),这些词向量是什么呢? 我们又该怎样输入?  这里我们是随机初始化的。假设我们这里只考虑中心词前面两个词和后面两个词,那这里就是初始化四个向量,至于长度是多少?是由你决定的,假设你想将词用长度为n的向量表示,你这里就初始化为长度为n的向量,所以我们输入的数据格式为   [ [长度为n的词向量], [长度为n的词向量], [长度为n的词向量], [长度为n的词向量]]

投影层(隐层): 这一步非常简单,我们就是将输入层的向量累加起来,如:输入[ [ 1, 2, 2, 1], [3, 2, 1, 3], [4, 2, 2, 1], [1,2, 1, 1]],我们投影层将累加变为 [ 1+3+4+1, 2+2+2+2, 2+1+2+1, 1+3+1+1]  结果就是 [ 9, 8, 6, 6]

输出层:看这一层之前,需要有个前导知识(对哈夫曼树有了解)。我们这里就是根据预料中词出现的次数当做词的权重构造一个哈夫曼树,显然,我们可以得出,所有词都是在叶子节点上,并且词频高的词靠近根节点,词频低的词远离根节点。这一点知识就此打住。我们举个例子看看从投影层到输出层最后怎样预测中心词。

     假设有一句话:我喜欢观看巴西足球世界杯。  我们输入的是足球的上下文,预测足球。 

      注意输出层的那棵树:叶子节点就是我们预料中的各个词。我们输入上下文,最后想预测足球,体现在输出层,就是我们想方设法,走红色那条路径,这条路径怎么走?  其实你把每一步当做一个softmax(也可叫做逻辑回归) 。 我们这里把左分支记做1,右分支记做0。 那我们从投影层来了一个向量,我们就进行第一次逻辑回归,肯定是想让最后输出1的概率大一些,然后再通过第二次逻辑回归,肯定又想让输出零的概率大一些。 依次类推,最后输出足球。  我们将上面的描述用公式表达出来:

     讲公式之前,我们先定义一下在哈夫曼树中一些字母表示的含义(对照上图看):

     接下来,分析我们的足球预测过程:

 

        针对每一步的预测,我们要么标签是0,要么标签是1, 公式如下:

         我们可以将上述两种情况整合到一个式子中

        接下来,把②式带入到上面的①式中,①式就变为:

        为了下面梯度推导方便,我们这里将(4.4)式中{ }中的内容拿出来:

        CBOW模型的对数似然函数出来了,我们现在要做的就是最大似然估计,也就是采用梯度上升的算法更新参数。梯度计算如下:

       对Xw求导后,相当于对隐层进行梯度更细,我们针对每个词向量,也用当前梯度进行更新。 这里也有一种想法,就是将梯度进行平均,然后针对每个词向量更新平均后的梯度值。

       下图给出一个完整的伪代码流程:

CBOW模型负采样方式实现

什么是负采样? 

    举一个例子:  我  喜欢  看  足球  世界杯。  这里面如果我们当前是预测足球这个词,我们把足球当做正样本,其他的词都当做负样本。  当时词那么都,都选的话,有点多。   我们就进行负采样。也就是从负样本中采取一定量的样本。

   我们都知道,在一个语料库中,每个词出现都有一定的次数,我们根据次数不同,给定每个词一个采样频率。怎样给呢? 出现次数多的词,我们给的概率大些,出现次数比较小的词,概率让其小一些。 

   这样我们可以得出每个词被采样的概率。如果采词1的负样本,采到词1我们就将其忽略,继续采样。 

 

     接下来,把②式带入①式。我们就可以得到对应的似然函数,

     然后,进行极大似然估计,采用梯度上升的算法。剩余的步骤和层次softmax一样,去更细词向量。。 最后就得到了词向量。。

 

参考一下博客帖子:

word2vec中的数学原理详解:https://blog.csdn.net/peghoty/article/details/37969519  

理解word2vec之skip-gram模型: https://zhuanlan.zhihu.com/p/27234078