1. 首页
  2. 数据分析

Deep Learning in NLP 词向量和语言模型 (一)

点击上方免费订阅学习)

本文选自 licstar的博客

Postedon 2013 7 29

这篇博客是我看了半年的论文后,自己对 DeepLearning NLP 领域中应用的理解和总结,在此分享。其中必然有局限性,欢迎各种交流,随便拍。

DeepLearning 算法已经在图像和音频领域取得了惊人的成果,但是在 NLP 领域中尚未见到如此激动人心的结果。关于这个原因,引一条我比较赞同的微博。

Deep Learning in NLP 词向量和语言模型 (一)

第一句就先不用管了,毕竟今年的 ACL 已经被灌了好多 DeepLearning 的论文了。第二句我很认同,不过我也有信心以后一定有人能挖掘出语言这种高层次抽象中的本质。不论最后这种方法是不是 DeepLearning,就目前而言,DeepLearning NLP 领域中的研究已经将高深莫测的人类语言撕开了一层神秘的面纱。

我觉得其中最有趣也是最基本的,就是词向量了。

将词用词向量的方式表示可谓是将 DeepLearning 算法引入 NLP 领域的一个核心技术。大多数宣称用了 DeepLearning 的论文,其中往往也用了词向量。

0. 词向量是什么

自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。

NLP中最直观,也是到目前为止最常用的词表示方法是One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。

举个例子,话筒表示为 [0 00 1 0 0 0 0 0 0 0 0 0 0 0 0 …]“麦克表示为 [0 00 0 0 0 0 0 1 0 0 0 0 0 0 0 …]每个词都是茫茫 0 海中的一个 1

这种One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVMCRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。

当然这种表示方法也存在一个重要的问题就是词汇鸿沟现象:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克这样的同义词也不能幸免于难。

DeepLearning 中一般用到的词向量并不是刚才提到的用One-hot Representation 表示的那种很长很长的词向量,而是用 Distributed Representation(不知道这个应该怎么翻译,因为还存在一种叫“DistributionalRepresentation”的表示方法,又是另一个不同的概念)表示的一种低维实数向量。这种向量一般长成这个样子:[0.792,−0.177, −0.107, 0.109, −0.542, …]。维度以 50 维和 100 维比较常见。这种向量的表示不是唯一的,后文会提到目前计算出这种向量的主流方法。

(个人认为)Distributedrepresentation 最大的贡献就是让相关或者相似的词,在距离上更接近了。向量的距离可以用最传统的欧氏距离来衡量,也可以用 cos 夹角来衡量。用这种方式表示的向量,麦克话筒的距离会远远小于麦克天气。可能理想情况下麦克话筒的表示应该是完全一样的,但是由于有些人会把英文名迈克也写成麦克,导致麦克一词带上了一些人名的语义,因此不会和话筒完全一致。

1. 词向量的来历

Distributedrepresentation 最早是Hinton 1986年的论文《Learningdistributed representations of concepts》中提出的。虽然这篇文章没有说要将词做Distributed representation,(甚至我很无厘头地猜想那篇文章是为了给他刚提出的 BP 网络打广告,)但至少这种先进的思想在那个时候就在人们的心中埋下了火种,到 2000年之后开始逐渐被人重视。

Distributedrepresentation 用来表示词,通常被称为“WordRepresentation”“WordEmbedding”,中文俗称词向量。真的只能叫俗称,算不上翻译。半年前我本想翻译的,但是硬是想不出 Embedding应该怎么翻译的,后来就这么叫习惯了-_-|||如果有好的翻译欢迎提出。Embedding一词的意义可以参考维基百科的相应页面(链接)。后文提到的所有词向量都是指用Distributed Representation 表示的词向量。

如果用传统的稀疏表示法表示词,在解决某些任务的时候(比如构建语言模型)会造成维数灾难[Bengio2003]。使用低维的词向量就没这样的问题。同时从实践上看,高维的特征如果要套用 DeepLearning,其复杂度几乎是难以接受的,因此低维的词向量在这里也饱受追捧。

