CBOW模型(连续词袋模型)与Skip-Gram模型基本原理

目录

  • CBOW模型与Skip-Gram模型基本原理
    • 一、前言
    • 二、 CBOW模型
      • 1.语义的提取
      • 2.建模前的分析
      • 3.具体形式
    • 三、Skip-Gram模型
    • 四、模型的结构图
    • 五、结论

CBOW模型与Skip-Gram模型基本原理

  NLP(自然语言处理)是AI中十分具有吸引力和挑战性的领域,本文是我学习过CBOW模型和Skip-Gram模型后整理的一篇笔记。阅读本文需要事先了解one-hot表示方法和词嵌入的概念(正文部分也会简要提及,影响并不大)。

一、前言

  传统的NLP方法,如HMM(隐马尔科夫模型)、CRF(条件随机场)、最大熵模型(MEM)等概率图模型都把文本看做一个有限状态机进行研究,因而无须对词汇进行量化处理。
  随着深度神经网络的广泛应用,越来越多的研究者将关注点转向NLP与深度学习方法的结合。而面临的第一个问题就是如何将自然语言中使用的一系列字符转化为神经网络输入层所需的向量。one-hot表示法提出了一种简单编码的思路,对于一个大小为N的词典(包含了自然语言中所需要的字符和词汇),其中的每一个字符映射为一个 N × 1 N\times1 N×1的稀疏向量 v v v,假设该字符在词表中的位置为 i i i,则 v v v的第 i i i个元素为1,其余元素为0。
  one-hot表示法面临以下两个问题,

  1. 词表中的每个词向量相互正交。然而在实际的语言使用中,词汇之间是有语义相似性的(例如:good, excellent),one-hot表示法无法体现这样的语义关系;
  2. 内存开销庞大,计算复杂度高。需要说明的是,如果采用稀疏矩阵的表示方法(常用的有三元组法表示)词向量的存储并不会占据过多内存,而建立训练用的神经网络需要存储过多的训练参数,这个开销较大,另外在进行卷积层运算和优化算法时时间复杂度和空间复杂度较高。

  从上面两个致命缺陷来看,似乎one-hot表示法一无是处,是否应该摒弃它并重新探索出一种新的表示法呢?基于one-hot模型做一些改进也许更为有效。这样的改进需要完成两个目的,一是使得新的词向量具备一定的语义相似性,二是减小内存存储。语义相似性在数学上并没有直观的定义,但我们可以假设两个词向量之间的线性相关性越高,相似性越强,减小内存的最直接思路就是减小词向量的维度。于是接下来的任务就明确起来,

  1. 利用现存的文本信息,赋予one-hot向量语义信息;
  2. 将one-hot向量投影到更低维度的空间;

  CBOW(连续词袋模型)和Ship-Gram模型分别以两种相对的思路解决了上述两个问题。

二、 CBOW模型

1.语义的提取

  语义信息可以通过两种方式获得,一种是规则,例如单词"a"后面一般接名词;另一种是经验,所谓经验,即从大量的自由文本中获得,神经网络是一种基于经验的方法。那么如何在大量的文本中定义语义信息的形式呢?语言这种信息通常以字符的时间序列表示。这类似于语音或者音乐(音符的时间序列)的传递方式。语义的产生是由于字符本身的指代以及字符的排列组合。我们已有的词表编码了每个字符,而字符的组合则需要从大量的文本中获取。有了上面的理解,语义的相似性就可以理解成字符所在序列的相似性。例如下面两句话

  1. I like watching films.
  2. I enjoy reading.

上面两句话中的like和enjoy用的语境相似。也就是说,表达某一个词的语义,可以用它附近的词(one-hot向量)进行表示,拿上面的举例,(I, watching, films)就某种意义上说明了like的语义。这里,我有一个疑问,就是如何辨别反义词的语义?例如"I hate reading"中的hate与enjoy的语境相同,但是却有着截然相反的含义
  无论如何,利用这样的思路可以从文本中获取大量的语义信息,并且我们可以自由的选择语义窗的大小。

