经典论文阅读-2:CBOW & SkipGram

42 阅读14分钟

高效评估向量空间单词表示

论文地址:[1301.3781] Efficient Estimation of Word Representations in Vector Space (arxiv.org)

摘要

我们提出了两个新的模型体系,可用于计算大规模数据集中单词的连续向量表示。

基于单词相似度任务,通过比较该方法与之前效果最好的神经网络方法,评估所得词向量质量。

根据对比结果,本文提出的方法具有更低的计算耗时和更高的准确度。在 16 亿单词数据集上训练高质量词向量的耗时比之前的方法少一天。

此外,我们将展示该方法所得词向量在测试单词语法、语义相似度任务上的优秀性能。

简介

当前许多 NLP 系统与技术将单词视为独立单元,就像词典里的各项元素,而不注意单词之间的相似性。

这种的原因包括方法简单、效果稳定、基于大数据训练的简单模型效果优于小数据训练的复杂模型的事实。

该技术的一个实例是 N-gram 模型,如今 N-gram 模型可基于任何可用数据训练。

然而,简单技术在许多任务上具有各自的限制。

例如,在自动语音识别任务里,所得领域内相关数据数量有限,识别性能通常由高质量转录语音数据的数量决定。

在机器翻译任务里,许多语言的现存语料库只包含十亿左右单词,或者更少。

因此,出现了简单模型在更大语料规模下,所得效果没有显著提升的现象。

如今我们必须发掘更先进的技术。

随着近几年机器学习技术的发展,我们能够在更大数据集上训练更复杂的模型,并且这些模型效果比简单模型性能更好。

可能上述模型里最成功的概念是使用单词的分布式表示。例如,基于语言模型的神经网络性能显著优于 N-gram 模型。

本文目的

本文的目的是提出一种新技术,可以用于在大规模数据集上学习高质量词向量的技术,通常数据集超过数百万、数十亿单词。

已知,之前提出的所有技术都不能顺利地在超过数百万单词的数据集上训练出维度在 50-100 之间的词向量。

我们使用最新提出的技术来度量所得词向量的质量,期望相似单词在向量空间中距离更近。

然而同一个单词可以具有多种相似性度量维度。该情况可在屈折语上下文中观察到,例如,同一个名次可以有多个词嵌入。

如果我们在原始向量空间的子空间中搜索相似单词,可能找到多个单词。

令人惊奇的是,词向量的相似性远超句法规律。使用单词偏移量技术对单词表示进行简单编织运算,所得结果与目标单词的词向量非常相似,例如

vector('King') - vector('Man') + vector('Woman')

vector('Queen')

本文尝试最大化词向量运算的准确性,通过开发一种新模型架构来保留单词之间的线性规律。

我们设计一种新的理解测试集来度量句法和语义的规律,并通过该测试,展示新算法在这些规则上的更高准确度。

我们也讨论了训练时间与模型准确度对于词向量维度与训练数据的依赖程度。

之前的相关研究

将单词表示为连续的向量由来已久[10, 26, 8]。

Y. Bengio 等人提出了一种非常流行的神经网络语言模型(NNLM)架构[1],该模型使用一个线性映射层和一个非线性隐藏层来同时学习词向量和统计语言模型。该方法思路被许多人借鉴学习。

另一种有趣的 NNLM 架构来自[13, 14],该架构首先使用带有一个隐藏层的神经网络来学习词向量,该词向量然后被用来训练 NNLM。因此,在 NNLM 构建之前词向量就被训练好了。本文参考该架构,并对其进行扩展,重点对第一步中词向量学习过程进行优化。

下文将展示词向量在许多 NLP 应用中如何显著提升效果和简化计算的[4, 5, 29]。

当前有许多通过各种语料和模型架构训练的词向量,可被用来进一步研究与比较[4, 29, 23, 19, 9]

然而,目前为止这些架构在训练时的计算耗时都明显高于文献 [12] 中提出的方法,该方法使用了对角权重矩阵和对数双线性模型的特定版本。

模型架构

目前已有许多不同类型的模型来估计单词的连续表示,包括著名的 Latent Semantic Analysis (LSA) 和 Latent Dirichlet Allocation (LDA)。

本文中,我们重点在通过神经网络学习单词的分布式表示,如之前所述,这种表示方法可以保留单词之间的线性规律[20, 31],效果明显优于 LSA 方法,而且在大规模数据集上的计算耗时优于 LDA 方法。