同时如上一节提到的,相似词的词向量距离相近,这就让基于词向量设计的一些模型自带平滑功能,让模型看起来非常的漂亮。

2. 词向量的训练

要介绍词向量是怎么训练得到的,就不得不提到语言模型。到目前为止我了解到的所有训练方法都是在训练语言模型的同时,顺便得到词向量的。

这也比较容易理解,要从一段无标注的自然文本中学习出一些东西,无非就是统计出词频、词的共现、词的搭配之类的信息。而要从自然文本中统计并建立一个语言模型,无疑是要求最为精确的一个任务(也不排除以后有人创造出更好更有用的方法)。既然构建语言模型这一任务要求这么高,其中必然也需要对语言进行更精细的统计和分析,同时也会需要更好的模型,更大的数据来支撑。目前最好的词向量都来自于此,也就不难理解了。

这里介绍的工作均为从大量未标注的普通文本数据中无监督地学习出词向量(语言模型本来就是基于这个想法而来的),可以猜测,如果用上了有标注的语料,训练词向量的方法肯定会更多。不过视目前的语料规模,还是使用未标注语料的方法靠谱一些。

词向量的训练最经典的有 3 个工作,C&W2008M&H2008Mikolov2010。当然在说这些工作之前,不得不介绍一下这一系列中Bengio 的经典之作。

2.0 语言模型简介

插段广告,简单介绍一下语言模型,知道的可以无视这节。

语言模型其实就是看一句话是不是正常人说出来的。这玩意很有用,比如机器翻译、语音识别得到若干候选之后,可以利用语言模型挑一个尽量靠谱的结果。在 NLP 的其它任务里也都能用到。

语言模型形式化的描述就是给定一个字符串,看它是自然语言的概率 P(w1,w2,…,wt)w1 wt 依次表示这句话中的各个词。有个很简单的推论是:P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1)

常用的语言模型都是在近似地求 P(wt|w1,w2,…,wt−1)。比如n-gram 模型就是用 P(wt|wt−n+1,…,wt−1) 近似表示前者。

顺便提一句,由于后面要介绍的每篇论文使用的符号差异太大,本博文里尝试统一使用Bengio 2003 的符号系统(略做简化),以便在各方法之间做对比和分析。

2.1 Bengio 的经典之作

用神经网络训练语言模型的思想最早由百度 IDL 的徐伟于 2000提出。(感谢 @余凯_西二旗民工 博士指出。)其论文《CanArtificial Neural Networks Learn Language Models?》提出一种用神经网络构建二元语言模型(即 P(wt|wt−1))的方法。文中的基本思路与后续的语言模型的差别已经不大了。

训练语言模型的最经典之作,要数Bengio 等人在 2001年发表在 NIPS上的文章《ANeural Probabilistic Language Model》。当然现在看的话,肯定是要看他在 2003年投到 JMLR上的同名论文了。

Bengio用了一个三层的神经网络来构建语言模型,同样也是n-gram 模型。如图1

Deep Learning in NLP 词向量和语言模型 (一)

1(点击查看大图)

图中最下方的 wt−n+1,…,wt−2,wt−1 就是前 n−1 个词。现在需要根据这已知的 n−1 个词预测下一个词 wtC(w) 表示词 w 所对应的词向量,整个模型中使用的是一套唯一的词向量,存在矩阵 C(一个 |V|×m 的矩阵)中。其中 |V| 表示词表的大小(语料中的总词数),m 表示词向量的维度。w C(w) 的转化就是从矩阵中取出一行。

网络的第一层(输入层)是将 C(wt−n+1),…,C(wt−2),C(wt−1) n−1 个向量首尾相接拼起来,形成一个 (n−1)m 维的向量,下面记为 x

