skip-gram模型理解

主要内容

刚读完《Distributed Representations of Words and Phrases and their Compositionalit》打算写论文报告,因为和skip-gram关系比较深,所以再此用自己的理解介绍一下skip-gram模型。

如有错误,谢谢指正。


词嵌入(word embedding)

词嵌入技术顾名思义,就是把一堆词语映射(嵌入)到同一个空间中,不同的词处于不同位置,这些位置特征(向量)即词向量。通俗的说,词嵌入就是把不同的词转化成不同的向量。

one-hot向量

在word2vec被提出之前,人们常常用one-hot来表示词语的向量。

那么如何用onehot表示词语呢?

举个例子,假设我们的语料库中只有一条句子“今天天气真好”。接下来我们会根据语料库中词的种类来创建一个词库:{今,天,气,真,好},今的词向量就可以表示为[1,0,0,0,0],同时天的词向量就可以表示为[0,1,0,0,0]。

这种方法虽然可以用来表示词语,但是同时有很多缺点:

  • 无法准确表示词语之间的关系
  • 在语料库非常大时,词向量的维数会非常的高,并且非常稀疏(大部分为0)

因此人们为了能够寻找一种能够更好的体现词语之间的关系,提出了word2vec模型,让nlp技术进入了词嵌入的时代,为后面的研究打下了坚实的基础。

skip-gram

word2vec模型中,有skipgram和CBOW两种模型,两种模型结构分别如下图:

从上面的图中,我们可以直观的看出两种模型之间的区别,CBOW主要靠中心词的上下文来预测中心词,而skip-gram则依靠中心词来预测他的上下文。本文主要介绍skip-gram模型。


训练目标

skip-gram模型的训练目标:预测文本中某个字周围可能出现的词

我们在看一篇文章时,若是将一个词的周围几个词盖住让我们猜测,我们也能够大致的猜出被盖住部分原有的词语,因为文章中每个词语与其周围的词之间都是有关系的,也可以说,每个词都决定了和它相邻的词。skip-gram模型就是以此为动机来进行训练的。

为了完成上面的训练目标,skip-gram模型有一个长度为2c+1的滑动窗口(上图为5),这个窗口会在语料库中滑动,每滑动以此,被窗口包括在内的2c+1个词就会被用与模型的训练。窗口中心的词作为已知的词,而中心词前c个和后c个词则被盖住,我们需要通过已知的词来预测被盖住的词。我们不需要对文本做任何标记 ,也就是说这是一个非监督算法

举个例子:
此时在我们滑动窗口内的句子为“今天 的 天气 很 好
此时窗口长度为5,那么在窗口中心的词即“天气”,我们希望机器能够通过“天气”来预测“今天,的,很,好”这四个词语(称为背景词)。机器只会用数据说话,所以它会将他的预测表示成条件概率形式: P ( 今 天 , 的 , 很 , 好 ∣ 天 气 ) P(今天,的,很,好|天气) P(,,,)
我们假设四个被预测的之间是相互独立的,那么公式可以变成: P ( 今 天 ∣ 天 气 ) P ( 的 ∣ 天 气 ) P ( 很 ∣ 天 气 ) P ( 好 ∣ 天 气 ) P(今天|天气)P(的|天气)P(很|天气)P(好|天气) P()P()P()P()
我们需要做的就是让这个概率尽可能的大。


优化目标

skip-gram模型的优化目标 ∑ t = 1 T ∑ − c ≤ j ≤ c , j ≠ 0 log ⁡ P ( w t + j ∣ w t ) \sum_{t=1}^{T}\sum\nolimits_{-c\le j\le c,j\ne 0}\log P(w_{t+j}|w_t) t=1Tcjc,j=0logP(wt+jwt)

这个式子即上面式子的归纳,T为文本长度,c为上下窗口大小。
还是拿上面那句话来举例,假设我们的整个语料库为:“今天 的 天气 很 好
但是这次我们把上下窗口大小设为3(c=1),依次滑动窗口,并将各窗口的式子相乘,我们优化目标就变为了: m a x P ( 的 ∣ 今 天 ) P ( 今 天 ∣ 的 ) P ( 天 气 ∣ 的 ) P ( 的 ∣ 天 气 ) P ( 很 ∣ 天 气 ) P ( 天 气 ∣ 很 ) P ( 好 ∣ 很 ) P ( 很 ∣ 好 ) max P(的∣今天)P(今天∣的)P(天气∣的)P(的∣天气)P(很∣天气)P(天气∣很)P(好∣很)P(很∣好) maxP(P()P()P()P()P()P()P()
此式子经过整理后就可以变成: ∏ t = 1 T ∏ − c ≤ j ≤ c , j ≠ 0 P ( w t + j ∣ w t ) \prod_{t=1}^{T}\prod\nolimits_{-c\le j\le c,j\ne 0} P(w_{t+j}|w_t) t=1Tcjc,j=0P(wt+jwt)
由于概率的连乘会导致最终的乘积非常小,因此我们考虑对式子的每一项进行log处理,使得乘积变大的同时还不会改变其单调性。
处理之后,我们就可以得到一开始的优化目标。

接下来我们对式子的单项来进行讨论:
为了对其有更好的理解,我们将单式改为以下形式: P ( c ∣ w ; θ ) P(c|w;\theta) P(cw;θ)
c c c表示要预测的上下文词, w w w代表中心词, θ \theta θ代表模型参数,也可以理解成词向量,在预测词和中心词确定的情况下,概率由 θ \theta θ影响,我们优化也主要对它进行优化。

对于 θ \theta θ,我们可以这么理解:
它由两个矩阵u和v构成,u为上下文矩阵,v为中心词矩阵,两个矩阵的大小都为 ∣ V ∣ × n |V|\times n V×n,其中 ∣ V ∣ |V| V表示词库大小, n n n表示我们训练出来的词向量的维度。这两个矩阵,就是我们要训练的参数。在skip-gram中,每个词都被表示成两个d维向量分别保存在上下文矩阵和中心词矩阵中,在相应的时候取出来用。
在这里插入图片描述

假设我们的中心词为w,要预测的背景词为c,那么我们要求的给定中心词生成背景词的条件概率就可以表示成如下形式:
P ( c ∣ w ; θ ) = e u c ⋅ v w ∑ c ′ ∈ V e u c ′ ⋅ v w P(c|w;\theta)=\frac{e^{u_c\cdot v_w}}{\sum_{c'\in V}e^{u_{c'}\cdot v_w}} P(cw;θ)=cVeucvweucvw

  • u c u_c uc表示u矩阵第c行的向量, v w v_w vw则表示v矩阵的第w行向量,分别可以看做词c的上下文向量和词w的中心词向量。我们对这两个向量的内积做softmax运算就可以得到上式的条件概率。
  • c’表示除了当前上下文之外的词库中的词
  • 两个向量之间越相似,点乘的结果就越大,从而归一化之后得到的概率值也就越大,因此关系越紧密的词的向量会越相似

