Word2Vec
自然语言处理问题中,一般以词作为基本单元,例如我们想要分析 "我去过华盛顿州" 这句话的情感,一般的做法是先将这句话进行分词,变成我
,去过
,华盛顿州
,由于神经网络无法处理词,所以我们需要将这些词通过某些办法映射成词向量。词向量是用来表示词的向量,也可被认为是词的特征向量。把词映射为实数域向量的技术也叫词嵌入(word embedding)
为何不采用 one-hot 向量
one-hot词向量过于稀疏,无法表达不同词之间的相似度。任意一对词的one-hot向量的余弦相似度都是0。
![](https://img.haomeiwen.com/i16722260/ffe65688430694f8.png)
![](https://img.haomeiwen.com/i16722260/77a34011f8a2153c.png)
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" 叫背景词),即
![](https://img.haomeiwen.com/i16722260/d458b6835579e8a9.png)
假设在给定中心词的情况下,背景词的生成是相互独立的,那么根据乘法原理,上式可以改写成
![](https://img.haomeiwen.com/i16722260/0184f4f6c927286e.png)
跳字模型需要最大化给定任一中心词生成背景词的概率
![](https://img.haomeiwen.com/i16722260/a8a65e2b6003c452.png)
![](https://img.haomeiwen.com/i16722260/1fc6dfa53cb5c006.png)
上式得最大似然估计与最小化以下损失函数等价:
![](https://img.haomeiwen.com/i16722260/96e76fe99a28ff3a.png)
我们可以用 代表中心词的词向量,
代表背景词的词向量。换言之,对于词典中一个索引为
的词,它本身有两个向量
(输入向量表达,也就是最终的词向量)和
(输出向量表达)进行表示,在计算的过程中,根据其所处的角色不同,选择不同的词向量。词典中所有词的这两种向量正是跳字模型所需要学习的参数。为了将模型参数植入损失函数,我们需要使用模型参数表达损失函数中的中心词生成背景词的概率。假设中心词的概率是相互独立的。给定中心词
在词典中的索引为
,背景词
在词典中的索引为
,损失函数中中心词生成背景词的概率可以使用 softmax 函数进行定义:
![](https://img.haomeiwen.com/i16722260/c34e672ee6d21524.png)
当序列长度较大时,我们通常随机采样一个较小的子序列来计算损失函数并使用 SGD 优化该损失函数。通过求导,我们可以计算出上式生成概率的对数关于中心词向量
的梯度为:
![](https://img.haomeiwen.com/i16722260/2c4d3a8292b2c58d.png)
![](https://img.haomeiwen.com/i16722260/b7b9aeffd3386509.png)
通过上面计算得到梯度后,我们可以使用随机梯度下降来不断迭代模型参数。其他模型参数
的迭代方式同理可得。最终,对于词典中任一索引为
的词,我们均得到该词作为中心词和背景词的两组词向量
和
1.2连续词典模型(CBOW)
CBOW对小型数据比较合适,而Skip-Gram在大型语料中表现更好
连续词袋模型与跳字模型类似,与跳字模型最大的不同是,连续词袋模型是用一个中心词在文本序列周围的词来预测中心词。简单的说就是,跳字模型用中心词预测周围的词;连续词袋模型用周围的词预测中心词。
例如,给定文本"the","man","hit","his","son",连续词袋模型所关心的是,邻近词 "the","man","his","son" 一起生成中心词 "hit" 的概率
连续词袋模型需要最大化由背景词生成任一中心词的概率:
![](https://img.haomeiwen.com/i16722260/aad520f24d2d5dc4.png)
上式的最大似然估计与最小化以下损失函数等价
![](https://img.haomeiwen.com/i16722260/25a676153fc8cc8a.png)
这里可以用
![](https://img.haomeiwen.com/i16722260/9773e856069321ca.png)
同样,当序列长度
![](https://img.haomeiwen.com/i16722260/6ed08d46d04f3691.png)
而上式与下式等价:
![](https://img.haomeiwen.com/i16722260/3b6f452ad63223f6.png)
注解:看到这里,就引出了word2vec的核心方法,其实就是认为每个词相互独立,用连乘来估计最大似然函数,求解目标函数就是最大化似然函数。上面公式涉及到一个中心词向量v,以及背景词向量u,因此呢很有趣的是,可以用一个input-hidden-output的三层神经网络来建模上面的skip-model。
![](https://img.haomeiwen.com/i16722260/e35b48b28b3f0254.png)
- 输入的表示:输入层中每个词由独热编码方式表示,即所有词均表示成一个N维向量,其中N为词汇表中单词的总数。在向量中,每个词都将与之对应的维度置为1,其余维度的值均为0。
-
网络中传播的前向过程:输出层向量的值可以通过隐含层向量(K维),以及连接隐藏层和输出层之间的KxN维权重矩阵计算得到。输出层也是一个N维向量,每维与词汇表中的一个单词相对应。最后对输出层向量应用Softmax激活函数,可以计算每一个单词的生成概率。
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近似训练法
可以看到,无论是跳字模型还是连续词袋模型,每一步梯度计算的开销与词典 的大小呈正相关。显然,当词典较大时,这种训练方法的计算开销会很大。所以使用上述训练方法在实际中是由难度的。我们可以使用近似的方法来计算这些梯度,从而减小计算开销。常用的近似训练法包括负采样和层序 softmax
2.1 负采样
以跳字模型为例讨论负采样。词典的大小之所以会在目标函数中出现,是因为中心词
生成背景词
的概率
使用了 softmax,而 softmax 考虑到了背景词可能是词典中任一词,并体现在了 softmax 的分母上
不妨换个角度,假设中心词生成背景词
由以下两个互相独立的联合事件组成来近似
![](https://img.haomeiwen.com/i16722260/374f8aef0dc2c28d.png)
我们可以用函数来表达中心词
和背景词
同时出现在训练数据窗口的概率:
![](https://img.haomeiwen.com/i16722260/3306fb84e7b03b49.png)
那么,中心词
![](https://img.haomeiwen.com/i16722260/54e191021d7ee572.png)
假设噪声词 在词典中的索引为
,上式可改写为
![](https://img.haomeiwen.com/i16722260/e0a289d948406751.png)
因此,有关中心词 生成背景词
的损失函数是
![](https://img.haomeiwen.com/i16722260/3c6e793ddbc9d291.png)
现在,训练中每一步的梯度计算开销不再与词典大小相关,而与 线性相关。当
取较小的常数时,负采样的每一步梯度计算开销也较小。噪音词的采样概率:噪音词的词频的3/4次方。
同理,也可以对连续词袋模型进行负采样。
有关背景词
生成中心词的损失函数为:
![](https://img.haomeiwen.com/i16722260/c58c2aa313625a11.png)
在负采样中可以近似为:
2.2 层序softmax
层序 softmax 利用了二叉树。树的每个叶子节点代表着词典 中的每个词。每个词
对应的词向量为
。我们以下图为例,来描述层序 softmax 的工作机制
![](https://img.haomeiwen.com/i16722260/64412c449c098624.png)
![](https://img.haomeiwen.com/i16722260/1afb4bd9785f6d9d.png)
上面公式可能比较抽象,下面举个具体的例子,计算
![](https://img.haomeiwen.com/i16722260/335214da9bb396e3.png)
![](https://img.haomeiwen.com/i16722260/63b6a49e8fa9f6e9.png)
每次迭代的计算开销由
最后一个问题:层序softmax的二叉树是如何建立的?
二叉Huffman树,权重为语料库中word出现的频率。
参考
- Word2Vec
- 深度学习方法(十七):word2vec算法原理(1):跳字模型(skip-gram) 和连续词袋模型(CBOW)
- Transformer 结构中最后一层 softmax 为什么不再使用 层次化softmax 了呢? - Towser的回答 - 知乎
https://www.zhihu.com/question/310845030/answer/599322764 - cbow 与 skip-gram的比较 - 卡门的文章 - 知乎
https://zhuanlan.zhihu.com/p/37477611