预训练语言模型:方法、实践与应用

978-7-115-65056-6
作者: 徐双双
译者:
编辑: 王旭丹

图书目录:

详情

近年来,在自然语言处理领域,基于预训练语言模型的方法已形成全新范式。本书内容分为基础知识、预训练语言模型,以及实践与应用3个部分,共9章。第一部分全面、系统地介绍自然语言处理、神经网络和预训练语言模型的相关知识。第二部分介绍几种具有代表性的预训练语言模型的原理和机制(涉及注意力机制和Transformer模型),包括BERT及其变种,以及近年来发展迅猛的GPT和提示工程。第三部分介绍了基于LangChain和ChatGLM-6B的知识库问答系统、基于大型语言模型的自然语言处理任务应用研究和大模型训练实战等具体应用,旨在从应用的角度加深读者对预训练语言模型理论的理解,便于读者在实践中提高技能,达到理论和实践的统一。 本书适合计算机相关专业的学生,以及其他对预训练语言模型感兴趣的读者阅读。


图书摘要

版权信息

书名:预训练语言模型:方法、实践与应用

ISBN:978-7-115-65056-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


版  权

编  著 徐双双

责任编辑 王旭丹

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内 容 提 要

近年来,在自然语言处理领域,基于预训练语言模型的方法已形成全新范式。本书内容分为基础知识、预训练语言模型,以及实践与应用3个部分,共9章。第一部分全面、系统地介绍自然语言处理、神经网络和预训练语言模型的相关知识。第二部分介绍几种具有代表性的预训练语言模型的原理和机制(涉及注意力机制和Transformer模型),包括BERT及其变种,以及近年来发展迅猛的GPT和提示工程。第三部分介绍了基于LangChain和ChatGLM-6B的知识库问答系统、基于大型语言模型的自然语言处理任务应用研究和大模型训练实战等具体应用,旨在从应用的角度加深读者对预训练语言模型理论的理解,便于读者在实践中提高技能,达到理论和实践的统一。

本书适合计算机相关专业的学生,以及其他对预训练语言模型感兴趣的读者阅读。

前  言

近十几年来,随着深度学习技术的快速发展,自然语言处理领域的技术取得了显著的进展和突破。深度学习技术的引入为自然语言处理任务提供了强大的建模能力和表达能力,使得其在各类应用场景,如文本理解、机器翻译、问答系统等,取得了巨大的突破。以BERT和GPT为代表的大规模预训练语言模型,通过在大规模语料库上进行预训练,可以学习到丰富的语言表达和语义知识。预训练语言模型能够将语言转化为高维向量表示,从而实现对语义、语法和上下文的理解。这为自然语言处理任务提供了更好的特征表示和模型基础,进一步推动了自然语言处理领域的发展。本书试图从基础知识、预训练语言模型及实践与应用3个层面对预训练语言模型进行全面且深入的介绍,让感兴趣的读者能够大致了解预训练语言模型的发展历史、实现原理和应用。

本书内容

本书内容分为3个部分:基础知识、预训练语言模型、实践与应用。各部分内容如下。

第一部分:基础知识。该部分介绍了与预训练语言模型相关的基础知识。

第1章首先介绍自然语言处理的定义和发展历史;其次介绍自然语言的复杂性和自然语言处理的研究领域;接着以机器翻译和信息抽取为例重点介绍自然语言处理的常规任务;最后介绍自然语言处理的常用工具,并以PyTorch为例,重点介绍其基本概念、机制及代码实现。

第2章主要介绍神经网络预备知识,包括神经网络核心概念和主要类型,涉及全连接神经网络、卷积神经网络、循环神经网络、长短期记忆网络、自编码器和生成对抗网络的网络结构和模型实现。

第3章介绍预训练语言模型基础知识,包括预训练的定义和文本表示方法的分类,重点介绍词袋型文本表示方法、主题型文本表示方法、固定型词向量文本表示方法和动态型词向量文本表示方法这4类文本表示方法。

第二部分:预训练语言模型。该部分主要介绍了几种大型预训练语言模型的原理和机制。

第4章首先介绍注意力机制,包括注意力机制的定义、自注意力机制和多头注意力机制。然后介绍基于注意力机制的Transformer模型,包括编码器部分和解码器部分,以及模型示例。

第5章重点介绍预训练语言模型BERT及其变种。首先从模型结构、输入表示、预训练、微调训练和模型示例这5个方面重点介绍BERT,然后详细介绍BERT的几个变种,包括ALBERT、XLNet、RoBERTa、ELECTRA和ERNIE。

第6章首先介绍GPT系列模型,包括GPT-1、GPT-2、GPT-3、InstructGPT、ChatGPT和GPT-4的训练数据和运行机制,然后对提示工程定义、构建提示模板的方法、提示工程常用技术和提示词应用示例等进行详细介绍。

第三部分:实践与应用。该部分主要通过任务示例来介绍预训练语言模型在具体应用中的流程和实现。

第7章主要介绍基于LangChain和ChatGLM-6B 的知识库问答系统,包括核心组件、构建流程,以及趋势与挑战。

第8章从文本分类、信息抽取和文本匹配这3个具体任务着手,分别介绍对应的任务描述、提示词设计、实现与测试。