网络的第二层(隐藏层)就如同普通的神经网络,直接使用 d+Hx 计算得到。d 是一个偏置项。在此之后,使用 tanh 作为激活函数。

网络的第三层(输出层)一共有 |V| 个节点,每个节点 yi 表示下一个词为 i 的未归一化 log 概率。最后使用softmax 激活函数将输出值 y 归一化成概率。最终,y 的计算公式为:

y=b+Wx+Utanh(d+Hx)

式子中的 U(一个 |V|×h 的矩阵)是隐藏层到输出层的参数,整个模型的多数计算集中在 U 和隐藏层的矩阵乘法中。后文的提到的 3 个工作,都有对这一环节的简化,提升计算的速度。

式子中还有一个矩阵 W|V|×(n−1)m),这个矩阵包含了从输入层到输出层的直连边。直连边就是从输入层直接到输出层的一个线性变换,好像也是神经网络中的一种常用技巧(没有仔细考察过)。如果不需要直连边的话,将 W 置为 0 就可以了。在最后的实验中,Bengio发现直连边虽然不能提升模型效果,但是可以少一半的迭代次数。同时他也猜想如果没有直连边,可能可以生成更好的词向量。

现在万事俱备,用随机梯度下降法把这个模型优化出来就可以了。需要注意的是,一般神经网络的输入层只是一个输入值,而在这里,输入层 x 也是参数(存在 C 中),也是需要优化的。优化结束之后,词向量有了,语言模型也有了。

这样得到的语言模型自带平滑,无需传统n-gram 模型中那些复杂的平滑算法。BengioAPNews 数据集上做的对比实验也表明他的模型效果比精心设计平滑算法的普通n-gram 算法要好 10% 20%

在结束介绍Bengio 大牛的经典作品之前再插一段八卦。在其 JMLR论文中的未来工作一段,他提了一个能量函数,把输入向量和输出向量统一考虑,并以最小化能量函数为目标进行优化。后来M&H 工作就是以此为基础展开的。

他提到一词多义有待解决,9 年之后Huang 提出了一种解决方案。他还在论文中随口(不是在Future Work 中写的)提到:可以使用一些方法降低参数个数,比如用循环神经网络。后来Mikolov 就顺着这个方向发表了一大堆论文,直到博士毕业。

大牛就是大牛。

2.2 C&W SENNA

RonanCollobert Jason Weston 2008年的 ICML上发表的《AUnified Architecture for Natural Language Processing: Deep Neural Networks withMultitask Learning》里面首次介绍了他们提出的词向量的计算方法。和上一篇牛文类似,如果现在要看的话,应该去看他们在 2011年投到 JMLR上的论文《NaturalLanguage Processing (Almost) from Scratch》。文中总结了他们的多项工作,非常有系统性。这篇 JMLR的论文题目也很霸气啊:从头开始搞 NLP。他们还把论文所写的系统开源了,叫做SENNA主页链接),3500 多行纯 C 代码也是写得非常清晰。我就是靠着这份代码才慢慢看懂这篇论文的。可惜的是,代码只有测试部分,没有训练部分。

实际上C&W 这篇论文主要目的并不是在于生成一份好的词向量,甚至不想训练语言模型,而是要用这份词向量去完成 NLP 里面的各种任务,比如词性标注、命名实体识别、短语识别、语义角色标注等等。

由于目的的不同,C&W的词向量训练方法在我看来也是最特别的。他们没有去近似地求 P(wt|w1,w2,…,wt−1),而是直接去尝试近似 P(w1,w2,…,wt)。在实际操作中,他们并没有去求一个字符串的概率,而是求窗口连续 n 个词的打分 f(wt−n+1,…,wt−1,wt)。打分 f 越高的说明这句话越是正常的话;打分低的说明这句话不是太合理;如果是随机把几个词堆积在一起,那肯定是负分(差评)。打分只有相对高低之分,并没有概率的特性。

