修改密码

请输入密码
请输入密码 请输入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 模型训练的原始形式,建议读者请先阅读文档——Skip-gram 模型

      概述

      Skip-gram 模型的原始训练采用 Softmax 函数将一系列分数转化成为一个概率分布,其中用于归一化的分母的计算涉及到语料库中的所有单词(参考以下 Softmax 公式),因而计算代价非常昂贵。优化 Skip-gram 模型时,我们想避免这样计算 Softmax。

      另外,每次反向传播时:对于矩阵 W,只更新目标词输入向量 vw;而对于矩阵 W',所有单词的输出向量 v'w 都会更新,其中绝大多数单词与目标词和上下文词都没有关系。矩阵 W 和 W' 通常非常大,神经网络越大,需要的训练样本越多,梯度下降法也越慢。模型训练优化的一个方向就是限制单词输出向量更新的个数。

      实际上,原始 Skip-gram 模型的训练方式几乎无法应用到实际场景中。T. Mikoliv 等人在提出 Skip-gram 模型的同时提出几种优化方法:分层 Softmax(Hierarchical Softmax)、负采样(Negative Sampling)以及高频词二次采样(Subsampling of Frequent Words)。这些方法不仅能提高训练速度,还能提升嵌入向量的质量。本文将具体解释 Node2Vec 和 Struc2Vec 等图嵌入算法都采用的负采样技术和高频词二次采样。

      相关资料如下:

      负采样

      正样本和负样本

      自然语言处理领域中,如果两个单词是一对上下文词与目标词,就是正样本(Positive Sample),否则就是负样本(Negative Sample)。

      负采样

      负采样是一种采样方法,即采样得到一个训练样本(一个目标词和一个上下文词)作为正样本送入模型训练时,选择若干其他单词与目标词组合作为负样本。应用负采样后,Skip-gram 模型每次训练时只更新正样本和负样本单词的输出向量。

      在描述 Skip-gram 模型原始形式时,我们用到了包含 10 个单词的语料库:

      graph, is, a, good, way, to, visualize, data, very, at

      以及一个句子:

      Graph is a good way to visualize data.

      滑动窗口大小为 1 且目标词为 is 时,其中一个训练样本是 (is, a),这是一个正样本。通过从语料库中随机选择其他单词与目标词 is 组合即形成负样本,假设我们随机选择 3 个负样本如下:

      对于正样本,isContext 列为 1,代表这是一个目标词上下文词的组合;对于所有负样本,isContext 列均为 0,代表这些都不是目标词与上下文词的组合。值得留意的是,对于其中一个负样本 (is, graph),虽然 graph 的确在 is 的窗口范围内,但对于正样本 (is, a) 来说,它仍被视为一个负样本。

      关于负样本数量,T. Mikoliv 等人建议小数据集选择 5~20 个,大数据集选择 2~5 个。

      如何选取负样本

      选择负样本单词的基本原则是:在语料库所有句子中越常出现的词,被选择的概率就越高。然而,如果仅考虑词频,高频词会被过度选择,而低频词几乎不会被选择。为了平衡这一点,T. Mikoliv 等人根据经验提出取词频的 3/4 次方,即

      其中 wi 表示第 i 个单词,f(wi) 表示 wi 的词频,V 是语料库中不重复的单词总数,Pn(wi) 表示选取 wi 作为负样本的概率,下标 n 代表噪声(Noise),Pn 也称为噪声分布(Noise Distribution)。

      举个极端的例子,假设语料库只有两个单词,词频分别为 0.9 和 0.1,经过上述公式处理后,它们被选择的概率则变成 0.84 和 0.16。

      模型训练——负采样优化形式

      前向传播过程

      以训练样本 (is, a) 为例:

      从隐藏层到输出层,只有正样本单词 w0 与选择的 3 个负样本单词 w1、w2 和 w3 的输出向量参与计算。应用负采样技术时,Skip-gram 模型采用如下的 Softmax 函数:

      其中 h 是从矩阵 W 直接提取出来的目标词输入向量,v'wi 是来自矩阵 W' 的上下文词输出向量,ui = v'wih 表示两个向量的内积。从直观上理解,两个单词越相似,它们的向量内积(余弦距离)就越大,因而 yi → 1,反之 yi → 0。

      负采样中 Softmax 函数的形式非常像 Sigmoid 函数,但由于 v'wi 和 h 都是需要训练的参数,所以不能称之为 Sigmoid。

      损失函数

      原始 Skip-gram 模型的训练目标是输出目标词的上下文词,应用负采样技术后,模型的训练目标改变了——我们期望模型能区分出正样本与负样本。具体来说,正样本 w0 对应的模型输出为 1(代表“是”),其他负样本对应的模型输出为 0(代表“否”):

      因此,模型的训练目标是最大化 y0 和所有 1 - yi,假设选取 k 个负样本:

      其中 i=1,2,...,k。经过上述推导得出模型的损失函数 E 为:

      计算 E 对 u0 和 ui 的偏导数,并将结果定义为 e0 和 ei

      e0 和 ei 与 Skip-gram 的原始训练方式中的 ej 很类似,相当于用输出值减去期望的判断结果:

      反向传播过程

      推导出损失函数 E 以及 e0 和 ei 后,负采样 Skip-gram 模型的反向传播过程就很简单了。读者可参考 Skip-gram 模型的原始形式,唯一不同的是——更新输出层到隐藏层的矩阵 W' 时,只更新一个正样本和 k 个负样本单词对应的输出向量。

      高频词二次采样

      对于语料库来说,有些词出现地频率很高,比如 in、the、a 等词,这些高频词造成的问题有:

      • 高频词通常不能提供太多的语义信息,例如,man 和 handsom 同时出现时就比 man 和 the 同时出现时提供的语义信息要多。
      • 我们会得到很多包含高频词的训练样本,远超过为了训练这些词的词向量所需的样本数,实际上会进行大量不必要的计算。

      因此,T. Mikolov 等人提出在采样过程中以一定的概率丢弃单词,且词频越高的单词被丢弃的概率越大。例如,丢弃例句“Graph is a good way to visualize data.”中的单词 a 后,这个句子的采样结果不会包含以 a 为目标词或上下文词的训练样本。具体来说,一个单词被丢弃的概率为:

      其中 wi 表示第 i 个单词,f(wi) 表示 wi 的词频,t 是设定的阈值,通常在 10-5 左右。取 t = 0.006 时,假设单词 a 在语料库中的词频为 0.03(没错,0.03 是一个很高的词频),则 a 被丢弃的概率为 0.817;当一个单词的词频小于等于 t 时,该单词则绝对不会被丢弃。

      注意,二次采样是在滑动窗口采样过程中进行的,不要与负采样混淆。

      对应到图上,高频词就相当于有很多邻居的超级节点。一个节点的邻居越多,能为每个邻居节点提供的信息就越少。例如,在社交网络中,用户 A 有 10000 个好友,用户 B 只有 10 个好友,对于他们的共同好友 C 来说,与用户 B 的好友关系更具价值。

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