第9章着重介绍大模型的训练过程。首先从数据准备、数据处理、词表扩充、模型预训练和模型效果评测几个方面介绍预训练阶段的实现,其次介绍指令微调阶段、奖励模型和RLHF微调的具体实现,最后从评测内容、评测方法和评测挑战3个方面介绍大模型评测。

致谢

本书的编著参阅了大量的学术论文、研究报告和技术文档,力求为读者奉上一本通俗、准确且实用的参考书。我们希望读者通过阅读本书,能够全面了解预训练语言模型的相关知识和应用,并在实际工作中灵活运用和深入探索预训练语言模型。

由于编者水平有限,书中不足之处在所难免,敬请各位读者批评指正,来信请发往wangxudan@ptpress.com.cn。

徐双双

2023年11月

资源与支持

资源获取

本书提供如下资源:

配套源文件;

本书思维导图。

要获得以上资源,扫描下方二维码,根据指引领取。

提交勘误

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区(https://www.epubit.com/),按书名搜索,进入本书页面,点击“发表勘误”,输入错误相关信息,点击“提交勘误”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。

如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。

“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域40余年的发展与积淀。异步图书面向IT行业以及使用IT相关技术的用户。

第一部分 基础知识

第一部分介绍与预训练语言模型相关的基础知识,首先介绍自然语言处理的相关知识,如自然语言处理的定义和发展历史、自然语言的复杂性、自然语言处理的研究领域、自然语言处理的常规任务和常用工具;接着介绍神经网络预备知识,包括神经网络核心概念和主要类型;最后,从预训练的定义和文本表示方法的分类着手,对各类文本表示方法进行详细介绍。

本部分包括以下内容。

自然语言处理介绍

神经网络预备知识

预训练语言模型基础知识

第1章 自然语言处理介绍

随着人工智能与计算机科学技术的不断发展,自然语言处理作为人工智能领域研究的重点之一,也不断演化出新的研究方向。本章将首先介绍自然语言处理的定义、发展历史,自然语言的复杂性,以及自然语言处理的研究领域。随后,以机器翻译与信息抽取为例介绍这两类任务的任务目的、常用方法和大致流程。最后,简要介绍自然语言处理过程中常用的基础任务类工具、与机器学习相关的科学计算类工具和深度学习框架类工具,并介绍PyTorch。

1.1 什么是自然语言处理

要理解自然语言处理,就需要先理解自然语言与人工语言的区别。自然语言通常指随着人类族群发展自然演化而来的语言,如汉语、英语、阿拉伯语等;人工语言则是由人为了达成某些特定目的而创造的语言,如数学公式、编程语言等。

自然语言处理旨在让计算机处理、理解和生成人类自然语言。通俗地说,计算机接收用户自然语言形式的输入,并在内部通过人类定义的规则、算法等进行加工与计算等一系列操作,以模拟人类对自然语言的理解,并将结果返回给用户。自然语言处理研究涉及数学、人工智能、计算机科学、语言学、心理学等领域知识。

1.2 自然语言处理的发展历史

自然语言处理的研究最早可以追溯到20世纪50年代左右的机器翻译,1946年第一台电子数字积分计算机(Electronic Numerical Integrator and Computer,ENIAC)的成功运行让人们看到了传统翻译技术变革的可能。1948年,信息论奠基人克劳德·埃尔伍德·香农(Claude Elwood Shannon)发表了一篇划时代的论文A Mathematical Theory of Communication(《通信的数学理论》),他将热力学中“熵”的概念引入信息论,用于衡量一段信息所包含的信息量的多少。1950年,图灵(Turning)提出了著名的“图灵测试”,这一般被认为是人工智能研究和自然语言处理思想的开端。为了研究如何让计算机实现自动翻译,1952年,麻省理工学院召开了第一次机器翻译大会。两年后,在国际商业机器(International Business Machines,IBM)公司的协助下,美国乔治敦大学研究人员用IBM 701计算机进行了世界上第一次机器翻译试验,将几个简单的俄语句子成功翻译为英语,至此,拉开了人类使用计算机处理自然语言的序幕。

为了推动机器翻译的研究与应用,1954年,美国瓦伦·韦弗(Warren Weaver)出版了Machine Translation(《机器翻译》),这是业界第一本关于机器自动翻译的期刊。研究人员开始建立自然语言相关规则库,试图用不断新增的规则来解决翻译自然语言的问题。令人遗憾的是,自然语言具有任意性与复杂性的问题远远不是更新和维护规则库所能解决的。

随着研究的深入,研究人员引入和借鉴其他领域的思想,用来对自然语言建模。1956年,美国逻辑学家斯蒂芬·科尔·克莱尼(Stephen Cole Kleene)提出了正则表达式的概念,通过制定规则来匹配和替换符合条件的文本。1957年,美国语言学家阿夫拉姆·诺姆·乔姆斯基(Avram Noam Chomsky)在其语言学著作Syntactic Structures(《句法结构》)中提出,上下文可以无关语法,利用代数和集合论将形式语言定义为符号的序列,任何语言的任意一条语句均可被视为有限自动机产生的符号序列。

这些代表性研究人员的工作推动了自然语言处理技术两大阵营的诞生,即基于规则的符号主义学派与基于概率方法的连接主义学派。

进入20世纪60年代,研究人员发展了解析算法,利用不同解析策略实现对自然语言结构的解析,将输入语句转换为结构单元,再对结构单元进行操作。也有其他研究人员利用随机方法中的概率来表示自然语言的模糊性,进而对自然语言进行建模表示。而到了20世纪70年代,随着机器翻译研究项目进度放缓,未能达到预期表现,对自然语言处理研究的资金支持也大为缩减,人工智能和自然语言处理的研究进入低谷期。

随着计算机技术的发展和硬件成本的降低,自然语言处理的相关研究在20世纪80年代开始复苏,这一时期最为关键的技术之一是利用统计学习方法来处理自然语言处理任务,这提升了语音识别的准确率,使机器翻译取得重大进展。

从20世纪90年代开始,随着技术的发展和个人计算机的普及,信息检索与信息抽取领域对自然语言处理技术的需求显著增加。这一时期,统计与概率驱动的方法逐步成为主流,句法解析、词性标注、机器翻译等都利用统计学习思想取得了较大突破。

进入21世纪后,深度学习,尤其是神经网络方向的兴起,使得自然语言处理迎来了一个全新时代。研究人员利用深度神经网络对自然语言进行建模,这一思路直接催生了后续在自然语言处理领域大放异彩的词嵌入、序列到序列模型等。

如今,自然语言处理领域快速发展,形成了百花齐放的局面,让这项技术在搜索系统、问答系统、机器翻译、阅读理解、文本生成、对话机器人等越来越多的应用领域中取得较好表现。

1.3 自然语言的特性

自然语言经历了漫长的发展过程,在世界各地形成了不同语言分支,其中汉藏语系和印欧语系的使用人数最多。汉语是汉藏语系的代表,英语是印欧语系的代表。在语言表示形式上,两者差异明显,汉语以表义(字形)构成,而英语以表音(字音)构成。下面将以汉语和英语这两种语言为例,简要介绍自然语言的4个主要特性。

1.3.1 歧义性

歧义指的是一个符合语法规则且遵循逻辑常理的语句包含两种或两种以上释义的语言现象。歧义性问题是自然语言中普遍存在的问题。图1-1为汉语和英语中具有典型歧义性的句子的示例。

图1-1 汉语与英语中具有典型歧义性的句子的示例

从图1-1的示例中可以看出,同样一个句子,因为断句或读音不同,最终的理解会出现较大差别。从歧义类型上看,汉语中存在结构层次歧义、结构关系歧义、语义关系歧义、语用歧义等;英语中存在词层面上的歧义和句法层面上的歧义等。而相比英语,汉语中词与词之间没有天然的分隔符,导致计算机处理中文时,需要先进行分词处理。

1.3.2 主观性

不同读者在阅读同一个故事或同一本书时,各自的理解也是不同的,背后的原因是人们对语言的理解与自身认知水平、过往经历甚至性格息息相关,具有强烈的主观性。“一千个读者就有一千个哈姆雷特。”这句话正反映了这种现象,比如对于同一本书,喜爱它的读者就算读过多次依旧兴致盎然,而不喜爱该书的读者阅读时却味同嚼蜡。

语言本质上是由社会共识产生的符号系统,这就意味着,当人们用语言来表达各类对象、概念和情感等时,都是通过一种约定俗成的方式来赋予符号特定意义的。语言约定俗成的特性给语言带来了主观性,因为语言的意义往往取决于使用者如何理解并使用它,而这就是一个主观过程。

语言的主观性往往会导致对语言理解的不确定性,使得人们利用计算机建模时,极难兼具高精确度和高覆盖度。

1.3.3 创造性

随着科学技术的飞速发展,尤其是互联网的日益普及,新事物和新概念等层出不穷。面对新现象或表达新想法时,语言的灵活性赋予了人们创造新词汇的能力。

在语言学领域,新词指的是新出现的词或词组,是口语或书面语中反映新事物、新概念等的表意明确、利于交流的词或词组。在形式上,新词可以是全新创造的,也可以是为适应新环境而赋予旧词以新意。简单地说,新词是新创造的词及表达。国内有专门的研究人员从事新词领域的研究工作。2000—2020年汉语新词增加量如图1-2所示。

图1-2 2000—2020年汉语新词增加量

英语新词主要包括自造词和外来词,前者形成的主要原因是随着科技的发展和时代的进步,人们自行构造词汇来表示层出不穷的新事物、新现象、新科技等,如coronavirus(冠状病毒)、blockchain(区块链)、athleisure(运动休闲风)等;后者主要是从其他语言引入的词汇,如从汉语引入的kung fu(功夫)、feng shui(风水),从日语引入的sumo(相扑)、ninja(忍者)等。

不少自造词和外来词其实并不常用,但它们的增多让英语变得越来越“臃肿”。

对自然语言处理研究人员来说,语言的创造性带来的多样性与任意性问题,尤其是如何自动化地准确识别新词,给技术实现带来了颇多挑战。

1.3.4 社会性

自然语言是人类社会建设的重要基础,方便了人与人之间的交流。语言在人们的生活中是不可或缺的,人们的生活离不开语言,语言也离不开人们的生活,两者是相互依存的关系,所以语言的社会化是必然的。

不同的地域形成了不同的语言,这些语言的产生、演化和使用都与周围环境息息相关。如非洲一些原住民会用多种方式描述草原,而生活在北极的因纽特人则根本不知道草原为何物,不过,他们会用几十个词来描述不同的雪,这也是非洲原住民想象不到的。信息与知识依赖语言在一个群体内传播,并积累下来,形成群体认知。群体认知则进一步强化了群体的认同感,成为群体文化的基础。

语言是个体与他人和社会联系的纽带,掌握某种语言的过程本身就是社会化的过程,从这点来说,语言具有社会性。

1.4 自然语言处理的研究领域

自然语言处理主要研究的是针对语言的智能,处理对象主要是文本。从广义上说,语音方向的研究也属于自然语言处理领域。

2023年,国际计算语言学学会(Association for Computational Linguistics,ACL)对自然语言处理的主要研究领域做了一次详细的划分,共列出了26个领域,它们代表着当前计算语言学和自然语言处理研究的不同方面。每个领域下又给出了一些子领域,也是当前备受关注的子领域。2023年,ACL公布的自然语言处理研究领域如表1-1所示。

表1-1 ACL于2023年公布的自然语言处理研究领域

序号

自然语言处理研究领域

序号

自然语言处理研究领域

1

计算社会科学和文化分析

14

机器翻译

2

对话和交互系统

15

多语言和跨语言自然语言处理

3

话语和语用学

16

自然语言处理应用

4

自然语言处理和伦理

17

音系学、形态学和词语分割

5

语言生成

18

问答

6

信息抽取

19

语言资源及评价

7

信息检索和文本挖掘

20

语义学:词汇层面

8

自然语言处理模型的可解释性与分析

21

语义学:句级语义、文本推断和其他领域

9

视觉、机器人等领域的语言基础

22

情感分析、文本风格分析和论点挖掘

10

大模型

23

语音和多模态

11

语言多样性

24

文摘

12

语言学理论、认知建模和心理语言学

25

句法学:标注、组块分析和句法分析

13

自然语言处理中的机器学习

26

主题领域:现实检测

1.5 自然语言处理的常规任务

在自然语言处理的研究与技术应用过程中,自然语言处理通常可以被分为自然语言理解(Natural Language Understanding,NLU)和自然语言生成(Natural Language Generation,NLG)。NLU负责理解内容,NLG负责生成内容。

NLU 常规任务包括分词、词性标注、句法分析、文本分类、信息检索、信息抽取、文字校对等;NLG 常规任务包括各类文本生成式任务等。在许多任务场景(如对话系统、机器翻译、自动问答等)中,两者通常需要合作,共同作用。

本节以机器翻译和信息抽取为例简要说明自然语言处理的任务目的、常用方法和大致流程。

1.5.1 机器翻译

实现不同语言之间的无障碍沟通,一直是人类终极梦想之一。机器翻译正是实现这一终极梦想的必由之路。机器翻译是利用机器自动地将一种语言翻译成另一种语言的技术。

与其他需要人类丰富创造力的领域一样,对机器翻译的探索既令人神往,又充满艰辛,常常需要耗费大量的智力资源。

机器翻译的基本流程如图1-3所示。

图1-3 机器翻译的基本流程

预处理的作用是将种类繁多的文本进行规范化处理,归整成符合规范的句子;核心翻译是机器翻译中最关键的部分,是将输入的字符单元或序列翻译成目标语言序列的过程;后处理是将翻译结果进行规范化处理的过程,包括特殊符号处理、大小写的转换、建模单元拼接等操作,使得翻译结果符合人们的阅读习惯。

机器翻译技术通常可以分为规则机器翻译、统计机器翻译、神经机器翻译这3类机器翻译技术。

1.规则机器翻译

作为第一代机器翻译技术,规则机器翻译采用规则形式将翻译专家的知识列出来,再利用软件手段实现翻译过程。比如首先采用一一映射规则,翻译输入文本序列的每个词;再利用拼接规则,将每个词的翻译结果进行拼接,得到翻译结果。

尽管语言学家与机器翻译研究人员总结了许多复杂的规则,但对更复杂的真实世界的文字来说,规则并不可靠。

2.统计机器翻译

在基于规则的翻译方法失效后,一些新的翻译方法被不断提出,基于统计的翻译方法渐渐在机器翻译领域成为主流。

与基于规则的翻译方法不同,基于统计的翻译方法并不试图生成一个精确的翻译结果,而是生成若干种可能的翻译结果,并按照可能最正确的方式给这些翻译结果排名,一般取出排名最高的结果作为最终的翻译结果。

统计机器翻译的基本思想是在一定规模的翻译语料库基础上,利用各类算法进行训练、学习,得到统计机器翻译模型,再通过参数调优,构建最终的翻译系统。比如用x表示输入语句,y表示目标语言语句,统计机器翻译的任务在于得到统计机器翻译模型,其中,表示统计机器翻译模型的参数,如图1-4所示。

图1-4 统计机器翻译过程示意

统计机器翻译的本质是用概率的思维思考翻译过程,其大致工作原理为:首先将输入语句分成块;其次,找到每一块所有可能的翻译,再生成所有可能的句子;最后找出最有可能的那个句子。

统计机器翻译推动了以谷歌公司(以下简称谷歌)为代表的大规模商业应用的落地。相较于规则机器翻译,统计机器翻译的效果有了质的突破。但问题在于,由统计机器翻译构成的翻译系统难以构建与维护,且系统越复杂,模型假设越多,上下文建模能力也偏弱,译文较为生硬。

3.神经机器翻译

神经机器翻译使用神经网络获取自然语言之间的映射关系,从而完成翻译任务。早在2013年,就有学者提出了一种用于机器翻译场景的新型端到端编码器-解码器结构,此结构使用卷积神经网络(Convolutional Neural Network,CNN)作为编码器,将源语言编码成连续的向量,再使用循环神经网络(Recurrent Neural Network,RNN)作为解码器,将通过编码器得到的向量转换成目标语言。这一研究成果标志着神经机器翻译的诞生。

不同于线性的统计机器翻译模型,神经机器翻译使用的神经网络模型可以学习到非线性映射关系,且神经机器翻译使用连续编码器和解码器的向量来描述语义的等价关系。

神经机器翻译过程示意如图1-5所示。

图1-5 神经机器翻译过程示意

随着深度学习技术的迅猛发展,2013 年,基于神经网络的翻译方法兴起,在随后短短三四年时间内,在大部分语言的翻译任务中神经机器翻译的质量已经超过了统计机器翻译的质量。不过,尽管神经机器翻译实现了机器翻译质量的巨大提升,但在技术上仍然面临许多挑战,包括漏译问题、数据稀疏问题、知识引入问题和模型可解释性问题等。

1.5.2 信息抽取

信息抽取是指从文本中抽取出关键信息的任务。根据被抽取的对象,信息抽取通常可以分为实体抽取(也称为“命名实体识别”,即Named Entity Recognition,NER)、关系抽取(Relation Extraction,RE)、事件抽取(Event Extraction,EE)、情感分析(Sentiment Analysis)和主题提取(Topic Distillation)等不同的任务。信息抽取的大致流程如图1-6所示。

图1-6 信息抽取的大致流程

1.实体抽取

实体抽取是指识别并抽取出文本中具有特定意义的实体,实体主要包括人名、地名、机构名、专有词等。作为自然语言处理领域的经典任务之一,实体抽取在诸多垂直领域有着相当重要的作用,如识别医疗领域的文本中的科室、疾病、药品、医疗器械、症状等不同实体;识别法律领域文本中的原被告姓名、案件属性、依据法条、责任承担和涉案财产等含有关键信息的实体。若能准确识别出这些实体,则可以有效地为上游的任务提供核心数据。

图1-7展示了实体抽取任务从输入文本到最终输出不同实体的大致过程。

图1-7 实体抽取任务的大致过程示意

从图1-7可知,输入的文本s是“爱因斯坦于1879年3月14日出生在德国乌尔姆市”。表示输入文本中的第i个字符,s由所有字符组成。表示实体的起始字符,表示实体的终止字符,t表示实体的类别。对输入文本s进行识别,识别出的实体及类别如下:(爱因斯坦,人名)、(1879年3月14日,日期)、(德国,地名)和(乌尔姆市,地名)。

实体抽取常见的难点包括实体的模糊性、标签冲突、过度匹配、嵌套实体和新词识别等。

2.关系抽取

关系抽取是指在非结构化或半结构化信息中找出两个实体及其对应的特定关系。通常,这两个实体分别被称为主体和客体,最终的抽取结果可以用实体关系三元组来表示,即主体、关系和客体。

图1-8展示了关系抽取任务的过程,呈现了从输入文本中抽取出不同实体及其特定关系的大致过程。

图1-8 文本关系抽取任务的过程示意

由图1-8可知,最终返回的实体关系三元组有(张三,出生于,武汉)、(张三,毕业于,武汉大学)、(张三,入职于,阿里巴巴)和(张三,任职于,算法工程师)。

关系抽取可按照对象类别划分为实体级关系抽取、句子级关系抽取、文档级关系抽取等,其中常见的任务是实体级关系抽取。

作为信息抽取的关键任务之一,实体级关系抽取一般分为两个子任务:命名实体识别和关系分类。这两个子任务通常可以用两种思路来完成:一是采用管道(Pipeline)模型,即先实现命名实体识别,再实现实体间的关系分类;二是采用联合(Joint)模型,即将命名实体识别与关系分类通过一定的方式进行整合,联合学习两个子任务,构建端到端的关系抽取模型。

这两种思路各有优缺点。管道模型的优点是命名实体识别与关系分类两个子任务的模型相互独立,灵活性高,且易于实现;它的缺点是命名实体识别的错误会影响关系分类的性能,可能会忽略两个子任务之间的内在联系与依赖关系等。联合模型的优点是一个任务就能完成两个子任务;它的缺点是模型结构相对复杂,且过程可控性差。

3.事件抽取

事件是指在特定的时间和地点发生的、涉及一个或多个参与者的特定的事,通常可以描述为状态的变化。事件抽取是从大量文本中快速获取事件信息的研究任务。作为信息抽取领域一项重要且颇具挑战性的任务,事件抽取通常包括4个子任务:触发词识别、事件类型、论元角色分类和论元识别。

事件抽取任务的过程示意如图1-9所示。

(1)触发词识别:事件抽取的核心子任务,可以清晰明了地表达状态的转变,即事件的发生。

(2)事件类型:根据现有触发词来确定每一句话是不是一个事件,可以将其看作一个多标签文本分类任务。

(3)论元角色分类:基于多分类任务,将论元识别得到的实体归入对应的类别。

(4)论元识别:从文本中识别事件类型中包含的所有论元,通常取决于触发词识别的结果。

与关系抽取类似,事件抽取的几个子任务通常也可以用管道模型和联合模型来尝试完成。

图1-9 事件抽取任务的过程示意

4.情感分析

情感分析是指利用自然语言处理等技术系统识别、提取、量化和研究情感状态与主观信息,其常见任务包括情绪检测、情感分类、立场检测、讽刺检测和评论得分等。

情感分析任务的过程示意如图1-10所示。

图1-10 情感分析任务的过程示意

情感分析按照粒度划分,通常可以分为文档级情感分析、句子级情感分析和实体级情感分析。总体来说,粒度越细,情感分析的难度越大。

文本情感分析的常见问题主要体现在以下3个方面。

(1)领域依赖:文本情感分析的模型在某一领域的文本数据上表现不错,但用于其他领域文本时,其性能可能会严重下降。

(2)情感语义理解:自然语言能够表达出相当复杂的情感,而计算机想要精准理解文本中包含的情感语义,对技术的要求较高。

(3)样本标注:文本情感分析主要利用监督学习的方法建模,较难在训练阶段获取精确的标注样本,人工标注也很难实现。

5.主题提取

主题提取指从大量的文本数据中提取出主题或特征的过程。常见的主题提取方法包括TF-IDF(Term Frequency-Inverse Doument Frequency,词频-反文档频率)、主题模型、基于排序的方法和基于聚类的方法等。

主题提取任务利用主题模型对不同文本进行主题提取的大致流程如图1-11所示。

图1-11 主题提取任务的大致流程示意

主题提取任务应用范围较广。比如新闻推荐,面对庞大的语料库,主题提取任务可以利用主题模型对每个新闻文本进行主题分析,再根据用户浏览历史向用户推荐相同主题的新闻。又如商品评论分析,主题提取任务可以利用主题模型分析不同购买者对商品的评论,提取出购买者对商品不同维度的意见,为后续的个性化商品推荐提供合理的数据支持。

1.6 自然语言处理的常用工具

工欲善其事,必先利其器。无论是处于自然语言处理前期的数据预处理阶段,还是处于后期的算法研发、参数调优、模型部署上线等阶段,都不可避免地需要使用一些工具。本节主要介绍自然语言处理的常用工具,鉴于本书中的代码实现主要依托开源深度学习库PyTorch,所以本节也会介绍PyTorch的相关基础知识。

1.6.1 常用工具

自然语言处理常用的三大类工具为基础任务类工具、与机器学习相关的科学计算类工具和深度学习框架类工具。

1.基础任务类工具

自然语言处理过程包含一些必不可少的基础任务,如中文分词、词性标注、命名实体识别、句法分析、词形还原等。这些任务具备较强的通用性,不少自然语言处理工具包如Tieba、LAC、NLTK等已经封装了常见的基础任务功能,在很多时候只需简单调用这些功能便可以完成相关任务。

2.与机器学习相关的科学计算类工具

尽管自然语言处理的对象主要是文字,但在计算机世界中,所有的文字对象都需要转化为数值的形式进行运算,这自然而然会借助不少与机器学习相关的科学计算类工具来辅助处理。

例如常用的数据计算工具NumPy、基于NumPy的高级科学计算库pandas和SciPy、基于NumPy和SciPy的机器学习库scikit-learn、常用于数据可视化场景的Matplotlib,以及大数据框架Spark中的机器学习库MLlib等。

3.深度学习框架类工具

现阶段,深度学习算法已成为自然语言处理领域的主流范式,不少业界厂商和研究机构已推出极具竞争力的深度学习框架。例如,谷歌推出的,用于深度神经网络研究和各类机器学习的TensorFlow,自开源以来,受到广泛关注且得到迅猛发展,是目前世界上使用人数最多的深度学习框架之一。本书主要用PyTorch来实现算法和模型,PyTorch是Meta公司人工智能研究团队在Torch框架的基础上进行重构,并结合具有普适性和高传播度的Python,推出的一款影响力极广的深度学习框架。

1.6.2 PyTorch介绍

作为一个兼具灵活性和易用性的深度学习框架,PyTorch使用了大量的实用工具和函数来加快工作速度。它基于Torch的动态图计算框架,支持动态构建计算图,不仅能够实现强大的GPU(Graphics Processing Unit,图形处理单元,也叫显卡)加速功能,同时还支持动态神经网络。PyTorch的设计理念是简单、灵活和易于扩展,目前已成为在学术界和工业界适用范围最广的深度学习框架之一。相比其他深度学习框架,PyTorch具有如下优点。

简单、易上手,学习和使用门槛低。

提供自动微分功能,即自动计算导数,无须手动推导和编写反向传播(Back Propagation,BP)算法。

采用模块化设计,便于组合和扩展各种模型与算法。

生态系统丰富,包括各种深度学习模型、数据集和工具库等,方便开发和部署。

采用动态计算图,可根据实际情况动态构建计算图,灵活性高。

下面介绍PyTorch的基本概念和机制。

1.张量

在深度学习领域,张量可以被视为对向量和矩阵的扩展,即它可以将向量和矩阵扩展到任意维度,我们可以将其简单理解为多维数组。在PyTorch中,张量用tensor表示,与NumPy中的多维数组类似,张量用于存储和操作模型的输入、输出和参数等。用不同维度的张量表示数据如图1-12所示。

图1-12 用不同维度的张量表示数据示意

在PyTorch中,有多种方式可以创建张量,下面给出具体示例,如代码清单1-1所示。

代码清单1-1 PyTorch中创建张量的多种方式

>>>import torch
>>>torch.randn(4, 2)       # 随机初始化一个4行2列的矩阵,其中每个值从标准正态分布中抽取
tensor([[0.9641, 0.4067],
        [0.6238, 0.7569],
        [0.9146, 0.2726],
        [0.2331, 0.9206]])
>>>torch.tensor([3, 5])    # 直接使用数据创建张量
tensor([3, 5])
>>>torch.zeros((3, 2))     # 定义一个3行2列全为0的矩阵
tensor([[0., 0.],
        [0., 0.],
        [0., 0.]])
>>>torch.ones((2, 3))      # 定义一个2行3列全为1的矩阵
tensor([[1., 1., 1.],
        [1., 1., 1.]])
>>>torch.eye(4, 4)         # 定义一个4行4列的对角矩阵
tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])
>>>torch.full([3, 3], 5)   # 定义一个3行3列全为5的矩阵
tensor([[5, 5, 5],
        [5, 5, 5],
        [5, 5, 5]])