2.建模前的分析

  在正式给出CBOW模型的具体形式前,我仍然想做一些思考并在适当的时候引入一些符号。在语义提取部分已经知道了如何去表示一个词的语义,即给出该词作为中心词时语义窗中其他词汇的one-hot向量,我们引入一些符号,假设语义窗的大小为 2 m 2m 2m,中心词的one-hot向量记作 x c ∈ R N × 1 x_{c} \in \mathbb{R}^{N\times 1} xcRN×1,则它的语义窗记作矩阵(或向量组)
X c = ( x c − m , x c − m + 1 , … , x c − 1 , x c + 1 , … , x c + m ) X_{c}=(x_{c-m},x_{c-m+1},\dots,x_{c-1},x_{c+1},\dots,x_{c+m}) Xc=(xcm,xcm+1,,xc1,xc+1,,xc+m)
  有了语义信息,接下来就是对 X c \bold{X}_{c} Xc进行编码(encoding)来表示中心词 x c x_{c} xc,即构造一个编码器 f ( ⋅ ) \bold{f}(·) f(),使得
v c = f ( X c ) v_{c}=\bold{f}(X_{c}) vc=f(Xc)
   v c ∈ R D × 1 v_{c}\in \mathbb{R}^{D\times 1} vcRD×1( D < N DD<N)是一个比 x c x_{c} xc更低维度的向量, f \bold{f} f加粗是为了表示它是一个向量值函数,我们暂且不考虑编码器的具体形式,继续分析接下来的步骤,理论上讲我们构造了 f \bold{f} f的形式,也就实现了前言部分提及的两个目标,既融合了语义信息,也成功降低了维度。那么如何校验编码器的准确性呢?于是我们需要构造一个解码器 g ( ⋅ ) \bold{g}(·) g(),对 v c v_{c} vc进行解码,这里有两种校验方式,

  1. 解码器将 v c v_{c} vc解码为 x ^ c \hat{x}_{c} x^c,校验 x ^ c \hat{x}_{c} x^c x c x_{c} xc的误差;
  2. 解码器将 v c v_{c} vc解码为 X ^ c \hat{X}_{c} X^c,校验 X ^ c \hat{X}_{c} X^c X c X_{c} Xc的误差;

  上述1称为CBOW模型。OK,那么新的问题产生了,如何定义误差呢?有两种比较常用的思路,一是用 x ^ c \hat{x}_{c} x^c x c x_{c} xc的欧式距离表示;二是由于 x c x_{c} xc是一个one-hot向量,可以理解为多类的伯努利分布,因而可以采用交叉熵函数定义。在该问题下,思路二似乎更合理(我没有找到强有力的否定思路一的理由,欢迎评论)。
  根据上面的分析,CBOW的流程就很清晰了,即
X c → v c → x ^ c X_{c} \rightarrow v_{c} \rightarrow \hat{x}_{c} Xcvcx^c
数学模型如下,
v c = f ( X c ) x ^ c = s o f t m a x ( g ( v c ) ) \begin{aligned} v_{c} &= \bold{f}(X_{c}) \\ \hat{x}_{c}&= \bold{softmax}(\bold{g}(v_{c})) \end{aligned} vcx^c=f(Xc)=softmax(g(vc))
目标函数为
L = ∑ i = 1 N x c , i log ⁡ ( x ^ c , i ) L=\sum_{i=1}^{N}x_{c,i}\log(\hat{x}_{c,i}) L=i=1Nxc,ilog(x^c,i)

  上面的分析基于的是著名的噪声信道模型。从分类模型的角度分析,可以把 X c X_{c} Xc看做是词 x c x_{c} xc的语义特征, v c v_{c} vc是提取的抽象语义特征,然后基于该特征构建了一个判别模型对其分类。简单来说是训练了一个缺词填空的模型,给定上下文,确定中心词。我们最终需要的是提取出来的抽象特征 v c v_{c} vc

