摘要
最近引入的连续Skip-gram模型是学习可以高质量分布式向量表示的有效方法,而这种分布式向量表示可以刻画大量精确的句法和语义关系。本文我们介绍了Skip-gram模型的多种扩展,它们可以提升向量的质量和训练速度。通过对频繁词进行重复采样我们可以极大地提升学习速度,学习到更有规律的单词表示。我们还描述了一种分层softmax的简单代替方案称作负抽样。
单词表示的内在局限是它们对单词顺序的无差异化以及不能表示惯用短语。例如,在单词表示中,难以简单地将“Canada”和“Air”结合得到“Air Canada”。受此例所激发,我们给出了一种找到文本中的短语的简单方法,并且表明为百万级的短语学习到好的向量表示是可能的。
引言
在自然语言处理任务中,向量空间中单词的分布式表示通过对相似的词分类可以帮助学习算法取得更好的效果。单词表示的最早使用可以追溯到1986年[Rumelhart, Hinton and Williams]。此后该思想便被应用于统计语言模型中,获得了极大的成功。后续的工作包括将其应用到自动语音辨识,机器翻译以及大量的自然语言处理任务中。
最近,Mikolov等人引入了Skip-gram模型[8],这是一种从大量分结构化的文本数据中学习高质量的向量表示的有效方法。与之前大量使用的用神经网络结构学习单词向量的架构不同,训练Skip-gram模型(如图1)不涉及密集的矩阵乘法。这就使得训练非常有效:经过优化的单机训练可以在一天训练1000亿个单词。
使用神经网络计算得到的单词表示非常有趣,因为学习到的向量可以显式编码很多语言规律和模式。有点惊人的是,很多这些模式可以表示成linear translations(线性变换)。例如,
vec(‘‘Madrid")−vec(‘‘Spain")+vec(‘‘France")
的向量计算比任何词向量都更接近于
‘‘vec("Paris")
。
本文我们给出了原始Skip-gram模型的若干扩展。我们的研究表明在模型训练时对频繁词进行子抽样可以极大提升训练速度(2-10倍),并且提升了欠频繁词的表示精度。此外,我们介绍了用Noise Contrastive Estimation(噪音对比估计)的简单变体来训练Skip-gram模型,实验表明我们的方法相比于之前工作中使用的更加复杂的分层softmax方法,可以得到更好的频繁词的向量表示,训练速度更快。
单词表示受限于它们不能表示惯用语,惯用语不是单个词的简单组合。例如波士顿环球报是一家报纸,但它不是波士顿和环球两个单词组合在一起的意思。因此,使用向量来表示整个短语使得Skip-gram模型更具有表达力。其它的通过构成词向量来表示句子意思的技术也可以受益于短语向量而不是词向量。
将基于词的模型扩展到基于短语的模型相当简单。首先我们使用数据驱动的方法识别大量的短语,然后在训练阶段我们将短语视作单个符号。为了评价短语向量的质量,我们生成了包含单词和短语的类比推理任务的测试集。我们测试集中一个典型的类比对是蒙特利尔:蒙特利尔加拿大人队,多伦多:多伦多枫叶队(二者都是北美冰球联盟的俱乐部)。因此如果vec(Montreal Canadiens)-vec(Montreal)+vec(Toronto)的最近表示为vec(Toronto Maple Leafs),那么我们就认为是一个正确的短语表示。
Skip-gram模型
Skip-gram模型的训练目标是发现可以用于预测句子或者文档中附近的词(surrounding words)的单词表示。更正式地讲,给定一个训练词
w1,w2,w3,⋯,wT
序列,Skip-gram模型的目标是最大化平均对数概率
其中c是训练环境的规模(可以是中心词center word wt 的函数)。大c会得到更多的训练样本从而能得到更高的精度,当然也会有着更多的训练时间。基本的Skip-gram模型使用下面的softmax函数定义 p(wt+j|wt) :
其中 vw 和 v′w 是w的输入和输出的向量表示,W是词典中的单词个数。这种方式不太实际,因为计算 ∇logp(wO|wI) 正比于W,而W通常非常大( 105−107 )。
分层Softmax
完全softmax的有效近似计算是分层Softmax。在神经网络语言模型环境中,首先由Morin和Bengio引入。主要优势在于在神经网络中不需要评估W个输出节点而是
log2(W)
个节点来得到概率分布。
分层Softmax使用一种输出层的二元树表示(有W个词)作为它的叶子节点,而且对于每个节点,显式地表示它的子节点的相关概率。这些定义了一个将概率分配到单词的随机游走模型。
更精确的是,我们可以通过一个从树根的合适路径到达每个单词
w
。令
其中 σ(x)=1/(1+exp(−x)) 。可以证明 ∑Ww=1p(w|wI)=1 。这表明计算 logp(wO|wI) 和 ∇logp(wO|wI) 的成本正比于 L(wO) ,一般来说不大于 logW 。此外,不像标准的softmax形式化的Skip-gram对每个单词 w 分配两个表示
分层softmax使用的树结构对结果又很大影响。Mnih和Hinton探究了很多方法来构建树结构及其对训练时间和模型精度的影响。在我们的工作中,我们用了一个二元Huffman树,由于它对频繁词分配了短代码,因而可以得到更快的训练速度。之前有观测发现,按照频率将单词分组可以加速基于语言模型的神经网络的训练速度。
负抽样
一种对分层Softmax的替代方案是Noise Contrastive Estimation(NCE),这种方法由Gutmann和Hyvarimen引入,并被Mnih和Teh应用于语言模型中。NCE指出一个好的模型应该可以通过逻辑回归从噪音中区分数据。这类似于Collobert和Weston使用的Hinge loss,他们在训练模型时将数据排在噪音前面。
尽管NCE可以近似最大化softmax的对数概率,但是Skip-gram模型只关心学习到高质量的向量表示,所以我们可以任意地简化NCE只要向量表示可以保持它们的质量。我们用下面的目标函数来定义负抽样(NEG):
该目标函数用来替换Skip-gram目标函数中的每个 logP(wO|wI) 。因此任务就是利用逻辑回归从噪音分布 Pn(w) 抽取的分布中区分目标词 wO ,对每个数据样本有 k 个负样本。我们的实验表明对于小的训练数据集
NCE和NEG都将噪音分布
频繁词的子抽样
在非常大的语料库中,最频繁的词可能会出现上亿次(如in,the,a等)。这类词相比于那些较少出现的词通常提供较少的信息。例如,尽管Skip-gram模型可以从法国和巴黎的共现中发现模式,但是从同样频繁出现的法国和the中得到较少的信息,因为几乎每个词都会与the共现。这一思想也可反向应用:即频繁词(in, the, a)的向量表示在经过几百万个样本的训练后也不会有明显变化。
为了考虑稀有词和频繁词的不平衡性,我们用一种简单的子抽样方法:训练集中的每个单词被丢弃概率的计算公式如下:
其中 f(wi) 是单词 wi 的频率, t 是一个选择的阈值,通常为
实验结果
本节我们验证了分层Softmax(HS),NCE,负抽样和训练词的子抽样方法。我们使用Mikolov等人[8]引入的类比推理任务。该任务由下面的类比如:“德国”:“柏林”::“法国”:?组成,通过求一个向量
x
使得
为了训练Skip-gram模型,我们使用了由多个新闻文章组成的大型数据集(有10亿单词的谷歌内部数据)。我们去除了训练数据中出现次数不超过5次的单词,得到的词典的规模为692K(也就是词典中有接近70万个单词)。多个Skip-gram模型在单词类比测试集上的效果如表1所示。该表显示:在类比推理任务中负抽样优于分层Softmax方法,甚至略微胜于NCE方法。对频繁词的子抽样提升了训练速度,使得单词表示更加精确。