2.张量的基本操作

张量创建完成后,可以对其进行各类操作,包括索引、切片、连接、维度转换取值等操作,以改变张量的形状、步长或内容。代码清单1-2中给出了一些操作示例。

代码清单1-2 对张量的操作

>>>import torch
>>>x = torch.rand(4, 3)  
   # 创建一个4行3列的随机张量,包含从[0,1)的均匀分布中抽取的一组随机数
>>>x[:, 1]    # 索引操作,取第二列数据
tensor([0.2246, 0.9330, 0.1902, 0.5482])
>>>x1 = torch.randn(4, 4)
>>>x1
tensor([[0.2005, 0.4795, 0.8454, 0.4631],
        [0.1176, 0.8504, 0.7416, 0.3899],
        [0.9149, 0.9343, 0.3835, 0.6069],
        [0.9072, 0.0564, 0.0423, 0.3675]])
>>>x1.size()
torch.Size([4, 4])
>>>y = x1.view(16)       # 维度变换操作
>>>y
tensor([0.2005, 0.4795, 0.8454, 0.4631, 0.1176, 0.8504, 0.7416, 0.3899, 0.9149,
        0.9343, 0.3835, 0.6069, 0.9072, 0.0564, 0.0423, 0.3675])
>>>y.size()
torch.Size([16])
>>>z = x1.view(-1, 8)    # 维度变换操作,“-1”是指这一维的维度由其他维决定
>>>z
tensor([[0.2005, 0.4795, 0.8454, 0.4631, 0.1176, 0.8504, 0.7416, 0.3899],
        [0.9149, 0.9343, 0.3835, 0.6069, 0.9072, 0.0564, 0.0423, 0.3675]])