3.具体形式

  接下来的讨论就是如何设计编码器 f \bold{f} f和解码器 g \bold{g} g。不再赘述,给出CBOW模型中的解码器,先引入下面的符号
Z c = W X c = ( z 1 , … , z j , … , z 2 m ) , W ∈ R D × N Z_c=WX_{c}=(z_{1},\dots,z_{j},\dots,z_{2m}),W\in \mathbb{R}^{D\times N} Zc=WXc=(z1,,zj,,z2m),WRD×N
则,
v c = f ( X c ) = 1 2 m ∑ j = 1 2 m z j v_{c}=\bold{f}(X_{c})=\frac{1}{2m}\sum_{j=1}^{2m}z_{j} vc=f(Xc)=2m1j=12mzj
  接下来解码器相当于一个全连接层的作用,即
x c ′ = W g v c , W g ∈ R N × D x ^ c = s o f t m a x ( x c ′ ) x'_{c}=W_{g}v_{c},W_{g}\in \mathbb{R}^{N\times D}\\ \hat{x}_{c}=\bold{softmax}(x'_{c}) xc=Wgvc,WgRN×Dx^c=softmax(xc)
CBOW模型相当于构建了一个多层神经网络,对输入的语义窗进行训练,不同的是我们需要的是中间层信息,即 v c v_{c} vc。模型的结构图会在介绍完Skip-Gram模型后一起给出。

三、Skip-Gram模型

  Skip-Gram模型可以看做是CBOW模型的镜像,如果说CBOW是让计算机做缺词填空,那么Skip-Gram就类似于让计算机根据某一个词去想象它可能的语境,这样考虑,按我的理解,似乎Skip-Gram模型更加赋予挑战性,也更可能不精确。沿用之前的符号,这里直接给出具体数学模型,
v c = f ( x c ) = W f x c , W c ∈ R D × N z c , j = W g , j v c , j = 1 , … , 2 m y ^ c , j = s o f t m a x ( z c , j ) X ^ c = ( y ^ c , 1 , … , y ^ c , 2 m ) \begin{aligned} v_{c}&=\bold{f}(x_{c})=W_{f}x_{c},W_c\in\mathbb{R}^{D\times N}\\ z_{c,j}&=W_{g,j}v_{c} ,j=1,\dots,2m\\ \hat{y}_{c,j}&=\bold{softmax}(z_{c,j}) \\ \hat{X}_{c}&=(\hat{y}_{c,1},\dots,\hat{y}_{c,2m}) \end{aligned} vczc,jy^c,jX^c=f(xc)=Wfxc,WcRD×N=Wg,jvc,j=1,,2m=softmax(zc,j)=(y^c,1,,y^c,2m)
X c X_{c} Xc的列向量下标重新编号为 j = 1 , 2 , … , 2 m j=1,2,\dots,2m j=1,2,,2m
目标函数:
L = ∑ j = 1 2 m ∑ i = 1 N x j , i log ⁡ ( y j , i ) L=\sum_{j=1}^{2m}\sum_{i=1}^{N}x_{j,i}\log(y_{j,i}) L=j=12mi=1Nxj,ilog(yj,i)

四、模型的结构图

  下面给出模型的结构图,图来源于参考资料1.

CBOW模型(连续词袋模型)与Skip-Gram模型基本原理_第1张图片

五、结论

  这篇文章是我在学习CBOW模型和Skip-Gram模型后的一些思考和整理,篇幅有限,下一篇博客里,在基本概念的基础上应用python和PyTorch框架简单实现上述模型,模型运行完毕后,将词表中的词嵌入向量利用PCA(主成分分析)方法投影到二维空间做可视化,以获得更加直观的理解。

[参考资料]
[1]: https://www.jianshu.com/p/d2f0759d053c

你可能感兴趣的:(学习笔记)