首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文了解Word2vec之Skip-Gram训练网络的3种技术

上一篇斯坦福大学NLP-cs224课程笔记2:词向量介绍了 Word2vec 模型的基本思想,得到目标函数,给定中心词求上下文概率,最后还说到用 negative sampling 方法优化目标函数,常见的 Word2vec的两种形式:Skip-Gram,CBOW模型。

鉴于上篇主要从理论角度,这一篇将从训练角度,更多关于 Word2vec 之 Skip-Gram 模型的训练,Skip-Gram会按照文本窗的方式将原文本组合为神经网络需要的训练样本,如果原始文本为The quick brown fox jumps over the laze dog,如果设置 window 的 fixed-size 为 2,那么可以得到如下所示的训练样本:

Word2vec 网络结构

我们拥有1万个单词的vocabulary,如果想嵌入300维的词向量,那么我们的输入-隐层权重矩阵和隐层-输出层的权重矩阵都会有 10000 x 300 =300万个权重参数。

如上所示,输入层为 one-hot 编码的词向量,隐含层为要嵌入的300个神经元,输出层为 softmax 分类器,神经元个数为 1万个,在 Skip-Gram 模型中为输入的中心词的上下文的概率,如输入词对 ( ants, abandon)训练后,开始调整权重参数,使得尽可能在输出层对应 abandon的概率高。

O(n)

训练一个神经网络意味着要输入训练样本并且不断调整神经元的权重,从而不断提高对目标的准确预测。每当神经网络经过一个训练样本的训练,它的权重就会进行一次调整。

以上模型训练过程中,我们需要大量的训练数据来调整 300 万个权重参数,同时还要避免出现神经网络的通病:过拟合。

所有的权重参数都需要通过我们数以亿计的训练样本来进行调整,这是非常消耗计算资源的,并且实际中训练起来会非常慢。为此 google 的 Word2vec 作者在后面的论文中提出了降低时间复杂度的 3 种方法。

降低O(n)

下面详细介绍这 3 种降低时间复杂度的方法。

Word pairs 看成一个 word

一些单词组合的含义如果拆开后和原来具有完全不同的意义,那么这种词组应该看成一个词。比如 “New York” ,“United Stated” 等拆开后表达不出原来的意思。

在Google发布的模型中,它本身的训练样本中有来自 Google News 数据集中的1000亿的单词,但是除了单个单词以外,单词组合有3百万之多。

高频词抽样

英语中的高频单词比如 the,根据 Skip-Gram 模型,the 会被选择为中心词和上下文词,下面分别讨论这两种情况。

当 the 选择为中心词时,组成训练的词对中将会出现大量的 (”the“,...) 这样的训练样本,而这些样本数量远远超过了学习 the 这个词向量所需的训练样本数。

当 the 被选为上下文词时,比如词对 ("fox", "the") 这样的训练样本,并不会给我们提供关于 “fox” 更多的语义信息。

因此,类似于 the 这种高频单词,如果我们选择它的概率降到很小或删除,会带来什么好处呢? 训练样本很减少,同时不会对词向量的生成质量造成影响。

如果用 ωi 表示一个单词,Z(ωi) 是 ωi 这个单词在所有语料中出现的频次,这个单词被保留下来参与训练的概率图为如下:

可以看出单词出现的频次越高,被选中的概率越小。

negative sampling

因为 negative sampling 是降低时间复杂度的另一个非常重要的技术,因此单独拿出来说一下,它是用来提高训练速度并且改善所得到词向量的质量的一种关键方法。

不采用这种技术前,原本每个训练样本需要更新所有的权重参数,negative sampling每次让一个训练样本仅仅更新一小部分的权重参数,从而降低梯度下降过程中的计算量。

如果 vocabulary 大小为1万时,当输入样本 ( "fox", "quick") 到神经网络时,“ fox”经过 one-hot 编码,在输出层我们期望对应 “quick” 单词的那个神经元结点输出 1,其余 9999 个都应该输出 0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们为negative word.negative sampling 的想法也很直接,将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。

在论文中作者指出指出对于小规模数据集,建议选择 5-20 个 negative words,对于大规模数据集选择 2-5个 negative words.

如果使用了 negative sampling 仅仅去更新positive word- “quick” 和选择的其他 10 个negative words 的结点对应的权重,共计 11 个输出神经元,相当于每次只更新 300 x 11 = 3300 个权重参数。对于 3百万 的权重来说,相当于只计算了千分之一的权重,这样计算效率就大幅度提高。

选择 negative words

使用 一元模型分布 (unigram distribution) 来选择 negative words,一个单词被选作 negative sample 的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words,经验公式为:

U(w) 代表每个单词被赋予的一个权重,即它单词出现的频次,分母 Z 代表所有单词的权重和。

公式中开3/4的根号完全是基于经验的,论文中提到这个公式的效果要比其它公式更加出色。

总结

总结了实际训练过程中,降低训练的时间复杂度的3中技术:

将常见的单词组合word pairs或者词组作为单个word来处理。

对高频次单词进行 sampling来减少训练样本的个数。

对优化目标采用negative sampling方法,对每个训练样本的训练只会更新一很小部分的权重参数,从而降低计算负担。

接下来,在 Tensorflow 中实现 Skip-Gram 模型。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180401G12H6D00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券