前言
前言
在过去的几年里,很难忽视自然语言处理(NLP)领域的飞速发展。在此期间,您可能已经被关于流行 NLP 模型(如 ELMo、BERT,以及最近的 GPT-3)的新闻文章所淹没。这种技术周围的兴奋是有道理的,因为这些模型使我们能够实现三年前我们无法想象的 NLP 应用,比如仅仅从对代码的描述中编写出生产代码,或者自动生成可信的诗歌和博客。
推动这一进步的一个重要因素是对自然语言处理模型的越来越复杂的迁移学习技术的关注。迁移学习在自然语言处理中越来越受欢迎和激动人心,因为它使您能够将从一个场景中获得的知识适应或转移到另一个场景,例如不同的语言或任务。这对于自然语言处理的民主化以及更广泛地说人工智能(AI)是一个重大进步,允许知识以前所需资源的一小部分在新环境中得到重复使用。
作为加纳西非国家的公民,在那里,许多新兴的企业家和发明家无法获得大量的计算资源,并且许多基本的自然语言处理问题仍然有待解决,这个主题对我来说尤为重要。这种范式赋予了这样的环境中的工程师们权力,使他们能够构建潜在的拯救生命的自然语言处理技术,否则这是不可能的。
我第一次接触到这些想法是在 2017 年,当时我正在美国国防高级研究计划局(DARPA)生态系统内从事开源自动机器学习技术的工作。我们使用迁移学习来减少对标记数据的需求,首先在模拟数据上训练自然语言处理系统,然后将模型转移到少量真实标记数据上。突破性模型 ELMo 随后出现,激发了我对该主题的进一步学习和探索,以了解如何在我的软件项目中进一步利用这些想法。
自然而然地,我发现由于这些想法的绝对新颖性和领域发展速度的快速性,这个主题没有全面的实用介绍。2019 年,我有机会撰写这个主题的实用介绍,我没有犹豫。你手里拿着的是我大约两年努力的成果。这本书将快速带领你了解该领域的关键近期自然语言处理模型,并提供可执行代码,您将能够直接修改和重用在自己的项目中。尽管不可能涵盖每一个体系结构和用例,但我们战略性地涵盖了我们认为会装备您基本技能以便在这个新兴领域中进一步探索并保持最新的架构和示例。
当你决定更多了解这个话题时,你做出了一个明智的决定。涌现出机会来探索新理论、算法方法和突破性应用。我期待着听到您在周围社会上所产生的转型积极影响。
致谢
我非常感谢加纳自然语言处理(NLP)开源社区的成员,在那里我有幸学习更多关于这一重要主题的知识。该群体成员和我们工具的用户的反馈强调了我对这项技术变革的理解。这激励并激励我将这本书完成。
我要感谢我的 Manning 开发编辑苏珊·埃斯里奇,她花了无数小时阅读手稿,提供反馈,并指导我度过了许多挑战。我感谢我的技术开发编辑艾尔·克林克尔为帮助我改进写作的技术维度所付出的所有时间和精力。
我感谢所有编辑委员会成员、市场营销专业人员和其他努力使这本书成为现实的制作团队成员。这些人包括丽贝卡·赖恩哈特、伯特·贝茨、尼科尔·巴特菲尔德、雷哈娜·马尔卡诺维奇、亚历山大·德拉戈萨夫列维奇、梅丽莎·艾斯、布兰科·拉廷西奇、克里斯托弗·考夫曼、坎迪斯·吉尔霍利、贝基·惠特尼、帕梅拉·亨特和拉德米拉·埃尔塞戈瓦克,排名不分先后。
在这个项目的几个关键时刻,技术同行审阅者提供了宝贵的反馈,没有他们,这本书就不会那么好。我非常感谢他们的意见。其中包括安德烈斯·萨科、安吉洛·西蒙尼·斯科托、艾瑞尔·加米诺、奥斯汀·普尔、克利福德·瑟伯、迭戈·卡塞拉、豪梅·洛佩兹、曼努埃尔·R·西奥西奇、马克·安东尼·泰勒、马西耶·阿弗尔蒂特、马修·萨尔门托、迈克尔·沃尔、尼科斯·卡纳卡里斯、尼诺斯拉夫·切尔克斯、奥尔·戈兰、拉尼·夏利姆、萨亚克·保罗、塞巴斯蒂安·帕尔马、塞尔吉奥·戈沃尼、托德·库克和万斯·西斯特拉。我感谢技术校对者艾瑞尔·加米诺在校对过程中捕捉到的许多拼写错误和其他错误。我感谢所有书籍论坛参与者的优秀评论,这进一步帮助改进了本书。
我非常感谢我的妻子戴安娜对这项工作的支持和鼓励。我感激我的母亲和我的兄弟姐妹——理查德、吉迪恩和吉夫蒂——对我继续激励我。
关于这本书
这本书试图为自然语言处理中的迁移学习这一重要主题提供全面实用的介绍。我们强调通过代表性代码和示例建立直观理解,而不是专注于理论。我们的代码编写旨在便于快速修改和重新利用,以解决您自己的实际问题和挑战。
谁应该读这本书?
要充分利用本书,您应具备一些 Python 经验,以及一些中级机器学习技能,如对基本分类和回归概念的理解。具备一些基本的数据处理和预处理技能,如使用 Pandas 和 NumPy 等库,也会有所帮助。
话虽如此,我写这本书的方式使你可以通过一点额外的工作掌握这些技能。前三章将迅速带你了解你需要掌握的一切,以充分理解迁移学习 NLP 的概念,并应用于你自己的项目中。随后,通过自行查阅包含的精选参考资料,你将巩固你的先修背景技能,如果你觉得有必要的话。
路线图
本书分为三个部分。按照它们的出现顺序逐步学习将让您收获最多。
第一部分回顾了机器学习的关键概念,提供了使最近的迁移学习 NLP 进展成为可能的机器学习进步的历史概述,并提供了研究该主题的动机。它还通过一对示例来回顾更传统的 NLP 方法的知识,并让您亲自动手使用一些关键的现代迁移学习 NLP 方法。本书此部分涵盖的概念章节级别的分解如下:
- 第一章介绍了迁移学习的确切含义,包括在人工智能领域和自然语言处理(NLP)的背景下。它还探讨了促成迁移学习的技术进步的历史发展。
- 第二章介绍了一对代表性的自然语言处理(NLP)问题,并展示了如何获取和预处理数据。它还使用传统的线性机器学习方法——逻辑回归和支持向量机——为它们建立了基准。
- 第三章继续通过传统的基于树的机器学习方法——随机森林和梯度提升机——对第二章中的一对问题进行基准测试。它还使用关键的现代迁移学习技术 ELMo 和 BERT 对它们进行基准测试。
第二部分深入探讨了基于浅层神经网络的一些重要的迁移学习 NLP 方法,即层次相对较少的神经网络。它还通过代表性技术(如 ELMo)更详细地探讨了深度迁移学习,这些技术利用循环神经网络(RNN)进行关键功能。本书此部分涵盖的概念章节级别的分解如下:
- 第四章应用了浅层词和句子嵌入技术,如 word2vec 和 sent2vec,进一步探索了本书第一部分的一些示例。它还介绍了领域自适应和多任务学习等重要的迁移学习概念。
- 第五章介绍了一组依赖于 RNN 的深度迁移学习 NLP 方法,以及一对新的例子数据集,这些数据集将用于研究这些方法。
- 第六章更详细地讨论了第五章介绍的方法,并将其应用于同一章节中介绍的数据集。
第三部分涵盖了这一领域中可能最重要的子领域,即依赖于变压器神经网络进行关键功能的深度迁移学习技术,例如 BERT 和 GPT。这种模型架构类别正在证明在最近的应用中最具影响力,部分原因是在并行计算架构上比等效的先前方法具有更好的可扩展性。本部分还深入探讨了各种使迁移学习过程更有效的适应策略。书中此部分涵盖的概念的章节级细分如下:
- 第七章介绍了基本的变压器架构,并使用其重要变体之一—GPT—进行了一些文本生成和基本聊天机器人。
- 第八章介绍了重要的变压器架构 BERT,并将其应用于多种用例,包括问答、填空以及向低资源语言的跨语言转移。
- 第九章介绍了一些旨在使迁移学习过程更有效的适应策略。其中包括区分性微调和逐步解冻(来自方法 ULMFiT 的方法)以及知识蒸馏。
- 第十章介绍了额外的适应策略,包括嵌入因子分解和参数共享—这些是 ALBERT 方法背后的策略。该章还涵盖了适配器和顺序多任务适应。
- 第十一章通过回顾重要主题并简要讨论新兴的研究主题和方向来结束本书,例如需要考虑和减轻技术可能产生的潜在负面影响。这些包括对不同人群的偏见预测以及训练这些大型模型的环境影响。
软件要求
Kaggle 笔记本是执行这些方法的推荐方式,因为它们可以让您立即开始,无需进行任何设置延迟。此外,在编写本文时,此服务提供的免费 GPU 资源扩大了所有这些方法的可访问性,使得那些可能没有本地强大 GPU 访问权限的人也能够使用,这与“AI 民主化”议程一致,激发了许多人对 NLP 迁移学习的兴趣。附录 A 提供了 Kaggle 快速入门指南和作者个人关于如何最大程度地发挥平台作用的一些建议。但是,我们预计大多数读者应该会发现开始使用是相当简单的。我们已经在 Kaggle 上公开托管了所有笔记本,并附上了所有必需的数据,以便您只需点击几下即可开始执行代码。但是,请记住“复制并编辑”(fork)笔记本——而不是将其复制并粘贴到新的 Kaggle 笔记本中——因为这样可以确保结果库在环境中与我们为代码编写的库匹配。
关于代码
这本书包含了许多源代码示例,既有编号列表中的,也有与普通文本一起的。在这两种情况下,源代码都以像这样的等宽字体
格式化,以便与普通文本分开。有时代码也会以粗体显示,以突出显示章节中已更改的代码,例如当新功能添加到现有代码行时。
在许多情况下,原始源代码已经重新格式化;我们添加了换行符并重新排列了缩进以适应书中可用的页面空间。在极少数情况下,即使这样还不够,列表中还包括了行继续标记(➥)。此外,在文本中描述代码时,源代码中的注释通常已从列表中删除。代码注释伴随许多列表,突出显示重要概念。
本书示例中的代码可从 Manning 网站下载,网址为www.manning.com/downloads/2116
,也可以从 GitHub 上下载,网址为github.com/azunre/transfer-learning-for-nlp
。
liveBook 讨论论坛
购买《自然语言处理的迁移学习》包括免费访问由 Manning Publications 运营的私人网络论坛,在该论坛上,您可以对该书发表评论,提出技术问题,并从作者和其他用户那里获得帮助。要访问论坛,请转到livebook.manning.com/#!/book/transfer-learning-for-natural-language-processing/discussion
。您还可以在livebook.manning.com/#!/discussion
了解有关 Manning 论坛及行为规范的更多信息。
Manning 致力于为我们的读者提供一个场所,让个人读者之间以及读者与作者之间进行有意义的对话。这不是对作者参与的特定数量的承诺,作者对论坛的贡献仍然是自愿的(未付酬)。我们建议您尝试向作者提出一些具有挑战性的问题,以免他失去兴趣! 只要这本书还在印刷,您都可以从出版商的网站访问论坛和以前的讨论档案。
作者简介
Paul Azunre 持有麻省理工学院计算机科学博士学位,并曾担任多个 DARPA 研究项目的主要研究员。他创立了 Algorine Inc.,一个致力于推动人工智能/机器学习发展并确定其可能产生重大社会影响的研究实验室。Paul 还共同创立了 Ghana NLP,一个专注于使用自然语言处理和迁移学习处理加纳语和其他资源稀缺语言的开源倡议。
封面插图说明
自然语言处理的迁移学习 封面上的图案标题为“Moluquoise”,或者说是马鲁古妇女。 这幅插图取自法国 1788 年出版的雅克·格拉塞·德·圣索维尔(Jacques Grasset de Saint-Sauveur,1757-1810)的 所有已知民族的现代民族服饰 系列,每个插图都经过精细手绘和上色。格拉塞·德·圣索维尔(Grasset de Saint-Sauveur)收集的丰富多样性生动地提醒我们,就在 200 年前,世界的城镇和地区文化迥然不同。 人们相互隔离,说着不同的方言和语言。 在街上或乡间,仅通过他们的服装就可以轻松辨认出他们住在哪里以及他们的贸易或生活状况。
自那时起,我们的着装方式已经发生了变化,地区的多样性也在消失。 现在很难区分不同大陆的居民,更不用说不同的城镇、地区或国家了。 或许我们已经用文化多样性换取了更丰富的个人生活,肯定是为了更丰富和快节奏的技术生活。
在很难将一本计算机书籍与另一本区分开来的时候,Manning 通过基于两个世纪前地区生活丰富多样性的丰富多样的书籍封面,庆祝了计算机业的创造力和主动性,这些封面是格拉塞·德·圣索维尔的图片重新呈现的。
第一部分:介绍与概述
第 1、2 和 3 章回顾了机器学习中的关键概念,提供了机器学习进展的历史概述,促进了最近在自然语言处理中的迁移学习进展,并强调了研究这一主题的重要性。它们还通过一对相关示例,既回顾了您对传统自然语言处理方法的知识,又通过一些关键的现代自然语言处理迁移学习方法让您亲身体验了一下。
第一章:什么是迁移学习?
本章涵盖了
- 迁移学习在人工智能(AI)中的普遍含义,以及在自然语言处理(NLP)的上下文中的含义
- 典型 NLP 任务及 NLP 迁移学习进展的相关年表
- 计算机视觉中的迁移学习概述
- 近年来 NLP 迁移学习技术日益普及的原因
人工智能(AI)已经以戏剧性的方式改变了现代社会。现在,机器执行了人类曾经做过的任务,而且它们做得更快、更便宜,有些情况下甚至更有效。流行的例子包括计算机视觉应用,教会计算机如何理解图像和视频,例如监控摄像头视频中的罪犯检测。其他计算机视觉应用包括从患者器官图像中检测疾病以及从植物叶片中定义植物物种。人工智能的另一个重要分支,自然语言处理(NLP),特别涉及人类自然语言数据的分析和处理。NLP 应用的例子包括语音转文本转录和各种语言之间的翻译。
AI 机器人技术和自动化的技术革命最新演变—一些人将其称为第四次工业革命¹—是由几个因素的交汇引发的:针对训练大型神经网络的算法进步,通过互联网获取大量数据的可行性,以及最初是为个人游戏市场开发的大规模并行能力通过图形处理单元(GPUs)的可获得性。最近对依赖人类感知的任务自动化的快速进步,特别是计算机视觉和 NLP,需要这些神经网络理论和实践的进步。这一领域的增长促进了对输入数据和所需输出信号的复杂表示的开发,以处理这些困难问题。
与此同时,人们对 AI 能够实现的预期大大超出了实践中所取得的成就。我们被警告说,将来可能会有一个末日般的未来,将消灭大部分人类工作并取代我们所有人,甚至可能对我们构成存在威胁。NLP 并没有被排除在这种猜测之外,因为它今天是 AI 内最活跃的研究领域之一。我希望阅读本书能帮助你更好地了解从 AI、机器学习和 NLP 中现实可能期待的东西。然而,本书的主要目的是向读者提供一组与最近在 NLP 中变得重要的范式相关的可行技能—迁移学习。
迁移学习旨在利用不同设置的先前知识——无论是不同的任务、语言还是领域——来帮助解决手头的问题。它受到人类学习的启发,因为我们通常不会为了任何给定的问题从头学习事物,而是建立在可能相关的先前知识上。例如,学习演奏一种乐器,在已经知道如何演奏另一种乐器的情况下被认为更容易。显然,乐器越相似——比如风琴与钢琴——先前的知识越有用,学习新乐器也会更容易。然而,即使乐器非常不同——如鼓和钢琴——一些先前知识仍然有用,虽然作用较小,比如遵循节奏的练习。
大型研究实验室,如劳伦斯利弗莫尔国家实验室或桑迪亚国家实验室,以及大型互联网公司,如谷歌和 Facebook,能够通过在数十亿字和数百万图片上训练深层神经网络来学习大规模复杂模型。例如,谷歌的 NLP 模型 BERT(双向编码器表示转换),将在下一章介绍,是在英文版本的维基百科(25 亿字)和 BookCorpus(8 亿字)上进行了预训练。² 同样,深度卷积神经网络(CNNs)已经在 ImageNet 数据集的超过 1400 万张图片上进行了训练,学习的参数已经被许多组织广泛应用。从头开始训练这样的模型需要的资源量通常不会被普通的神经网络从业者所使用,比如在较小企业工作的 NLP 工程师或在较小学校读书的学生。这是否意味着较小的参与者无法取得其问题的最先进成果?绝对不是——值得庆幸的是,如果正确应用,迁移学习的概念承诺解决这个问题。
为什么迁移学习如此重要?
迁移学习使您能够将从一组任务和/或领域中获得的知识调整或转移到另一组任务和/或领域。这意味着,曾经开源的、经过大量资源包括数据、计算能力、时间和成本训练的模型可以通过更广泛的工程社区进行微调和重复使用,而使用的资源成本仅为原始资源成本的一小部分。这对于 NLP 甚至更广泛的 AI 的民主化代表了一个重要进步。图 1.1 说明了这种范式,以学习如何演奏乐器为例。从图中可以看出,不同任务/领域之间的信息共享可以使后续任务 B 所需的数据量减少,以实现相同的性能,或者下游任务 B。
图 1.1 转移学习范式优势的示意图—显示在底部面板—在不同任务/领域训练的系统之间共享信息,与传统范式—显示在顶部面板—其中任务/领域之间同时进行训练相比。在转移学习范式中,通过信息/知识共享可以实现减少数据和计算需求。例如,如果一个人先学会弹钢琴,我们预期他们学会打鼓会更容易些。
1.1 代表性自然语言处理任务概述
自然语言处理的目标是使计算机能够理解自然人类语言。您可以将其视为将自然语言文本系统地编码为准确反映其含义的数值表示的过程。尽管存在各种典型自然语言处理任务的分类法,但以下非尽述性列表提供了一个框架,用于思考问题的范围,并适当地构建本书将讨论的各种示例。请注意,其中一些任务可能需要(或不需要,具体取决于所选择的特定算法)列表中其他更难的任务:
- 词性标注(POS)—在文本中标记词语的词性;可能的标记包括动词、形容词和名词。
- 命名实体识别(NER)—在非结构化文本中检测实体,如人名、组织名和地名。请注意,词性标注可能是 NER 流水线的一部分。
- 句子/文档分类—使用预定义的类别对句子或文档进行标记,例如情感{“积极”,“消极”}、各种主题{“娱乐”,“科学”,“历史”}或一些其他预定义的类别集。
- 情感分析—为一个句子或文档分配其中表达的情感,例如,{“积极”,“消极”}。事实上,您可以将其视为句子/文档分类的特例。
- 自动摘要—总结一系列句子或文档的内容,通常用几句话或关键词概括。
- 机器翻译—将句子/文档从一种语言翻译成另一种语言或一系列语言。
- 问答系统—确定对人类提出的问题的合适答案;例如,问题:加纳的首都是什么?答案:阿克拉。
- 闲聊机器人/聊天机器人—与人类进行一段有说服力的对话,可能旨在实现某个目标,例如最大化对话长度或从人类那里提取某些特定信息。请注意,闲聊机器人可以被构建为问答系统。
- 语音识别—将人类语音的音频转换为其文本表示。尽管已经投入了大量的工作使语音识别系统更加可靠,但在本书中,假设已经存在了语言感兴趣的文本表示。
- 语言建模 —— 确定人类语言中一系列单词的概率分布,其中知道一个序列中最有可能的下一个单词对于语言生成——预测下一个单词或句子——尤为重要。
- 依赖解析 —— 将一句话分成一个表示其语法结构和单词之间关系的依赖树。请注意,POS 标记在这里可能很重要。
1.2 在 AI 背景下理解 NLP
在继续本书的其余部分之前,了解自然语言处理这个术语,并正确地将其与其他常见术语,如人工智能、机器学习和深度学习相联系非常重要。流行媒体经常将这些术语赋予的含义与机器学习科学家和工程师使用它们的含义不匹配。因此,在我们使用这些术语时,通过图 1.2 中的部分图解精确定义这些术语非常重要。
图 1.2:自然语言处理(NLP)、人工智能(AI)、机器学习和深度学习相互关系的维恩图解。具有符号 AI 的其他相关内容也在图中显示。
如您所见,深度学习是机器学习的子集,而机器学习又是 AI 的子集。NLP 也是 AI 的子集,与深度学习和机器学习有非空交集。本图扩展了 François Chollet 提出的图表³。请参阅他的书中的第六章和第 8.1 节,了解神经网络在文本中的应用综述。符号 AI 也在图表中显示,并将在下一小节中描述。
1.2.1 人工智能(AI)
人工智能这一领域起源于 20 世纪中叶,旨在使计算机模仿和执行人类通常执行的任务。最初的方法侧重于手动推导和硬编码显式规则,以处理每种感兴趣情况的输入数据。这个范式通常被称为符号 AI。它适用于像棋类这样明确定义的问题,但在遇到属于感知类别的问题,如视觉和语音识别时,明显遇到了困难。需要一种新的范式,其中计算机可以从数据中学习新规则,而不是让人类主管明确指定它们。这导致了机器学习的崛起。
1.2.2 机器学习
在 20 世纪 90 年代,机器学习的范式成为了人工智能的主导趋势。计算机不再为每种可能的情景明确地编程,而是通过看到许多相应的输入输出对的示例来训练计算机将输入与输出信号关联起来。机器学习使用了大量的数学和统计机制,但由于它往往涉及大型和复杂的数据集,该领域更多地依赖于实验、经验观察和工程,而不是数学理论。
机器学习算法学习一种将输入数据转换为适当输出的表示。为此,它需要一组数据,例如句子分类任务中的一组句子输入,以及一组相应的输出,例如句子分类的标签,如{“positive”,“negative”}。还需要一个损失函数,它衡量机器学习模型当前输出与数据集预期输出的距离有多远。为了帮助理解,考虑一个二元分类任务,其中机器学习的目标可能是选择一个名为决策边界的函数,它将清晰地将不同类型的数据点分开,如图 1.3 所示。这个决策边界应该泛化到超出训练数据的未见示例。为了使这个边界更容易找到,您可能希望首先对数据进行预处理或转换,使其更易于分离。我们从被允许的一组称为假设集的函数中寻求这样的转换。自动确定这样一个转换,使得机器学习的最终目标更容易实现,具体来说就是所谓的学习。
图 1.3 机器学习中一个重要的激励任务的示例:在假设集中找到一个决策边界,以有效地将不同类型的点彼此分开。在本图所示的情况下,假设集可能是弧的集合。
机器学习自动化了在一些预定义的假设集中搜索最佳输入输出转换的过程,利用损失函数所体现的一些反馈信号的指导。假设集的性质确定了考虑的算法类别,我们接下来会概述。
经典机器学习是以概率建模方法为起点,例如朴素贝叶斯。在这里,我们做出一个朴素假设,即输入数据特征都是相互独立的。逻辑回归是一个相关方法,通常是数据科学家在数据集上尝试的第一个方法,以其为基准。这两类方法的假设集都是线性函数的集合。
神经网络最初是在 20 世纪 50 年代发展起来的,但直到 20 世纪 80 年代才发现了训练大型网络的有效方法——反向传播算法与随机梯度下降算法相结合。虽然反向传播提供了计算网络梯度的方法,但随机梯度下降则利用这些梯度来训练网络。我们在附录 B 中简要回顾了这些概念。第一个成功的实际应用发生在 1989 年,当时贝尔实验室的 Yann LeCun 构建了一个识别手写数字的系统,这个系统后来被美国邮政部门大量使用。
核方法 在 20 世纪 90 年代变得流行起来。这些方法试图通过找到好的决策边界来解决分类问题,就像在图 1.3 中概念化的那样。最受欢迎的方法是支持向量机(SVM)。通过将数据映射到一个新的高维表示,然后在这个表示中超平面就是有效的边界。然后最大化每个类中最近数据点与超平面之间的距离。在高维空间中操作的高计算成本通过核技巧来减轻。这个方法类别受到坚实的理论支持,并且可以进行数学分析,当核是线性函数时,这样的分析是线性的。然而,在感知机器学习问题上的表现仍有待改善,因为这些方法首先需要手动进行特征工程,这使方法变得脆弱且容易出错。
决策树及相关方法是另一类仍然被广泛使用的算法类别。决策树是一种决策支持辅助工具,可以将决策及其后果建模为树,即一个两个节点之间只有一条路径连接的图。另外,可以将树定义为将输入值转换为输出类别的流程图。决策树的流行度在 2010 年代上升,当依赖它们的方法开始被更喜欢于核方法时。这种流行度得益于它们易于可视化、理解和解释。为了帮助理解,图 1.4 展示了一个示例决策树结构,如果 A<10 则将输入 {A,B} 分类为类别 1,如果 A>=10 且 B<25 则分类为类别 2,否则分类为类别 3。
图 1.4 示例决策树结构,如果 A<10 则将输入 {A,B} 分类为类别 1,如果 A>=10 且 B<25 则分类为类别 2,否则分类为类别 3
随机森林为应用决策树提供了一种实用的机器学习方法。该方法涉及生成大量的专门树并结合它们的输出。随机森林非常灵活且广泛适用,通常在逻辑回归之后作为基线的第二种算法尝试。当 Kaggle 开放竞赛平台在 2010 年启动时,随机森林迅速成为该平台上最广泛使用的算法。在 2014 年,梯度提升机接管了这一地位。它们迭代地学习新的基于决策树的模型,解决了上一轮迭代中模型的弱点。在撰写本文时,它们被普遍认为是解决非感知机器学习问题的最佳类方法。它们在 Kaggle 上仍然非常受欢迎。
大约在 2012 年,GPU 训练的深度卷积神经网络(CNNs)开始在每年的 ImageNet 比赛中获胜,标志着当前深度学习“黄金时代”的开始。CNNs 开始主导所有主要的图像处理任务,如对象识别和对象检测。同样,我们可以在处理人类自然语言,即 NLP 方面找到应用。神经网络通过对输入数据的一系列越来越有意义的分层表示进行学习。这些层的数量指定了模型的深度。这就是术语深度学习——训练深度神经网络的过程来自哪里。为了区分它们与深度学习,所有前述的机器学习方法通常被称为浅层或传统学习方法。请注意,深度较小的神经网络也将被分类为浅层,但不是传统的。深度学习已经主导了机器学习领域,成为感知问题的明显首选,并引发了能够处理的问题复杂度的革命。
尽管神经网络受到神经生物学的启发,但它们并不是我们神经系统工作方式的直接模型。神经网络的每一层都由一组数字参数化,称为该层的权重,准确指定了它如何转换输入数据。在深度神经网络中,参数的总数可以轻易达到百万级别。前面提到的反向传播算法是用来找到正确参数集的算法引擎,也就是学习网络的过程。图 1.5 展示了一个具有两个全连接隐藏层的简单神经网络的可视化。右侧还显示了同样的总结性可视化,我们经常会使用。一个深度神经网络可能有许多这样的层。一个显著的神经网络架构,不符合前馈性质的是长短期记忆(LSTM)循环神经网络(RNN)架构。与图 1.5 中的前馈架构不同,该架构接受长度为 2 的固定长度输入,而 LSTMs 可以处理任意长度的输入序列。
图 1.5 显示了一个具有两个全连接隐藏层的简单前馈神经网络的可视化(左)。右侧是一个总结性的等效表示,我们经常会用来简化图表。
正如之前提到的,引发深度学习最近兴趣的因素是硬件的跨度,大量数据的可用性以及算法的进步。GPU 最初是为视频游戏市场开发的,互联网的成熟开始为该领域提供前所未有的质量和数量的数据。维基百科、YouTube 和 ImageNet 是数据源的具体例子,其可用性推动了计算机视觉和自然语言处理的许多进步。神经网络消除了昂贵的手工特征工程的需求——这是将浅层学习方法成功应用于感知数据所需的——这可以说是影响了深度学习易于采纳的因素。由于自然语言处理是一个感知问题,它也将是本书中讨论的最重要的机器学习算法类别之一,尽管不是唯一的。
接下来,我们的目标是深入了解自然语言处理(NLP)领域的历史和进展。
1.2.3 自然语言处理(NLP)
语言是人类认知中最重要的方面之一。毋庸置疑的是,为了创建真正的人工智能,机器需要被教导如何解释、理解、处理和作出对人类语言的反应。这强调了自然语言处理对人工智能和机器学习领域的重要性。
就像人工智能的其他子领域一样,处理自然语言处理问题的初始方法,如句子分类和情感分析,都是基于显式规则或符号型人工智能。这种系统通常无法推广到新的任务,并且很容易崩溃。自从 20 世纪 90 年代核方法诞生以来,人们一直致力于特征工程——将输入数据手动转化为浅层学习方法可以用来产生有用预测的形式。这种方法非常耗时、任务特定且对非专家来说难以接触。深度学习的出现(大约在 2012 年)引发了自然语言处理的真正革命。神经网络能够在其某些层自动设计合适的特征,降低了这些方法对新任务和问题的适用性门槛。然后,人们将精力集中在为特定任务设计适当的神经网络架构,以及调整训练过程中的各种超参数设置上。
训练自然语言处理系统的标准方式是收集一组大量的数据点,每个数据点都可靠地注释了输出标签,比如情感分析任务中的“积极”或“消极”的句子或文档。然后将这些数据点提供给机器学习算法,学习最佳的输入到输出信号的表示或转换,可以推广到新的数据点。在自然语言处理和机器学习的其他子领域中,这个过程通常被称为“监督学习”范式。标注过程通常是手动完成的,为学习代表性转换提供“监督信号”。另一方面,从无标签数据中学习表示转换被称为“无监督学习”。
虽然今天的机器学习算法和系统并非生物学习系统的直接复制品,也不应被认为是这种系统的模型,但它们的某些方面受到了进化生物学的启发,而在过去,从生物学中汲取的灵感引导了显著的进步。基于这一点,似乎不合逻辑的是,对于每个新的任务、语言或应用领域,监督学习过程传统上都是从零开始重复。这一过程在某种程度上与自然系统学习的方式背道而驰——建立在之前获得的知识之上并进行再利用。尽管如此,从零开始学习感知任务仍取得了重大进展,特别是在机器翻译、问答系统和聊天机器人领域,虽然其中仍存在一些缺点。尤其是,当样本分布发生重大变化时,现有系统在处理时的稳定性较差。换句话说,系统学会了在特定类型的输入上表现良好。如果我们改变输入类型,这可能导致性能显著下降,甚至完全失效。此外,为了完全民主化人工智能,并使自然语言处理对小型企业的普通工程师——或对没有大型互联网公司所拥有的资源的人——变得更易获得,能够下载和重复使用其他地方获得的知识将是极其有益的。这对于生活在官方语言可能与英语或其他流行语言不同的国家的人,以及从事可能在他们所在地区独特的任务或从未有人探索过的任务的人来说,也非常重要。迁移学习提供了一种解决这些问题的方法。
迁移学习使人们能够从一个环境——我们定义为特定任务、领域和语言的组合——转移知识到另一个不同的环境。原始环境自然被称为源环境,而最终的环境称为目标环境。迁移过程的难易程度和成功程度取决于源环境和目标环境的相似性。很自然地,如果目标环境在某种意义上与源环境“相似”,在这本书的后面我们将对此做出定义,那么迁移将会更加容易且成功。
转移学习在自然语言处理中的隐式使用时间比大多数从业者意识到的要长得多,因为常见做法是使用预训练的嵌入,如word2vec或sent2vec(在下一节中会更详细介绍)对单词进行向量化。 浅层学习方法通常被应用于这些向量作为特征。 我们将在接下来的章节和第四章中更详细地介绍这两种技术,并在整本书中以各种方式应用它们。 这种流行的方法依赖于一个无监督的预处理步骤,首先用于训练这些嵌入而不需要任何标签。 然后,从这一步中获取的知识被转移到特定的应用程序中,在监督设置中,通过使用浅层学习算法在一小部分标记示例上对所说的知识进行改进和专业化,以解决手头的问题。 传统上,将无监督和监督学习步骤相结合的这种范式被称为半监督学习。
接下来,我们将详细介绍自然语言处理进展的历史进程,特别关注转移学习最近在这一重要的人工智能和机器学习子领域中所起的作用。
1.3 自然语言处理进展简史
要框架化你对自然语言处理中转移学习的状态和重要性的理解,首先了解历史上对这个人工智能子领域重要的任务和技术可以是有帮助的。 本节介绍了这些任务和技术,并以自然语言处理转移学习最近的进展概述告终。 这个概述将帮助你适当地将转移学习在自然语言处理中的影响放入背景,并理解为什么它现在比以往任何时候都更重要。
1.3.1 概述
自然语言处理诞生于 20 世纪中叶,与人工智能同时出现。 自然语言处理的一个重要历史里程碑是 1954 年的乔治城实验,在该实验中,大约 60 个俄语句子被翻译成英语。 在 20 世纪 60 年代,麻省理工学院(MIT)的自然语言处理系统 ELIZA 成功模拟了一名心理医生。 同样在 20 世纪 60 年代,信息表示的向量空间模型被开发出来,其中单词被表示为实数向量,这些向量可进行计算。 20 世纪 70 年代,基于处理输入信息的复杂手工规则集的一系列闲聊机器人/聊天机器人概念被开发出来。
在 1980 年代和 1990 年代,我们看到了将系统化的机器学习方法应用于自然语言处理的出现,计算机发现了规则,而不是人类制定了规则。这一进步与当时机器学习的普及爆炸同时发生,正如我们在本章前面已经讨论过的那样。1980 年代末,将奇异值分解(SVD)应用于向量空间模型,导致潜在语义分析—一种无监督的确定语言中单词关系的技术。
在 2010 年代初,神经网络和深度学习在该领域的崛起,彻底改变了自然语言处理。这些技术被证明在最困难的自然语言处理任务中取得了最先进的结果,例如机器翻译和文本分类。2010 年代中期见证了 word2vec 模型的发展,以及其变种 sent2vec、doc2vec 等等。这些基于神经网络的技术将单词、句子和文档(分别)向量化,以一种确保生成的向量空间中向量之间距离代表相应实体之间的差异的方式,即单词、句子和文档。事实上,这些嵌入的一些有趣属性允许处理类比—在诱导的向量空间中,单词Man和King之间的距离大约等于单词Woman和Queen之间的距离,例如。用于训练这些基于神经网络的模型的度量来自语言学领域,更具体地说是分布语义学,不需要标记数据。一个单词的含义被假定与其上下文相关联,即周围的单词。
各种嵌入文本单元的方法,例如单词、句子、段落和文档,成为现代自然语言处理的关键基石。一旦文本样本被嵌入到适当的向量空间中,分析通常可以简化为对真实向量操作的众所周知的浅层统计/机器学习技术的应用,包括聚类和分类。这可以看作是一种隐式迁移学习的形式,以及一种半监督机器学习流水线—嵌入步骤是无监督的,学习步骤通常是监督的。无监督的预训练步骤实质上降低了标记数据的要求,从而减少了实现给定性能所需的计算资源—我们将在本书中学习如何利用迁移学习来为更广泛的情景提供服务。
大约在 2014 年,序列到序列模型⁷被开发出来,并在困难任务,如机器翻译和自动摘要中取得显著改进。特别是,尽管在神经网络之前的 NLP 流水线由几个明确的步骤组成,例如词性标注、依存句法分析和语言建模,但后来表明机器翻译可以进行“序列到序列”的处理。在这里,深度神经网络的各个层自动执行了所有这些中间步骤。这些模型学会了通过一个将输入序列(例如一种语言中的源句子)与一个输出序列(例如该句子的另一种语言的翻译)相关联的方法,通过将输入转换成上下文向量的编码器和将其转换成目标序列的解码器。编码器和解码器通常被设计为循环神经网络(RNNs)。这些能够在输入句子中编码顺序信息,这是早期模型(如词袋模型)无法做到的,从而显著提高了性能。
然而,人们发现,长输入序列更难处理,这促使了被称为注意力的技术的发展。这一技术通过让模型关注输入序列中最相关的部分,显著改善了机器翻译序列模型的性能。一个叫做transformer的模型进一步定义了自注意力层,用于编码器和解码器,使两者都能相对于输入序列中的其他文本段构建更好的上下文。这种架构在机器翻译方面取得了显著的改进,并且观察到它更适合在大规模并行硬件上进行训练,将训练速度提高了一个数量级。
直到 2015 年左右,大多数自然语言处理的实用方法都集中在词级别,这意味着整个单词被视为不可分割的原子实体,并被赋予一个特征向量。这种方法有几个缺点,尤其是如何处理从未见过或词汇外的单词。当模型遇到这样的单词时,比如单词拼写错误时,该方法会失败,因为无法对其进行向量化。此外,社交媒体的兴起改变了什么被视为自然语言的定义。现在,数十亿人通过表情符号、新发明的俚语和故意拼错的单词在线表达自己。不久之后,人们意识到,许多这些问题的解决方案自然地来自于以字符级别处理语言。在这个范式中,每个字符都将被向量化,只要人类使用可接受的字符表达自己,就可以成功生成向量特征,并成功应用算法。Zhang 等人⁹在字符级别 CNN 用于文本分类的背景下展示了这一点,并展示了对拼写错误的显著鲁棒性。
1.3.2 最近的迁移学习进展
传统上,针对任何给定的问题设置——任务、领域和语言的特定组合——学习都是以完全监督或完全无监督的方式进行的,从头开始。如前所述,半监督学习早在 1999 年就在 SVM 的背景下被认识到,作为一种解决可能有限标记数据可用性的方式。对更大规模的未标记数据集进行初始无监督预训练步骤使下游监督学习更容易。对此的变体被研究用于解决可能存在噪声——可能不正确——标签的情况,这种方法有时被称为弱监督学习。然而,通常假设标记数据集和未标记数据集的采样分布是相同的。
迁移学习放宽了这些假设。1995 年,在神经信息处理系统会议(NeurIPS)上,迁移学习被普遍认为是“学习学习”。基本上,它规定智能机器需要具有终身学习能力,以重复利用学到的知识进行新任务。此后,这一点已经在几个不同的名称下进行了研究,包括学习学习、知识转移、归纳偏差和多任务学习。在多任务学习中,算法被训练以在多个任务上同时表现良好,从而发现可能更普遍有用的特征。然而,直到 2018 年左右,才开发出了实用且可扩展的方法来解决 NLP 中最困难的感知问题。
2018 年可谓是自然语言处理领域的一场革命。对于如何最好地将文本集合表示为向量的理解发生了巨大变革。此外,人们普遍认识到开源模型可以进行微调或转移到不同的任务、语言和领域。与此同时,一些大型互联网公司发布了更多、更大的自然语言处理模型,用于计算这些表示,并且指定了明确定义的微调程序。突然之间,即使是普通从业者,甚至是独立从业者,也能够获得自然语言处理方面的最新成果。有人称之为自然语言处理的“ImageNet 时刻”,这是在 2012 年之后看到的计算机视觉应用的爆发,当时一个 GPU 训练的神经网络赢得了 ImageNet 计算机视觉竞赛。就像最初的 ImageNet 时刻一样,预训练模型库首次为大量的自然语言处理数据提供了支持,以及对使用标记数据集微调到特定任务的明确定义技术,其数据集大小明显小于否则所需的大小。本书的目的是描述、阐明、评估、可证明地应用、比较和对比属于此类别的各种技术。我们接下来简要概述这些技术。
早期对自然语言处理的迁移学习的探索主要集中在类比于计算机视觉,后者在过去十多年中已经成功使用了。其中一种模型——本体建模语义推理(SIMOn)[¹⁰]——采用了字符级卷积神经网络(CNN)与双向 LSTM 结合的结构语义文本分类。SIMOn 方法展示了直接类比于计算机视觉的自然语言处理迁移学习方法。计算机视觉应用的丰富知识库激发了这种方法。该模型学到的特征被证明对无监督学习任务有用,并且在社交媒体语言数据上表现良好,这种语言有些特殊,与维基百科和其他大型基于书籍的数据集上的语言非常不同。
原始的 word2vec 公式中一个显著的弱点是消歧。无法区别在不同上下文中可能具有不同含义的单词的各种用法,例如同音异形词的情况——鸭子(姿势)与鸭子(鸟类)或公平(一次集会)与公平(有正义)。在某种意义上,原始的 word2vec 公式通过单词的平均向量表示来代表一个单词中这些不同同音异形词的向量的平均值。从语言模型中嵌入(¹¹ ELMo)——以受欢迎的Sesame Street角色命名-试图使用双向 LSTM 开发单词的上下文化嵌入。在这个模型中,一个单词的嵌入非常依赖于它的上下文,相应的数值表示对于每个这样的上下文是不同的。ELMo 通过训练来预测单词序列中的下一个词,这与本章开头介绍的语言建模概念有很大关系。大型数据集,如维基百科和各种书籍数据集,可用于此框架的训练。
通用语言模型微调(Universal Language Model Fine-Tuning, ULMFiT )¹² 方法被提出来为了微调任何一种基于神经网络的语言模型以适应特定任务,并在文本分类的情况下被初步证明。这种方法背后的一个重要概念是有区别的微调,其中网络的不同层以不同的速率进行训练。OpenAI 的生成式预训练变换器(Generative Pretrained Transformer, GPT)改变了变换器的编码器-解码器架构,以实现 NLP 微调语言模型。它放弃了编码器,并保留了解码器及其自我注意力子层。来自变形金刚的双向编码器表征¹³ (Bidirectional Encoder Representations from Transformers, BERT) 则相反,修改了变换器的结构,保留了编码器并丢弃了解码器,还依赖于单词掩蔽,需要准确预测训练指标。这些概念将在接下来的章节中详细讨论。
在所有这些基于语言模型的方法中——ELMo、ULMFiT、GPT 和 BERT,都表明生成的嵌入可以针对特定的下游 NLP 任务进行微调,只需相对较少的标记数据点即可。对语言模型的关注是有意义的:假设它们诱导的假设集是普遍有用的,并且已知为大规模训练准备了数据。
接下来,我们重点介绍计算机视觉中的迁移学习的关键方面,以更好地理解在 NLP 中的迁移学习,并看看是否可以为我们的目的学到和借鉴一些知识。这些知识将成为本书剩余部分中驱动我们对 NLP 迁移学习探索的丰富类比的来源。
1.4 计算机视觉中的迁移学习
尽管本书的目标是自然语言处理,但将 NLP 迁移学习放在计算机视觉迁移学习的背景下进行框架化有助于理解。这样做的原因之一是,来自 AI 的这两个子领域的神经网络架构可能具有某些相似的特征,因此可以借鉴计算机视觉的方法,或者至少用它们来指导 NLP 的技术。事实上,计算机视觉领域中这些技术的可用性被认为是最近 NLP 迁移学习研究的一个重要驱动因素。研究人员可以访问一个定义良好的计算机视觉方法库,以在相对未被探索的 NLP 领域进行实验。然而,这些技术直接可转移的程度是一个开放的问题,有几个重要的区别需要注意。一个这样的区别是,NLP 神经网络通常比计算机视觉中使用的神经网络要浅。
1.4.1 总体概述
计算机视觉或视觉机器人的目标是使计算机理解数字图像和/或视频,包括获取、处理和分析图像数据,并根据它们的派生表示做出决策。视频分析通常可以通过将视频分成帧来进行,然后可以将其视为图像分析问题。因此,理论上计算机视觉可以被提出为图像分析问题而不失一般性。
计算机视觉诞生于 20 世纪中期,与人工智能一起出现。显然,视觉是认知的重要部分,因此致力于建造智能机器人的研究人员早期就认识到它的重要性。上世纪六十年代,首批方法试图模仿人类视觉系统,而上世纪七十年代人们更加关注提取边缘和场景中形状建模。上世纪八十年代,各个方面的计算机视觉方法越来越成熟,尤其是人脸识别和图像分割,到了上世纪九十年代出现了数学严谨的方法。这个时期正值机器学习流行的时期,正如我们前面所提到的。接下来的几十年,致力于为图像开发更好的特征提取方法。在应用浅层机器学习技术之前,进行努力和重心在此。2012 年的“ImageNet 时刻”,当 GPU 加速的神经网络第一次在广受关注的 ImageNet 比赛中大幅领先时,标志着该领域的革命。
- ImageNet¹⁴ 最初于 2009 年发布,并迅速成为测试目标识别最佳方法的竞赛基础。著名的 2012 年神经网络条目指出了深度学习作为计算机视觉特别是机器学习中感知问题的前进之路。对我们来说,一些研究人员很快意识到,来自预训练的 ImageNet 模型的神经网络权重可以用于初始化其他有时看似无关的任务的神经网络模型,并显著提高性能。
- 1.4.2 预训练的 ImageNet 模型
- 在 ImageNet 每年的标志性比赛中获胜的各个团队非常慷慨地共享了他们的预训练模型。以下是一些值得注意的 CNN 模型示例。
- VGG 架构最初是在 2014 年引入的,具有 VGG16(深度为 16)和 VGG19(深度为 19 层)两个变种。为了使更深的网络在训练过程中收敛,需要首先训练较浅的网络直至收敛,然后使用它的参数初始化更深的网络。该架构被发现在训练过程中有些慢,而且参数总数相对较大——约为 1.3 亿至 1.5 亿个参数。
- 2015 年 ResNet 架构解决了其中一些问题。尽管更深层,但参数数量显著减少——最小的变种 ResNet50 深 50 层,约有 5000 万个参数。实现这种减少的关键是通过一种称为 最大池化 的技术进行正则化,并通过子构建块的模块化设计。
- 其他值得注意的例子包括 Inception 及其扩展 Xception,分别于 2015 年和 2016 年提出,旨在通过在同一网络模块中堆叠多个卷积来创建多个级别的特征提取。这两个模型都进一步显著减小了模型大小。
- 1.4.3 微调预训练的 ImageNet 模型
- 由于已经提出了预训练的 CNN ImageNet 模型,因此从头开始训练计算机视觉模型是不常见的。目前更常见的方法是下载其中一个这些开源模型,并在有限的标记数据上使用它来初始化类似的架构,例如 微调 一部分层,或者将其用作固定的特征提取器。
在图 1.6 中显示了在前馈神经网络中选择要微调的一部分层的可视化。随着目标领域中的数据量增加,阈值从输出(向输入)移动,阈值和输出之间的层被重新训练。这种变化是因为增加的数据量可以有效地用于训练更多的参数,而否则是无法完成的。此外,阈值的移动方向必须是从右到左,即远离输出端,接近输入端。这种移动方向使我们能够保留编码接近输入端的一般特征的层,同时重新训练接近输出端的层,它们编码源领域特定特征。而且,当源领域和目标领域高度不同的时候,一些阈值右侧的更具体的参数/层可以被丢弃。
另一方面,特征提取涉及仅移除网络的最后一层,该层不再产生数据标签,而是产生一组数值向量,可以通过浅层机器学习方法(如支持向量机 SVM)进行训练,就像以前一样。
在重新训练或微调方法中,先前的预训练权重并不全部保持不变,而是允许其中的一个子集根据新的标记数据进行改变。然而,重要的是要确保在有限的新数据上训练的参数数量不会导致过度拟合,这促使我们冻结一些参数以减少正在训练的参数的数量。通常是以经验的方式来选择要冻结的层数,图 1.6 中的启发式方法指导了这一点。
图 1.6 表现了在计算机视觉中适用于前馈神经网络架构的各种迁移学习启发式方法的可视化,在 NLP 中我们将尽可能利用它。随着目标领域中的训练数据的增加,阈值向左移动,它右侧的所有参数都被重新训练,除了那些由于源领域和目标领域越来越不同而被丢弃的参数。
在 CNN 中已经确定,靠近输入层的早期层—执行更一般的图像处理任务的功能,例如检测图像中的任何边缘。 靠近输出层的后期层—执行更特定于手头任务的功能,例如将最终的数值输出映射到特定标签。 这种安排导致我们首先解冻和微调靠近输出层的层,然后逐渐解冻和微调接近输入层的层,如果发现性能不满意,这个过程将继续,只要目标任务的可用标记数据集能够支持训练参数的增加。
这个过程的一个推论是,如果目标任务的标记数据集非常大,整个网络可能都需要被微调。另一方面,如果目标数据集很小,就需要仔细考虑目标数据集与源数据集的相似程度。如果非常相似,模型体系结构可以直接初始化为预训练权重进行微调。如果非常不同,当初始化时,放弃一些网络的后续层的预训练权重可能会对目标任务没有任何相关性。此外,由于数据集不是很大,在微调时应该只解冻剩余后续层的一小部分。
我们将进行计算实验,以进一步探索这些启发式方法。
1.5 为什么 NLP 迁移学习是一个令人兴奋的研究课题?
现在我们已经在整体人工智能和机器学习领域的背景下框定了 NLP 的当前状态,我们可以很好地总结为什么本书的主题重要,以及为什么您作为读者应该非常关心这个主题。
到目前为止,显而易见的是,近年来这一领域的进展迅速加速。许多预训练语言模型首次提供,同时也提供了明确定义的程序,用于对其进行更具体的任务或领域的微调。人们发现可以类比于计算机视觉领域进行迁移学习的方式,一些研究小组能够迅速借鉴现有的计算机视觉技术,推动我们对 NLP 迁移学习的了解的进展。这项工作取得了重要的优势,即为那些没有大量资源的普通从业者减少了这些问题的计算和训练时间要求。
目前该领域存在着大量的激动人心的研究,并且大量的研究人员正在从事这个问题领域的研究。在这个新颖的学科中存在许多未解决的问题,这为机器学习研究人员通过帮助推动知识水平的提高而使自己出名提供了机会。同时,社交媒体已经成为人类互动中越来越重要的因素,它带来了在自然语言处理中以前未曾见过的新挑战。这些挑战包括俚语/行话和表情符号的使用,这些在通常用于训练语言模型的更正式语言中可能找不到。一个示例是在社交媒体自然语言生态系统中发现的严重漏洞——尤其是关于主权民主国家针对其他外国政府的选举干预指控,比如剑桥分析丑闻。此外,对“假新闻”问题恶化的一般感觉增加了人们对该领域的兴趣,并推动了在构建这些系统时应考虑的道德问题的讨论。所有这些,加上在各个领域不断增长的越来越复杂的聊天机器人的增加,以及相关的网络安全威胁,意味着自然语言处理中的迁移学习问题有望继续增长其重要性。
总结
- 人工智能(AI)承诺着从根本上改变我们的社会。为了使这种转变的好处普及化,我们必须确保最新的进展对每个人都是可访问的,无论其语言、获取大规模计算资源的能力和出生国是什么。
- 机器学习是人工智能中主要的现代范式,它不是为每种可能的情况明确地编程计算机,而是通过看到许多这样对应的输入-输出对的例子,训练它将输入与输出信号关联起来。
- 自然语言处理(NLP)是我们将在本书中讨论的人工智能的子领域,它涉及对人类自然语言数据的分析和处理,是当今人工智能研究中最活跃的领域之一。
- 近年来在自然语言处理领域中流行的一种范式,迁移学习,使你能够将从一个任务或领域中获得的知识适应或迁移到另一个任务或领域。这对于自然语言处理的民主化以及更广泛地说是人工智能,是一个重要的进步,使得知识可以在新环境中以前所需资源的一小部分重新使用,而这些资源可能并不是所有人都能得到的。
- 关键的建模框架,使得在自然语言处理中实现迁移学习成为可能,包括 ELMo 和 BERT。
- 社交媒体重要性的近期上升改变了什么被认为是自然语言的定义。现在,数十亿人在网上使用表情符号、新创造的俚语和故意拼写错误的单词来表达自己。所有这些都提出了新的挑战,在开发新的自然语言处理迁移学习技术时我们必须考虑到这些挑战。
- 在计算机视觉中,迁移学习相对较为成熟,因此在尝试新的自然语言处理迁移技术时,我们应尽可能借鉴这一知识体系。
- K. Schwab,《第四次工业革命》(日内瓦:世界经济论坛,2016 年)。
- J. Devlin 等人,“BERT: 深度双向转换器的预训练”,arXiv (2018)。
- F. Chollet,《Python 深度学习》(纽约:Manning Publications,2018 年)。
- T. Mikolov 等人,“词表示在向量空间中的高效估计”,arXiv (2013)。
- M. Pagliardini 等人,“使用组合 n-Gram 特征的句子嵌入的无监督学习”,NAACL-HLT 论文集 (2018)。
- Q. V. Le 等人,“句子和文档的分布式表示”,arXiv (2014)。
- I. Sutskever 等人,“序列到序列学习的神经网络”,NeurIPS 论文集 (2014)。
- A. Vaswani 等人,“注意力就是一切”,NeurIPS 论文集 (2017)。
- X. Zhang 等人,“用于文本分类的字符级卷积网络”,NeurIPS 论文集 (2015)。
- P. Azunre 等人,“基于字符级卷积神经网络的表格数据集的语义分类”,arXiv (2019)。
- M. E. Peters 等人,“深层上下文化词表示”,NAACL-HLT 论文集 (2018)。
- J. Howard 等人,“通用语言模型微调用于文本分类”,第 56 届计算语言学年会论文集 (2018)。
- J. Devlin 等人,“BERT: 深度双向转换器的预训练”,NAACL-HLT 论文集 (2019)。
- J. Deng 等人,“ImageNet:一个大规模分层图像数据库”,NAACL-HLT 论文集 (2019)。
- K. Schaffer,《数据与民主:大数据算法如何塑造观点并改变历史进程》(纽约:Apress,2019 年)。
第二章:开始使用基线:数据预处理
本章包括
- 介绍一对自然语言处理(NLP)问题
- 获取和预处理用于此类问题的自然语言处理数据
- 使用关键的广义线性方法为这些问题建立基线
在本章中,我们直接着手解决自然语言处理问题。这将是一个分为两部分的练习,横跨本章和下一章。我们的目标是为一对具体的自然语言处理问题建立一组基线,以便稍后用于衡量利用越来越复杂的迁移学习方法获得的渐进改进。在此过程中,我们旨在提升您的一般自然语言处理直觉,并更新您对为此类问题设置问题解决流程所涉及的典型程序的理解。您将复习从分词到数据结构和模型选择等技术。我们首先从头开始训练一些传统的机器学习模型,为这些问题建立一些初步的基线。我们在第三章中完成练习,在那里我们将最简单形式的迁移学习应用于一对最近流行的深度预训练语言模型。这涉及在目标数据集上仅微调每个网络的最终几层。这项活动将作为本书主题——自然语言处理的迁移学习的实际动手介绍的一种形式。
我们将专注于一对重要的代表性示例自然语言处理问题:电子邮件的垃圾分类和电影评论的情感分类。这个练习将装备您一些重要的技能,包括一些获取、可视化和预处理数据的技巧。我们将涵盖三种主要的模型类别:广义线性模型,如逻辑回归,基于决策树的模型,如随机森林,以及基于神经网络的模型,如 ELMo。这些类别另外由具有线性核的支持向量机(SVM),梯度提升机(GBM)和 BERT 所代表。要探索的不同类型的模型如图 2.1 所示。请注意,我们不明确讨论基于规则的方法。这些方法的一个广泛使用的示例是简单的关键词匹配方法,该方法会将包含某些预先选择的短语的所有电子邮件标记为垃圾邮件,例如,“免费彩票”作为垃圾邮件,“了不起的电影”作为正面评价。这些方法通常作为许多工业应用中解决自然语言处理问题的首次尝试,但很快被发现脆弱且难以扩展。因此,我们不再深入讨论基于规则的方法。我们在本章讨论这些问题的数据及其预处理,并引入和应用广义线性方法。在下一章,作为整体练习的第二部分,我们将决策树方法和神经网络方法应用于数据。
图 2.1 本章和下一章将探讨文本分类示例中不同类型的监督模型。
我们为每个示例和模型类别提供了代码示例,让你能快速掌握这些技术的要点,同时也可以培养编码技巧,以便能够直接应用到自己的问题中。所有代码都以渲染后的 Jupyter 笔记本形式提供在本书的伴随 GitHub 代码库,以及 Kaggle 笔记本/内核中。你可以在几分钟内开始运行 Kaggle 笔记本/内核,而无需处理任何安装或依赖问题。渲染后的 Jupyter 笔记本提供了在正确执行时可以预期的输出示例,而 Kaggle 提供了基于浏览器的 Jupyter 执行环境,同时还提供了有限的免费 GPU 计算资源。虽然 Google Colab 是 Jupyter 的主要替代方案之一,但我们选择在这里使用 Kaggle。你也可以使用 Anaconda 在本地轻松安装 Jupyter,并欢迎将笔记本转换为 .py 脚本以供本地执行,如果你更喜欢的话。然而,我们推荐使用 Kaggle 笔记本来执行这些方法,因为它们可以让你立即开始,无需任何设置延迟。此外,在撰写本文时,该服务提供的免费 GPU 资源扩大了所有这些方法的可访问性,使那些可能没有本地强大 GPU 资源的人们也能够使用,与关于 NLP 迁移学习的“人工智能民主化”议程保持一致,这激发了很多人的兴趣。附录 A 提供了一个 Kaggle 快速入门指南,以及作者对如何最大化平台价值的个人建议。然而,我们预计大多数读者应该可以很轻松地开始使用它。请注意在下面的注释中附带的重要技术注意事项。
注意 Kaggle 经常更新依赖项,即其 Docker 镜像上安装的库的版本。为了确保您使用的是我们编写代码时使用的相同依赖项——以保证代码可以直接使用而进行最小更改,请确保对感兴趣的每个笔记本选择“复制并编辑内核”,这些笔记本的链接列在本书的伴随存储库中。如果您将代码复制粘贴到一个新的笔记本中,并且不遵循此推荐过程,您可能需要针对创建它时为该笔记本安装的特定库版本稍微调整代码。如果选择在本地环境中安装,请注意我们在伴随存储库中共享的冻结依赖要求列表,该列表将指导您需要哪些库的版本。请注意,此要求文件旨在记录并完全复制在 Kaggle 上实现书中报告结果的环境;在不同的基础设施上,它只能用作指南,并且您不应期望它直接使用,因为可能存在许多潜在的与架构相关的依赖冲突。此外,对于本地安装,大多数要求都不是必需的。最后,请注意,由于在撰写本文时 ELMo 尚未移植到 TensorFlow 2.x,我们被迫使用 TensorFlow 1.x 来公平比较它和 BERT。在伴随存储库中,我们确实提供了如何在 TensorFlow 2.x 中使用 BERT 进行垃圾邮件分类示例的示例。我们在后续章节中从 TensorFlow 和 Keras 过渡到使用 TensorFlow 2.x 的 Hugging Face transformers 库。您可以将第二章和第三章中的练习视为早期为 NLP 迁移学习开发的早期软件包的历史记录和体验。这个练习同时帮助您将 TensorFlow 1.x 与 2.x 进行对比。
2.1 预处理电子邮件垃圾分类示例数据
在本节中,我们介绍了本章将要讨论的第一个示例数据集。在这里,我们有兴趣开发一个算法,它可以在规模上检测任何给定的电子邮件是否为垃圾邮件。为此,我们将从两个独立的来源构建数据集:流行的恩隆电子邮件语料库作为非垃圾邮件的代理,以及一系列“419”欺诈邮件作为垃圾邮件的代理。
我们将把这看作是一个监督分类任务,在这个任务中,我们将首先在一组被标记为垃圾邮件或非垃圾邮件的电子邮件上训练一个分类器。虽然在线上存在一些标记数据集用于训练和测试,与这个问题密切相关,但我们将采取另一种方式,从一些其他知名的电子邮件数据源创建我们自己的数据集。这样做的原因是更贴近实践中数据收集和预处理通常发生的方式,其中数据集首先必须被构建和筛选,而不是文献中这些过程通常被简化的方式。
尤其是,我们将采样安然公司语料库——最大的公开电子邮件收集,与臭名昭著的安然金融丑闻有关——作为非垃圾邮件的代理,以及采样“419”欺诈邮件,代表最为知名的垃圾邮件类型,作为垃圾邮件的代理。这两种类型的电子邮件都可以在 Kaggle 上公开获取,³,⁴,这是一个流行的数据科学竞赛平台,这使得在那里运行示例特别容易,而不需要太多的本地资源。
安然语料库包含大约五十万封由安然公司员工撰写的电子邮件,由联邦能源委员会收集,用于调查该公司的倒闭。这个语料库在文献中被广泛用于研究用于电子邮件应用的机器学习方法,并且通常是研究人员与电子邮件一起进行初步算法原型实验的首选数据源。在 Kaggle 上,它作为一个单列.csv 文件提供,每行一个电子邮件。请注意,与许多实际应用中可能找到的情况相比,此数据仍然更干净。
图 2.2 显示了在这个示例中将在每封电子邮件上执行的步骤序列。电子邮件的正文将首先与电子邮件的标头分开,将提取一些关于数据集的统计信息以了解数据的情况,将从电子邮件中删除停用词,然后将其分类为垃圾邮件或非垃圾邮件。
图 2.2 对输入电子邮件数据执行的预处理任务序列
2.1.1 加载和可视化安然公司语料库
我们需要做的第一件事是使用流行的 Pandas 库加载数据,并查看数据的一个切片,以确保我们对数据的外观有一个良好的了解。清单 2.1 展示了一旦获取了安然公司语料库数据集并放置在变量filepath
指定的位置(在这种情况下,它指向我们 Kaggle 笔记本中的位置)后,要执行的代码。在导入之前,请确保所有库都已通过以下命令进行 PIP 安装:
pip install <package name>
清单 2.1 加载安然公司语料库
import numpy as np ❶ import pandas as pd ❷ filepath = "../input/enron-email-dataset/emails.csv" emails = pd.read_csv(filepath) ❸ print("Successfully loaded {} rows and {} columns!".format(emails.shape[0], emails.shape[1])) ❹ print(emails.head(n=5))
❶ 线性代数
❷ 数据处理,CSV 文件输入输出(例如,pd.read_csv)
❸ 将数据读入名为 emails 的 Pandas DataFrame 中
❹ 显示状态和一些加载的电子邮件
执行代码成功后将确认加载的列数和行数,并显示加载的 Pandas DataFrame 的前五行,输出如下所示:
Successfully loaded 517401 rows and 2 columns! file message 0 allen-p/_sent_mail/1\. Message-ID: <18782981.1075855378110.JavaMail.e... 1 allen-p/_sent_mail/10\. Message-ID: <15464986.1075855378456.JavaMail.e... 2 allen-p/_sent_mail/100\. Message-ID: <24216240.1075855687451.JavaMail.e... 3 allen-p/_sent_mail/1000\. Message-ID: <13505866.1075863688222.JavaMail.e... 4 allen-p/_sent_mail/1001\. Message-ID:<30922949.1075863688243.JavaMail.e...
尽管这个练习让我们对结果 DataFrame 有了一个了解,并形成了一个很好的形状感觉,但还不太清楚每封单独的电子邮件是什么样子。为了达到这个目的,我们通过下一行代码仔细检查第一封电子邮件
print(emails.loc[0]["message"])
产生以下输出:
Message-ID: <18782981.1075855378110.JavaMail.evans@thyme> Date: Mon, 14 May 2001 16:39:00 -0700 (PDT) From: phillip.allen@enron.com To: tim.belden@enron.com Subject: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-From: Phillip K Allen X-To: Tim Belden <Tim Belden/Enron@EnronXGate> X-cc: X-bcc: X-Folder: \Phillip_Allen_Jan2002_1\Allen, Phillip K.\'Sent Mail X-Origin: Allen-P X-FileName: pallen (Non-Privileged).pst Here is our forecast
我们发现消息都包含在结果 DataFrame 的 message 列中,每条消息开头的额外字段——包括 Message ID、To、From 等——被称为消息的 头信息 或简称头部。
面向自然语言处理的迁移学习(一)(2)https://developer.aliyun.com/article/1519831