一天一经典Efficient Estimation of Word Representations in Vector Space
摘要
本文提出了两种从大规模数据集中计算连续向量表示(Continuous Vector Representation)的计算模型架构。这些表示的有效性是通过词相似度任务(Word Similarity Task)来度量的。实验结果表明,这种方法要优于已有的基于其他类型的神经网络模型的效果。更重要的是,这种方法可以以更低的计算代价获得更高的词相似性预测的准确度。举个例子来说,从16亿词的语料库中学习表示大概需要不到一天的时间。从效果角度来讲,在词的语法与语义相似度方面,达到了领先水平。
背景介绍
当今先进的NLP系统与技术都把词作为原子单元。总是被用作词表的索引,而不会去考虑词间的相似性。这样做的好处在于简单且robust,通常我们的观测结果是:简单模型在大量数据上的性能超过复杂模型在少量数据上的计算结果。统计语言模型中的N-gram就是这样的典型例子。
然而,简单模型在很多领域都有其局限性。例如,相关领域内的自动语音识别数据是有限的,简单模型的性能通常取决于转录的高质量的语音数据的大小,通常只有几百万的词。机器翻译任务中,好多语音的已有的语料库的大小也只有十几亿。因此,确实存在对这些简单基本技术的升级并不会带来性能很大的提升的情况,我们不得不考虑更复杂的高级技术。
随着机器学习技术的发展,训练更大规模数据上的复杂模型成为可能,它们要远远超过那些简单模型。可能最成功的概念就是使用分布式词表示[1]。例如,NNLM远远优于N-gram模型。
本文的主要目标在于从拥有几十亿的语料库与几百万的词表的巨大数据集中学习高质量词表示的技术。据我们所知,已有的方法在几百万词的语料库上,获取50~100维的词向量,效果不错。
我们使用最近提出的一项技术来评价得到的向量表示的质量,该度量指标不但期望意思相近的词表示相近,而且还能表示词的多种相似性程度[2]。这在屈折语言(Inflectional Language)中是常见的,例如,名词可能有多种词尾(后缀),如果我们在原始的向量子空间中搜索相似词,可能找到的是具有相似词尾的词[3,4]。有些奇妙的是,词表示的相似性远远超出了简单的语法规则。使用词偏置技术时,对词向量进行简单的代数操作,例如vector("King")-vector("Man")+vector("Woman")得到的向量与vector("Queen")比较近[2]。
本文通过开发新的模型结构来最大化向量操作的准确度,从而保留词间的线性规则。我们设计了一个综合的测试集,来从语法和语义规则两方面评价,以此来展示我们的模型可以以很高的精度学习到许多规则。我们进一步讨论了模型的训练时间和精度依赖于词向量的维度和训练数据集的大小。
将词表示为连续的向量的思想由来已久[1,5,6]。一个很受欢迎的模型结构称为Neural Network Language Model (NNLM)[7],采用一个线性映射层加上一个非线性隐层来同时学习到词向量表示和统计语言模型。该工作得到后续很多工作的追捧。另外一个有趣的NNLM架构[3,4],仅仅采用一个隐层来学习词向量,再使用这些词向量来学习NNLM。因此,词向量的学习不需要构建完整的NNLM。本文对这个架构进一步扩展,重点关注使用一个简单的模型来学习词向量表示。后续我们会展示词向量表示可以用来大大改善和简化许多NLP应用。词向量本身的估计可以采用多种模型架构,采用多种语料库,其中一些学习到的词向量表示可以用作进一步的研究和对比。然而,据我们所知,这些模型的计算代价要远远高于最早的那个模型[3],一个例外是采用对角权重矩阵的log-bilinear模型。
模型结构
许多已有的模型可以用来估计词的连续向量表示,包括我们所耳熟能详的LSA以及LDA。已有的工作表明,与LSA相比,分布式表示(distributed representation)可以更好的保留词间的线性规则[2,8],因此本文关注于采用neural network来学习词的分布式表示(distributed representation)。而LDA最大的缺点在于大数据集上的计算复杂度高。
我们首先用完整的训练模型所需要的参数的数量来作为模型计算复杂度的定义,从而来比较不同模型结构(这一点与工作【18】非常相似)。接下来,我们试图最大化准确率,同时最小化计算复杂度。再接下来的所有模型中,训练复杂度都是与下面这个量成正比的,,其中E表示训练epoch的次数,T表示训练集中词数,Q表示模型结构相关的量。常见的选择是E在3到50之间,T多达十亿。所有的模型采用SGD与BP来训练[5]。
Feedforward NNLM. 概率前馈NNLM[7]包括Input-projection-hidden-output四层。输入层中,前N个词编码为1-of-V的向量,V为词表大小。输入层通过一个的映射矩阵,映射到映射层P。在任何时刻,仅仅N个输入是激活的,因此映射层的组合是相对简单的操作。NNLM结构的复杂计算在于映射层和隐层之间的计算,主要原因在于映射层是稠密的。对于一个常见的选择N=10,映射层P的大小可能为500到2000,而隐层H的大小通常为500到1000。更进一步讲,隐层通常用来计算在整个词表上的概率分布,结果导致输出层的维度为V。这么说来,每个训练实例的计算复杂度为,其中主要的复杂度集中在第三项上。然而,为了避免如此,提出了一些实际的解决方案:或者使用softmax的层次版本[9,10,11],或者避免对模型进行归一化,转而在训练的时候使用未归一化的模型。采用词表的二叉树表示,可以将输出单元的数量降低到。至此模型的主要复杂计算就在于第二项了。
我们的模型采用层次softmax,其中词表表示未Huffman二叉树。这样做主要是基于之前观测到的一个现象[12]:Frequency of words works well for obtaining classes in NNLM。Huffman树对频繁出现的词以较短的编码,这样进一步减少了输出单元的数量。然而,平衡二叉树需要,基于huffman树的层次softmax仅仅需要。举个例子来说,当词表大小为100万时,我们的计算效率得到了两倍的加速。虽然对于NNLM来讲,这并不是最关键的加速,因为主要的计算瓶颈在于这一项,我们后续提出的模型结构并没有隐层,而是主要依赖于softmax正则化的计算效率。
Recurrent NNLM。RNNLM的提出是为了克服前馈NNLM的一些局限性,例如,需要指定context的长度(模型阶数N)。因此,理论上讲RNN可以比浅层NN(shallow neural networks)高效的表示更加复杂的模式[13,14]。RNN并没有映射层,只有input-hidden-ouput几层。这类模型的特殊性就在于recurrent matrix,该matrix将隐层与自己通过时间延迟的关系联系起来。由于以前的信息能够表示为隐层中的状态,该状态可以根据当前的输入以及上个时间步的状态进行更新,这就使得recurrent model形成了某种形式的短时记忆。RNN模型对于一个训练实例的时间复杂度是,其中词表示D具有与隐层H相同的维度。类似的,我们可以使用层次softmax(hierarchical softmax)将有效降低为。至此RNN模型的主要计算复杂度在于。
Parallel Training of Neural Networks.在大规模数据集上训练模型时,我们已经基于大规模分布式框架DistBlief实现了几个模型包括前馈NNLM以及本文中提出的新模型。DistBlief[15]可以并行运行一个模型的多个副本,每个副本的梯度更新同步通过中央服务器来保持所有参数的一致。对于这种并行训练,我们]。采用这种框架,使用100多个模型副本,多个机器的多个CPU核,一个数据中心时常见的配置。
本文的模型:New Log-Linear Models (word2vec)。我们提出两个模型结构来学习词的分布式表示,同时也最小化计算复杂度。从前述章节的观测结果表明:模型计算的主要复杂度来自于非线性隐层。尽管这些隐层使得neural networks非常具有吸引力,但是我们决定使用更为简单的模型。这样可能并不能够获得与Neural network一样准确的数据表示,但是至少能够高效的训练更多的数据。新结构的提出主要依赖于以前模型[3,4]中采用两步来训练NNLM:(1)使用简单模型获得连续词向量的表示;(2)基于词的分布式表示来训练N-gram NNLM。虽然后续有好多工作关注学习词向量的表示,但我们考虑到这个模型[3]是最简单的一个。
CBOW(Continuous Bag-of-Words Model).该模型类似于前馈NNLM,去掉了其中的非线性隐层,所有词共享映射层,而非共享映射矩阵。所有的词映射到同样的位置,对这些向量进行平均。因为历史词序并不能影响映射结果,所以我们将这个模型结构称为Bag-of-Words模型。况且,我们也使用了未来的词。我们使用4个未来词和4个历史词作为输入在下节提到的任务中取得了最优的性能,其中,优化目标是能准确分类中间的词。训练复杂度为:。我们将这个模型记为CBOW。与传统的Bag-of-Words模型不同,它使用连续分布式的context表示。模型结构如图1所示。值得注意的是,输入层与映射层之间的权重矩阵,与NNLM一样,是所有词位置共享的。
Continuous Skip-Gram Model.第二个模型结构与CBOW类似,不同与CBOW根据context来预测当前word,本模型尝试优化根据另外一个词来预测同一个句子中这个词的类别。更准确来讲,我们使用当前词作为输入,经过连续映射层,到log-linear分类器,来预测指定窗口内,位于该词前后的词。我们发现,增加窗口的大小可以改善学习到的词向量的质量,但是也增加了计算复杂度。既然离得最远的词通常与当前词的关系要远远小于离得近的,所以我们给那些离得较远的词较小的权重,使得它们采样到的概率要小。该模型结构的训练复杂度正比于:,其中C为词的最大距离。若我们选择C=5,那么对于每个训练词,我们从1~C随机选择一个数R,使用R个历史词与R个未来词作为正确的标注(R words from history and R words from the future of the current word as correct labels)。这就需要我们进行2R次词分类:将当前词作为输入,2R个词中的每个词作为输出。在下面的实验中我们采用C=10。
实验结果
略
[1] G.E. Hinton, J.L. McClelland, D.E. Rumelhart. Distributed representations
[2] Linguistic Regularities in Continuous Space Word Representations
[3]T. Mikolov. Language Modeling for Speech Recognition in Czech, Masters thesis
[4] T. Mikolov, J. Kopeck´y, L. Burget, O. Glembek and J. ˇCernock´y. Neural network based language models for higly inflective languages,
[5]D. E. Rumelhart, G. E. Hinton, R. J. Williams. Learning internal representations by backpropagating errors.
[6]J. Elman. Finding Structure in Time. Cognitive Science, 14, 179-211, 1990
[7]Y. Bengio, R. Ducharme, P. Vincent. A neural probabilistic language model.
[8]A. Zhila, W.T. Yih, C. Meek, G. Zweig, T. Mikolov. Combining Heterogeneous Models for Measuring Relational Similarity
[9]F. Morin, Y. Bengio. Hierarchical Probabilistic Neural Network Language Model.
[10] A.Mnih,G.Hinton.AScalableHierarchicalDistributedLanguageModel
[11] T. Mikolov, A. Deoras, D. Povey, L. Burget, J. ˇCernock´y. Strategies for Training Large Scale Neural Network Language Models
[12] T.Mikolov,S.Kombrink,L.Burget,J. ˇCernock´y,S.Khudanpur.Extensionsofrecurrentneural network language model
[13] T. Mikolov, M. Karafi´at, L. Burget, J. ˇCernock´y, S. Khudanpur. Recurrent neural network based language model
[14] Y. Bengio, Y. LeCun. Scaling learning algorithms towards AI.
[15] J. Dean, G.S. Corrado, R. Monga, K. Chen, M. Devin, Q.V. Le, M.Z. Mao, M.A. Ranzato, A. Senior, P. Tucker, K. Yang, A. Y. Ng., Large Scale Distributed Deep Networks
[16] J.C. Duchi, E. Hazan, and Y. Singer. Adaptive subgradient methods for online learning and stochastic optimization
一天一经典Efficient Estimation of Word Representations in Vector Space的更多相关文章
- pytorch --- word2vec 实现 --《Efficient Estimation of Word Representations in Vector Space》
论文来自Mikolov等人的<Efficient Estimation of Word Representations in Vector Space> 论文地址: 66666 论文介绍了 ...
- Efficient Estimation of Word Representations in Vector Space 论文笔记
Mikolov T , Chen K , Corrado G , et al. Efficient Estimation of Word Representations in Vector Space ...
- Efficient Estimation of Word Representations in Vector Space (2013)论文要点
论文链接:https://arxiv.org/pdf/1301.3781.pdf 参考: A Neural Probabilistic Language Model (2003)论文要点 https ...
- 【Deep Learning学习笔记】Efficient Estimation of Word Representations in Vector Space_google2013
标题:Efficient Estimation of Word Representations in Vector Space 作者:Tomas Mikolov 发表于:ICLR 2013 主要内容: ...
- 论文翻译——Deep contextualized word representations
Abstract We introduce a new type of deep contextualized word representation that models both (1) com ...
- 一天一经典Reducing the Dimensionality of Data with Neural Networks [Science2006]
别看本文没有几页纸,本着把经典的文多读几遍的想法,把它彩印出来看,没想到效果很好,比在屏幕上看着舒服.若用蓝色的笔圈出重点,这篇文章中几乎要全蓝.字字珠玑. Reducing the Dimensio ...
- Word Representations 词向量
常用的词向量方法word2vec. 一.Word2vec 1.参考资料: 1.1) 总览 https://zhuanlan.zhihu.com/p/26306795 1.2) 基础篇: 深度学习wo ...
- 通过Visualizing Representations来理解Deep Learning、Neural network、以及输入样本自身的高维空间结构
catalogue . 引言 . Neural Networks Transform Space - 神经网络内部的空间结构 . Understand the data itself by visua ...
- 论文阅读笔记 Improved Word Representation Learning with Sememes
论文阅读笔记 Improved Word Representation Learning with Sememes 一句话概括本文工作 使用词汇资源--知网--来提升词嵌入的表征能力,并提出了三种基于 ...
随机推荐
- Redis 多级缓存架构和数据库与缓存双写不一致问题
采用三级缓存:nginx本地缓存+redis分布式缓存+tomcat堆缓存的多级缓存架构 时效性要求非常高的数据:库存 一般来说,显示的库存,都是时效性要求会相对高一些,因为随着商品的不断的交易,库存 ...
- Go内存分配器可视化指南【译】【精】
当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂.一切看起来都像一个神秘的黑盒子.因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥 ...
- 复杂dic的文件化存储和读取问题
今天遇到一个难题.整出一个复杂的dic,里面不仅维度多,还含有numpy.array.超级复杂.过程中希望能够存储一下,万一服务器停了呢?万一断电了呢? 结果存好存,取出来可就不是那样了.网上搜索了很 ...
- 百度地图 libBaiduMapSDK_base_v4_2_1.so" is 32-bit instead of 64-bit错误
20191111 集成android sdk,华为手机基本都启动报错,如下: W/System.err: java.security.NoSuchProviderException: no such ...
- python 系统定时关机
#coding=utf-8 "shutdown at 23:00" from datetime import * import os import win32api import ...
- IDEA下创建Spring项目
IDEA下创建Java SE Spring项目示例 1.创建项目 第4步:是否自动创建空的Spring容器配置文件,默认文件名是spring-config.xml.勾不勾选都行,如果没勾选,后面要自己 ...
- Linux 里的 2>&1 究竟是什么
原文 我们在Linux下经常会碰到nohup command>/dev/null 2>&1 &这样形式的命令.首先我们把这条命令大概分解下: 首先就是一个nohup:表示当 ...
- 利用yum下载rpm包并批量安装
一.下载rpm包 方法一:downloadonly 1.yum自动下载RPM包及其所有依赖的包至/root/rpm目录: yum install yum-plugin-downloadonly yum ...
- Python类的__new__()
本篇主要想要详细的介绍一下关于类的魔法方法__new__()方法. 在学习之前我们看一下Python3中关于object基类的__new__() 方法: @staticmethod # known c ...
- 万众期待的kintone开发账号免费开放申请啦!
亲爱的小伙伴们,等了很久很久的kintone开发账号终于可以免费申请使用了! 有人想问了,什么是kintone? kintone是指无需开发知识,即可根据公司业务轻松创建系统的Cybozu的云服务. ...