https://blog.csdn.net/thinking_boy1992/article/details/53321827
https://www.jianshu.com/p/b2da4d94a122
https://zhuanlan.zhihu.com/p/22477976
一、概述
本文主要是从deep learning for nlp课程的讲义中学习、总结google word2vector的原理和词向量的训练方法。文中提到的模型结构和word2vector的代码实现并不一致,但是可以非常直观的理解其原理,对于新手学习有一定的帮助。(首次在简书写技术博客,理解错误之处,欢迎指正)
二、词向量及其历史
1. 词向量定义
词向量顾名思义,就是用一个向量的形式表示一个词。为什么这么做?机器学习任务需要把任何输入量化成数值表示,然后通过充分利用计算机的计算能力,计算得出最终想要的结果。词向量的一种表示方式是one-hot的表示形式:
首先,统计出语料中的所有词汇,然后对每个词汇编号,针对每个词建立V维的向量,向量的每个维度表示一个词,所以,对应编号位置上的维度数值为1,其他维度全为0。这种方式存在问题并且引发新的质疑:
1)无法衡量相关词之间的距离
从语义上讲,hotel 和motel 更相关,和cat更不相关,但是无法表示这种差异。
2)V维表示语义空间是否有必要
one-hot的每一维度表示具体的词,我们假设存在更加抽象的维度能够表示词和词之间的相似性和差异性,并且词向量的维度远远小于V。例如,这些维度可以是时态,单复数等
2.词向量获取方法
1)基于奇异值分解的方法(奇异值分解)
a、单词-文档矩阵
基于的假设:相关词往往出现在同一文档中,例如,banks 和 bonds, stocks,money 更相关且常出现在一篇文档中,而 banks 和 octous, banana, hockey 不太可能同时出现在一起。因此,可以建立词和文档的矩阵,通过对此矩阵做奇异值分解,可以获取词的向量表示。
b、单词-单词矩阵
基于的假设:一个词的含义由上下文信息决定,那么两个词之间的上下文相似,是否可推测二者非常相似。设定上下文窗口,统计建立词和词之间的共现矩阵,通过对矩阵做奇异值分解获得词向量。
2)基于迭代的方法
目前基于迭代的方法获取词向量大多是基于语言模型的训练得到的,对于一个合理的句子,希望语言模型能够给予一个较大的概率,同理,对于一个不合理的句子,给予较小的概率评估。具体的形式化表示如下:
第一个公式:一元语言模型,假设当前词的概率只和自己有关;第二个公式:二元语言模型,假设当前词的概率和前一个词有关。那么问题来了,如何从语料库中学习给定上下文预测当前词的概率值呢?
a、Continuous Bag of Words Model(CBOW)
给定上下文预测目标词的概率分布,例如,给定{The,cat,(),over,the,puddle}预测中心词是jumped的概率,模型的结构如下:
如何训练该模型呢?首先定义目标函数,随后通过梯度下降法,优化此神经网络。目标函数可以采用交叉熵函数:
由于yj是one-hot的表示方式,只有当yj=i 时,目标函数才不为0,因此,目标函数变为:
代入预测值的计算公式,目标函数可转化为:
b、Skip-Gram Model
skip-gram模型是给定目标词预测上下文的概率值,模型的结构如下:
同理,对于skip-ngram模型也需要设定一个目标函数,随后采用优化方法找到该model的最佳参数解,目标函数如下:
分析上述model发现,预概率时的softmax操作,需要计算隐藏层和输出层所有V中单词之间的概率,这是一个非常耗时的操作,因此,为了优化模型的训练,minkov文中提到Hierarchical softmax 和 Negative sampling 两种方法对上述模型进行训练,具体详细的推导可以参考文献1和文献2。
三、参考文献
1.word2vec Explained: Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method
2.word2vec Parameter Learning Explained
3.Deep learning for nlp Lecture Notes 1
4.Neural Word Embedding as Implicit Matrix Factorization(证明上述model本质是矩阵分解)
5.Improving Distributional Similarity with Lessons Learned from Word Embeddings(实际应用中如何获得更好的词向量)
6.Hierarchical Softmax in neural network language model
7.word2vec 中的数学原理详解(四)基于 Hierarchical Softmax 的模型
9.霍夫曼编码
作者:Aroundtheworld
链接:https://www.jianshu.com/p/b2da4d94a122
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
https://arxiv.org/pdf/1301.3781.pdf“>论文翻译
摘要:
我们提出了两个新的模型框架用来计算从非常大的数据集中单词的连续向量表示;
表示的质量在一个单词相似度任务中进行测试;结果与之前效果最好的技术进行比较,这些技术基于不同类型的神经网络;我们使用更低的计算量在准确率上有很大的提高,例如,它从1.6billion单词量的数据集中花费不到一天时间训练得到高质量的向量表示;而且,这些向量用于我们的测试集,计算单词句法和语义相似度时提供了很好的表现;
简介:
许多当前的NLP系统和技术把单词视为原子单位,其中没有单词间相似度的概念,它们由单词表中的序号来表示;这种做法有几个原因:简单,鲁棒,和观察经验:使用大量数据训练的简单模型效果好于使用少量数据训练的复杂模型;一个例子就是流行的N-gram模型,用于统计语言建模,使用所有实际可以利用的数据训练N-gram是可能的;
然而,简单的技术在许多的任务中有自身的限制,例如,在自动语音识别中,相关领域的数据量被限制,它的性能通常由高质量的转录的语音数据量来主导(通常只有几百万单词)。在机器翻译中,许多语言中存在的语料仅仅包含数十亿的单词;因此,现在的情况是,简单的放大基础的技术并不会导致明显的进步,我们不得不关注于更高级的技术;
随着最近几年机器学习技术的进步,有了在更大的数据集上训练更复杂模型的可能性;而且应该优于简单模型。可能最成功的概念是使用单词的分布式向量表示。例如,基于语言模型的神经网络就明显由于N-gram模型;
文章目标
这篇文章的主要的目标是介绍从数十亿单词量的大数据集学习高质量单词向量,其中词典包含了数百万的单词;据我们所知,之前存在的框架没有哪个能够在百万单词量的数据集上进行训练,得到了维度在50-100之间的合适的单词向量;
我们使用最近提出的技术来度量得到的向量表示的质量;惊奇的发现,相似的单词不仅仅趋向于彼此之间更加接近,而且单词之间可能具有多重维度的相似性;这在之前的屈折变化语言的上下文中已经观察到,例如,名词可能拥有多种不同的词后缀,当我们在原始的向量空间的子空间寻找相似的单词的时候,很有可能找到拥有相似后缀名的单词;
在这篇文章中,我们尝试开发新的框架,它能够保存单词之间存在的线性规律,进而尝试最大化向量操作的精确度;我们设计新的复杂测试集用来句法和语义规则测试;
而且,我们讨论训练时间和精确度与单词向量维数、训练数据的大小之间的关系;
之前的工作
把单词表示为连续向量拥有很长的历史;一个用于估计神经网语言模型的非常流行框架模型被提出
模型的框架
许多不同种类的模型被提出,用来估计单词的连续表示;包括众所周知的Latent Semantic Analysis (LSA) and Latent Dirichlet Allocation (LDA);
在这篇文章中,我们关注于通过神经网络学习得到单词的分布式向量表示;就像前面展示的,它们通过保存单词之间的线性规则使得性能明显优于LSA;此外,LDA在大的数据集上计算代价很大;
为了比较不同模型框架,我们定义了模型计算复杂度,作为评价完整的模型训练的数量指标;接下来,我们试着在最小化计算复杂度的同时,最大化准确度;
对于下面的所有模型,训练复杂度正比于:
O=E*T*Q
这里E是指训练的迭代次数,T是指训练集中单词的数量,Q在每个模型框架中以后定义;一般选择E =3-50 ,T上至十亿,所有的模型使用随机梯度下降算法和反向传播进行训练;
Feedforward Neural Net Language Model (NNLM)
概率前馈神经网络语言模型已被提出,它包括输入、输出、投影、隐含、输出层。在输入层,N个词使用 1-of-V coding进行编码,V是指词典中的单词数量;之后,输入层被映射到一个映射层P,它具有维度N*D,使用一个共享的映射矩阵,N个输入在任何指定的时间都是激活的,组建投影层是一个相对简单的操作
NNLM架构在映射层和隐含层之间的计算变得复杂,因为在映射层的值是稠密的。对于一个通常的选择,N=10 ,映射层可能是500-2000,然而隐含层大小H通常为500-1000,而且,隐含层用于计算在单词表中所有单词的概率分布,结果导致V维的输出向量。因此,每一个训练样本的计算复杂度为:
Q =N*D+N*D*H+H*V;
其中支配项为H*V。然而,一些实际的解决方案被提出来能够避免它,或者使用 hierarchical versions of the softmax,或者通过在训练过程中没有归一化的模型来避免完整的归一化模型;
2.2 循环神经网络语言模型(RNNLM)
基于语言模型的循环神经网络已经被提出用来克服前馈NNLM的某种限制,例如,需要指出上下文的长度,因为传统的RNNs能够有效的表达更复杂的模型,相比于摘得神经网络;RNN模型没有映射层,只有输入层,隐含层、输出层;这个模型的特点在于循环矩阵,它连接隐含层和它自身,使用延迟连接,它使得循环模型形成短时间的记忆,过去的信息能够通过隐含层的状态表示,它的更新根据当前的输入和前段时间隐含层状态;
RNN中每一个训练样本的复杂度为:
Q=H*H+H*V
这里单词的表示D和隐含层状态H拥有相同的维度。紧接着,项H*V能够通过使用hierarchical softmax.有效的减少为H*log2(V)。大部分复杂度来自于H*H;
神经网络的并行训练
为了在超大数据集上运行神经网络模型,我们已经在名叫Dist Belief的大规模分布式框架的基础上实现了一些模型;包括前馈NNLM和在文章中提出的新模型;这个框架允许相同的模型并行的运行多个副本,所有的副本通过一个保存有所有的参数的中心服务器同步它的梯度更新,对于这个并行训练,我们使用小的批同步梯度下降,使用一个自适应的学习率生成器称为Adgrad;在这个框架下,通常使用一百或跟多的副本,每一个使用在数据中心的不同机器的多个CPU
新的对数线性模型(New Log-linear Models)
在这一部分,我们提出两个新的框架模型,用最小化计算复杂度学习单词的分布式向量表示;
从前面可知,计算复杂度主要来源于模型的非线性的隐含层;然而这是使得神经网络富有吸引力的原因,,我们决定开发更多的相似模型,它可能不能像神经网络那样精确地表示数据,但是能够尽可能的在更多的数据进行训练;
新的框架基于之前我们的工作,在那里发现了神经网络语言模型能够成功的通过两个步骤训练:首先,通过简单模型学习单词连续向量表示,在这些单词的分布式向量表示的基础之上进行N-gramNNLM 训练 。然而,后续有大量工作来学习用来学习词向量
3.1连续词袋模型( Continuous Bag-of-Words Model)
第一个被提出的模型与前馈NNLM相似,在这个模型中,非线性隐含层被移除,映射层被所有的单词共享(而不是仅仅共享映射矩阵)因此,所有的单词被映射到相同的位置(它们的向量被求平均),我们称这个框架为词袋模型,因为在模型中,过去的单词的顺序不影响映射;而且,我们还用未来的单词;我们已经在下面介绍的项目中获得了最好的性能,项目中通过构建一个log-linear 分类器,带有四个历史的单词和四个未来单词作为输入,训练准则是正确的分类当前的单词(中间词),训练复杂度为:
Q= N*D+D*log2(V)
我们把这个模型简称为CBOW,不同于标准的词袋模型,它使用上下文的连续分布向量表示。这个模型框架由下图显示;注意输入层与映射层之间的权值向量被所有位置的单词共享,和NNLM中相同的方式
第二个框架与CBOW相似,但是与基于上下文预测当前词相反,它试图最大化一个单词的分类器;更精确的说,我们使用每个当前单词作为带有连续的映射层的log-linear 分类器的输入,预测当前单词之前和之后一定范围内的单词;我们发现增加范围能够提高生成的单词向量的质量;但是还增加了计算复杂度;由于远距离的单词通常与当前单词有更少的关系,我们通过在我们的训练样本中从这些单词中采样更少,给予远距离单词更小的权重;
框架的训练复杂度成正比于:
Q=C*(D+D*log2(V))
这里C是单词最大化距离,因此,如果我们选择C = 5 ,对于每个训练单词,我们随机的选择一个数字R ,在<1;C>之间,然后使用R当前单词的R个历史单词和R个未来单词作为正确的标签。这需要我们做R*2单词分类器,把当前单词作为输入,R+R个单词作为输出;在下面的试验中,C = 10;
4 结果
为了比较不同的词向量版本的质量,之前的文章通常会使用一个表,展示样本单词和它最相似的单词,直观的理解他们;尽管很容易显示France与Italy相似;把这些向量应用于更复杂的相似度任务中更具有挑战性;根据前面的观察,单词之间存在不同类型的相似度,例如,单词big与bigger形似,同样的意义,small与smaller相似;另一个类型的关系的示例:big -biggest 和small - smallest;我们将要在一个问题中呈现两个单词对之间的关系,就像这样:similar相对于small和biggest相对于big具有相同的意义吗?
多少令人吃惊!这个问题能够通过实施简单的单词的向量表示的代数运算进行回答。为了找到与small在语义上最相近的的单词,而且与biggest-big具有相同的意义;我么能够简单的计算向量X = vector(“biggest”)-vector(“big”)+vector(”small”);然后,我们通过Cosine Distance在向量空间中寻找与X最接近的单词;
把它作为问题的答案进行回答;当词向量被很好地训练的时候,使用这个方法很有可能获得正确的答案;
最后,我们发现当我们在大的数据集上训练高维词向量的时候,生成的向量能够用于回答非常微妙的单词之间的语义相关问题;例如,一个城市与所处于的国家。例如France-Paris和Germany-Berlin。具有这些语义关系的词向量能够对现存的许多NLP应用提供很大的帮助,例如,机器翻译、信息检索、问答系统,和将来出现的其他应用;
任务描述
为了度量词向量的质量,我们定义了一个复杂的测试集,它包括了五种类型的语义问题。九个类型的句法问题。包括每个类别的两个样本集在上表展示;总之,共拥有8869个语义问题和10675个句法问题。在每个类别的问题根据两步进行构建,首先,相似的单词对序列被自动的构建,然后,通过链接两个单词对,一个大的问题序列被构建;例如,我们产生一个序列记录68个美国的大城市与它们所属的州,通过随机的链接两个单词对功能产生2.5K个问题;在我们的测试集中,仅仅包含了单个单词的标签,因此多单词的实体并没有出现(例如New york );
我们计算了所有问题类型的整体精确度,每一个问题类型被分开考虑;假设只有向量通过上面的方法得到对应的最相似的单词就是问题所对应的正确的单词,问题才视为正确;因此,同义词视为错误;由于当前的模型没有任何关于单词形态学的信息输入,这意味着达到100%的精确度不太可能;然而,我们相信单词向量对于模型应用的有用性应该与这个精确指标相关。而且,通过结合单词结构信息,还能获得进步,尤其对于句法问题;
最大化精确度
我们使用GoogleNews语料来训练词向量。语料包含了大约6B标签;
我们把单词表限制在1million个频率高的单词;明显的,我们正在面对时间约束优化问题,就像期待使用更多的数据和更高维度词向量能够提高精度一样。为了得到即好又快的结果,评估最好的模型框架选择;我们首先使用训练数据的子集进行训练、评价各种模型;把单词表限制在频率最好的30k个单词;使用CBOW框架,得到不同的词向量维度或者增加训练数据量的训练结果在下表中进行展示:
可以看出,在一些点之后,增加更多的维度和增加训练数据提供递减的提升。因此,我们不得不提高向量维度,同时提高训练数据的量;虽然这一观察似乎微不足道,值得注意的是,当前流行于使用相对大的数据集训练词向量,但是相对不足的尺寸(例如50-100),训练数据增加一倍大概等同于向量尺寸中增加一倍增加的计算复杂度;
对于在表2 和表4 呈现的实验,我们使用了随机梯度下降和负反馈进行三次训练迭代,我们选择开始的学习率为0.025,线性减小,因袭最后一次迭代是接近于零;
学习得到的关系的示例
上图展示了符合各种各样关系的单词对。我们依照下面介绍的方法:通过两个单词向量相减来定义单词之间的关系,结果加上另一个单词。例如,Paris - France +Italy =rome 。所有能看出,准确度是相当的高,尽管还有很多的提升空间(注意,使用我们精确地度量,即假设准确的匹配,上表呈现的结果仅仅得分60%);我们相信在更大大数据集上训练更高维度的词向量将要表现的更好,使能够促进创新的应用的发展,
另一个提高精确度的方法是提供一个样本更多的关系。通过使用十个样本而不是一个来形成词向量,在语义-句法测试集上我们最好的模型上已经实现精度提高10%;
把向量公式应用于解决不同的任务是可能的,例如,我们已经实现了很好的精确度用来选择列表以外的单词,通过计算单词序列所对应的词向量的平均,寻找最远距离的词向量。只是某些人工智能测试中比较流行的一个问题。显然,使用这些技术还会有很多的发现;