>>>z.size()
torch.Size([2, 8])
>>>x2 = torch.randn(1)
>>>x2
tensor([-0.1048])
>>>type(x2)
<class 'torch.Tensor'>   
>>>x2.item()       # 取值操作,通过.item()算子可以获取tensor的值
-0.10479209572076797
>>>type(x2.item())
<class 'float'>    # 取出来的值为浮点型

张量的基本操作还包括数学运算和逻辑运算,前者包括求和、求均值、求平方、求乘积、求最大值等;后者包括判断两个张量的全部元素是否相等,判断一个张量的元素是否等于另一个张量的对应元素,等等。代码清单1-3中给出了部分示例。

代码清单1-3 张量的数学运算和逻辑运算

>>>import torch
>>>x1 = torch.rand(3, 2)
>>>x1
tensor([[0.0678, 0.1593],
        [0.6072, 0.8203],
        [0.7040, 0.0519]])
>>>x2 = torch.rand(3, 2)
>>>x2
tensor([[0.4910, 0.3417],
        [0.9031, 0.0746],
        [0.8801, 0.0601]])
>>>x1 + x2     # 第一种加法操作
tensor([[0.5588, 0.5010],
        [1.5103, 0.8949],
        [1.5841, 0.1120]])
>>>torch.add(x1, x2)    # 第二种加法操作
tensor([[0.5588, 0.5010],
        [1.5103, 0.8949],
        [1.5841, 0.1120]])
