word2vec理论

1. 简介

在学习一个新的模型时,我们关注的是模型的方法,即原理是什么;模型结构;模型的损失函数;优化方式。本次word2vec就从以上四个方面讲解。

2. 原理

word2vec的方法/原理有两种,一种是skip-gram;一种是cbow。使用时我们选择其中一个即可。(ps:在讲网络结构时,比如DNN结构图,通常都是指一个样本的,以下方法所述也是指一个样本,或者一句话)

2.1 skip-gram(跳字模型)

跳字模型的核心是用中心词来预测周围的词。比如一句话:“我”、“非常”、“喜欢”、“吃”、“苹果”。假设以“喜欢”为中心词,窗口大小为2,那么跳字模型要完成的任务是:给定中心词“喜欢”,预测周围词(距离不超过2)“我”、“非常”、“吃”、“苹果”这四个词的概率(这四个词也成称为背景词)。
数学方式表达为:
假设语料库(每个样本是一句话)中词典(语料库、词典的区别见博客https://blog.csdn.net/weixin_43178406/article/details/105354047)V的大小为|V|,给定一个长度为T的文本序列,时间t的词为 w ( t ) w(t) w(t)。当时间窗口大小为m时,跳字模型需要最大化给定任一中心词生成所有背景词的概率。

2.2 CBOW模型(连续词袋模型)

CBOW模型原理与skip gram相类似,其核心是用中心词来预测周围词。比如一句话:“我”、“非常”、“喜欢”、“吃”、“苹果”。假设以“喜欢”为中心词,窗口大小为2,那么CBOW模型要完成的任务是:给定周围词(距离不超过2):“我”、“非常”、“吃”、“苹果”这四个词,预测中心词“喜欢”的概率。
数学描述:
假设语料库(每个样本是一句话)中词典(语料库、词典的区别见博客https://blog.csdn.net/weixin_43178406/article/details/105354047)V的大小为|V|,给定一个长度为T的文本序列,时间t的词为 w ( t ) w(t) w(t)。当时间窗口大小为m时,CBOW模型需要最大化给定背景词生成任一中心词的概率。

3. 模型结构(原始)

word2vec虽然是用来计算词向量的,但其结构本质上还是深度学习结构。在一句话中有多个时刻,对于上述所举的例子,我们可以以“喜欢”为中心词,也可以以“吃”为中心词,因此,t=1时刻中心词为“我”,t=2时刻中心词为“非常”,t=3时刻中心词为“喜欢”,t=4时刻中心词为“吃”,t=5时刻中心词为“苹果”。对于时刻T=t,当前时刻的网络结构如下:
在这里插入图片描述
无论是skip gram还是cbow,其网络结构都包括三层,输入层,投影层和输出层(没有隐藏层)

  • 对于cbow,其输入层是周围词的初始化向量,假设词向量维度为n,如上图, w t − 2 / w t − 1 / w t + 1 / w t + 2 w_{t-2}/w_{t-1}/w_{t+1}/w_{t+2} wt2/wt1/wt+1/wt+2都是n维的向量;投影层就是把输入层的四个n维向量进行了相加;输出层的维度为|V|,因为要计算词典中所有词的概率(这里的输出层和DNN不一样,但目前为止,word2vec所应用的还是语言模型原理,未涉及深度学习,因此这里的输出层就是计算已知背景词求中心词(|V|种可能)的概率,概率的计算方法见第四章)。
  • 对于skip gram,其和cbow异曲同工,只不过输入层只有中心词一个词向量,投影层sum的功能可以省略(因为只有一个词的词向量),输出层维度也为|V|,预测所有词的概率(也是根据语言模型原理求的)。
    word2vec和传统的深度学习模型不同的是,word2vec既要更新参数的值,还要更新输入的词向量的值(传统深度学习模型,只是为了求参数 ω \omega ω),因此词向量其实是word2vec模型的副产物。

4. 损失函数(原始)

4.1 skip gram损失函数

上述讲到当时间窗口大小为m时,跳字模型需要最大化给定任一中心词生成所有背景词的概率。其也说明了损失函数的本质。其损失函数如下:
l o s s = ∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( ω ( t + j ) ∣ ω ( t ) ) loss=\prod_{t=1}^{T}\prod_{-m\le j\le m,j\ne0}P(\omega^{(t+j)}|\omega^{(t)}) loss=t=1Tmjm,j=0P(ω(t+j)ω(t))
t表示时刻,对于上述所举的例子,我们可以以“喜欢”为中心词,也可以以“吃”为中心词,因此,t=1时刻中心词为“我”,t=2时刻中心词为“非常”,t=3时刻中心词为“喜欢”,t=4时刻中心词为“吃”,t=5时刻中心词为“苹果”;m表示窗口大小;j表示离中心词的距离,在中心词左边为负数,在中心词右边为正数; ω t + j \omega^{t+j} ωt+j表示t时刻,离中心词 ω \omega ω距离为j的词。
首先来看内层的连乘,假设此时t=3,m=2, ∏ − m ≤ j ≤ m , j ≠ 0 P ( ω ( 3 + j ) ∣ ω ( 3 ) = P ( 我 ∣ 喜 欢 ) P ( 非 常 ∣ 喜 欢 ) P ( 吃 ∣ 喜 欢 ) P ( 苹 果 ∣ 喜 欢 ) \prod_{-m\le j\le m,j\ne0}P(\omega^{(3+j)}|\omega^{(3)}=P(我|喜欢)P(非常|喜欢)P(吃|喜欢)P(苹果|喜欢) mjm,j=0P(ω(3+j)ω(3)=P()P()P()P()
外层连乘就是遍历时刻t,即分别以我、非常、喜欢、吃、苹果为中心词,计算内层连乘。
ps(以上损失函数只是针对一个样本的,对于所有样本,还需要再加一层求和,或者是选择随机梯度下降时的损失函数,即每次随机选择一样样本计算损失函数、更新参数。上述损失函数的定义也是由语言模型发展而来的)
一般来讲,连乘是不好计算的,而且值也会非常大,因此,一般取log后进行求和。
l o s s ≈ l o g [ ∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( ω ( t + j ) ∣ ω ( t ) ) ] ≈ ∑ t = 1 T ∑ − m ≤ j ≤ m l o g P ( ω ( t + j ) ∣ ω t ) loss\approx log[\prod_{t=1}^{T}\prod_{-m\le j\le m,j\ne0}P(\omega^{(t+j)}|\omega^{(t)})]\approx\sum_{t=1}^{T}\sum_{-m\le j \le m}logP(\omega^{(t+j)}|\omega^{t}) losslog[t=1Tmjm,j=0P(ω(t+j)ω(t))]t=1TmjmlogP(ω(t+j)ωt)
在学习其他模型时,我们都是最小化损失函数,但是上式,很明显,我们需要最大化(让概率值尽可能大),因此前面乘以负号,并且求一个时间的平均。于是,需要最小化的损失函数为
l o s s = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m l o g [ P ( ω ( t + j ) ∣ ω t ) ] loss = -\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\le j \le m}log[P(\omega^{(t+j)}|\omega^{t})] loss=T1t=1Tmjmlog[P(ω(t+j)ωt)]
在word2vec中,对于一个词,我们有两个向量,一个是作为中心词的向量,一个是作为背景词的向量。我们用V和U分别表示中心词和背景词向量。对于词典中索引为i的词,他在作为中心词和背景词时的向量分别为 v i v_i vi u i u_i ui
上式虽然给定了损失函数的定义,但是 P ( ω t + j ∣ ω t ) P(\omega^{t+j}|\omega^{t}) P(ωt+jωt)仍然不知道如何计算(其实就是第三章所说的输出层概率如何计算的问题)。给定中心词,假设生成的各个背景词时相互独立的。设中心词 w c w_c wc在词典中的索引为c,背景词 w o w_o wo在词典中的索引为o。损失函数中给定中心词生成背景词的条件概率可以通过softmax函数定义为:
P ( ω o ∣ ω c ) = e x p ( u o T v c ) ∑ i ∈ V e x p ( u i T v c ) P(\omega_o|\omega_c)=\frac{exp(u_o^Tv_c)}{\sum_{i\in V}exp(u_i^Tv_c)} P(ωoωc)=iVexp(uiTvc)exp(uoTvc)
其中 v c v_c vc表示词典中索引为c的中心词向量, u o u_o uo表示词典中索引为c的背景词向量,该公式即第三章中的输出层计算方法。
知道了条件概率的公式表达,代入损失函数公式中,就可以得到损失函数具体的计算表达式了。

  • skip-gram其他说明:
    • 训练模型时,每一次迭代实际上是用这些梯度来迭代子序列中出现过得中心词和背景词的向量
    • 训练结束后,对于词典中的任一索引为i的词,我们均得到该词作为中心词和背景词的两组词向量
    • 在nlp应用中,我们使用跳字模型的中心词向量

4.2 CBOW损失函数

CBOW损失函数的思维和skip gram也是相似的,也是从语言模型发展而来的。其最初的表达式为:
∏ t = 1 T P ( ω ( t ) ∣ ω t − m , . . . , ω t + 1 , . . . , ω t + m ) \prod_{t=1}^{T}P(\omega^{(t)}|\omega^{t-m},...,\omega^{t+1},...,\omega^{t+m}) t=1TP(ω(t)ωtm,...,ωt+1,...,ωt+m)
CBOW损失函数最初表达形式与skip gram相比,少了一层连乘,是因为skip gram是用中心词预测周围词,其在t时刻,需要2m个周围词的条件概率相乘。而CBOW是用周围词预测中心词,因此t时刻,只有一个预测中心词的条件概率,不需要连乘了。
将CBOW加log及符号后,损失函数变为
l o s s = − ∑ t = 1 T l o g [ P ( ω ( t ) ∣ ω t − m , . . . , ω t + 1 , . . . , ω t + m ) ] loss=-\sum_{t=1}^{T}log[P(\omega^{(t)}|\omega^{t-m},...,\omega^{t+1},...,\omega^{t+m})] loss=t=1Tlog[P(ω(t)ωtm,...,ωt+1,...,ωt+m)]
其中,由周围词预测中心的条件概率表达式为:
P ( ω c ∣ ω o 1 , . . . , ω o 2 m ) = e x p ( u c T ( v o 1 + . . . + v o 2 m ) / 2 m ∑ i ∈ V e x p ( u i T ( v o 1 + . . . + v o 2 m ) / 2 m P(\omega_c|\omega_{o1},...,\omega_{o2m})=\frac{exp(u_c^T(v_{o1}+...+v_{o2m})/2m}{\sum_{i \in V}exp(u_i^T(v_{o1}+...+v_{o2m})/2m} P(ωcωo1,...,ωo2m)=iVexp(uiT(vo1+...+vo2m)/2mexp(ucT(vo1+...+vo2m)/2m

  • cbow其他总结:
    • 在自然语言处理应用中,会使用CBOW的背景词向量

4.3 本章小结

回想一下,一句话(一个样本)的损失函数是多个时刻的连乘(log转换后为求和),但是网络结构却是一句话(一个样本)某个时刻的(学习DNN时,所示的网络结构是一个样本的)。所以推断word2vec传入的是可迭代对象,以列表为例,结合gensim库,如
[[the, cat, is, running],
[the, dog, is, cute, that, dog, is, smart]]
因此一句话代表一个样本,对于一个样本的损失函数,其公式如第三章所讲,而一个样本,某一时刻的结构图如本章上图所示(因此可以理解为一个样本可以切分出很多小样本)。word2vec在训练时,应该选择的是随机梯度下降,即任选一个样本计算损失函数,而不是所有样本(所有样本的损失函数之和计算量太大了)。对于第一个样本,当时刻t=1,m=2时,可以发现向左滑动没有单词了,这时可以用padding的方式,即向前填充m个词(同理向后填充m个词),填充的词为固定的,其也有一个初始化的向量。在这一块,word2vec和NNLM的处理比较相似,具体可以参考NNLM:https://blog.csdn.net/weixin_43178406/article/details/101671342

5. 模型结构及损失函数的优化

无论是基于cbow原理还是基于skip gram原理,模型结构都有两种优化方式,相应的损失函数也会变化。一种是层次softmax(Hierarchical softmax),另一种是负采样(Negative Samplig)。那么为什么需要进行模型结构的优化呢?

5.1 基于skip gram原理的模型结构优化原因

第四章中我们得到了原始模型的损失函数为:
l o s s = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m l o g [ P ( ω ( t + j ) ∣ ω t ) ] loss = -\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\le j \le m}log[P(\omega^{(t+j)}|\omega^{t})] loss=T1t=1Tmjmlog[P(ω(t+j)ωt)]
其中用中心词预测背景词的概率P为:
P ( ω o ∣ ω c ) = e x p ( u o T v c ) ∑ i ∈ V e x p ( u i T v c ) P(\omega_o|\omega_c)=\frac{exp(u_o^Tv_c)}{\sum_{i\in V}exp(u_i^Tv_c)} P(ωoωc)=iVexp(uiTvc)exp(uoTvc)
将其带入损失函数,然后求偏导。为了简单起见,我们先不考虑外面两层的求和,仅对内层条件概率求偏导:
在这里插入图片描述
该式也可以写成:
在这里插入图片描述
由上述公式可以看到,仅仅是内层的条件概率求偏导,就需要遍历词典,因此计算量是很大的。所以,需要采用一定的方法降低计算量,具体方法见下述。

5.2 基于cbow原理的模型结构优化原因

其逻辑与skip gram相似,cbow的损失函数为:
l o s s = − ∑ t = 1 T l o g [ P ( ω ( t ) ∣ ω t − m , . . . , ω t + 1 , . . . , ω t + m ) ] loss=-\sum_{t=1}^{T}log[P(\omega^{(t)}|\omega^{t-m},...,\omega^{t+1},...,\omega^{t+m})] loss=t=1Tlog[P(ω(t)ωtm,...,ωt+1,...,ωt+m)]
其中,由背景词预测中心词的条件概率表达式为:
P ( ω c ∣ ω o 1 , . . . , ω o 2 m ) = e x p ( u c T ( v o 1 + . . . + v o 2 m ) / 2 m ∑ i ∈ V e x p ( u i T ( v o 1 + . . . + v o 2 m ) / 2 m P(\omega_c|\omega_{o1},...,\omega_{o2m})=\frac{exp(u_c^T(v_{o1}+...+v_{o2m})/2m}{\sum_{i \in V}exp(u_i^T(v_{o1}+...+v_{o2m})/2m} P(ωcωo1,...,ωo2m)=iVexp(uiT(vo1+...+vo2m)/2mexp(ucT(vo1+...+vo2m)/2m
将其带入损失函数,然后求偏导。为了简单起见,我们先不考虑外面两层的求和,仅对内层条件概率求偏导:
在这里插入图片描述
该式也可以写成:
在这里插入图片描述
由上述公式可以看到,仅仅是内层的条件概率求偏导,就需要遍历词典,因此计算量是很大的。所以,需要采用一定的方法降低计算量,具体方法见下述。

5.3 Hierarchical softmax优化方法

5.3.1 哈夫曼树(huffman)

哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树,如下图所示
在这里插入图片描述
对于huffman树,定义以下概念:

  • 路径:从一个根结点到孩子结点的通路。这里的孩子指的是孩子、孙子、重孙等等。
  • 路径长度:通路中分支的个数。如上图a从根结点到A结点,除叶子结点的圆圈外,还有两个圆圈,每个圆圈都认为是一个分支(从圆圈处可选择不同的路径),因此,路径长度为2。若规定根结点的层号为1,则从根结点到第L层结点的路径长度为L-1
  • 结点的权:若为树中结点赋予一个具有某种含义的非负数值,则这个数值称为该结点的权。
  • 结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积。
  • 树的带权路径长度:所有叶子结点的带权路径长度之和。如上图,图a:WPL=5×2+7×2+2×2+13×2=54;图bWPL:5×3+2×3+7×2+13×1=48。图b的代全路径长度较小,可以证明图b是huffman树(也称最优二叉树)
  • huffman树:给定n个权值作为n个叶子结点,构造一棵二叉树,若他的代全路径长度达到最小,则成这样的二叉树为最优二叉树,也称为huffman树。

huffman树的构建
给定n个权值 w 1 , w 2 , . . . , w n {w_1,w_2,...,w_n} w1,w2,...,wn作为二叉树的n个叶子结点,可通过以下算法构造一棵huffman树:
在这里插入图片描述
如果看起来比较吃力,先举例说明:
假设现在有“我”、“喜欢”、“观看”、“俄罗斯”、“足球”、“世界杯”六个词,其出现的次数(也即w)分别为15,8,6,5,3,1。过程如下:
在这里插入图片描述
初始化时,这6个词各单独构成一个树,然后将值最小的两棵树合并成一棵树(本图假设数值较小的放在右边,也可以放在左边),如此还剩下5棵树,再将这5棵树排序,取最小的两棵树合并。如此循环。
huffman编码:简单来讲就是huffman树除根结点外,其余每个结点标记为0或者1,假设我们将数值较小的标记为0,且位于右边,则如下图所示:
在这里插入图片描述
由此,可以得到“我”、“喜欢”、“观看”、“俄罗斯”、“足球”、“世界杯”这六个词的huffman编码分别为0,111,110,101,1001,1000
huffman编码既满足了前缀编码的条件,又保证了报文编码总长度最短。

5.3.2 hierarchical softmax模型结构及损失函数求解

根据第三章介绍的模型结构和第四章的损失函数,可以发现计算量很大。为了解决计算量大的问题,提出了hierarchical softmax,其改变了输出层的结构,损失函数也得到相应改变,现以cbow举例。
在hierarchical softmax训练时,cbow的模型结构转变为:
在这里插入图片描述
截图中的|C|即词典大小|V|,输出层就是一颗huffman树
首先,定义一些变量,如下图所示:
在这里插入图片描述
现假设,以“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这个样本(这句话,同时也是语料库的词典)为例,这六个词的count分别为15,8,6,5,3,1。假设我们要计算足球这个词出现的概率,如下图所示:

在这里插入图片描述
图中正例和负例概率应用的是sigmoid函数,正例概率加负例概率为1。图中编码为0的结点记为正例。 x w T x_w^T xwT就是所有背景词初始化向量之和(投影层后), θ \theta θ就是回归模型中的参数 ω \omega ω
要计算足球出现的概率,需要从根结点按照红线部分走。每走一个结点,就需要根据 x w T x_w^T xwT ω \omega ω以及sigmoid函数计算概率,最后将每一步的概率相乘,即得到足球出现的概率。
既然能够计算 P ( 足 球 ∣ C o n t e x ( 足 球 ) ) P(足球|Contex(足球)) P(Contex())的概率,那么也可以计算 P ( 我 ∣ C o n t e x ( 我 ) ) P(我|Contex(我)) P(Contex()) P ( 喜 欢 ∣ C o n t e x ( 喜 欢 ) ) P(喜欢|Contex(喜欢)) P(Contex()) P ( 观 看 ∣ C o n t e x ( 观 看 ) ) P(观看|Contex(观看)) P(Contex()) P ( 巴 西 ∣ C o n t e x ( 巴 西 ) ) P(巴西|Contex(巴西)) P(西Contex(西)) P ( 世 界 别 杯 ∣ C o n t e x ( 世 界 杯 ) ) P(世界别杯|Contex(世界杯)) P(Contex()),这里的p(i|Contex(i))就是第四章中的
P ( ω c ∣ ω o 1 , . . . , ω o 2 m ) P(\omega_c|\omega_{o1},...,\omega_{o2m}) P(ωcωo1,...,ωo2m)
因此损失函数变为:
在这里插入图片描述
对上述损失函数利用梯度上升求偏导,为下图:
在这里插入图片描述
word2vec需要对参数 θ \theta θ和词向量都进行更新。但是对词向量进行更新时,是更新投影层之后的求和向量。那么对于单个词如何更新参数呢?将整体的更新应用到每个词向量上,下图中 v ( ω ) v(\omega) v(ω)表示每一个词向量
在这里插入图片描述
可以看到,该方法下,损失函数及其更新仍然需要求和,但是这个求和只需要遍历结点的个数,而不是整个词典。结点个数相较于整个词典要小很多。
由于刚才的例子,语料库只有一句话,因此huffman树的结构就是上图所示,但是,我们语料库一般都是有很多句话的,词典大小远不止上述6个词,此时huffman树是将整个词典根据出现的次数排序,然后构建。因此,对于一个语料库,huffman树只需要构建一棵,而不是每棵树都构建一个huffman树。
上述讲的是cbow应用hierarchical softmax。skip gram的应用也是类似的,在此不再赘述。

5.4 负采样negative sampling优化方法

上一小节利用huffmna树,构造了好几个二分类,假设语料库非常大,对于一些不常见的词,会排到很下面,此时,计算复杂度还是很高的。因此,又提出了负采样的方法。
负采样的应用也是针对输出层的。假如我们有一句话“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”,在这个样本中,我们需要计算:已知上下文分别求“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”的概率。假如我们现在要预测巴西的概率(一个样本中的子样本),m=2,那么输入为“喜欢”、“观看”、“足球”、“世界杯”,至于输出,我们想要预测成“巴西”,因此在one-hot中“巴西”那一列为1,其他列(其余单词,也即negative words)为0。negative sampling 的想法很直接 ,将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。论文中作者指出指出对于小规模数据集,建议选择 5-20 个 negative words,对于大规模数据集选择 2-5个 negative words.
那么如何选择负样本呢?
在这里插入图片描述
负样本选出来了(选择出的负样本有点类似huffman需要走多少个分支),那么条件概率为什么?如下图:
在这里插入图片描述
其中NEG就是negative的缩写,表示预测成非 ω \omega ω
其中 p ( u ∣ C o n t e x t ( ω ) ) p(u|Context(\omega)) p(uContext(ω))为:
在这里插入图片描述

现以cbow为例介绍负采样的损失函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
word2vec参考链接:
https://blog.csdn.net/herosunly/article/details/105752803
该链接包含了理论和代码,尤其代码值得一看

猜你喜欢

转载自blog.csdn.net/weixin_43178406/article/details/105702262
今日推荐