有了这个对 f 的假设,C&W就直接使用pair-wise 的方法训练词向量。具体的来说,就是最小化下面的目标函数。

Deep Learning in NLP 词向量和语言模型 (一)

X 为训练集中的所有连续的 n 元短语,D 是整个字典。第一个求和枚举了训练语料中的所有的 n元短语,作为正样本。第二个对字典的枚举是构建负样本。x(w) 是将短语 x 的最中间的那个词,替换成 w。在大多数情况下,在一个正常短语的基础上随便找个词替换掉中间的词,最后得到的短语肯定不是正确的短语,所以这样构造的负样本是非常可用的(多数情况下确实是负样本,极少数情况下把正常短语当作负样本也不影响大局)。同时,由于负样本仅仅是修改了正样本中的一个词,也不会让分类面距离负样本太远而影响分类效果。再回顾这个式子,x 是正样本,x(w) 是负样本,f(x) 是对正样本的打分,f(x(w)) 是对负样本的打分。最后希望正样本的打分要比负样本的打分至少高 1 分。

f 函数的结构和Bengio 2003 中提到的网络结构基本一致。同样是把窗口中的 n 个词对应的词向量串成一个长的向量,同样是经过一层网络(乘一个矩阵)得到隐藏层。不同之处在于C&W 的输出层只有一个节点,表示得分,而不像Bengio 那样的有 |V| 个节点。这么做可以大大降低计算复杂度,当然有这种简化还是因为C&W 并不想做一个真正的语言模型,只是借用语言模型的思想辅助他完成 NLP 的其它任务。(其实C&W 的方法与Bengio 的方法还有一个区别,他们为了程序的效率用 HardTanh 代替 tanh 激活函数。)

他们在实验中取窗口大小 n=11,字典大小 |V|=130000,在维基百科英文语料和路透社语料中一共训练了 7 周,终于得到了这份伟大的词向量。

如前面所说C&W 训练词向量的动机与其他人不同,因此他公布的词向量与其它词向量相比主要有两个区别:

1.他的词表中只有小写单词。也就是说他把大写开头的单词和小写单词当作同一个词处理。其它的词向量都是把他们当作不同的词处理的。

2.他公布的词向量并不直接是上述公式的优化结果,而是在此基础上进一步跑了词性标注、命名实体识别等等一系列任务的 Multi-TaskLearning 之后,二次优化得到的。也可以理解为是半监督学习得到的,而非其他方法中纯无监督学习得到的。

不过好在Turian 2010年对C&W M&H 向量做对比时,重新训练了一份词向量放到了网上,那份就没上面的两个问题(确切的说应该是差别),也可以用的更放心。后面会详细介绍Turian 的工作。

关于这篇论文其实还是有些东西可以吐槽的,不过训练词向量这一块没有,是论文其他部分的。把吐槽机会留给下一篇博文了。

2.3M&H HLBL

AndriyMnih Geoffrey Hinton 2007年和 2008年各发表了一篇关于训练语言模型和词向量的文章。2007 年发表在 ICML上的《Threenew graphical models for statistical language modelling》表明了Hinton DeepLearning 战场扩展到 NLP 领域的决心。2008 年发表在 NIPS上的《Ascalable hierarchical distributed language model》则提出了一种层级的思想替换了 Bengio 2003 方法中最后隐藏层到输出层最花时间的矩阵乘法,在保证效果的基础上,同时也提升了速度。下面简单介绍一下这两篇文章。

Hinton 2006年提出 DeepLearning 的概念之后,很快就来 NLP 最基础的任务上试了一把。果然,有效。M&H ICML2007 上发表的这篇文章提出了“Log-Bilinear”语言模型。文章标题中可以看出他们其实一共提了 3 个模型。从最基本的 RBM 出发,一点点修改能量函数,最后得到了“Log-Bilinear”模型。

模型如果用神经网络的形式写出来,是这个样子:

Deep Learning in NLP 词向量和语言模型 (一)

这里的两个式子可以合写成一个 Deep Learning in NLP 词向量和语言模型 (一)C(w) 是词 w 对应的词向量,形如Deep Learning in NLP 词向量和语言模型 (一)的模型叫做 Bilinear 模型,也就是M&H 方法名字的来历了。

为了更好地理解模型的含义,还是来看这两个拆解的式子。h 在这里表示隐藏层,这里的隐藏层比前面的所有模型都更厉害,直接有语义信息。首先从第二个式子中隐藏层能和词向量直接做内积可以看出,隐藏层的维度和词向量的维度是一致的(都是 m 维)。Hi 就是一个 m×m 的矩阵,该矩阵可以理解为第 i 个词经过 Hi 这种变换之后,对第 t 个词产生的贡献。因此这里的隐藏层是对前 t−1 个词的总结,也就是说隐藏层 h 是对下一个词的一种预测。

再看看第二个式子,预测下一个词为 wj log 概率是 yj,它直接就是 C(wj) h 的内积。内积基本上就可以反应相似度,如果各词向量的模基本一致的话,内积的大小能直接反应两个向量的 cos 夹角的大小。这里使用预测词向量 h 和各个已知词的词向量的相似度作为 log 概率,将词向量的作用发挥到了极致。这也是我觉得这次介绍的模型中最漂亮的一个。

这种“Log-Bilinear”模型看起来每个词需要使用上文所有的词作为输入,于是语料中最长的句子有多长,就会有多少个 H 矩阵。这显然是过于理想化了。最后在实现模型时,还是迫于现实的压力,用了类似n-gram 的近似,只考虑了上文的 3 5 个词作为输入来预测下一个词。

M&H的思路如前面提到,是Bengio 2003 提出的。经过大牛的实现,效果确实不错。虽然复杂度没有数量级上的降低,但是由于是纯线性模型,没有激活函数(当然在做语言模型的时候,最后还是对 yj跑了一个softmax),因此实际的训练和预测速度都会有很大的提升。同时隐藏层到输出层的变量直接用了词向量,这也就几乎少了一半的变量,使得模型更为简洁。最后论文中M&H 用了和Bengio 2003 完全一样的数据集做实验,效果有了一定的提升。

来源:http://licstar.net/archives/328

PPV课转载的每一篇文章均来源于公开网络,仅供学习使用,不会用于任何商业用途,文章版权归原作者所有,如果侵犯到原作者的权益,请您与我们联系删除或者授权事宜,联系邮箱:149104196@qq.com。转载PPV课网站文章请注明原文章作者,否则产生的任何版权纠纷与PPV课无关。

PPV课-国内领先的大数据学习社区和职业培训平台

Deep Learning in NLP 词向量和语言模型 (一)

1、回复“数据分析师”查看数据分析师系列文章

2、回复“案例”查看大数据案例系列文章

3、回复“征信”查看相关征信的系列文章

4、回复“可视化”查看可视化专题系列文章

5、回复“SPPS”查看SPSS系列文章

6、回复“答案”查看hadoop面试题题目及答案

7、回复“爱情”查看大数据与爱情的故事

8、回复“笑话”查看大数据系列笑话

9、回复“大数据1、大数据2、大数据3、大数据4”查看大数据历史机遇连载

PPV课大数据ID:ppvke123(长按可复制)

本公众号专注大数据和数据科学领域,分享领域知识和相关技术文章,探索大数据商业价值,培养和挖掘大数据专业人才,欢迎大家关注!

原文始发于微信公众号(PPV课数据科学社区):Deep Learning in NLP 词向量和语言模型 (一)

原创文章,作者:ppvke,如若转载,请注明出处:http://www.ppvke.com/archives/15736

联系我们

4000-51-9191

在线咨询:点击这里给我发消息

工作时间:周一至周五,9:30-18:30,节假日休息