>>>x2.add_(x1)          # 第三种加法操作
tensor([[0.5588, 0.5010],
        [1.5103, 0.8949],
        [1.5841, 0.1120]])
>>>x3 = torch.randn(1, 3)
>>>x3
tensor([[-0.0654, -0.9895, -0.4756]])
>>>x3.mean()
tensor(-0.5102)         # 对整个张量计算平均值
>>>x4 = torch.randn(2, 3)
>>>x4
tensor([[-0.7970, 1.0293, -0.0200],
        [-0.4229, 0.2609, -0.1106]])
>>>x4.mean()
tensor(-0.0101)
>>>x5 = torch.tensor([1, 2, 3, 4])
>>>x6 = torch.tensor([1, 2, 3, 4])
>>>a.equal(b)           # 比较两个张量的全部元素是否相等,是则返回True,否则返回False
True
>>>x7 = torch.tensor([1, 2, 3])
>>>x8 = torch.tensor([3, 2, 1])
>>>x7.eq(x8)            # 比较同位置的元素是否相等,相等则对应位置返回True,否则返回False
tensor([False,  True, False])

PyTorch中涉及张量的操作超过100种,在实际场景中应用时,可根据需求查询PyTorch官方API(Application ProgramInterface,应用程序接口)文档。

3.广播机制

