修改密码

请输入密码
请输入密码 请输入8-64长度密码 和 email 地址不相同 至少包括数字、大写字母、小写字母、半角符号中的 3 个
请输入密码
提交

修改昵称

当前昵称:
提交

申请证书

证书详情

Please complete this required field.

  • Ultipa Graph V4

Standalone

Please complete this required field.

Please complete this required field.

服务器的MAC地址

Please complete this required field.

Please complete this required field.

取消
申请
ID
产品
状态
核数
申请天数
审批时间
过期时间
MAC地址
申请理由
审核信息
关闭
基础信息
  • 用户昵称:
  • 手机号:
  • 公司名称:
  • 公司邮箱:
  • 地区:
  • 语言:
修改密码
申请证书

当前未申请证书.

申请证书
Certificate Issued at Valid until Serial No. File
Serial No. Valid until File

Not having one? Apply now! >>>

ProductName CreateTime ID Price File
ProductName CreateTime ID Price File

No Invoice

搜索
    中文

      Skip-gram 模型

      Skip-gram(SG)模型是自然语言处理(NLP, Natural Language Processing)领域中用于创建词嵌入的重要方法。它也被用于图嵌入算法,如 Node2VecStruc2Vec,来生成节点嵌入。

      背景介绍

      Skip-gram 模型来源于 Word2Vec 算法。Word2Vec 将单词映射到一个向量空间,在这个向量空间中,语义相似的单词由距离接近的向量表示。Google 的 T. Mikolov 等人于 2013 年提出 Word2Vec。

      在图嵌入领域,一般认为是 2014 年提出的 DeepWalk 算法首次将 Skip-gram 模型应用于生成图中节点的向量表示。其核心概念是将节点视为“单词”,将随机游走生成的节点序列视为“句子”和“语料库”。

      后续提出的 Node2Vec、Struc2Vec 等图嵌入算法对 DeepWalk 进行了若干改进,但都仍使用 Skip-gram 模型。

      接下来,我们将使用 Skip-gram 原始应用的自然语言作为例子进行说明。

      模型概览

      Skip-gram 的基本模式是通过给定的一个目标词(Targat Word)预测出它的若干个上下文单词(Context Word)。如下图所示,单词 w(t) 被输入模型,然后模型生成与 w(t) 相关的四个上下文词汇:w(t-2)w(t-1)w(t+1)w(t+2)。在这里,符号 +/- 表示与目标词的前后上下文。生成的上下文单词数量可以根据需要进行调整。

      然而,很重要的一点是,Skip-gram 模型的最终目标并不是预测。它的真正任务是获得映射关系中的权重矩阵(在图中表示为 PROJECTION),该权重矩阵代表了单词的向量表示。

      语料库

      语料库(Corpus)是模型用来学习单词之间语义关系的句子或文本集合。

      假设一个语料库中的所有不同单词组成一个大小为 10 的词汇表(Vocabulary),这些单词分别是:graph、is、a、good、way、to、visualize、data、very、at。

      语料库中包含一系列若干这些单词构成的句子,其中一个是:

      Graph is a good way to visualize data.

      滑动窗口采样

      Skip-gram 模型采用滑动窗口采样(Sliding Window Sampling)技术来生成训练样本。这种方法使用一个“窗口”,依次将窗口的中心目标位置放在句子中的每个单词上。目标单词分别与它前后范围在 window_size 内的每个上下文单词组合在一起。

      以下是当 window_size=1 时抽样过程的示例:

      需要留意的是,当 window_size>1 时,所有落在窗口内的上下文单词,无论它们与目标单词的距离远近,其重要性没有区别。

      独热编码

      模型无法直接识别单词,因此必须将单词转换为机器可读的表示形式。

      对单词进行编码的一种常见方法是独热编码(One-hot Encoding)。在这种方法中,每个单词被表示为一个唯一的二进制向量,其中只有一个元素是“热”的(1),而其他所有元素都是“冷”的(0)。向量中 1 的位置对应于词汇表中单词的索引。

      以下是将独热编码应用于示例词汇表的结果:

      单词 独热编码向量
      graph 1000000000
      is 0100000000
      a 0010000000
      good 0001000000
      way 0000100000
      to 0000010000
      visualize 0000001000
      data 0000000100
      very 0000000010

      模型架构

      Skip-gram 模型的架构如上所示,其中:

      • 输入向量 xV×1 是目标单词的独热编码,V 是词汇表中的单词数。
      • WV×N 是输入层 → 隐藏层的权重矩阵,N 是单词嵌入的维度。
      • hN×1 是隐藏层向量。
      • WN×V 是隐藏层 → 输出层的权重矩阵。WW 不同,W 不是 W 的转置。
      • uV×1 是应用激活函数 Softmax 前的向量。
      • 每个输出向量 ycc=12...C)也被称为一个面板(Panel),C 个面板对应于目标单词的 C 个上下文单词。

      Softmax:激活函数 Softmax 能够将一个数值向量归一化为一个概率分布向量。转换后的向量中,所有分量的概率总和等于 1。Softmax 的公式如下:

      前向传播过程

      在我们的示例中,V = 10,设置 N = 2。先随机初始化权重矩阵 WW,如下所示。接着,我们将使用样本 (is, graph)、(is, a) 进行说明。

      输入层 → 隐藏层

      计算隐藏层向量 h

      由于 x 是一个仅有 xk=1 的独热编码向量,h 就对应于矩阵 W 的第 k 行。这个操作本质上是一个简单的查表(Lookup)过程:

      其中 vwI 是目标单词的输入向量(Input Vector)。

      事实上,矩阵 W 的每一行,表示为 vw,将被视为词汇表中每个单词的最终嵌入结果。

      隐藏层 → 输出层

      计算向量 u

      向量 u 的第 j 个分量等于向量 h 与矩阵 W 的第 j 列向量的转置的点积:

      其中,vwj 是词汇表中第 j 个单词的输出向量(Output Vector)。

      在 Skip-gram 模型的设计中,词汇表中的每个单词都有两种不同的表示:输入向量 vw 和输出向量 vw。输入向量代表单词作为目标词时的表示,而输出向量则代表单词作为上下文词时的表示。

      在计算过程中,uj 本质上是目标单词的输入向量 vwI 与词汇表中第 j 个单词的输出向量 vwj 的点积。Skip-gram 模型的设计原则之一是,两个向量越相似,它们的点积就越大。

      此外,值得强调的是,Skip-gram 最终只使用输入向量作为单词的嵌入表示。输入和输出向量的分离简化了计算过程,并且提高了模型训练的效率和准确性。

      计算输出面板 yc

      其中,yc,jyc 的第 j 个分量,表示考虑给定目标词时,预测得出词汇表中第 j 个单词的概率。显然,所有概率的总和为 1

      概率最高的 C 个词被视为预测的上下文词。在我们的示例中,C=2,预测的上下文词分别是 good 和 visualize。

      反向传播过程

      为了调整 WW 中的权重,使用 SGD 进行误差反向传播

      损失函数

      我们希望最大化 C 个真实的上下文单词的概率,即最大化这些概率的乘积:

      其中,jc* 是期望的第 c 个输出上下文单词的索引。

      由于在通常情况下,最小化的目标更为直观和易行,因此我们对上述目标进行一些转换:

      因此,Skip-gram 的损失函数 E 为:

      计算 E 相对于 uj 的偏导数:

      为了简化后续的表示,定义以下内容:

      其中,tc 是第 c 个期望输出上下文单词的独热编码向量。在我们的示例中,t1t2 是单词 graph 和 a 的独热编码向量,因此计算得到 e1e2 如下:

      因此,Euj 可以写成:

      带入示例中的数值进行计算:

      输出层 → 隐藏层

      调整矩阵 W 中的所有权重,这意味着所有单词的输出向量都会更新。

      计算 E 相对于 wij 的偏导数:

      根据学习率 η 调整 wij

      设置 η=0.4。举例来说,w14=0.86w24=0.67 被更新为:

      w14 = w14 - η ( e1,4 + e2,4 ) h1 = 0.86 - 0.4 × 0.314 × 0.65 = 0.78
      w24 = w24 - η ( e1,4 + e2,4 ) h2 = 0.67 - 0.4 × 0.314 × 0.87 = 0.56

      隐藏层 → 输入层

      只调整矩阵 W 中与目标单词输入向量相对应的权重。

      向量 h 是通过查找矩阵 W 的第 k 行获得的(假设 xk=1):

      计算 E 相对于 wki 的偏导数:

      根据学习率 η 调整 wki

      在我们的示例中,k 等于 2,因此 w21=0.65w22=0.87 被更新:

      E w21 = ( e1,1 + e2,1 ) w11 + ( e1,2 + e2,2 ) w12 + ... + ( e1,10 + e2,10 ) w1,10 = 0.283
      w21 = w21 - η E w21 = 0.65 - 0.4 × 0.283 = 0.54

      E w22 = ( e1,1 + e2,1 ) w21 + ( e1,2 + e2,2 ) w22 + ... + ( e1,10 + e2,10 ) w2,10 = 0.081
      w22 = w22 - η E w22 = 0.87 - 0.4 × 0.081 = 0.84

      优化计算效率

      我们已经探讨了 Skip-gram 模型的原始形式。然而,为了确保模型在实际应用中的计算复杂性保持可行和实用,必须加入一些优化措施。点击这里继续阅读。

      请完成以下信息后可下载此书
      *
      公司名称不能为空
      *
      公司邮箱必须填写
      *
      你的名字必须填写
      *
      你的电话必须填写
      *
      你的电话必须填写