pytorch机器学习从入门到实践:PyTorch自然语言处理系列
pytorch机器学习从入门到实践:PyTorch自然语言处理系列在第六章中,我们看到了循环网络是如何在很少参数的情况下跨时间捕捉长期依赖的,可以这样说:卷积网络跨越空间共享参数,而循环网络跨时间共享参数。我们还学习了循环网络的三种变体,包括Elman RNN、像LSTM的门控变体以及GRU。我们还了解了如何在预测或序列标记情境中使用循环网络,在输入的每个时间步骤预测输出。最后,我们介绍了一类称为编码器-解码器(encoder–decoder)的模型,并研究了序列到序列(sequence-to-sequence,S2S)模型作为解决像机器翻译这样有条件的生成问题的示例。我们在PyTorch中学习了很多这些主题的端到端示例。我们从有监督学习范式开始学习,并学习了如何使用计算图抽象将复杂的想法编码为可以通过反向传播进行训练的模型。我们选择了Pytorch作为计算框架。在本书中的撰写过程中,我们使用了深度学习将文本输入视为“数据”输入了黑匣子中,这是有风险的。
数据与智能 出版了专著「构建企业级推荐系统:算法、工程实现与案例分析」。每周输出7篇推荐系统、数据分析、大数据、AI原创文章。「数据与智能」(同名视频号、知乎、头条、B站、快手、抖音、小红书等自媒体平台号) 社区,聚焦数据、智能领域的知识分享与传播。
来源 | Natural Language Processing with PyTorch
作者 | Rao,McMahan
译者 | Liangchu
校对 | gongyouliu
编辑 | auroral-L
在本章中,我们将从整本书的角度出发回顾前面的章节,看看本书中讨论的看似独立的话题是如何相互依赖的,并了解研究人员如何将这些内容结合使用,以解决手头的问题。我们还会总结NLP中一些经典主题,由于篇幅限制,我们并不能在本书中深入讨论这些内容。最后,我们会指出至2018年为止该领域的前沿技术。在像经验丰富的NLP和深度学习等快速发展的领域中,学习新思想并使自己跟上时代是很重要的,我们会介绍如何学习NLP中的新主题。
9.1 到目前为止我们学到了什么?我们从有监督学习范式开始学习,并学习了如何使用计算图抽象将复杂的想法编码为可以通过反向传播进行训练的模型。我们选择了Pytorch作为计算框架。在本书中的撰写过程中,我们使用了深度学习将文本输入视为“数据”输入了黑匣子中,这是有风险的。在第二章中,我们介绍了NLP和语言学的一些基本概念,为本书的其余部分奠定了基础。我们在第三章中学习了一些基本概念,比如激活函数、损失函数、基于梯度的监督学习优化以及训练-评估循环,这些概念对于学习后续内容十分重要。我们学习了前馈网络的两个例子——多层感知器和卷积网络。我们看到了像L1、L2范式和dropout等用于使得网络健壮性更强的正则化机制。多层感知器能在隐藏层中捕捉像ngram的关系,但是效率很低。相比之下,卷积网络使用称为“参数共享”的思想以有效的计算方式学习这个子结构。
在第六章中,我们看到了循环网络是如何在很少参数的情况下跨时间捕捉长期依赖的,可以这样说:卷积网络跨越空间共享参数,而循环网络跨时间共享参数。我们还学习了循环网络的三种变体,包括Elman RNN、像LSTM的门控变体以及GRU。我们还了解了如何在预测或序列标记情境中使用循环网络,在输入的每个时间步骤预测输出。最后,我们介绍了一类称为编码器-解码器(encoder–decoder)的模型,并研究了序列到序列(sequence-to-sequence,S2S)模型作为解决像机器翻译这样有条件的生成问题的示例。我们在PyTorch中学习了很多这些主题的端到端示例。
9.2 NLP中的永恒主题一本书能涉及的NLP内容实在有限,本书也是如此。在第二章中,我们确定了NLP中的一些核心术语和任务,在其余章节中,我们讨论了许多NLP任务。由于本书设定为一本基本的解释性书籍,因此在这里,我们只简单提及一些无法部分或全部研究的重要主题。
9.2.1 对话和交互系统在人和计算机之间进行无障碍的对话被认为是计算的圣杯,并启发了Turing test和Loebner Prize。从人工智能的早期研究工作以来,NLP一直与对话系统相关联,并通过一些虚构系统在流行文化中普及,如星际迷航中USS Enterprise上的主计算机和电影2001:A Space Odyssey中的HAL 9000。对话和更广泛的交互系统设计领域很有研究价值,一些成功的产品包括Amazon的Alexa,Apple的Siri和谷歌助手。对话系统可以是开放域的(可以问任何问题),也可以是限定域的(比如预定航班或者车辆导航)。该领域的一些重要的研究课题包括:如何建模对话行为、对话上下文(见下图9-1)以及对话状态?如何建立多模式对话系统(比如语音和视觉或文本和视觉输入)?系统如何辨析用户意图?如何为用户的偏好建模并生成针对用户量身定制的响应?如何回应得更加人性化?例如,最近的生产对话系统已经开始将诸如“umm”和“uh”之类间断的语气词与响应结合,这样系统看起来就不那么像机器人了。
9.2.2 语篇语篇(discourse)涉及理解文本文档的部分和整体性质。例如,语篇解析任务涉及理解两个句子在上下文中如何与彼此相关联。为了说明这项任务,下表(9-1)给出了Penn Discourse Treebank(PDTB)的一些例子:
理解语篇还涉及一些其他问题,比如指代消解(anaphora resolution)和转喻检测(metonymy detection)。在指代消解中,我们希望将出现的代词解析为它们所引用的实体,这可能是一个复杂的问题,如下图(9-2)所示:
指代对象可以是转喻,如下例所示:
Beijing imposed trade tariffs in response to tariffs on Chinese goods.
Beijing在这里指的不是中国政府的所在地。有时,可能需要使用知识库来成功地解析所指对象。
9.2.3 信息抽取和文本挖掘行业中遇到的常见问题之一涉及信息抽取(information extraction)。我们如何从文本中抽取实体(人名,产品名等)、事件和关系?我们如何将文本中提到的实体映射到知识库中的条目(又称实体发现,实体链接,槽填充)?我们如何在刚开始建立和维护知识库(知识库群体)?这些都是在不同背景下信息抽取研究经常回答的一些问题。
9.2.4 文档分析和检索行业中另一种常见的NLP问题包括理解大量文档集合。我们如何从文档中提取主题(主题建模)?我们如何更智能地索引和搜索文档?我们如何理解搜索查询(查询解析)?我们如何为大型集合生成摘要?
NLP技术的范围和适用性很广泛,事实上,NLP技术可以应用于存在非结构化或半结构化数据的任何地方。比如,Dill 等人(2007)就应用自然语言解析技术解释了蛋白质折叠。
9.3 NLP 前沿
当一个领域正在飞速发展与创新时,探讨所谓NLP前沿似乎是一件很愚蠢的事,然而我们还是想给你介绍下该领域截至2018年秋季的最新趋势:
• 将经典NLP文献引入可微学习范式
NLP 领域已有几十年的历史,尽管深度学习领域只有几年的历史。许多创新似乎都在于研究新的深度学习(可微学习)范式下的传统方法和任务。当在阅读经典的NLP论文(我们建议你一定得读一下)时,一个很好的问题是作者试图学习什么?什么是输入/输出表示?我们如何通过前面章节中学到的技术简化这一过程?
• 模型的组合性
在本书中,我们讨论了 NLP几种不同的深度学习架构:MLP,CNN,序列模型,序列到序列模型以及基于注意力的模型。注意,我们将这些模型分开讨论是因为更好教学和理解,然而在文献中的趋势是结合使用不同架构来完成工作。例如,你可以编写卷积网络表示单词的字符,然后基于该表示编写LSTM,并通过MLP完成LSTM编码的最终分类。能够根据任务的需求结合使用各种不同架构是使深度学习成功的最有力的想法之一。
• 序列的卷积
我们在序列建模中看到的最近趋势是使用卷积运算完全模拟序列。作为完全卷积的机器翻译模型的一个例子,请参见Gehring 等人(2018)。解码步骤使用去卷积操作是有利的,因为明显可以使用全卷积模型加速训练。
• Attention is all you need
最近的另一个趋势是用注意机制取代卷积(Vaswani等人,2017)。使用注意力机制,特别是自注意力机制和多头注意力机制,你基本可以捕获通常使用RNN和CNN建模的远程依赖关系。
• 迁移学习
迁移学习指的是学习一项任务的表示并使用这些表示改进另一个任务的学习。在最近复兴的神经网络和NLP的深度学习中,经常会看到使用预训练的单词向量的迁移学习技术。近期更多工作(Radford等人,2018;Peters 等人,2018)证明了语言建模任务的无监督表示对于各种NLP任务的有效性,这些任务包括问答,分类,句子相似性和自然语言推断。
此外,强化学习(reinforcement learning)最近在对话相关任务方面取得了一些成功,复杂的自然语言推理任务的记忆和知识库的建模似乎引起了工业界和学术界的研究人员的高度关注。在下一节中,我们将讨论更直接的东西——开发设计生产NLP系统背后的系统思维。
9.4 生产NLP系统的设计模式
生产NLP系统可能很复杂。在构建NLP系统时,重要的是要记住:你正在构建的系统即将解决任务,并且只是实现这一目标的手段。系统构建期间,工程师、研究人员、设计人员和产品经理可以做出多种选择。虽然本书主要关注技术和基础构建块,但是将这些构建块组合在一起并形成复杂的结构以满足你的需求还是需要一些模式思维和描述模式的语言的,这在包括软件工程的许多学科中都很流行(Alexander,1979)。在本节中,我们将介绍生产NLP系统的几种常见设计和部署模式,这些是团队经常需要做出的选择或权衡,以使产品开发与技术、业务、战略和运营目标保持一致。我们从6个维度来检查这些设计选择:
• 在线系统VS离线系统
在线系统是需要实时或接近实时地进行模型预测的系统,比如识别垃圾邮件和内容审核等一些任务本质上都是需要在线系统的。相比之下,离线系统不需要实时运行,我们可以将它们构建为一次在一批输入上高效运行,并且可以利用诸如转换学习(transductive learning)之类的方法。一些在线系统可以作出反应,甚至可以以在线方式进行学习(也称为在线学习(online learning)),然而许多在线系统都是通过推送到生产环境中构建的周期性的离线模型来构建和部署的。使用在线学习构建的系统应该对对抗性环境特别敏感。最近的一个例子是著名的Twitter对话机器人Tay,它走火入魔地在线学习了一些网络垃圾,显而易见,Tay很快开始回复令人反感的推文,因此微软公司不得不在推出后不到一天就关闭了这项服务。
系统构建中的典型步骤是:首先构建一个离线系统,将其作为一个“在线”系统进行大量工程工作,然后通过添加反馈循环或可能改变学习方法,使其成为“在线学习”系统。尽管这种步骤在增加代码库复杂性方面是有机的,但它也可能引入诸如处理对手之类的盲点。下图(9-3)展示了“Facebook Immune System”作为检测垃圾邮件的在线系统的一个例子(注意:大概是2012年的系统而非现在的系统)。请注意在线系统与离线系统相比所需更多的工程设计:
• 交互系统VS非交互系统
大多数自然语言系统都是非交互的,从这个意义上来讲,预测完全来自于一个模型。事实上,实际上,许多生产NLP模型深深嵌入到ETL(Extract Transform and Load)管道的转换步骤中。在某些情况下,人为干预预测循环可能有所裨益。下图(9-4)展示了Lilt Inc交互式机器翻译界面的一个例子,其中模型和人类共同参与所谓的“mixed-initiative model”中的预测(Green 2014)。我们很难设计交互式系统,但将人考虑到循环中可以实现非常高的精度。
• 单模态系统vs多模态系统
在许多情况下,在学习和预测过程中结合使用多种模态是有用的。例如,对于新闻转录系统来说,可以结合使用音频流和视频帧。再比如,Google最近一项名为“Look to Listen”(Ephrat等人,2018)的研究使用多模式输入来解决扬声器源分离的难题(又名鸡尾酒会问题)。多模态系统的构建和部署成本很高,但对于难题,组合来自多个模态的输入能提供单独使用任一单一模态无法实现的信号。NLP中也有相关示例,例如,在多模态翻译中,我们可以通过整合多种源语言的输入来提高翻译质量。生成网页主题(主题建模)时,除了网页上的文本外,还可以结合从其中包含的图像中提取的特征,如下图(9-5)所示:
• 端到端系统VS分段系统
自深度学习问世以来,研究人员和工程师额外的选择是将复杂的NLP系统构建为不同单元的管道或整体的端到端系统。端到端设计在许多领域(比如机器翻译,摘要和语音识别)都很有吸引力,精心设计的端到端系统能显着降低实施和部署的复杂性,当然也能减少代码行数。分段系统(下图9-6)将复杂的 NLP 任务分解为子任务,每个子任务单独优化,独立于最终任务目标。分段系统中的子任务使其变得非常模块化并且易于“修补”生产中的特定问题,但是通常会存在一些技术问题。
• 限定域系统VS开放域系统
限定域系统明确一个目标进行优化:在指定的域中表现良好。例如,机器翻译系统当与生物医学期刊一起使用能够得到显著的优化——这不仅仅涉及生物医学平行语料库的训练。另一方面,开放域系统旨在用于通用目的(比如Google Translate)。再举一个例子,考虑一个文件标记系统,如果系统只预测了许多预定义类中的一个(典型情况),那么会产生一个限定域系统。然而,如果系统被设计为在运行时发现新类,那么它就是一个开放域系统。在翻译和语音识别系统的背景下,限定域系统也被称为“有限词汇”系统。
• 单语言系统vs多语言系统
为单一语言工作而构建的NLP系统称为单语言系统(monolingual system),我们很容易构建和优化一个单语言系统。相比之下,多语言系统可以处理多种语言。当在不同语言的数据集上进行训练时,它们应该是可以直接用的。虽然构建多语言系统很有吸引力,但专注于单语言系统也有其优点。研究人员和工程师可以利用该语言中广泛可用的资源和领域专业知识来生成高质量的系统,这在多语言系统中一般是不可能实现的。因此,我们经常会发现许多多语言产品被实现为单独优化的单语言系统的集合,并使用语言识别组件分配输入。
9.5 接下来呢?
使用像PyTorch这样的框架和学习像深度学习这样日新月异的领域,这感觉就像在不断变化的土地上建造一座高楼大厦。在本节中,我们将指出一些与深度学习、PyTorch 和NLP相关的资源,以帮助读者继续深入学习本节的内容。
我们没有介绍PyTorch 的每一个功能,因此建议你遵循优秀的PyTorch文档并参与PyTorch论坛以继续PyTorch实践之路:
• PyTorch 文档(pytorch/docs/stable/index.html)
• PyTorch 论坛(discuss.pytorch/)
深度学习领域本身来自于工业界和学术界的大量活动。大多数深度学习研究出现在arXiv的不同类别下:
• 机器学习(arxiv/list/cs.LG/recent)
• 语言和计算(arxiv/list/cs.CL/recent)
• 人工智能(arxiv/list/cs.AI/recent)
了解NLP新研究的最佳方法是参照以下学术会议:
• Association of Computational Linguistics (ACL)
• Empirical Methods in Natural Language Processing (EMNLP)
• North American Association for Computational Linguistics (NAACL)
• European chapter of ACL (EACL)
• Conference on Computational Natural Language Learning (CoNLL)
我们推荐aclweb以及时了解这些会议、研讨会和其他重要NLP新闻的最新进展。
当你不满足止步于基础内容,则必须阅读研究论文了。阅读论文是一门后天习得的艺术。你可以在article by Jason Eisner(cs.jhu.edu/~jason/advice/how-to-read-a-paper.html)中找到一些阅读NLP论文的有用提示。
最后,我们将在GitHub repo(nlproc/PyTorchNLPBook/repo/)中继续提供更多教育材料,作为本书的补充内容。