PyTorch 广播机制是一种在不同形状的张量之间执行按元素运算的机制,该机制使得PyTorch在无须显式地调整不同张量形状的前提下,允许它们自动按元素进行运算。比如,有一个维度为[4,1]的张量x和一个维度为[2,1]的张量y,当执行x+y时,PyTorch广播机制会自动将y扩展到与x相同的维度[4,1],然后执行按元素的加法运算。广播机制可以提升算法的运算效率,通常需遵循以下规则。

(1)每个张量至少有一个维度。

(2)将两个张量维度向右对齐,从右往左比较,每个维度必须满足以下3个条件之一。

① 两个张量的维度相等。

② 两个张量维度不等且其中一个张量的维度为1。

③ 两个张量维度不等且其中一个张量的维度不存在。

PyTorch广播机制操作示例如代码清单1-4所示。

代码清单1-4 PyTorch广播机制

>>>import torch
>>>x1 = torch.empty(3, 2, 4)
>>>y1 = torch.empty(3, 2, 4)
>>>(x1 + y1).size()    # 两个张量的维度一致,可以广播
torch.Size([3, 2, 4])
>>>x2 = torch.ones((3, 4, 1, 5))
>>>y2 = torch.ones((4, 6, 1))
>>>(x2 + y2).shape   # 从两个张量的最后一个维度向前依次比较:第一次比较,y2的维度为1;第二次比较,x2的维度为1;第三次比较,x2和y2的维度都为4,相等;第四次比较,y2的维度不存在。所以,x2和y2可以广播,进行加法运算
torch.Size([3, 4, 6, 5])
>>>x3 = torch.ones((1, 3, 4))
>>>x3 = torch.ones((1, 3, 5))
>>>x3 + y3   # 从两个张量的最后一个维度向前依次比较:4不等于5,不可进行广播
   RuntimeError: The size of tensor a (4) must match the size of tensor b (5) at non-singleton dimension 2

