word2vec原理

word2vec

word2vec是一个计算word vector的开源工具。当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型和Skip-gram模型。
2013年,Google团队发表了word2vec工具。word2vec工具主要包含两个语言模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法(降低复杂度):负采样(negative sampling)和层序softmax(hierarchical softmax)。
值得一提的是,word2vec词向量可以较好地表达不同词之间的相似和类比关系。

Word2vec可以通过词语上下文的结构信息,将单词的语义映射到一个固定的向量空间中。如果需要判定两个词语的语义相似度(或相关度),只需要计算两个词向量的夹角余弦或欧式距离等即可。

skip-gram:预测上下文(context)
CBOW 预测目标单词
CBOW是从原始语句推测目标字词,背景词推出中心词;而Skip-Gram正好相反,是从目标字词推测出原始语句,中心词推背景词。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

霍夫曼树

word2vec利用霍夫曼树来模拟隐层到输出层的学习过程。

霍夫曼树是带权路径最小的二叉树,权值越大的叶子结点越靠近根结点

输入:权值为(w1,w2,…wn)(w1,w2,…wn)的nn个节点

输出:对应的霍夫曼树

1)将(w1,w2,…wn)(w1,w2,…wn)看做是有nn棵树的森林,每个树仅有一个节点。

2)在森林中选择根节点权值最小的两棵树进行合并,得到一个新的树,这两颗树分别作为新树的左右子树。新树的根节点权重为左右子树的根节点权重之和。

3) 将之前的根节点权值最小的两棵树从森林删除,并把新树加入森林。

4)重复步骤2)和3)直到森林里只有一棵树为止。

Hierachical Softmax

在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为"Hierarchical Softmax"。

在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数,即
P ( + ) = σ ( x w T θ ) = 1 1 + e x w T θ P(+) = \sigma(x_w^T\theta) = \frac{1}{1+e^{-x_w^T\theta}}
其中xw是当前内部节点的词向量,而θ则是我们需要从训练样本求出的逻辑回归的模型参数。

使用霍夫曼树的好处:二叉树,查找计算量变为log2V;由于霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间就能被找到,符合贪心优化思想。

基于Hierarchical Softmax的CBOW模型

首先我们要定义词向量的维度大小M,以及CBOW的上下文大小2c,这样我们对于训练样本中的每一个词,其前面的c个词和后面的c个词作为了CBOW模型的输入,该词本身作为样本的输出,期望softmax概率最大。

在做CBOW模型前,我们需要先将词汇表建立成一颗霍夫曼树。

对于从输入层到隐藏层(投影层),这一步比较简单,就是对ww周围的2c2c个词向量求和取平均即可,即
x w = 1 2 c i = 1 2 c x i x_w = \frac{1}{2c}\sum\limits_{i=1}^{2c}x_i
第二步,通过梯度上升法来更新我们的θ和xw,注意这里的xw是由2c个词向量相加而成,我们做梯度更新完毕后会用梯度项直接更新原始的各个xi,即

θ j 1 w = θ j 1 w + η ( 1 d j w σ ( x w T θ j 1 w ) ) x w \theta_{j-1}^w = \theta_{j-1}^w + \eta (1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))x_w

x w = x w + η j = 2 l w ( 1 d j w σ ( x w T θ j 1 w ) ) θ j 1 w    ( i = 1 , 2.. , 2 c ) x_w= x_w +\eta \sum\limits_{j=2}^{l_w}(1-d_j^w-\sigma(x_w^T\theta_{j-1}^w))\theta_{j-1}^w \;(i =1,2..,2c)

基于Hierarchical Softmax的skip-gram模型

对于从输入层到隐藏层(投影层),这一步比CBOW简单,由于只有一个词,所以,即xwxw就是词ww对应的词向量。

第二步仍然是通过梯度上升法来更新θ和xw

负采样

在每次迭代的过程中,有大量的输出向量需要更新,为了解决这一困难,negative sampling提出了只更新其中一部分输出向量的解决方案。
随机选择一个较少数目的负样本来更新权重(这里的“负”单词就是我们希望神经网络输出为0的神经元对应的单词),并且依然更新正样本(上下文单词)

负采样并没有采用霍夫曼树,而是通过采样neg个不同的中心词做负例,就可以训练模型,整个过程比hierarchical softmax要简单

如何进行负采样

在采样前,我们将这段长度为1的线段划分成M等份,这里M>>V,这样可以保证每个词对应的线段都会划分成对应的小块。而M份中的每一份都会落在某一个词对应的线段上。在采样的时候,我们只需要从M个位置中采样出neg个位置就行,此时采样到的每一个位置对应到的线段所属的词就是我们的负例词。

猜你喜欢

转载自blog.csdn.net/xty5057212/article/details/88618141