和文献 [18] 相似,为了比较不同模型,我们首先定义了模型的计算复杂度,作为训练该模型的参数。然后,我们尝试最大化准确率和最小化计算耗时。

对于所有的模型,训练复杂度大约为 O = E x T x Q

其中 E 是训练的 epoch 数,T 是训练集中单词数,Q 是各模型定义的数。通常,在 3-50 之间选择 E 的值,T 最多为 10 亿。

所有的模型通过随机梯度下降和反向传播训练。

前向神经网络语言模型(NNLM)

概率前向神经网络语言模型由文献 [1] 提出,该模型由一个输入层、一个映射层、一个隐藏层、一个输出层构成。

在输入层,N 个单词被编码为最大为 V 的序号,而 V 是词汇表大小。映射层 P 的维度是 N x D,使用该维度的映射矩阵。

NNLM 模型的计算在映射层和隐藏层变得复杂,这是因为映射层的值分布密集。

通常将 N 设置为 10,映射层的大小 D 设置为 500-2000,隐藏层的大小 H 设置为 500-1000。

由于隐藏层被用于计算词汇表中各单词的概率分布,这导致输出层维度为 V

因此每批训练样本的计算复杂度为 Q = N x D + N x D x H + H x V,决定项为 H x V

然而一些实际解决方案并不使用该模型,这些方案或者使用 softmax[25, 23, 18] 的层次版本,或者使用不归一化输出的模型[4, 9]。

将词汇表用二叉树表示,输出单元的数量将减少至 log(V),计算复杂度由此变为 N x D x H

在我们的模型中,使用层次 softmax 和词汇表的霍夫曼树形式。这思路参考文献 [16] 中关于词频对输出类型的影响。

霍夫曼树将常用单词赋予较短编码,这进一步减少了需要计算的输出单元数量:平衡二叉树输出单元为 log(V) 个,使用层次 softmax 的霍夫曼树只需要 log(Unigram_perplexity(V)) 个。在词汇表数量为 100 万时,该思路将计算效率提升两倍。

然而这并非关键加速点,对于 NNLM 来说,计算瓶颈在于 N x D x H 项。

我们下文提出的模型将省去隐藏层,重度依赖 softmax 归一化的效率。

循环神经网络模型(RNNLM)

循环神经网络可以克服前向神经网络的一些缺陷,例如 NNLM 需要确定上下文长度,同时,比起浅层神经网络,RNN 可以有效表达更复杂的模式[15, 2]。

RNN 模型不需要映射层,只有输入层、隐藏层、输出层。特点是隐藏层会循环连接在一起,这导致具有该循环结构的模型拥有了一种类似短时记忆的能力,过去的信息可以在隐藏层状态中保存下来,并用当前输入的隐藏层信息来更新。

RNN 模型每批训练复杂度为 Q = H x H + H x V

该模型中,词向量维度 D 与隐藏层维度 H 一致,同时,计算项 H x V 可以使用层次 softmax 减少为 H x log(V),大部分计算时间来自 H x H 项。

神经网络的并行训练

基于大数量级数据训练模型时,我们实现了一种名为 DistBelief [6] 的大规模分布式框架,可用于训练包括 NNLM、RNNLM 和本文中提出的模型。

该模型可以同时运行同一个模型的多个副本,在中心服务器上对梯度更新进行同步。

在并行训练时,使用名为 Adagrad [7] 对最小批数据进行异步的梯度下降自适应学习率调整。

基于此框架,我们通常在数据中心运行 100 多个模型副本,使用不同机器的多个 CPU 处理器。

新的对数线性模型(Log-Linear Model)

我们提出了两种学习分布式词向量的新模型架构,尝试最小化计算复杂度。

如前边几节看到的那样,大部分计算复杂度来自模型的非线性隐藏层,这也是神经网络迷人之处。

尽管如此,我们尝试寻找更简单的模型,希望模型能够输出不亚于神经网络模型的词向量,且训练时更高效。

新架构参考了我们之前的研究 [13, 14],发现神经网络模型可以通过两步训练得到:

  1. 使用简单模型训练连续词向量。
  2. 基于上一步的词向量训练 N-gram 模型。

尽管后续有许多方法可以学习词向量,我们觉得文献 [13] 的方法是最简单的。

连续词袋模型(CBOW)

首先提出的模型类似前向 NNLM,移除非线性隐藏层,所有单词共享映射层,因此所有单词都被映射到同一个位置。

我们称该模型为词袋模型,因为单词位置不影响映射操作。