如果两个张量可以用广播机制进行运算,在计算过程中需遵循以下规则。

如果两个张量的维度不同,在维度较小的张量前面增加维度,保证两个张量的维度相等。

对于每个维度,计算结果的维度值取决于两个张量中较大的值。

两个张量扩展维度的过程就是对数值进行复制操作的过程。

4.自动微分

torch.autograd是PyTorch内置的自动微分(计算梯度)引擎,在实际计算过程中,系统会构建一个计算图,接着利用autograd.backward()方法来自动求计算图中各个节点的梯度。

(1)计算图。

计算图是一种用来描述运算的有向无环图,节点表示数据,节点与节点之间的连线表示运算,如式(1-1)可以用图1-13所示的计算图表示。

  (1-1)

图1-13 PyTorch中的计算图示意

(2)autograd自动求导。

autograd自动求导的过程就是指调用张量的 backward()方法,接着计算梯度并将其存储在各个张量的.grad属性中,具体使用时需设置关键字 requires_grad=True 来计算梯度。实现式(1-1),并调用backward()方法来计算梯度的方法如代码清单1-5所示。

代码清单1-5 公式的实现和自动计算梯度

>>>import torch
>>>w = torch.tensor([2.], requires_grad = True)  
>>>x = torch.tensor([3.], requires_grad = True)
>>>m = torch.add(w, x)
>>>m.retain_grad()   # 对需要保留梯度的非叶子节点使用retain_grad()方法,可以通过.grad
# 来获取其梯度
>>>n = torch.add(w, 1)
>>>y = torch.mul(m, n)
>>>y.backward()      # 自动调用反向传播算法计算
>>>w.grad
tensor([8.])

PyTorch可以用于各种场景,包括渲染、仿真、建模、优化等,在科学应用的各个领域成为一款重要的工具。基于PyTorch的从数据预处理到模型部署的流程,也是PyTorch深度学习项目的一般步骤,如图1-14所示。

图1-14 PyTorch深度学习项目的一般步骤

相关图书

CXL体系结构:高速互连的原理解析与实践
CXL体系结构:高速互连的原理解析与实践
Excelize权威指南
Excelize权威指南

相关文章

相关课程