翻译 | 详解自然语言处理发展的点点滴滴
Posted Jerry的算法和NLP
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译 | 详解自然语言处理发展的点点滴滴相关的知识,希望对你有一定的参考价值。
《Recent Trends in Deep Learning Based Natural Language Processing》是一篇发表在IEEE Computational Intelligence Magazine 上的一篇论文,全文32页,详细讲述了有关自然语言处理发展的点点滴滴。
《Recent Trends in Deep Learning Based Natural Language Processing》:https://arxiv.org/pdf/1708.02709.pdf
原文翻译链接:https://zhuanlan.zhihu.com/p/51479851
阅读该文大概需要15分钟左右。
Abstract
深度学习方法利用多层处理结构来学习数据中的层次化表示,在很多领域都得到了SOTA的结果。最近几年,NLP领域涌现了大量的深度学习模型和方法,这篇文章总结了一些比较重要的在NLP领域广泛应用的深度学习方法,并回顾其发展历程。通过总结和对比不同的模型,让我们对NLP中的深度学习有了一个更详细的了解。
Introduction
自然语言处理(NLP)是一门为了自动分析和表达人类语言的理论驱动的计算机技术。NLP的研究最早可以追溯到打孔卡和批处理时代,在当时,处理一句话就要7分钟,而现在,我们可以在1秒钟内处理上百万的网页[1]。NLP 使得计算机可以执行各种各样不同层次的自然语言相关任务,从词性标注到机器翻译到对话系统。
深度学习架构和算法已经在诸如计算机视觉和模式识别领域取得了令人瞩目的成果。在这一趋势下,最近NLP领域的研究也日益聚焦到深度学习方法(Fig. 1)。几十年来,针对NLP问题的机器学习方法都是基于高维稀疏特征训练浅层模型(如SVM和logistic regression),在过去几年中,基于神经网络的稠密向量表示已经在很多NLP任务上得到了更好的结果,主要是词向量[2, 3]的成功和深度学习方法[4]引领了这一趋势。与此对比的是,基于传统机器学习的NLP系统往往依赖于手工提取特征,不仅费时费力,而且往往不全。
Collobert et al [5] 用一个简单的深度学习框架就在诸如命名实体识别、语义角色标注和词性标注等NLP任务上打败了最先进的方法。从那开始,大量的复杂的基于深度学习的算法被提出来解决各种NLP任务。这篇文章总结了在NLP领域广泛应用的深度学习方法,包括CNN,RNN,同时也讨论了memory-augment strategies、注意力机制以及最近的无监督模型、强化学习方法、深度生成模型如何用在NLP相关任务中。
这篇文章结构如下:第二部分介绍复杂深度学习模型的基础——分布式表示的相关概念;第三、四、五部分主要讨论主流模型,包括CNN,RNN等;第六部分是关于强化学习在NLP中的应用以及无监督句子表示学习;然后,第七部分阐述了近年来深度学习模型与存储模块结合的发展趋势;最后,第八部分总结了一系列深度学习方法在相关NLP标准数据集上的表现。
Distributed Representation
A. Word Embeddings
分布式词向量(Fig. 2)本质上遵循这样一个假设,意思相近的词趋向于出现在相似的上下文中。因此,这些词向量试图捕捉相似词之间的特征,能学到词汇之间的相似性是词向量的一个主要优点。有了词向量之后,词之间的相似度就可以用词向量的相似度来度量,比如余弦距离。词向量一般用于NLP深度学习模型中的第一层。通常而言,词向量是在大规模无标注语料上预训练得到的,预训练目标一般是额外定义的,比如基于上下文预测词[8, 3],这样学到的词向量能够捕捉到通用的句法和语法信息。所以,词向量在捕捉上下文相似性、类比性方面非常有效,而且由于词向量维度低,所以计算效率也非常高。
这些年来,用于产生词向量的模型一直是浅层神经网络,并不需要特别复杂的深度学习模型来生成词向量,然而,基于深度学习的NLP模型无一例外都是用的这些词向量,用来表示词、短语、甚至句子。词向量实际上是基于词计数的传统模型和基于深度学习的NLP模型的主要差异。所以,实际上可以说是词向量的广泛应用导致了NLP领域很多SOTA的诞生[9, 10, 11, 12]。
举几个例子,Glorot et al [13] 将词向量加堆叠降噪自动编码机用于领域自适用情感分类,Blunsom[14] 提出了使用组合分类编码器来学习组合句子。从这些例子中也能看出词向量的有效性及其应用的广泛性。
词的分布式表示通常是从上下文中学到的。在上个世纪90年代,相关研究进展就奠定了分布式语义研究的基础。详细情况可以参考早期综述[16, 17]。在这基础上,后来发展出了主题模型(LDA)和语言模型。这些工作奠定了自然语言表示学习的基础。
2003年,Bengio et al [7] 提出了一种可以学习词的分布式表示的神经网络语言模型(Fig. 3)。作者认为,有了词的表示,可以按词序列的联合概率来表示句子,这样可以产生指数级数量的语义相近的句子。因此,可以提升模型的泛化能力,比如,对于没见过的句子,模型可以通过见到的类似的词组成的类似的句子来学到相关性。
Collobert 和 Weston [19] 是第一个证明词向量预训练效果的。他们提出了一种奠基性的神经网络架构。这个工作也确立了词向量作为NLP任务有用工具的地位。然而,词向量的广泛普及却是Mikolov 等人 [3] 的功劳,他们提出了CBOW和skip-gram模型来有效构建高质量的分布式向量表示。他们的词向量表现出来的组合特效(意料之外的副产物)促使其快速流行开来,例如,两个词向量相加得到的词向量是对应的两个词的语义组合对应的向量,例如:vec('man') + vec('royal') = vec('king')。最近,Gittens等人 [20] 给出了这种行为的理论依据,这种组合性只在一定的假设下才成立:词向量在表示空间的分布必须是均匀的。
Pennington等人 [21] 提出的GloVe是另一个有名的词向量算法,其本质上是一种基于词计数的方法。首先,对词的共现次数矩阵进行归一化和对数平滑操作,然后基于最小重构误差对矩阵进行分解得到词的低维分布式表示。
下面,我们对Mikolov等人 [3] 提出的word2vec 进行简单介绍。
B. Word2vec
Mikolov等人[3] 提出的CBOW和skip-gram模型彻底改变了词向量并使其广为流传。CBOW计算给定上下文时目标词的条件概率,skip-gram恰恰相反,计算给定中心词时上下文词的条件概率。上下文定义为中心词汇左右两边各k个词。在无监督的情况下,词向量的维度由预测的精度决定,一般而言,词向量维度越大,预测精度越高,直到收敛到某个点。
下面我们具体来看一个简化版的CBOW模型,我们只考虑一个词作为上下文,这本质上是一个二元语法模型。
如Fig. 4所示,CBOW模型仅仅只是一个包含单个隐含层的全连接神经网络。输入层一共V个结点,V是词表大小,输入one-hot编码的上下文词汇,隐含层一共N个结点,输出层使用softmax归一化得到预估的词的概率分布。输入层和隐含层之间连接矩阵W大小为V*N,隐含层和输出层之间连接矩阵W'大小为N*V。 每个词均对应2个向量,上下文向量和目标词向量,分别对应W和W' 中与该词相连的参数。根据这个结构,可以得到给定上下文c时出现目标词w的概率:
然后通过优化对数似然概率得到模型参数
在通常的CBOW模型中,上下文词一般有多个,相当于输入向量中有多个1,隐含层h的结果就是所有上下文词向量的和,这样做的局限是由此得到句子的表示本质上是词袋模型,词之间组合、顺序都没法考虑。所以后来就有人提出了直接把ngram当成词来训练[23]。
由于词向量一般都是基于左右几个词作为上下文来训练,这样会导致另一个问题,比如“好”和“坏”的上下文可能差不多,最后就训练出来“好”和“坏”的词向量也近似[24],这种词向量用于情感分析就会出问题[25]。因此,Tang等人[26] 提出了sentiment specific word embedding,训练词向量的时候,在损失函数中引入情感极性作为监督信号来缓解该问题。
使用词向量时需要注意的是它们和具体任务高度相关,Labutov 和Lipson 等人[27] 提出了特定于任务的词向量,通过微调将词向量对齐到当前任务空间。由于从头开始训练词向量需要大量时间和资源,所以一般都是基于预训练的结果进行微调。为了缓解词向量训练慢的问题,Mikolov等人 [8] 提出了负采样的方法,训练模型的时候对负样本按频率采样。
传统的词向量算法一般都是每个词对应一个唯一的词向量,这也导致了无法处理一词多义的情况。在最近的研究中,Upadhyay等人[28] 提出了解决这一缺点的创新性方法。作者利用多语言平行语料来学习一词多义的词向量。比如,英语中的bank,翻译到法语就对应两个不同的词banc和banque,分别表示金融和地理学方面的含义,利用这种多语言分布信息有助于解决一词多义问题。
表I 列出了现有流行的词向量计算框架。
C. 字向量
虽然词向量可以捕捉句法和语义信息,但是对于像词性标注和命名实体识别这样的任务而言,单词内部形态和形状等信息也非常有用。就目前而言,基于字级别来构建自然语言理解系统已经吸引了一定的研究关注[29, 30, 31, 32]。在形态学信息丰富的语言上,在相关NLP任务上利用字的表征信息已经取得了更好结果。Santos 和 Guimaraes [31] 利用字的表示加上词向量在葡萄牙语和西班牙语命名实体识别上取得了最好的结果。Kim 等人[29] 仅利用字嵌入向量构建神经语言模型并取得了不错的结果。Ma 等人 [33] 在做命名实体识别的时候利用了好几种嵌入向量,包括trigram 字向量,将原始信息和分层信息结合起来用于训练label的嵌入表征。
对于词汇量大的语言来说,一个常见的现象是存在大量未登录词,也叫袋外词。基于字的表征天然就能处理这种情况,因为每个词都是由字构成的。在有些语言中,文本本身是由字构成的,词的语义由字的组合决定,比如中文,基于字的表征构建系统还可以避免分词的问题[34]。 因此,在这些语言上很多深度学习的工作都倾向于基于使用字向量[35]。比如,Peng等人 [36] 证明了radical-level processing可以显著提升情感分类性能,作者提出了两类中文radical-based分层嵌入,结合了radical和字级别的语义以及情感极性信息。Bojanowski等人 [37] 也尝试在形态学信息丰富的语言中用字的表示信息来改善词的表示。他们采用了skip-gram的方法将词表示为字符的ngram,因此他们的模型一方面具有skip-gram的优点,同时也解决了词向量中长期存在的问题。而且该方法速度快,可在大规模语料上快速训练模型,这就是著名的FastText,在速度、可伸缩性和有效性方面均优于之前的方法。
除了字向量之外,学者们也提出了很多其他方法来解决未登录词的问题。Herbelot和Baroni等人 [38] 提出了一种动态处理OOV的方法,将未登录词初始化为上下文词向量的和并且使用较大的学习率进行微调,然而,他们的方法有待在典型NLP任务上进行测试。Pinter等人 [39] 提出了一种有趣的方法,通过训练字向量来重建预训练的词向量,这使其可以学到从字组合成词的组合映射,从而可以处理未登录词问题。
尽管词向量越来越火,最近也出现了一些关于其relevance in the long run的讨论。例如,Lucy和Gauthier等人[40] 最近尝试评估词向量如何捕捉单词概念意义的必要方面,作者发现,词向量在感知理解单词背后的概念方面存在严重局限性,因为这些不是仅从分布语义表征就能推断。缓解这些缺陷的一个可能的方向是grounded learning,它在这个领域已经越来越流行。
D. Contextualized Word Embeddings
词向量的好坏一般体现在其捕捉句法信息及处理多义词的能力,这些能改善词向量的语义特性。最近有一些方法开始研究如何把上下文的信息融合进词向量,比如通过使用更深的网络将词向量表示为上下文的函数。
传统的词嵌入方法,比如Word2Vec和GloVe都是对每个词计算一个全局唯一的词向量,然而,一个词在不同的上下文中往往表达的语义也不同。比如,"The bank will not be accepting cash on Saturdays" 和 "The river overflowed the bank" 两句话里的bank语义明显不同。合理来讲,上面两句话中的bank应该需要两个不同的词向量。因此,新出现了一类词向量模型,与传统词向量模型的不同之处在于,每个词的表征不是全局静态的,而是与词所在的上下文相关的。
ELMo [41] 就是这类方法之一,ELMo 利用每个词所在的上下文来生成该词的词向量,因此可以表达词在不同句子中的不同意思,比如,对于在N句话中都出现过的词w而言,ELMo可以为w生成N个不同的词向量。
ELMo的计算主要是基于从双向语言模型中获得的表征。双向语言模型包括两个语言模型,一个前向的和一个后向的。每个语言模型都是L层的LSTM构成,每一层LSTM的输出都是输入层的deep contextual representation,最后计算词向量的时候,会用到词的原始表征以及两个语言模型的各个隐含层的表征,一共2L+1个
上式中
是softmax归一化的权重,用来组合不同层的表征,
是任务相关的超参数,主要是为了调整词向量的数值范围方便优化。据Peters 等人 [41] ,将ELMo和原词向量结合使用总能得到更好的结果。
在这不久之后,预训练语言模型就受到越来越多的关注[43]。因为语言模型具备自然语言理解和生成的多重特性,所以被选作预训练的目标。一个好的语言模型需要能学到语言的复杂特性,包括句法特征以及语义一致性。通过预训练语言模型,可以为词向量注入更丰富的语言特征,因此比随机初始化效果要好。生成式模型预训练一般需搭配判别式模型微调,因为预训练是无监督的、缺乏人工标注信息。
Radfrod等人 [44] 提出了一种类似的预训练模型,OpenAI-GPT,采用了Transformer的结构。最近,Devlin等人 [45] 提出了BERT,也是用的transformer网络结构,与ELMo和OpenAI-GPT不同的是,BERT在预训练的时候,按一定比例随机掩盖训练语料中的一些词,然后让模型来预测被掩盖的词,除此之外,还引入了另一个训练目标,给定当前的句子预测下一个句子,这个目标尝试对句子之间的关系进行建模,这是传统的语言模型预训练无法做到的。最终,BERT在诸如QA、NLI等一系列关键NLP任务上以显著优势击败了当前最优结果。
上述上下文相关的词向量能改善模型效果,预训练深度语言模型以迁移学习的方式为下游任务提供了一个良好的开端。这些方法在计算机视觉领域已经广为流行,这是否是NLP领域的未来趋势呢?研究人员在传统模型和这些新方法中如何抉择呢?未来见分晓。
Convolutional Neural Networks
随着词向量的普及,需要有一种有效的特征抽取函数,来从底层词向量提取高层次特征,然后这些高层特征可以用于各种NLP任务,比如情感分析、自动摘要、机器翻译和问答等。鉴于CNN在计算机视觉中的出色表现[46, 47, 48, 49],很自然的人们尝试将其用到NLP任务中。
将CNN用于句子建模最早可以追溯到Collobert和Weston等人 [19]的研究,他们利用多任务学习来预测多个NLP任务,包括词性标注、命名实体识别、语义角色标注和语言模型。他们首先利用查找表将词映射到向量(Fig. 5)。
这可以看成是一种原始的词向量方法,词向量是在模型训练的时候学到的。后来,Collobert [5] 对这个工作做了进一步拓展,提出了一个基于CNN的通用框架来解决各种NLP任务。这些工作引导了CNN在NLP研究者中的普及。鉴于CNN在计算机视觉中的出色表现,人们很容易相信将其用于NLP效果也会不错。
CNN可以从输入的句子中提取显著的n元语法特征,从而得到信息量丰富的潜在语义表征用于下游任务。Collobert [5],Kalchbrenner [49],Kim [50]等人率先将CNN用于NLP任务中,直接导致后续相关研究中出现了大量的基于CNN的网络结构,下面,我们简单描述基于CNN对句子建模的原理:
A. Basic CNN
1)句子建模:对于每个句子,记
为句子中第i个词的词向量,其中d是词向量维度。假设句子中有n个词,那么句子就可以表示为
,Fig. 6描述这样一句话是如何作为CNN框架的输入。
CNN的计算过程如下:
其中
是从i个词开始的连续h个词对应的词向量的拼接,h是CNN 卷积核的宽度,b是偏置项,最后将所有位置的输出拼起来就得到了特征映射向量
在CNN中,一般会用多个大小不同的卷积核,每个卷积核可以抽取特定的n元语法特征。卷积层后面一般会接上最大池化层,相当于在所有卷积核输出中选最大的,这样做主要有两个理由:
首先,经过最大池化后,可以得到长度固定的输出,一般做分类任务的都要求最后一层输出维度是固定的。通过池化层,输入长度不一样的句子,最后都能得到长度相同的向量。其次,最大池化可以有效降低输出维度同时保存最显著的n元语法特征。这是通过位置不变性来保证的,因为每个卷积核都可以从任何位置提取特征(比如,表示否定的词)然后加到最后的特征映射中。
词向量可以随机初始化也可以在大量无标注语料上预训练得到(如第二章所述),预训练的方式往往效果更好,特别是有标签样本特别少的时候[50],然后后面可以叠加卷积层和最大池化层,这样就得到了深度CNN网络。深度CNN网络有助于挖掘句子中包含丰富语义信息的高层抽象表示。越深层的卷积核可以覆盖更多的词直到覆盖整个句子,从而能得到句子全局特征表示。
2)基于窗口的方法:上面提到的CNN架构可以对整句话建模,然而,在很多NLP任务中,比如命名实体识别、词性标注以及语义角色标注中,我们需要对每个词都预测一个输出。为了将CNN用于这一类任务,基于窗口建模的方法被提出来了,这是基于这样一个假设:一个词对应的标注往往取决于其相邻的词。所以,基于窗口建模的方法,将每个词及其左右窗口内的词看成是一个子句,然后用句子建模的方法对这个子句建模。基于这种方法,Poria等人 [52] 利用多层次的深度CNN对句子中每个词进行标记,辅以一系列语言学特征,他们的集成模型在aspect detection上表现良好。
词级别的分类终极目标是输入一句话输出一个标签序列。在这种情况下,利用条件随机场之类的结构化方法往往能捕捉相邻标签之间的依赖关系,从而产生更一致的标签序列,最后得到路径最优的标签序列[53]。
为了覆盖更大的上下文范围,经典的窗口建模方法往往会结合时延神经网络(TDNN)[54],在整个序列的所有窗口上执行卷积操作,这些卷积通常具有固定宽度的卷积核。经典的窗口方法仅仅考虑要标记的单词周围的窗口中的单词,但时延神经网络可以同时考虑句子中所有单词窗口。需要的话,TDCNN也可以像CNN一样堆叠起来以提取底层局部特征和高层全局特征。
B. Applications
在这一部分,我们总结了将CNN用于NLP的一些关键工作,这些工作在提出来时都是最先进的。
Kim [50] 将上述CNN网络用于各种句子分类任务中,包括情感分类,实体分类和问题类别分类,最后都取得了有竞争性的结果。这个工作提出的模型结构非常简洁而且有效,所以马上就被很多研究者采纳。随机初始化的卷积核随着训练的进行,最终变成了有效的n元语法提取器(Fig. 7)。这个网络虽然很有效,但由于太简单也存在很多缺点,CNN无法有效建模长程依赖是主要问题。
Kalchbrenner等人[49]发表了一篇著名文章提出了动态卷积网络(DCNN)对句子语义建模,一定程度上缓解了上述问题。他们的主要策略是动态k最大池化(dynamic k-max pooling),对于给定的序列p,从中挑出k个最大特征,并且保持原来的顺序,如Fig. 8所示。基于时延网络的思想,加上k-max pooling,得到最后的模型。这种模型结构可以用较小的卷积核覆盖到较广的范围,有利于积累句子中的关键信息。从Fig. 8中能看出,高层特征覆盖的句子范围差异很大,有些可以聚焦在很少的词上,有些却能覆盖整个句子。他们的模型在大量任务上都取得了显著的结果,包括情感分类和句式分类。总体来讲,这项工作分析了单个卷积核在建模上下文语义的时候的覆盖范围并提出了一种扩展其覆盖范围的方法。
涉及到情感分析的任务往往需要提取和情感极性相关的特征 [55]。Ruder等人 [56] 利用CNN建模同时在输入中接上一个aspect vector最终取得了不错的结果。对于长文本和短文本,CNN建模的效果也有差异,比如Johnson和Zhang [56] 的研究中就发现在长文本上的表现优于短文本。Wang 等人 [57] 提出用CNN来对短文本建模,由于缺乏足够的上下文信息,往往需要引入额外信息来保证得到有效的句子表示,作者提出了一种语义聚类的方法,可以通过引入多尺度的语义单元作为附加信息辅助短文本CNN建模。实际上,需要丰富的上下文信息可以算是基于CNN模型的一个局限性。涉及到短文本的NLP任务使用基于CNN的模型时往往需要借助额外信息和外部知识才能获得预期表现。这一事实在另一个基于CNN做的推特文本讽刺检测[58]的研究中也得到了证明。要达到预期效果,一般都需要额外辅助信息,比如可以利用表情数据集、情感数据集或者个人数据集进行预训练。
CNN在其他NLP任务上也有广泛的应用。比如,Denil等人[59]将DCNN用于文本摘要,同时在句子级别和文章级别训练DCNN卷积核,多层次的训练可以融合底层词特征信息到高层语义概念中。这项工作的重点是介绍如何对学到的表示进行可视化,对模型学习过程和文本自动摘要都提供了有洞察性的见解。
CNN模型不仅可以用于句子分类任务,也可用于涉及到语义匹配的任务[60]。比如,信息检索的一项研究[61]就用到了和上述类似的CNN模型(Fig. 6),CNN用来将query和document映射到固定维度的语义空间,然后就可以用余弦相似度来做排序。该模型试图通过考虑单词序列中的时间上下文窗口来提取query和document中的丰富上下文结构。这捕获了单词n-gram级别的上下文特征。 然后通过卷积和最大池化层发现显著的单词n-gram,然后将其聚合以形成整个句子向量。
在问答领域,Yih等人[62]提出可以通过度量问题和知识库中条目的相似度来决定在回答问题时需要从知识库中寻找什么样的支撑事实,计算语义表示时用到了类似Fig. 6的CNN框架。和文本分类不同的是,监督信号来自于query-document正负样本对,而不是文本类别。随后,Dong等人[63]提出了multi-comumn CNN(MCCNNN)来从多个方面分析理解问题,MCCNN使用了多路网络结构从包含答案类型和输入问题上下文的方面提取信息,通过将知识库中的实体和关系用低维向量表示,然后用问题-答案对来训练CNN模型用来对候选答案排序。Severyn和Moschitti在建模问题和答案时也用到了CNN网络,他们还在词向量中加入了问题和答案词与词的匹配特征,这种基于CNN的简单网络最终得到了与最先进的方法相媲美的结果。
在CNN中,为了捕捉句子中最重要的信息,通常是在后面加最大池化层,然而,这种操作经常会丢失包含多个事实的句子中有价值的信息。为了克服多事件建模中信息丢失的问题,Chen等人[65]提出了改进版的池化策略:动态多路池化(DMCNN),在一般池化操作的基础上引入事件触发机制,以便从池化层保留更多关键信息。
CNN网络本质上提供了局部连接、权值共享、池化等特征,这在一定程度上提供了很多任务都需要的不变性。语音识别就需要类似的不变性,在语音信号中由于说话人不一样频率差异很常见,因此,Abdel-Hamid等人[66]使用了一个混合CNN-HMM模型,该模型对沿频率轴的频移提供了不变性,他们还用了有限的权值共享,这导致池化层的参数减少,从而降低了计算复杂性。Palaz等人[67]用原始语音作为输入,对基于CNN的语音识别系统进行了广泛的分析,他们展示了CNN直接建模原始语音输入和因素之间关系的能力,构建了一个健壮的语音识别系统。
类似机器翻译的任务依赖词之间的先后顺序以及长程依赖关系,因此,结构上不太适合CNN网络。随后,Tu等人[68]通过考虑翻译句对之间的语义相似性和各种的语境来解决这个问题,虽然没有解决词语保序的问题,但也能得到与其他基线差不多的结果。(译者注:transformer貌似就是做翻译的,attention is all you need)
总体来讲,CNN网络在挖掘上下文窗口的语义线索方面非常有效,然而,CNN模型参数多,需要大量训练数据,当数据不足时就有问题。CNN的另一个问题是无法对长程上下文信息建模,也无法在表示中保存顺序[49, 68],针对这类问题,其他的类似递归神经网络可能更适合。
Recurrent Neural Networks
递归神经网络(RNN)[69]使用了处理序列信息的思想,这里用了“递归”这个词,因为它们对序列的每个单元执行相同的操作,每个时刻的操作都依赖于上一时刻操作的结果。通常来讲,将序列中的基本单元一个接一个输入到递归神经网络就能得到长度固定的向量作为序列的表征。在某种程度上,RNN对之前的计算有“记忆”,并且能将这种信息用于当前计算。这个模板自然地就适用于NLP的很多任务,比如语言模型[2, 70, 71],机器翻译[72, 73, 74],语音识别[75, 76, 77, 78],看图说话(image captioning)[79],所以,RNN模型最近在NLP的应用上越来越受欢迎。
A. Need for Recurrent Networks
在这一部分,我们分析了一系列大量用到RNN模型的NLP任务的基本特性。由于RNN对序列中的基本单元进行顺序处理,所以能捕捉语言中固有的顺序特性,在语言中,基本单元可以是字符、词甚至是句子。语言中的词的语义往往受到句子中上一个词的影响,举个简单的例子来说明,比如“狗”和“热狗”。RNN是为了处理语言或者类似序列建模任务中的上下文依赖关系而量身定制的,这也是很多研究者在相关领域使用RNN而不是CNN的原因。
RNN可以处理不同长度的文本,包括句子、篇章甚至文档,这也是其适合用于序列建模的另一个原因。不像CNN,RNN的计算非常灵活,提供了更强的建模能力,理论上可以捕捉无限长的上下文信息。这种可以处理任意长度输入的能力也是RNN的相关工作的主要卖点[81]。
很多NLP任务需要对整个句子的语义进行建模。这涉及到在一个固定维度的超空间中构建句子的“总结”。RNN对句子的总结能力使其在机器翻译[82]等任务中用得越来越多,在这些任务中,整个句子先被表示为一个向量,然后映射回可变长度的目标序列。
RNN还可以支持时间分布式联合处理,诸如词性标注[32]的大部分序列标注任务就属于这一类,更具体的应用比如多类别文本分类[83],多通道情感分析[84, 85, 86],以及subjectivity detection[87]。
上面列举了几个研究人员选择RNN的一些主要原因。然而,如果就此认为RNN网络比其他深度神经网络要好那就大错特错了。最近,也有很多研究做了相关对比实验证明CNN效果更好,甚至在一些RNN天然很适用的任务中,比如语言模型,CNN都取得了有竞争力的结果[88]。在对句子建模的时候,CNN和RNN有不同目标,RNN可以将有任意长度的上下文的句子揉进一个向量表征里面,而CNN倾向于抽取其中最重要的n元语法特征,虽然实践证明CNN是一种有效的n元语法特征提取方法,而且这在某些特定的任务上已经足够,比如句子分类,但是CNN对词序的敏感性有一定局限性,也无法处理长程依赖关系。
Yin等人[89]提供了一个有趣的视角来比较RNN和CNN的效果,通过在大量NLP任务上进行测试,包括情感分类、问答、词性标注等,最后的结论是:没有明确的赢家,实验结果往往取决于具体任务对全局语义的需求。
下面,我们讨论下广泛使用的RNN模型。
B. RNN models
1)Simple RNN:RNN在NLP中的应用主要是基于Elman等人[69]最初设计的3层网络结构。Fig. 9展示了一个沿时间轴将整个序列展开的通用RNN网络结构,图中
是网络在t时刻的输入,
是t时刻网络的隐藏层状态,其计算公式如下:
从公式中可以看出 的计算不仅依赖当前时刻的输入还依赖上一时刻的隐藏层状态,f是非线性激活函数,比如tanh,ReLU等,U和W是网络参数,在所有时刻是共享的。在NLP的应用中, 通常就是one-hot编码或者是词向量,有时候也可以是文本的表示。
RNN网络的隐藏层状态通常是其最关键的部分,如上所述,隐藏层状态可以看成是网络对当前时间点之前的信息处理的记忆。然而,实际上,这一类简单的RNN网络存在著名的梯度消失问题,这使得网络参数很难训练,特别是离输出层较远的层。
为了解决梯度消失问题,各种基于RNN的变种被提出来,比如LSTM,GRU,ResNets,前两者是在NLP中用得最多的RNN变种。
2)Long Short-Term Memory:如Fig. 10所示,LSTM在原始RNN上加入了遗忘门,这独特的机制使其能在一定程度上解决梯度消失和梯度爆炸的问题。
与原始RNN不同的是,LSTM可以让梯度后向传播到任意长的步数。我们来看看LSTM中的几个主要的“门”:输入门,遗忘门和输出门,它们涉及的计算如下:
3)Gated Recurrent Units:RNN的另一变种是GRU[82],如Fig. 10所示,相比LSTM简单一些,而且在很多任务上取得了和LSTM近似的效果。GRU主要包含2个门,重置门和更新门,具体计算如下:
NLP领域的研究者和开发者经常面临到底选LSTM还是GRU的困惑。纵观历史,选LSTM还是GRU大多数时候都是启发式的,Chung等人[81]针对以上提到的3种RNN进行了比较,虽然不是在NLP任务上,他们做的复调音乐建模和语音信号建模,结果表明LSTM和GRU比传统的RNN明显要好(他们用了tanh激活)Fig. 11,然而,LSTM和GRU相互之间没有明显优势,其他研究也得到了类似的结论,所以,LSTM和GRU到底怎么选很多时候取决于其他因素,比如计算资源等。
C. Application
1)基于RNN的词粒度分类:RNN在词粒度分类方面有着广泛的应用,而且在很多任务上都取得了最先进的结果。Lample等人[93]提出使用双向LSTM来做命名实体识别,打破了固定窗口大小的限制,可以捕捉任意长度上下文信息,在最后一层使用了CRF。
在语言模型建模方面RNN相对传统的基于计数的方法有相当大的改进,Graves[94]在这方面做了开创性的工作,通过引入RNN来对建模复杂有较长上下文的复杂句子,除此以外,作者还提出了使用多层RNN来提升模型效果,这项研究也确立了RNN网络在NLP之外的任务上的应用。随后,Sundermeyer等人[95]在基于当前词预测下一个词的时候比较了前馈神经网络(feed-forward network)和RNN的效果,在这项研究中,他们提出了一种典型的层次网络结构来做语言模型建模,结果表明,前馈神经网络效果比传统的基于计数的方法要好,基于RNN和LSTM的网络效果要比前馈神经网络好,他们提出的一个重要的点是,他们的结论适用于其他各种任务,例如统计机器翻译[96]。
2)基于RNN的句子粒度的分类:Wang等人[25]提出了使用LSTM来对推文进行编码,然后用于推文情感极性预测,这种简单策略得到了与复杂网络DCNN可比的结果,DCNN是Kalchbrenner等人[49]提出用于赋予CNN捕捉长程依赖的一种网络结构。在针对否定短语的案例研究中,作者还发现LSTM可以捕捉到否定词not的反转效应。
和CNN类似,RNN的隐藏层状态也能用于文本的语义匹配。在对话系统中,Lowe等人[97]提出使用Dual-LSTM来匹配问题和候选答案,先将句子编码成固定长度的向量,然后基于点积相似度来对候选答案排序。
3)基于RNN的文本生成:NLP中一个有挑战性的任务就是文本生成,这也是RNN的另一个应用。基于文本或视觉数据,深度LSTM被证明可用于机器翻译、image captioning等特定任务生成合理的文本,在这种情况下,RNN被称为解码器。
在[74]中,作者提出了一种通用的编码-解码框架可以用于句子到句子的映射,其中的一个LSTM用于将输入的句子编码成一个长度固定的向量,这个LSTM也叫编码器,输入的句子可以是机器翻译任务中的“源语言”,或者是问答系统中的问题,或者是对话系统中的消息,这个固定长度的句子然后被用作另一个LSTM的初始状态,这个LSTM也叫解码器。在预估阶段,解码器一步一步生成最后的文本,每一步的生成结果同时会更新解码器的状态。beam-search经常被用于来搜索近似最优的解码序列。
Sutskever等人[74]将4层LSTM用于端到端机器翻译任务,也得到有竞争力的结果,同样的编码-解码框架还被用于建模人类对话[99],在100M message-response pair的数据上训练后,LSTM的解码器在开放域对话中可以产生非常有趣的回复。在解码的时候,通常会给解码器一个额外的输入以便产生特定的效果,比如在[100]中,作者提出可以将包含说话人个人信息的角色向量作为解码器的条件输入。在上面几个例子中,文本的生成主要是基于文本输入的语义表征向量,类似的框架也可以用于基于图像的文本生成,如Fig. 12所示,视觉特征向量用于解码器的条件输入。
视觉对话是另一个文本生成任务,需要同时用到文本和视觉的信息。Malinowski等人[101]首先提出了一个端到端的模型,如Fig. 13所示,模型输入的是CNN编码的图像信息以及LSTM编码的文本信息,然后基于这些信息来解码答案。
Kumar等人[102]提出了一个复杂的动态记忆网络(DMN)来处理视觉对话的问题,这个网络有4个子模块,主要思路是反复对输入文本和图像计算attention,在迭代中不断改进获取的特征信息。注意力网络被用于细粒度地关注输入文本短语。
D. Attention Mechanism
传统的编码-解码框架一个潜在的问题是编码阶段有时候会将和任务不相干的信息也一并编码,如果文本很长或者信息很丰富并且不能进行选择性编码的时候,传统的编码-解码框架也有会问题。
比如,文本摘要的任务可以看出是一个sequence-to-sequence的任务,输入是原文,输出是压缩后的摘要,直观来看,要将整个句子都编码到一个固定长度的向量很不现实,特别是原文有可能特别长,在机器翻译中也要类似的问题[103]。
在文本摘要和机器翻译等任务中,输入和输出之间存在着一定的对齐关系,也就是说,输出的词和输入句子中的某一部分有很强的相关性。这种直觉启发了注意力机制的诞生。注意力机制通过在解码阶段同时考虑编码结果和输入来缓解上述传统编码-解码框架的问题。具体来讲,在解码阶段,除了隐藏层的状态和上一步解码的结果之外,解码器还会利用一个基于输入句子的隐藏层状态计算得到的上下文向量。注意力机制可以认为是输入一个query向量和一个key-value集合,然后输出结果向量,结果向量是value向量的加权和,加权的权重是根据query向量和key向量之间的相似性计算得到,得到的结果向量作为上下文输入解码器用于解码。
Bahdanau等人[103]首先将注意力机制用来提升机器翻译的效果,特别是长句的效果。在他们的研究中,注意力信号是根据解码器最后的隐藏层状态利用多层感知机计算得到的,通过将解码阶段每一步计算得到的注意力信号可视化,可以发现源语言和目标语言之间存在着明显的对齐关系,如Fig. 14所示。
Rush等人[104]将注意力机制方法应用于文本摘要任务。其中摘要中的每个输出词都通过注意机制以输入句子为条件得到的。作者进行了抽象概括摘要,不同于传统的抽取式摘要,这种方法的优势在于扩展性非常好。
在image captioning方面,Xu等人[105]也用到了注意力机制,在LSTM解码的时候注意到输入图像的不同部分,注意力信号是根据上一步解码器隐藏层状态和CNN特征一起计算得到的。在[106]中,作者通过解析树线性化将语法分析问题建模成sequence-to-sequence任务,事实证明,注意力机制在这项研究中更有数据效率(需要更少数据就可以得到同等效果)。利用输入序列信息的的另一个方法是一定的条件下直接复制输入句子的单词或句子片段到输出句子中[107],这在诸如对话和文本摘要的任务中是非常有用的,解码的每一步都需要决定是直接复制还是生成[108]。
在细粒度情感分析方面,Wang等人[109]提出了基于注意力机制的解决方案,在分类的时候使用aspect embedding来提供额外信息(Fig. 15),注意力模块用来聚焦句子中对aspect 分类有影响的部分,如Fig. 17所示,对于a)中的aspect “service”来说,注意力模块动态聚焦于短语“fastest delivery times”,对于b)中的aspect “food”,注意力模块聚焦了居中多个关键词包括“tasteless”和“too sweet”。最近,Ma等人[110]使用带有层次化注意力机制的LSTM来利用常识进行targeted aspect-based情感分析,层次化注意力包括目标层面的注意力和句子层面的注意力,以利用常识性知识进行针对性的细粒度情感分析。
在另一方面,Tang等人[111]采用了基于记忆网络的解决方案(也叫MemNet[112]),其中使用了多跳(multiple-hop)注意力,通过在记忆网络上使用多重注意力机制有助于找到记忆网络中信息量最大的区域随后来帮助分类,他们的工作也代表了这个领域的最先进技术。
鉴于注意力机制的直观适用性,NLP研究者们仍然在积极地研究,并将其用于越来越多的任务。
E. Parallelized Attention:The Transformer
CNN和RNN在编码-解码框架中的句子转换模块都起着至关重要的作用。注意力机制,如上所述,则进一步提升了这些模型的能力。然而,这个框架的瓶颈之一是编码阶段必须按顺序处理,为了解决这个问题,Vaswani等人[113]提出了Transformer结构,完全抛弃了编码过程中包含的递归和卷积,完全基于注意力机制来捕捉输入和输出之间的全局关系,使得整个框架变得更容易并行化,在诸如翻译和解析等任务上训练时间大大减少的同时也能不错的效果。
Transformer编码和解码部分都包含堆叠的多层结构,每一层由两个子层构成,多头注意力层(Fig. 16)后面跟着一个前馈网络层。给定queries Q、keys K和values V,多头注意力模块重复计算h次注意力,具体计算如下:
其中的W是网络参数。结合残差连接[114],层规范化[115],dropout,位置编码等技术,Transformer在英语-德语和英语-法语翻译以及句法成分分析等任务上取得了最先进的结果。
V. Recursive neural networks
递归神经网络是序列建模的一种自然方式,然而自然不仅像一般的序列一样在时间维度上具备先后和依赖关系,还具备层次化的结构关系,比如由词构成短语、由短语构成句子,这种层次化的结构关系可以用句法分析树来表示。因此,树形结构模型被提出来以便更好地利用这种句法成分结构[4]。具体来说,在递归神经网络中,解析树中的每个非叶子节点的表征有其儿子节点决定。
A. Basic model
在这一部分,我们描述递归神经网络的基本结构。如Fig. 18所示,网络g定义了短语和单词(b,c or a, p1)的组合函数,用来计算高层短语的表征(p1 or p2)。所有结点的表征有着相同的形式。
Socher等人[4]给出了这一模型的多个变种,其最简单的形式如下:
每个结点的表征都是一个d维的向量,W是网络参数,
另一个变种是MV-RNN[116],主要思想是将每个词或短语用一个向量和一个矩阵来表示,当两个结点一起用来构成高层结点时,两个结点的表征向量要乘以对方的表征矩阵,具体如下:
其中,
,与最简单的形式相比,MV-RNN用对应的子结点的矩阵来参数化子结点构成父结点的函数。
后来又有人提出了递归张量神经网络(RNTN),在输入向量之间引入了更多的交互,而不像MV-RNN那样参数量特别大,RNTN计算如下:
其中, 是一个定义了多个双线性变换的张量。
B. Applications
递归神经网络一个很自然的应用就是解析[10],通过在短语表征上定义评分函数来评估该短语的合理性,通常也会用到beam-search来搜索最佳的解析树,训练的时候采用最大边际目标来优化[117]。
基于递归神经网络和解析树,Socher等人[4]提出了一个短语级别的情感分析框架(Fig. 19),解析树中的每个结点都可以打上情感标签。
Socher等人[116]通过为最小构成单元构建单个成分语义,从而来对句子中的语义关系(如因果关系)或者主题信息来进行分类。Bowman等人[118]提出用递归神经网络来对句子间的逻辑关系进行分类,两个句子的表征喂给另一个神经网络来进行分类,他们的研究表明,无论是简单版的或者是张量版的递归升级网络在文本蕴含数据集上都取得了有竞争力的结果。
为了避免梯度消失问题,LSTM单元也有被用于树形结构中[119],研究结果表明,树形结构得到的句子表征要优于线性LSTM模型,特别是在情感分析和句子关系测试的数据集上有明显提高。
VI. Deep Reinforced Models and Deep Unsupervised Learning
A. 强化学习用于句子生成
强化学习通过训练一个agent来执行一些离散的行为以获得奖励。在NLP中,文本生成问题可以被建模成强化学习的问题。
在原始公式中,RNN语言生成器通常通过在给定当前隐藏状态和之前的预测结果来最大化语料中句子的最大似然概率来训练。这种方案也叫“teacher forcing”,训练的时候每一步都有真实的数据作为前缀序列,然而在测试的时候,没有真实的前缀序列,所以只能用模型生成的结果作为前缀序列。这种训练和预测之间的偏差,也叫“暴露偏差”(exposure bias)[120, 121],在生成的时候,错误会不断快速累积。
基于词级别的最大似然估计的另一个问题是,在训练自回归生成语言模型时,训练目标和测试的指标不一致。评估这些任务(机器翻译,对话系统等)的指标一般是基于n-gram重叠的指标(BLEU,ROUGE),而如何通过词级别的训练方式来优化这些指标目前尚不明确。根据以往经验,基于词级别最大似然训练出来的对话系统往往会得到枯燥和短视的回答[122],用于文本摘要则容易产生不连贯或者重复的摘要[108]。
强化学习提供了在一定程度上解决上述问题的前景。为了直接优化不可微的评估指标,Ranzato等人[121]使用REINFORCE算法[123]来训练基于RNN的模型用于一系列序列生成任务(例如,文本摘要,机器翻译和图像字幕),与之前的监督学习方法相比得到了提升。在这个框架中,生成模型(RNN)可以看作是一个代理(agent),用于和外部环境进行交互(外部环境是指每个时刻看到的单词以及上下文向量)。代理的参数定义了其策略(policy),策略的执行会导致代理选择一个动作(action),也就是在每一步的时候预测下一个单词,每次执行完一个动作代理都会更新其内部状态(RNN的隐藏层单元),一旦预测完一句话,代理都会得到一个奖励(reward),奖励可以是开发者根据具体任务量身定制的,比如,Li等人[122]基于易用性、信息流和语义连贯性为生成句子定义的3个奖励函数。
强化学习有两个众所周知的缺点,首先,为了使强化学习可行,必须仔细处理状态和动作空间[124, 125],但这最终又可能会限制模型的表达和学习能力;其次,因为奖励函数需要训练,所以这也使得模型运行时评估[126, 127]。
另一个序列级别的监督学习方案是是使用对抗训练技术[128],语言生成器的训练目标是欺骗另一个训练好用来区分生成数据和实际数据的判别器。生成器G和判别器D是在min-max game中联合训练的,理想情况下得到的生成器G能生成无法与真实数据区分的序列。这种方法可以看成是生成对抗网络的变种[128],生成对抗网络往往会以某种输入作为前提(比如,图像字幕中的源图像)。实际中,上述方案可以用策略梯度强化学习框架实现。在对话系统中,鉴别器就类似于人类图灵测试者,用来区分人类和机器产生的对话。
B. Unsupervised sentence representation learning
和词向量类似,句子的分布式表征也可以用无监督学习的方式得到。通过无监督学习的方式可以得到“句子编码器”(sentence encoder),可以将任何句子都映射到一个固定长度的向量用于捕捉语义和句法特征。通常而言,需要定义一个额外的任务来辅助训练。
和词向量里面的skip-gram[8]模型比较类似,skip-thought[130]模型被提出来用于学习句子表征,其中的辅助任务是给定两个句子预测其先后顺序关系,训练的时候使用seq2seq的模型框架,其中一个LSTM将句子编码成向量,另外两个LSTM再将向量解码来生成目标句子,训练流程采用标准的seq2seq方式,训练完后,其中的编码器就可以看出是一个通用的特征提取器(训练完同时也得到了词向量)。
Kiros等人[130]在一系列句子分类任务上验证了学到的句子编码器的效果,将句子编码器得到的静态特征接入简单的线性模型,最后也能得到有竞争力的结果。当然,句子编码器也可以在训练分类器的时候进行微调。Dai和Le[43]研究了如何使用解码器来重建句子本身,和自动编码器比较类似[131]。
语言模型也可以作为辅助任务来训练LSTM编码器,预测下一个词就是监督信号。Dai和Le[43]实验了用不同任务上学到的模型参数来初始化LSTM模型,结果表明,在大规模语料上无监督预训练句子编码器的效果比仅仅预训练词向量要好,而且,与句子重建相比,语言模型是一个较差的无监督辅助任务,因为它仅仅只是预测下一个词,相对较短视。
C. Deep generative models
最近在生成逼真图像方面的成功推动了一系列将深度生成模型应用于文本数据的相关研究。这种研究的前景是发现自然语言中的丰富结构,进而能从潜在的表征空间中生成逼真的句子。在本节中,我们回顾了最近利用变分编码器(VAEs)[132]和生成对抗网络(GANs)[128]来实现这一目标的相关研究。
如上一节所述,标准的句子自动编码器不对潜在表征空间施加任何约束,因此在生成实际句子的时候往往会失败[133],因为真实句子的表征在潜在空间中可能只占了小部分区域,而潜在空间中大多数区域不一定能映射到真实句子[134],这些区域不能用于采样生成真实句子[133]。
VAE对因此编码空间加了先验分布约束,从而能从模型中得到合适的样本,通过将自动编码器框架中的确定性编码模块替换为训练得到的后验识别模型,该模型由编码器和生成器组成,分别负责将数据样本映射到潜在表征空间,以及从潜在表征空间生成样本。通过最大化实际数据在生成模型下的对数似然的变分下界来训练。
Bowman等人[133]提出了一种基于RNN的变分自动编码器生成模型,该模型包含了整个句子的潜在分布式表征,如Fig. 20所示。与普通的RNN模型不同之处在于该模型使用了显示的全局句子表征,有了这些句子全局表征作为先验,该模型能产生结构良好且多样化的句子。
Hu等人[135]提出生成句子的属性可以通过学习具有指定语义的disentangled潜在表征来控制,作者用一组结构化变量扩充了VAE的潜在编码,每个变量都代表句子的一个显著且独立的语义特征。该模型包含VAE和属性判别器,其中VAE模型负责训练生成器重建真实句子以生成合理的文本,而判别器则强制生成器生成与结构化编码一致的属性。通过在大量无标签语料和少量标注数据上训练,He等人[135]表明该模型能根据英语的两个主要属性来生成合理的文本,这两个属性分别是紧张和情绪。
GAN是另一类生成模型,由两个对抗网络组成,生成网络将潜在表征解码生成样本,与此同时,判别网络被训练用于区分真实样本和生成器生成的样本。GAN没有明确地将真实数据分布表示出来。
Zhang等人[134]提出了一个框架使用LSTM和CNN对抗训练来生成实际文本,潜在编码z作为LSTM在每一步的输入,CNN作为二分类器用于区分真实样本和生成样本。将GAN用于文本的一个问题是判别器的梯度无法通过离散变量很好地进行反向传播。在[134]中,作者通过在单词嵌入空间中每次“soft”地进行单词预测来解决这个问题。Yu等人[136]通过将生成器建模为随机策略来绕过这个问题,其中的奖励信号来自于GAN判别器对一个完整句子的判断,并使用蒙特卡洛搜索将其传回到state-action的步骤。
对深度生成模型的评估一直很具挑战性。对于文本而言,可以通过用固定语法创建的数据来训练模型,然后看模型生成的数据是否符合既定的语法规则[137],另一个策略是在大量模型未见过的数据上评估BLEU分数。是否能生成与未见过数据相似的句子被认为是衡量模型质量的标准[136]。
VII. Memory-Augmented Networks
注意力机制存储了编码器的一系列隐藏向量,可以让解码器在生成的时候用,这里的隐藏向量可以看作是模型“内部存储器”里的条目。最近,人们对带有某种形式的“记忆”并能和模型交互的神经网络的兴趣激增。
在[112]中,作者提出了记忆网络用于问答任务,在综合问答中,一系列“记忆条目”用于辅助模型以提供和问题相关的“支撑事实”来回答相关问题,该模型学会了根据问题和先前检索的结果从“记忆存储”中一次检索一个条目。在大规模实际问答中,以(主体、关系、客体)三元组形式的大量常识知识被用作“记忆”。Sukhbaatar等人[138]扩展了这些工作,提出了端到端记忆存储网络,通过使用注意力机制以“软”的方式进行检索,从而实现端到端的训练。从“记忆存储”中进行多次检索被证明对提升性能至关重要,多次使模型能从多个检索结果中进行推理得到多个“支撑事实”来回答具体的问题,Fig. 21。Sukhbaatar等人[138]还展示该模型用于语言模型的特殊用法,其中每个句子被视为记忆条目,辅以多次检索,模型能产生于深度LSTM模型媲美的结果。
此外,动态存储网络(DMN)[102]使用神经网络模型来计算输入表征、注意力以及回答机制改善了之前的记忆存储模型,由此产生的模型适用于大量的NLP任务(问答,词性标注,情感分析等),因为每个任务都可以转换为(memory,question,answer)三元组的形式。Xiong等人[139]将相同的模型用于视觉问答,并证明了存储器模块适用于视觉信号。
VIII. 不同模型在不同NLP任务上的表现
我们总结了近年来一系列深度学习方法在主要的NLP任务上的表现,主要是让读者熟悉NLP方向常见的数据集以及使用不同模型的最新结果。
A. 词性标注
WSJ-PTB(the Wall Street Journal part of the Penn Treebank Dataset)语料包含了117万的词,被广泛用于开发和评估词性标注系统。Gimenez和Marquez[140]在7个词的窗口内基于手工提取的特征采用一对多的SVM进行分类,其中评估了一些基本的n元语法特征来生成二进制特征,例如,“前一个词是the”,“前两个词的标签是DT NN”等等。词性标注的一个特点是相邻标签之间的依赖非常强。通过简单的从左到右标记方案,此方法仅仅通过特征工程来建模相邻标记之间的依赖关系。为了减少特征工程,Collobert等人[5]仅仅利用窗口范围内的单词的词向量作为特征然后用多层感知机建模,结合CRF证明是有效的。Santos和Zadrozny[32]将词向量和字向量拼接起来一遍更好利用词语中的形态学特征。在[32]中,作者没有使用CRF,但由于在上下文窗口上做了词级决策,可以看成是对依赖关系的隐式建模。Huang等人[141]将词向量和手工设计的特征拼接起来使用双向LSTM来建模任意长的上下文。一系列的对比分析表明双向性和CRF都提升了性能。Andor等人[142]展示了一种transi-based的方法,仅仅利用简单的前馈神经网络就得到了有竞争力的结果。当应用于序列标注时,DMN[102]允许基于RNN隐藏状态多次计算注意力,可以每次聚焦上下文的不同地方。
B. 句法分析
句法分析可以分为两类,第一类是依存句法分析,将每个词及其有依赖关系的词连起来;第二类是句法结构分析,迭代地将句子分成短语。Transition-based方法是一种流行的选择,因其在句子长度上是线性的。句法解析器从缓冲区按顺序读取单词然后做出一系列决策,并将它们逐步组合成句法结构[143]。在每个时间步,基于包含可用树结点的堆栈和包含未处理单词的缓冲区和已经获得的依赖关系来做决策。Chen和Manning[143]使用带一个隐层的神经网络来进行每个时间步的决策,输入层包含来自堆栈、缓冲区和一组依赖弧标签的特定单词,词性标注标签和依赖弧标签的嵌入表征。
Tu等人[68通过采用含2个隐含层的深层模型扩展了Chen和Manning[143]的工作。然而,他们的工作都依赖从解析器状态选择人工特征,而且只考虑了最新的有限个词。Dyer[144]等人提出了堆叠LSTM用来建模任意长的历史信息,堆栈的终点随着树结点的进栈出栈而改变。Zhou等人[145]结合了束搜索和对比学习来进一步提升效果。
Transition-based模型也常用于句法成分解析,Zhu等人[146]是基于特征的状态转移来做的,比如堆栈顶部的单词以及缓冲区的词性标注标签。Vinyals等人[106]是通过将解析树映射到线性序列,然后用seq2seq的方法来解决此问题。
C. 命名实体识别
CoNLL 2003是英文命名实体识别的一个标准数据集,主要集中于4类实体:人名、地名、机构名以及其他实体名。命名实体识别是词典能起很大作用的NLP任务之一。Collobert等人[5]是第一个用神经网络结合地名词典做出有竞争力结果的。Chiu和Nichols[150]将词典特征,词向量和字向量连接起来,然后作为双向LSTM的输入。另一方面,Lample等人[93]只用了词向量和字向量,通过在大规模无监督语料上进行预训练,在没有外挂任何词典的情况下取得了有竞争力的结果。和词性标注类似,条件随机场也能提升命名实体识别的效果,正如[93]中所述。总的来说,我们可以看到双向LSTM加CRF在NLP结构预测相关的任务上表现都不错。
Passos等人[149]提出了基于skip-gram改进的模型可以更好地利用相关词典信息来学习实体类型相关词向量。Luo等人[151]联合优化实体抽取及实体在知识库中的链接。Strubell等人[152]提出使用宽卷积,通过跳过一些输入从而能覆盖更宽的有效输入,以便进行更好的并行化以及上下文建模,该模型在保持准确性的同时能显著提升训练速度。
D. 语义角色标注
语义角色标注(SRL)旨在发现句子中每个谓词的谓词参数结构。对于每个目标动词(谓词),句子中所有使用了该动词语义的成分都需要识别出来。典型的语义参数包括Agent,Patient,Instrument等,以及诸如Locative,Temporal,Manner,Cause等[153]。表格V中展示了CoNLL 2005和2012数据集上不同模型的表现。
传统的SRL系统由一下几个阶段组成:生成一颗解析树,识别出哪个解析树结点代表给定动词的参数,最后对这些结点进行分类以确定相应的SRL标签。每个分类过程通常需要提取大量特征并将其输入统计模型[5]。
给定一个谓词,Tackstrom等人[154]通过一系列解析树的特征来对该谓词打分得到成分区间及可能的角色,他们提出了使用动态规划算法来加速推断的过程。Collobert等人[5]通过解析以附加查找表形式提供的信息来增强卷积神经网络在SRL上的效果,最终得到了有竞争力的结果。Zhou和Xu[153]提出了使用双向LSTM来建模任意长的上下文,结果表明即使不用任何解析树的信息也能得到不错的结果。He等人[155]进一步改进了他的工作,引入highway network连接[156]以及加入更多的正则以及利用集成模型来提升效果。
E. 情感分类
斯坦福情感树库(SST)数据集包含从电影评论网站Rotten Tomatoes中获取的数据。首先由Pang和Lee[157]提出,后来Socher等人又在此基础上进行了扩充[4]。该数据集的标注方案又启发了一个新的情感分析数据集,CMU-MOSI,其中的情感分析是在多模态的情况下进行的。
[4]和[119]的工作都是基于句法成分分析解析树的递归网络结构,他们之间的差异也表明了LSTM和普通RNN网络在建模句子方面的差异。另一方面,基于树形结构LSTM的模型比线性LSTM的效果好,这也意味着树形结构的网络可能能更好的捕捉自然语言的句法属性。Yu等人[159]提出使用情感词典来微调预训练的词向量,在[119]的基础上能有所提升。
F. 机器翻译
基于短语的SMT框架[161]将翻译模型分解为源语句和目标句子短语匹配的翻译概率。Cho等人[82]提出了使用RNN encoder-decoder框架来学习源短语到目标短语的翻译概率,这种基于短语对打分的方案改善了翻译性能。另一方面,Sutskever等人[74]使用4层LSTM seq2seq模型对SMT系统产生的前1000个最佳候选翻译进行了重新打分。Wu等人[162]则完全抛弃了传统的SMT系统,训练了一个深层LSTM网络,其中包含8个编码器和8个解码器,还使用了残差网络以及注意力机制。Wu等人[162]还使用了强化学习来直接优化BLEU值,结果BLEU值虽然提高了,但是人工评估的结果并没有改善。最近,Gehring等人[163]提出了基于CNN的seq2seq机器翻译模型。输入中每个单词的表征输入CNN进行并行处理,然后计算注意力。解码器的状态由CNN根据已经产生的结果决定。Vaswani等人[113]提出了一种基于自注意力机制的模型,完全抛弃了卷积和递归神经网络。
G. 问答
问答有多种形式,有些是依靠大型知识库来回答开放性问题,有些则是根据一些给定的段落来回答特定问题(阅读理解)。对于前者,我们列出了在大规模问答数据集[164]上的几个实验(表VIII),其中有14M常识三元组数据,每个问题都可以通过单关系查询来回答。对于阅读理解问答,我们主要列出了在两个数据集上的相关实验结果(表VIII)1)bAbI[165]的合成数据集,这个数据集要求模型能推理多个相关事实来得到正确答案,一共包含20个合成任务,用于测试模型检索相关事实和推理的能力。每项任务都侧重于不同的技能,如基本相关性推断和大小推理。2)斯坦福问答数据集(SQUAD)[166],这个数据集由众包在一组维基百科的文章中提出的100000多个问题组成,每个问题的答案都是相应的文章中的一段文字。
单关系实体查询类问题的核心是能从数据库中找出对应的支撑事实。Fader等人[164]提出了使用映射的方法来解决这个问题,学习从自然语言短语到知识库概念(实体,关系,问题模式)的词典。Bordes等人[167]将问题和知识库中的三元组嵌入到向量然后使用点积进行打分。
Weston等人[112]使用了类似的方法,将知识库看成是模型的长期记忆,然后用memory network的框架解决。在bAbI数据集上,Sukhbaatar等人[138]在记忆网络[112]的基础上进行了改进,在训练的时候模型屏蔽掉真实的支撑事实,Kumar等人[102]使用神经网络模型(GRU)来建模memory而不是像[138]和[112]中使用词袋模型。
在SQuAD数据集上,问题的关键是定位答案的起止位置。Chen等人[168]使用LSTM对问题和上下文篇章中的词进行编码,然后使用双线性映射来计算二者的相似度。Shen等人[169]提出了Reasonet,模型可以多次阅读上下文篇章,每次聚焦不同部分直到找到满意的答案为止。Yu等人[170]用CNN和自注意力机制来替换RNN以提高训练速度。
H. 对话系统
对话系统主要分两类:生成式对话系统和检索式对话系统。
推特对话数据集通常用于评估生成式对话系统,它包含3轮对话信息,在表IX中列出相关模型的表现。虽然人们普遍认为大部分自动评估指标对于对话质量评估并不可靠,一般都需要进行额外的人工评估,但是BLEU[171]仍然广泛用于评估对话系统。Ritter等人[172]采用基于短语的统计机器翻译(SMT)框架将对话系统输入“翻译”成对话系统输出。Sordoni等人[173]通过对SMT生成的结果输入上下文敏感的RNN编码-解码框架进行重新排序,得到了实质性的提升。Li等人[174]尝试通过将传统的最大对数似然训练目标替换成最大互信息来生成更有趣更多样化的结果,实验均是基于4层LSTM编码-解码框架。
答案检索任务定义为从候选答案库中选择最佳答案。处理这种任务的模型可以用recall1 at k来评估,其中真实答案和其他k-1个随机的答案混合在一起。Ubuntu对话数据集是通过从在线聊天室中抓取多轮Ubuntu故障排除对话来构建的[97]. Lowe等人[94]利用LSTM对对话输入和输出进行编码,然后利用句子编码的内积来对候选进行排序。
Zhou等人[175]提出通过在句子级CNN编码的基础上使用LSTM编码来更好地利用人类对话多轮的特性,和[176]的思路差不多。Dodge等人[177]将问题用memory network来解决,其中之前的对话被视为记忆,当前的对话输入被看成是要回答的“问题”。作者表明,用简单的词袋模型对句子用词向量编码就可以得到不错的结果。
I. 上下文嵌入
这部分将探讨基于上线文嵌入的一些最新结果,如第II-D节所述。ELMo为最新的NLP进展做出了重大贡献,在各种各样的NLP任务中,ELMo都以较大优势打败了当时最佳结果(表X),然而,最新出炉的BERT再次超越了ELMo,在各项NLP任务上都取得了最好的结果(标XI)。
IX. 总结
深度学习提供了一种可以利用大量数据和计算力的方法,而且几乎不需要人肉特征工程[90]。通过分布式表示,各种深度学习模型在NLP问题上都取得了SOTA。就目前而言,大部分模型都是监督学习的,然而,在很多现实场景中,我们都有大量的未标注数据,要利用这些数据我们需要先进的无监督或者半监督学习方法。如果在测试模型的时候遇到某些特定类别缺少标注数据或者出现新的类别,则需要采用zero-shot等学习策略。虽然这些学习方法仍然处于发展阶段,但我们期待基于深度学习的NLP研究能朝着更好利用无标注数据的方向发展,我们预计这种趋势会随着更多更多更好的模型设计而继续。我们也希望能看到更多采用强化学习的NLP应用,例如对话系统,我们还希望能看到更多多模态学习的研究[190],因为在现实世界中,语言通常以其他信号为基础或者与之相关。
最后,我们希望能看到更多的深度学习模型,其内部存储(从数据中学到的自下而上的知识)可以通过外部存储(从知识库中继承的自上而下的知识)进行丰富。结合symbolic和sub-symbolic 人工智能将是从NLP到自然语言理解的道路上前进的关键。事实上,依靠机器学习,可以根据过去的经验做出“好的猜测”,因为sub-symbolic方法可以编码相关性,而决策过程也是概率性的。然而,自然语言理解需要的远不止于此,用Noam Chomsky的话来讲,“你不会通过获取大量数据,将它们扔进计算机并对它们进行统计分析来获得科学中的发现:这不是你理解事物的方式,你必须有理论上的见解”。
Jerry的算法和NLP,一个注重技术领域的平台!
以上是关于翻译 | 详解自然语言处理发展的点点滴滴的主要内容,如果未能解决你的问题,请参考以下文章