而且,我们使用了当前位置单词后续单词的信息,通过构建包含四个历史单词、四个后续单词的对数线性分类器作为输入,训练模型正确输出当前单词。

训练复杂度为 Q = N x D + D x log(V)

我们将模型称为 CBOW,但不像标准词袋模型,该模型使用连续的上下文的词向量表示。

连续 Skip-gram 模型

第二个模型与 CBOW 类似,但不再是使用上下文预测当前位置单词,而是尝试通过同句中其他单词来最大化当前单词类型。

更精确的说,通过将当前单词输入给带有映射层的对数线性分类器,来预测当前单词前后制定范围的各个单词。

我们发现,增加范围大小可以提升结果词向量的质量,同时也会提升计算的耗时。

由于与当前单词距离越远的单词,和当前单词的相关性越弱,我们在训练样本中对远距离单词做了权重削减的采样预处理。

训练复杂度为 Q = C x (D + D x log(V))

其中 C 是能与当前单词相隔的最大距离,因此,如果 C = 5,训练单词时,随机选择 1-5 之间的数作为窗口大小,从当前单词的前后选择对于单词作为当前单词训练的目标值。

实验与结果

为了比较不同版本词向量的质量,之前的论文通常使用一个表来显示单词和与之相似的单词,来直观的理解结果。

尽管很容易展示单词 France 和单词 Italy 或其他国家的相似性,在更复杂的相似性问题上,词向量的展示就很困难。

如我们所见,有很多种度量单词之间相似性的方式,例如 big 与 bigger 相似,就像 small 与 smaller 相似。

我们使用单词对 big-bigger、small-smaller 等来表示该关系,并使用包含两对单词的提问来测试,如:已知 biggest 与 big 相似,那么 small 与哪个单词相似?

令人惊奇的是,一些提问可以通过词向量的简单编织运算解决。

为了回答上边的问题,简单通过计算 vector('biggest') - vector('big') + vector('small') 得到一个向量,接着在向量空间里寻找与该向量余弦距离最接近的 X 个向量作为问题的答案。

当词向量被充分训练时,该方法可能找到正确答案。

最后,我们发现,当我们在大量数据上训练高维词向量后,一些很微小的语义关系问题,都可以通过词向量的编织运算解决,例如城市与国家的归属关系。

具有语义关系的词向量可以被用来提升 NLP 应用质量,如机器翻译、信息抽取、问答系统和许多其他发明的应用。

任务描述

为了度量词向量质量,我们定义了包含五种语义问题、九种语法问题的理解任务集,总体有 8869 条语义问题和 10675 条语法问题。

每一类问题由两步操作产生:

  1. 手动创建一列相似单词对。
  2. 通过连接两个相似单词对,创建一列问题。

我们计算所有问题类型的整体准确度和每个类型问题的单独准确度。只有在目标词向量的最近单词中包含问题中的答案单词,才算问题被正确回答。

最大化准确度

我们使用 Google News 预料来做词向量训练,该预料包含 6B 词条,我们将词汇表裁剪为一百万个最常用单词。

显然,我们面临时间约束最优问题,期望使用更多训练数据和更大维度的词向量可以提升正确率。

为了尽快估计选择哪个模型可以得到的词向量最好,我们首先使用训练集的子集来训练模型,并计算结果,将词汇量裁剪为 3 万单词。

可以看到,在某个时间点后,添加维度或者添加训练数据量对于准确度的提升效果递减,因此需要同时增加维度和训练数据量。

尽管这点看上去微不足道,但该技巧在大量数据上训练词向量时很有效。

其他比较测试

...

总结

本文研究了不同模型产生的词向量在一系列语法、语义测试上的效果。

我们发现与流行的神经网络模型相比,使用简单的模型更有可能得到高质量词向量。

由于简单模型计算复杂度更低,该模型更有可能在大数据集上获得具有更高维数的词向量。

使用 DistBelief 分布式训练架构,可以在训练 CBOW、Skip-gram 等模型时使用更多数据,得到效果更好的模型。

...

我们正在研究的项目展示了词向量能够对知识库中的知识进行自动扩充,并可以检验已有知识的正确性。机器翻译实验的结果看起来很有前途。

将来拿我们的模型与 Latent Relational Analysis 和其他模型比较,应该会发现有意思的结果。

我们相信我们的理解任务集能够帮助其他研究机构估计其词向量的技术效果。

我们期望高质量的词向量能够成为未来 NLP 应用的重要基石。

参考文献