修改密码

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

修改昵称

当前昵称:
提交

??certificate-table.title_zh_CN??

??certificate-table.name_zh_CN?? ??certificate-table.issued-at_zh_CN?? ??certificate-table.valid-until_zh_CN?? ??certificate-table.serial_zh_CN?? ??certificate-table.actions_zh_CN??
??certificate-table.serial_zh_CN?? ??certificate-table.valid-until_zh_CN?? ??certificate-table.actions_zh_CN??

??certificate-table.no-data.p1_zh_CN?? ??certificate-table.no-data.p2_zh_CN??

??invoice-table.title_zh_CN??

??invoice-table.name_zh_CN?? ??invoice-table.create-time_zh_CN?? ??invoice-table.id_zh_CN?? ??invoice-table.price_zh_CN?? ??invoice-table.actions_zh_CN??
??invoice-table.name_zh_CN?? ??invoice-table.create-time_zh_CN?? ??invoice-table.id_zh_CN?? ??invoice-table.price_zh_CN?? ??invoice-table.actions_zh_CN??
v4.3
搜索
    中文EN
    v4.3

      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 模型的原始形式。然而,为了确保模型在实际应用中的计算复杂性保持可行和实用,必须加入一些优化措施。点击这里继续阅读。

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