训练流程

大致的训练流程如下图所示:
在这里插入图片描述

  1. 首先,我们会用onehot向量表示中心词来作为输入,长度为V的一维向量。
  2. 接着我们会遇到一个大小为 V × n V\times n V×n的矩阵,也就是矩阵v(中心词矩阵)
  3. 将他们两相乘后我们可以得到一个n维的向量,这就是我们的隐藏层
  4. 接着我们会遇到一个大小为 V × n V\times n V×n的矩阵,但是这次是矩阵u(上下文矩阵)
  5. 将他们两相乘后我们可以得到一个V维向量,我们可以将这个向量看成V个数,对应词库中的V个词
  6. 对这V个数做softmax归一化处理,概率最大的那个词所对应的词即为模型所预测的词
  7. 若模型预测的词与上下文的词不符,我们会使用反向传播算法来修正权重向量W和W’。

训练流程(举例)

举一个比较极端的例子。这次假设我们的语料库中只有一句话:‘今天 下雨’,那么我们的词库大小V就为2。并且我们假设训练出来的词向量维度n为3(只为讲解,正式训练的向量一般取300维左右)。

  1. 在滑动窗口中的就只有两个词,我们先把今天作为中心词,对它进行one-hot编码,因为词库只有两个词,所以编码长度也只有2,为[1,0],将他作为输入。
  2. 接着我们会遇到大小为 2 × 3 2\times 3 2×3的中心词矩阵,假设矩阵目前为[[0.4,0.3,0.2],[0.3,0.2,0.1]],相乘之后得到的向量为[0.4,0.3,0.2],我们可以发现其实就是把矩阵第一行的向量取了出来,第一行也就对应着今天这个词
  3. 接着我们会遇到大小同为为 2 × 3 2\times 3 2×3的上下文矩阵,假设矩阵为[[5,4,3],[3,2,1]],将矩阵转置进行相乘之后我们得到的向量为[3.8, 2.0],这是一个2维向量,每一维对应着一个词,3.8对应今天,2.0则对应下雨
  4. 接着对两个词进行softmax归一化,得出每一个词的概率。
    P i = e x i ∑ j ∈ 词 库 e j P_i=\frac{e^{x_i}}{\sum_{j\in 词库}e^{j}} Pi=jejexi
    当词库巨大时,分母计算会极其花费时间
  5. 接着我们应该可以算出 P 今 天 > P 下 雨 P_{今天}>P_{下雨} P>P,所以机器预测在今天之后的单词还是今天,非常明显这是错误的,这时候我们就会利用反向传播算法来修正两个矩阵。
  6. 如果有更多的词,窗口继续往后移动一格,重复以上步骤。
  7. 在所有词语都训练了之后,我们就得到了每个词的两个词向量, v i v_i vi u i u_i ui,分别为i作为中心词时的向量和i作为上下文时的向量。我们一般采用中心词向量为词语的最终向量。

参数更新

skip-gram采用梯度下降法来更新参数

目标函数

这是我们上面提到的目标函数
∑ t = 1 T ∑ − c ≤ j ≤ c , j ≠ 0 log ⁡ P ( w t + j ∣ w t ) \sum_{t=1}^{T}\sum\nolimits_{-c\le j\le c,j\ne 0}\log P(w_{t+j}|w_t) t=1Tcjc,j=0logP(wt+jwt)
将softmax的计算结果带入我们可以得到如下结果:
a r g m a x ∑ w ∑ c [ u c ⋅ v w − log ⁡ ∑ c ′ e u c ⋅ v w ] argmax \sum_{w}\sum_{c}[u_c\cdot v_w-\log \sum_{c'}e^{u_c\cdot v_w}] argmaxwc[ucvwlogceucvw]
其中w为中心词,c为上下文,我们采用梯度下降法来更新参数从而最大化这个式子的值。

缺陷

对于目标函数中的 log ⁡ ∑ c ′ e u c ⋅ v w \log \sum_{c'}e^{u_c\cdot v_w} logceucvw项,其中的c’取值包括了整个词库,因此当词库非常大时,优化的所需的计算量非常大。因此我们需要对其进行优化。
《Distributed Representations of Words and Phrases and their Compositionalit》这篇论文中就提到了对于word2vec的优化方法。论文阅读报告我会另写一篇。点这里

  • 21
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值