Word2Vec

2021-03-01  本文已影响0人  Jarkata

自然语言处理问题中,一般以词作为基本单元,例如我们想要分析 "我去过华盛顿州" 这句话的情感,一般的做法是先将这句话进行分词,变成去过华盛顿州,由于神经网络无法处理词,所以我们需要将这些词通过某些办法映射成词向量。词向量是用来表示词的向量,也可被认为是词的特征向量。把词映射为实数域向量的技术也叫词嵌入(word embedding)

为何不采用 one-hot 向量

one-hot词向量过于稀疏,无法表达不同词之间的相似度。任意一对词的one-hot向量的余弦相似度都是0。



1.word2vec

2013 年,Google 团队发表了 word2vec 工具。word2vec 工具主要包含两个模型:跳字模型(skip-gram)连续词模型(continuous bag of words,简称 CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序 softmax(hierarchical softmax)。值得一提的是,word2vec 词向量可以较好地表达不同词之间的相似度和类比关系。

1.1跳字模型(skipgram)

在跳字模型中,我们用一个词来预测它在文本序列周围的词。例如,给定文本序列the","man","hit","his","son"。设背景窗口大小为 2, 跳字模型所关心的是,给定 "hit",生成它邻近词 "the","man"."his","son" 的概率(在这个例子中,"hit" 叫中心词,"the","man","his","son" 叫背景词),即


假设在给定中心词的情况下,背景词的生成是相互独立的,那么根据乘法原理,上式可以改写成

跳字模型需要最大化给定任一中心词生成背景词的概率


上式得最大似然估计与最小化以下损失函数等价:

我们可以用 v代表中心词的词向量, u代表背景词的词向量。换言之,对于词典中一个索引为i 的词,它本身有两个向量 v_i(输入向量表达,也就是最终的词向量)和u_i(输出向量表达)进行表示,在计算的过程中,根据其所处的角色不同,选择不同的词向量。词典中所有词的这两种向量正是跳字模型所需要学习的参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的中心词生成背景词的概率。假设中心词的概率是相互独立的。给定中心词w_c在词典中的索引为c,背景词 w_o在词典中的索引为o,损失函数中中心词生成背景词的概率可以使用 softmax 函数进行定义:

当序列长度T较大时,我们通常随机采样一个较小的子序列来计算损失函数并使用 SGD 优化该损失函数。通过求导,我们可以计算出上式生成概率的对数关于中心词向量v_c的梯度为:


通过上面计算得到梯度后,我们可以使用随机梯度下降来不断迭代模型参数v_c。其他模型参数u_0的迭代方式同理可得。最终,对于词典中任一索引为i的词,我们均得到该词作为中心词和背景词的两组词向量v_iu_i

1.2连续词典模型(CBOW)

CBOW对小型数据比较合适,而Skip-Gram在大型语料中表现更好
连续词袋模型与跳字模型类似,与跳字模型最大的不同是,连续词袋模型是用一个中心词在文本序列周围的词来预测中心词。简单的说就是,跳字模型用中心词预测周围的词;连续词袋模型用周围的词预测中心词。
例如,给定文本"the","man","hit","his","son",连续词袋模型所关心的是,邻近词 "the","man","his","son" 一起生成中心词 "hit" 的概率
连续词袋模型需要最大化由背景词生成任一中心词的概率:


上式的最大似然估计与最小化以下损失函数等价

这里可以用vu分别代表背景词和中心词的向量(注意符号和跳字模型不同)。给定中心词 w_c在词典中的索引为c,背景词 w_{o_1},...,w_{o_2m}在词典中的索引为 ,损失函数中的背景词生成中心词的概率可以使用 softmax 函数定义为

同样,当序列长度T较大时,我们通常随机采样一个较小的子序列来计算损失函数,并使用随机梯度下降优化该损失函数,通过微分,我们可以计算出上式生成概率的对数关于任一背景词向量 v_{o_i}(i=1,...,2m)的梯度为:

而上式与下式等价:

注解:看到这里,就引出了word2vec的核心方法,其实就是认为每个词相互独立,用连乘来估计最大似然函数,求解目标函数就是最大化似然函数。上面公式涉及到一个中心词向量v,以及背景词向量u,因此呢很有趣的是,可以用一个input-hidden-output的三层神经网络来建模上面的skip-model。


skip gram和 cbow的区别

在skip-gram里面,每个词在作为中心词的时候,实际上是 1个学生 VS K个老师,K个老师(周围词)都会对学生(中心词)进行“专业”的训练,这样学生(中心词)的“能力”(向量结果)相对就会扎实(准确)一些,但是这样肯定会使用更长的时间;

cbow是 1个老师 VS K个学生,K个学生(周围词)都会从老师(中心词)那里学习知识,但是老师(中心词)是一视同仁的,教给大家的一样的知识。至于你学到了多少,还要看下一轮(假如还在窗口内),或者以后的某一轮,你还有机会加入老师的课堂当中(再次出现作为周围词),跟着大家一起学习,然后进步一点。因此相对skip-gram,你的业务能力肯定没有人家强,但是对于整个训练营(训练过程)来说,这样肯定效率高,速度更快。

所以,这两者的取舍,要看你自己的需求是什么了。

cbow 与 skip-gram的比较 - 卡门的文章 - 知乎
https://zhuanlan.zhihu.com/p/37477611

2近似训练法

可以看到,无论是跳字模型还是连续词袋模型,每一步梯度计算的开销与词典 |V|的大小呈正相关。显然,当词典较大时,这种训练方法的计算开销会很大。所以使用上述训练方法在实际中是由难度的。我们可以使用近似的方法来计算这些梯度,从而减小计算开销。常用的近似训练法包括负采样层序 softmax

2.1 负采样

以跳字模型为例讨论负采样。词典|V|的大小之所以会在目标函数中出现,是因为中心词 w_c生成背景词 w_o的概率 P(w_o|w_c)使用了 softmax,而 softmax 考虑到了背景词可能是词典中任一词,并体现在了 softmax 的分母上

不妨换个角度,假设中心词w_c生成背景词w_o由以下两个互相独立的联合事件组成来近似

我们可以用\sigma(x)=\frac{1}{1+exp(-x)}函数来表达中心词w_c和背景词w_o同时出现在训练数据窗口的概率:


那么,中心词w_c生成背景词w_0的对数概率可以近似为:

假设噪声词 w_k在词典中的索引为i_k,上式可改写为

因此,有关中心词 w_c生成背景词 w_o的损失函数是

现在,训练中每一步的梯度计算开销不再与词典大小相关,而与 K线性相关。当 K取较小的常数时,负采样的每一步梯度计算开销也较小。噪音词的采样概率:噪音词的词频的3/4次方。

同理,也可以对连续词袋模型进行负采样。
有关背景词w^{(t-m)},...,w^{(t-1)},w^{(t+1)},...,w^{(t+m)}
生成中心词w_c的损失函数为:


在负采样中可以近似为:
-log\frac{1}{1+\exp[-\boldsymbol{u}_c^T(\boldsymbol{v}_{o_1}+...+\boldsymbol{v}_{o_{2m}})/(2m)]}-\sum_{k=1,w_k\sim P(w)}^Klog\frac{1}{1+\exp[\boldsymbol{u}_{i_k}^T(\boldsymbol{v}_{o_1}+...+\boldsymbol{v}_{o_{2m}})/(2m)]}

2.2 层序softmax

层序 softmax 利用了二叉树。树的每个叶子节点代表着词典 |V|中的每个词。每个词 w_i对应的词向量为v_i 。我们以下图为例,来描述层序 softmax 的工作机制



上面公式可能比较抽象,下面举个具体的例子,计算 w_i生成 w_3的概率,由于在二叉树中由根到 w_3的路径需要向左、向右、再向左地遍历,所以得到

每次迭代的计算开销由O(|V|)降为二叉树的高度O(log|V|)

最后一个问题:层序softmax的二叉树是如何建立的?

二叉Huffman树,权重为语料库中word出现的频率。

参考

上一篇 下一篇

猜你喜欢

热点阅读