Transformers 自然语言处理(四)

原文:zh.annas-archive.org/md5/a1e65552fc41f3b5a667f63d9bed854c

译者:飞龙

协议:CC BY-NC-SA 4.0

第十章:基于 BERT 的Transformers的语义角色标记

Transformers在过去几年中取得的进展比上一代 NLP 更大。标准的 NLU 方法首先学习句法和词汇特征来解释句子的结构。以前的 NLP 模型在运行语义角色标注SRL)之前会被训练来理解语言的基本句法。

ShiLin(2019)在他们的论文中提出了一个问题,是否可以跳过初步的句法和词汇训练。基于 BERT 的模型可以在不经历这些传统训练阶段的情况下执行 SRL 吗?答案是肯定的!

ShiLin(2019)建议将 SRL 视为序列标记,并提供标准化的输入格式。他们基于 BERT 的模型产生了令人惊讶的好结果。

本章将使用基于 ShiLin(2019)论文的艾伦人工智能研究所提供的预训练基于 BERT 的模型。ShiLin 通过放弃句法和词汇训练将 SRL 提高到了一个新的水平。我们将看到他们是如何做到的。

我们将首先定义 SRL 和序列标记输入格式的标准化。然后,我们将开始使用艾伦人工智能研究所提供的资源。接下来,我们将在 Google Colab 笔记本中运行 SRL 任务,并使用在线资源来理解结果。

最后,我们将通过运行 SRL 样本来挑战基于 BERT 的模型。第一批样本将展示 SRL 的工作原理。然后,我们将运行一些更困难的样本。我们将逐步推动基于 BERT 的模型达到 SRL 的极限。找到模型的极限是确保Transformers模型的现实和实用之路。

本章涵盖以下主题:

  • 定义语义角色标记

  • 定义 SRL 输入格式的标准化

  • 基于 BERT 的模型架构的主要方面

  • 编码器堆栈如何管理屏蔽的 SRL 输入格式

  • 基于 BERT 的模型 SRL 注意力过程

  • 开始使用由艾伦人工智能研究所提供的资源

  • 构建笔记本来运行预训练的基于 BERT 的模型

  • 在基本示例上测试句子标记

  • 在困难的例子上测试 SRL 并解释结果

  • 将基于 BERT 的模型推向 SRL 的极限并解释如何做到这一点

我们的第一步将是探索 ShiLin(2019)定义的 SRL 方法。

开始 SRL

对于人类和机器来说,SRL 都是一样困难的。然而,一次又一次,Transformers已经朝着我们人类基线迈出了一步。

在本节中,我们将首先定义 SRL 并举例说明。然后,我们将运行一个预训练的基于 BERT 的模型。

让我们首先定义 SRL 这个棘手的任务。

定义语义角色标记

ShiLin (2019)推进并证明了一个想法,即我们可以找出谁做了什么以及在哪里,而不依赖于词汇或句法特征。本章基于 Peng ShiJimmy Lin 在加利福尼亚滑铁卢大学展开的研究。他们展示了Transformers如何通过注意力层更好地学习语言结构。

SRL 将语义角色定义为单词或一组单词在句子中所起的作用以及与谓语所建立的关系。

语义角色是一个名词或名词短语在句子中与主要动词的关系中所扮演的角色。例如,在句子Marvin walked in the park中,Marvin是句子中发生事件的施事者施事者是事件的执行者。主动词,或控制动词,是walked

谓语描述了主语或施事者的一些信息。谓语可以是任何提供有关主题特征或行为的信息的东西。在我们的方法中,我们将谓语称为主要动词。例如,在句子Marvin walked in the park中,谓语是walked

词组在公园里 修饰的含义,并且是修饰语

环绕谓词的名词或名词短语称为论元论元项。例如,Marvinwalked的一个论元

我们可以看到,SRL 不需要句法树或词汇分析。

让我们可视化我们的示例的 SRL。

可视化 SRL

本章将使用 Allen Institute 的视觉和代码资源(有关更多信息,请参见参考部分)。 Allen Institute for AI 拥有出色的交互式在线工具,例如我们在本章中用来可视化 SRL 的工具。您可以在demo.allennlp.org/上访问这些工具。

Allen Institute for AI 倡导AI 造福人类。我们将充分利用这种方法。本章中的所有图表都是用 AllenNLP 工具创建的。

Allen Institute 提供了不断发展的Transformers模型。因此,当您运行这些示例时,本章中的示例可能会产生不同的结果。最充分利用本章的最佳方法是:

  • 阅读并理解解释的概念,而不只是运行程序

  • 花时间理解提供的示例

然后,使用本章中使用的工具运行您自己选择的句子进行您自己的实验:demo.allennlp.org/semantic-role-labeling

现在让我们可视化我们的 SRL 示例。图 10.1Marvin walked in the park的 SRL 表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.1: 句子的 SRL 表示

我们可以在图 10.1中观察到以下标签:

  • 动词:句子的谓语

  • 论据:一个被命名为ARG0的句子论点

  • 修饰语:句子的修饰成分。在这种情况下是一个地点。它也可以是副词,形容词,或任何修改谓词意义的成分

文本输出同样有趣,其中包含了可视表示标签的缩写形式:

walked: [ARG0: Marvin] [V: walked] [ARGM-LOC: in the park] 

我们已经定义了 SRL 并进行了一个例子。现在是时候看看基于 BERT 的模型了。

运行一个预训练的基于 BERT 的模型

本节将首先描述本章中使用的基于 BERT 的模型的架构。

接下来我们将定义使用 BERT 模型实验 SRL 样本的方法。

让我们开始看一下基于 BERT 的模型的架构。

基于 BERT 的模型架构

AllenNLP 的基于 BERT 的模型是一个 12 层只编码器的 BERT 模型。AllenNLP 团队实现了ShiLin(2019)描述的 BERT 模型,并添加了一个额外的线性分类层。

欲了解更多关于 BERT 模型的描述,如有必要,请花几分钟回顾第三章BERT 模型微调

基于 BERT 的模型充分利用了双向注意力以简单的方法和架构。Transformers模型的核心潜力存在于注意力层中。我们已经看到了既有编码器和解码器堆栈的Transformers模型。我们已经看到了其他只有编码器层或者解码器层的Transformers。Transformers的主要优势仍然在于近乎人类的注意力层方法。

ShiLin(2019)定义的谓词标识格式的输入格式显示了Transformers在标准化语言理解方面取得的进展:

[CLS] Marvin walked in the park.[SEP] walked [SEP] 

训练流程已被标准化:

  • [CLS]表示这是一个分类练习

  • [SEP]是第一个分隔符,表示句子的结束

  • [SEP]后面是作者设计的谓词标识

  • [SEP]是第二个分隔符,表示谓词标识符的结束

光是这种格式就足够训练一个 BERT 模型来识别并标记句子中的语义角色。

让我们设置环境来运行 SRL 样本。

设置 BERT SRL 环境

我们将使用 Google Colab 记事本,在demo.allennlp.org/上提供的 AllenNLP SRL 的文本可视化下进行

我们将应用以下方法:

  1. 我们将打开SRL.ipynb,安装AllenNLP,并运行每个样本

  2. 我们将显示 SRL 运行的原始输出

  3. 我们将使用 AllenNLP 的在线可视化工具来可视化输出

  4. 我们将使用 AllenNLP 的在线文本可视化工具来显示输出

本章是自包含的。您可以阅读它,或按照描述运行示例。

当 AllenNLP 更改了使用的 transformer 模型时,SRL 模型的输出可能会有所不同。这是因为 AllenNLP 的模型和 transformers 通常都是持续训练和更新的。此外,用于训练的数据集可能会发生变化。最后,这些不是基于规则的算法,每次产生的结果可能会有所不同,正如屏幕截图中所描述和显示的那样。

现在让我们运行一些 SRL 实验。

使用基于 BERT 的模型进行 SRL 实验

我们将使用本章“设置 BERT SRL 环境”的方法来运行 SRL 实验。我们将从具有各种句子结构的基本样本开始。然后,我们将挑战基于 BERT 的模型,使用一些更难的样本来探索系统的能力和限制。

打开SRL.ipynb并运行安装单元格:

!pip install allennlp==2.1.0 allennlp-models==2.1.0 

然后我们导入标记模块和训练好的 BERT 预测器:

from allennlp.predictors.predictor import Predictor
import allennlp_models.tagging
import json
predictor = Predictor.from_path("https://storage.googleapis.com/allennlp-public-models/structured-prediction-srl-bert.2020.12.15.tar.gz") 

我们还添加了两个函数来显示 SRL BERT 返回的 JSON 对象。第一个显示谓语动词和描述:

def head(prediction):
  # Iterating through the json to display excerpt of the prediciton
  for i in prediction['verbs']:
    print('Verb:',i['verb'],i['description']) 

第二个函数显示完整的响应,包括标签:

def full(prediction):
  #print the full prediction
  print(json.dumps(prediction, indent = 1, sort_keys=True)) 

在本出版物发布之时,BERT 模型专门用于语义角色标注。该模型的名称是 SRL BERT。SRL BERT 是使用 OntoNotes 5.0 数据集进行训练的:catalog.ldc.upenn.edu/LDC2013T19

此数据集包含句子和注释。该数据集设计用于识别句子中的谓词(包含动词的部分),并确定提供有关动词的更多信息的单词。每个动词都带有其关于它的“参数”,告诉我们更多信息。一个“框架”包含一个动词的参数。

因此,SRL BERT 是一个专门训练来执行特定任务的专用模型,并且与我们在第七章看到的 OpenAI GPT-3 一样,并不是像 OpenAI GPT-3 这样的基础模型。

SRL BERT 将专注于语义角色标注,只要句子包含谓词,就可以以可以接受的准确度执行。

现在我们已经准备好使用一些基本样本进行热身了。

基本样本

基本样本在直观上看起来很简单,但分析起来可能有点棘手。复合句,形容词,副词和情态动词对于非专业人士来说甚至也很难识别。

让我们从 transformer 的一个简单样本开始。

样本 1

第一个样本很长,但对 transformer 来说相对容易:

“Bob 真的以为自己能在几小时内为 50 个人准备一顿饭吗?”

运行SRL.ipynb中的样本 1单元格:

prediction=predictor.predict(
    sentence="Did Bob really think he could prepare a meal for 50 people in only a few hours?"
)
head(prediction) 

BERT SRL 识别了四个谓词;每个谓词的动词都标记了结果,如在使用head(prediction)函数显示的这段摘录中:

Verb: Did [V: Did] Bob really think he could prepare a meal for 50 people in only a few hours ?
Verb: think Did [ARG0: Bob] [ARGM-ADV: really] [V: think] [ARG1: he could prepare a meal for 50 people in only a few hours] ?
Verb: could Did Bob really think he [V: could] [ARG1: prepare a meal for 50 people in only a few hours] ?
Verb: prepare Did Bob really think [ARG0: he] [ARGM-MOD: could] [V: prepare] [ARG1: a meal for 50 people] [ARGM-TMP: in only a few hours] ? 

您可以通过运行full(prediction)单元格来查看完整的响应。

如果我们根据 PropBank(命题银行)的结构使用数据集参数的描述,例如在这段摘录中,动词think可以被解释为:

  • V标识动词think

  • ARG0标识代理人; 因此,Bob是代理人或“主体代理人”

  • ARGM-ADVreally视为副词(ADV),ARGM表示该副词提供一个修饰语(不是必要的),因此没有编号

如果我们在 AllenNLP 在线界面上运行样本,则会获得每个动词一个框架的 SRL 任务的可视化表示。第一个动词是Did

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.2:识别动词“Did”

第二个确认的动词是think

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.3:识别动词“think”

如果我们仔细观察这个表示,我们可以检测到 SRL BERT 的一些有趣属性:

  • 检测到动词think

  • 避免了可能被解释为主要动词的prepare陷阱。 相反,prepare仍然是think的论点的一部分

  • 检测到一个副词并进行标记

第三个动词是could

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.4:识别动词“could”和论点

转换器然后转向动词prepare,标记它,并分析其上下文:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.5:识别动词“prepare”,论点和修饰语

再次,基于简单 BERT 的转换器模型检测到了大量关于句子语法结构的信息,并发现:

  • 确定动词prepare并将其孤立出来

  • 确定名词he并将其标记为论据,对于a meal for 50 people也做同样处理,这是一个“原始患者”,涉及由其他参与者修改

  • in only a few hours是一个时间修饰语(ARGM-TMP

  • could是一个表示动词情态性的情态修饰语,例如事件发生的可能性

现在我们将分析另一个相对较长的句子。

样本 2

下面的句子看似简单,但包含多个动词:

Mrs.和 Mr. Tomaso 去欧洲度假并访问巴黎,首先去参观埃菲尔铁塔。

这个令人困惑的句子会使转换器犹豫吗?让我们通过运行SRL.ipynb笔记本的Sample 2单元格来看一下:

prediction=predictor.predict(
    sentence="Mrs. and Mr. Tomaso went to Europe for vacation and visited Paris and first went to visit the Eiffel Tower."
)
head(prediction) 

输出摘录证明转换器正确识别了句子中的动词:

Verb: went [ARG0: Mrs. and Mr. Tomaso] [V: went] [ARG4: to Europe] [ARGM-PRP: for vacation] and visited Paris and first went to visit the Eiffel Tower .
Verb: visited [ARG0: Mrs. and Mr. Tomaso] went to Europe for vacation and [V: visited] [ARG1: Paris] and first went to visit the Eiffel Tower .
Verb: went [ARG0: Mrs. and Mr. Tomaso] went to Europe for vacation and visited Paris and [ARGM-TMP: first] [V: went] [ARG1: to visit the Eiffel Tower] .
Verb: visit [ARG0: Mrs. and Mr. Tomaso] went to Europe for vacation and visited Paris and first went to [V: visit] [ARG1: the Eiffel Tower] . 

在 AllenNLP 在线上运行样本,可识别四个谓词,从而生成四个框架。

第一个框架是went

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.6:识别动词“went”,论点和修饰语

我们可以解释动词went的论点。Mrs.和 Mr. Tomaso是代理。 转换器发现动词的主要修饰语是旅行目的:to Europe。 如果我们不知道ShiLin(2019)只是建立了一个简单的 BERT 模型来获取这种高质量的语法分析,则结果将不令人惊讶。

我们还可以注意到wentEurope正确关联。Transformers正确地识别了动词visitedParis相关联:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.7:识别动词“visited”和论点

Transformers本可以将动词visited直接与Eiffel Tower关联起来。但是它没有。它坚持自己的立场并做出了正确的决定。

我们要求Transformers做的下一个任务是确定动词went的第二次使用的上下文。同样,它没有陷入将与动词went相关的所有论点合并的陷阱。再次,它正确地分割了序列并产生了一个出色的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.8:识别动词“went”,论点和修饰语

动词went被使用了两次,但Transformers没有陷入陷阱。它甚至发现first是动词went的时间修饰语。

最后,动词visit第二次被使用,而 SRL BERT 正确解释了它的使用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.9:识别动词“visit”和论点

让我们运行一个更加令人困惑的句子。

示例 3

示例 3 将使我们的Transformers模型变得更加困难。以下示例包含动词drink的变体四次:

John 想喝茶,Mary 喜欢喝咖啡,但 Karim 喝了一些凉爽的水,Faiza 想喝番茄汁。

让我们在 SRL.ipynb 笔记本中运行 示例 3

prediction=predictor.predict(
    sentence="John wanted to drink tea, Mary likes to drink coffee but Karim drank some cool water and Faiza would like to drink tomato juice."
)
head(prediction) 

Transformers找到了它的方法,如下面输出的摘录所示,其中包含动词:

Verb: wanted [ARG0: John] [V: wanted] [ARG1: to drink tea] , Mary likes to drink coffee but Karim drank some cool water and Faiza would like to drink tomato juice .
Verb: drink [ARG0: John] wanted to [V: drink] [ARG1: tea] , Mary likes to drink coffee but Karim drank some cool water and Faiza would like to drink tomato juice .
Verb: likes John wanted to drink tea , [ARG0: Mary] [V: likes] [ARG1: to drink coffee] but Karim drank some cool water and Faiza would like to drink tomato juice .
Verb: drink John wanted to drink tea , [ARG0: Mary] likes to [V: drink] [ARG1: coffee] but Karim drank some cool water and Faiza would like to drink tomato juice .
Verb: drank John wanted to drink tea , Mary likes to drink coffee but [ARG0: Karim] [V: drank] [ARG1: some cool water] and Faiza would like to drink tomato juice .
Verb: would John wanted to drink tea , Mary likes to drink coffee but Karim drank some cool water and [ARG0: Faiza] [V: would] like [ARG1: to drink tomato juice] .
Verb: like John wanted to drink tea , Mary likes to drink coffee but Karim drank some cool water and [ARG0: Faiza] [ARGM-MOD: would] [V: like] [ARG1: to drink tomato juice] .
Verb: drink John wanted to drink tea , Mary likes to drink coffee but Karim drank some cool water and [ARG0: Faiza] would like to [V: drink] [ARG1: tomato juice] . 

当我们在 AllenNLP 在线界面上运行句子时,我们获得了几个视觉表示。我们将检查其中的两个。

第一个完美。它识别了动词wanted并做出了正确的关联:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.10:识别动词“wanted”和论点

当它识别到动词drank时,它正确地排除了Faiza,并且只产生了some cool water作为论点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.11:识别动词“drank”和论点

到目前为止,我们发现基于 BERT 的Transformers在基本样本上产生了相对较好的结果。所以让我们尝试一些更困难的样本。

困难样本

本节将运行包含 BERT-based Transformers首先解决的问题的示例。最后,我们将以一个棘手的样本结束。

让我们从一个 BERT-based Transformers可以分析的复杂样本开始。

示例 4

示例 4 将我们带入更复杂的 SRL 领域。该样本将Alice与动词liked分开,创建了一个长期依赖,必须跳过whose husband went jogging every Sunday.

句子是:

Alice,她的丈夫每个星期天都去慢跑,而她则喜欢在此期间去跳舞课。

一个人可以分离出Alice并找到谓词:

爱丽丝喜欢在此期间去上舞蹈课。

BERT 模型能像我们一样找到谓词吗?

让我们首先在SRL.ipynb中运行代码,看看结果如何:

prediction=predictor.predict(
    sentence="Alice, whose husband went jogging every Sunday, liked to go to a dancing class in the meantime."
)
head(prediction) 

输出确定了每个谓词的动词并标记了每个框架:

Verb: went Alice , [ARG0: whose husband] [V: went] [ARG1: jogging] [ARGM-TMP: every Sunday] , liked to go to a dancing class in the meantime .
Verb: jogging Alice , [ARG0: whose husband] went [V: jogging] [ARGM-TMP: every Sunday] , liked to go to a dancing class in the meantime .
Verb: liked [ARG0: Alice , whose husband went jogging every Sunday] , [V: liked] [ARG1: to go to a dancing class in the meantime] .
Verb: go [ARG0: Alice , whose husband went jogging every Sunday] , liked to [V: go] [ARG4: to a dancing class] [ARGM-TMP: in the meantime] .
Verb: dancing Alice , whose husband went jogging every Sunday , liked to go to a [V: dancing] class in the meantime . 

让我们关注我们感兴趣的部分,看看模型是否找到了谓词。它找到了!它在输出的节选中找到了动词liked,尽管动词likeAlice被另一个谓词隔开:

动词:liked [ARG0: Alice,whose husband went jogging every Sunday]

现在让我们看看在 AllenNLP 的在线 UI 上运行样本后模型分析的视觉表示。转换器首先找到了爱丽丝的丈夫:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.12:谓语“went”已被识别

转换器解释道:

  • 谓语或动词是went

  • whose husband是参数

  • 慢跑是另一个与went相关的参数

  • 每个星期天是一个表示在原始输出中的时间修饰语 [ARGM-TMP: 每个星期天]

然后转换器发现了爱丽丝的丈夫在什么:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.13:动词“慢跑”的 SRL 检测

我们可以看到动词jogging被识别出来并与她的丈夫以及时态修饰语每个星期天相关联。

转换器到此为止。现在它发现了爱丽丝喜欢什么:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.14:识别动词“liked”

转换器还正确地检测和分析了动词go

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.15:检测动词“go”,它的参数和修饰语

我们可以看到,时态修饰语与此同时也被识别出来了。考虑到 SRL BERT 训练时的简单序列 + 动词输入,这是相当出色的表现。

最后,转换器确定了最后一个动词dancingclass有关:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.16:将参数“class”与动词“跳舞”相关联

示例 4产生的结果相当令人信服!让我们尝试找到转换器模型的极限。

示例 5

示例 5 不会多次重复动词。但是,示例 5 包含一个具有多种功能和含义的单词。它超越了一词多义,因为单词round可以有不同的含义和语法功能。单词round可以是名词、形容词、副词、及物动词或不及物动词。

作为及物动词或不及物动词,round可以达到完美或完成。在这个意义上,round可以用于off

以下句子使用round的过去式:

明亮的太阳,蓝天,温暖的沙滩,棕榈树,一切都圆满结束。

此谓词中的动词round是“使完美”的意思。当然,最容易理解的语法形式应该是“rounded”。但我们来看看我们的句子会发生什么。

让我们在SRL.ipynb中运行Sample 5

prediction=predictor.predict(
    sentence="The bright sun, the blue sky, the warm sand, the palm trees, everything round off."
)
head(prediction) 

输出显示没有动词。变换器未识别出谓词。实际上,即使我们运行full(prediction)函数时,它也找不到任何动词:

"verbs": [] 

然而,在线版本似乎更好地解释了句子,因为它找到了动词:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.17:检测动词“round”和“everything”作为参数

既然我们喜欢我们的 SRL 变换器,我们会对它友好。我们将向它展示如何处理更常用的动词形式。我们将句子从过去时改为现在时,通过在round后加上s

明亮的阳光,蓝色的天空,温暖的沙滩,棕榈树,一切都 rounds off。

让我们再次尝试用现在时运行SRL.ipynb

prediction=predictor.predict(
    sentence="The bright sun, the blue sky, the warm sand, the palm trees, everything rounds off."
)
head(prediction) 

原始输出显示找到了谓词,如下输出所示:

Verb: rounds [ARG1: The bright sun , the blue sky , the warm sand , the palm trees , everything] [V: rounds] [ARGM-PRD: off] . 

如果我们在 AllenNLP 上运行句子,我们将得到视觉解释:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.18:检测单词“rounds”作为动词

我们基于 BERT 的变换器表现良好,因为单词round在其现在时形式rounds中可以找到。

BERT 模型最初未能产生我们预期的结果。但在它的朋友的一点帮助下,这个样本最终结束得不错。

我们可以看到:

  • 输出可能会随着我们实施的模型版本的演变而有所不同

  • 工业 4.0 的实用主义心态需要更多认知努力来向变换器展示要做什么

让我们尝试另一个难以标记的句子。

样本 6

Sample 6选取了一个我们经常认为只是名词的词。然而,我们怀疑的词比我们想象的更多,可以是名词也可以是动词。例如,to ice是曲棍球中用来将冰球射向整个溜冰场并超出对手球门线的动词。冰球是曲棍球中使用的圆盘。

曲棍球教练可以通过告诉队伍训练冰球来开始一天。然后当教练喊道时,我们可以得到祈使句

现在,让冰球过去,伙计们!

请注意,guys可以表示无论性别的人。

让我们运行Sample 6单元格,看看会发生什么:

prediction=predictor.predict(
    sentence="Now, ice pucks guys!"
)
head(prediction) 

变换器无法找到动词:“verbs”:[]。

游戏结束!我们可以看到变换器已经取得了巨大的进步,但开发人员仍然有很多改进模型的空间。人类仍然在向变换器展示要做什么的游戏中。

在线界面将pucks与动词混淆:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.19:模型错误地将“pucks”标记为动词

这个问题可能会通过另一个模型解决,但你会遇到另一个限制。即使是 GPT-3 也有你必须应对的限制。

当你为一个定制的应用程序实现变换器时,使用专业术语或技术词汇,你会在某个时候达到难以解决的限制。

这些限制将需要您的专业知识来使项目成功。因此,您将不得不创建专门的词典才能在项目中取得成功。这对开发人员来说是个好消息!您将培养新的跨学科和认知技能,您的团队会感激您的。

尝试一些您自己的示例或样本,看看 SRL 如何处理这种方法的限制。然后探索如何开发预处理函数,以向变换器展示如何处理您的定制应用程序。

在我们离开之前,让我们质疑一下 SRL 的动机。

质疑 SRL 的范围

当我们面对现实项目时,我们是孤身一人。我们有一项工作要做,唯一要满足的人是那些要求该项目的人。

实用主义必须放在前面。技术意识随后。

在 20 世纪 20 年代,前人工智能意识和新意识并存。到了十年结束时,只会有一个赢家将前者的部分融合到后者中。

本节质疑了 SRL 的生产力,同时也通过两个方面质疑了其动机:

  • 谓词分析的限制

  • 质疑“语义”一词的使用

谓词分析的限制

SRL 依赖于谓词。只要提供动词,SRL BERT 就能工作。但是数百万句子没有包含动词。

如果你在 AllenNLP 演示界面的语义角色标注部分(demo.allennlp.org/)只提供了 SRL BERT 的断言,它就能工作。

但是,如果你的断言是对问题的回答会发生什么:

  • 人员 1:请问您想喝什么?

  • 人员 2:一杯咖啡,谢谢。

当我们输入人员 2 的答案时,SRL BERT 什么也找不到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.20:未获得任何帧

输出是0个总帧。由于含有省略号,SRL 无法分析此句。谓词是隐式的,而不是显式的。

省略的定义是省略句子中不必要理解的一个或多个词。

每天都会有数亿句包含省略的句子被口头和书面表达。

然而,对于所有这些句子,SRL BERT 都产生了0 个总帧

下面的回答(A)对以whatwherehow开头的问题(Q)产生了0 个总帧

Q: 早餐想要吃什么?

A: 用热巧克力的薄煎饼。

(模型推断:pancakes=专有名词,with=介词,hot=形容词,chocolate=普通名词。)

Q: 您想去哪里?

A: 请去伦敦。

(模型推断:London=专有名词,please=副词。)

Q: 你今天怎么去上班的?

A: Subway.

(模型推断:subway=专有名词。)

我们可以找到数百万个 SRL BERT 无法理解的例子,因为这些句子不包含谓词。

我们也可以将其应用到对话中间的问题上,但仍然无法从 SRL BERT 获得帧(输出):

场景:对话中段,人 2 不想要咖啡:

Q: 那么,茶呢?

A: 不用了,谢谢。

Q: 好的,热巧克力呢?

A: 没有。

Q: 一杯水?

A: 是的!

我们刚刚看到了一段没有框架、没有语义标注的对话。什么都没有。

我们可以在社交媒体上发布一些电影、音乐会或展览的评论,这些评论不包含任何框架:

  • 有史以来最好的电影!

  • 我一生中最糟糕的音乐会!

  • 精彩的展览!

这一节展示了 SRL 的局限性。现在让我们重新定义 SRL 并展示如何实现它。

重新定义 SRL

SRL BERT 假设句子包含谓词,这在许多情况下是错误的假设。仅基于谓词分析来分析句子是不正确的。

谓词包含一个动词。谓词告诉我们更多关于主语的信息。下面的谓词包含一个动词和额外的信息:

`The dog ate his food quickly.` 

快速吃...告诉我们关于狗吃饭的方式更多的信息。然而,动词本身可以是一个谓词,如:

狗吃。

这里的问题在于“动词”和“谓词”是语法和语法分析的一部分,而不是语义学的一部分。

从语法、功能的角度理解词语如何组合是有限制的。

看这句完全毫无意义的句子:

`Globydisshing maccaked up all the tie.` 

SRL BERT 完美地对一句毫无意义的句子进行“语义”分析:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10.21:分析无意义的句子

我们可以从这些例子中得出一些结论:

  • SRL 谓词分析仅在句子中存在动词时才有效

  • SRL(语义角色标注)谓词分析无法识别省略。

  • 谓词和动词是语言结构的一部分,是语法分析的一部分

  • 谓词分析识别结构,但不能理解句子的意义

  • 语法分析远远超出了谓词分析作为句子必要中心的范围

语义学关注短语或句子的意义。语义学关注上下文和词语之间的关系。

语法分析包括句法、屈折和短语或句子中单词的功能。术语“语义角色标注”具有误导性;它应该被命名为“谓词角色标注”。

我们可以完全理解没有谓词并超出顺序结构的句子。

情感分析可以解码句子的含义,并给出输出,而不需要进行谓词分析。情感分析算法完全理解“有史以来最好的电影”是积极的,无论是否存在谓词。

单独使用 SRL 来分析语言是有限制的。将 SRL 与 AI 流水线或其他 AI 工具结合使用可以非常有益,以增加对自然语言理解的智能化。

我建议将 SRL 与其他 AI 工具结合使用,正如我们将在第十三章中看到的,使用 Transformer 分析假新闻

现在让我们总结一下我们对 SRL 的范围和限制的探讨。

摘要

在本章中,我们探讨了 SRL。SRL 任务对人类和机器都很困难。Transformers模型已经显示出在许多 NLP 主题上在一定程度上可以达到人类基线。

我们发现,一个简单的基于 BERT 的Transformers可以执行谓词语义消歧。我们运行了一个简单的Transformers,它可以识别动词(谓词)的含义,而无需词汇或句法标签。Peng ShiJimmy Lin(2019)使用了标准的句子 + 动词输入格式来训练他们的基于 BERT 的Transformers。

我们发现,使用简化的句子 + 谓词输入训练的Transformers可以解决简单和复杂的问题。当我们使用相对罕见的动词形式时,就达到了限制。然而,这些限制并非最终。如果将困难问题添加到训练数据集中,研究团队可以改进模型。

我们还发现了为了人类的利益而存在的 AI。艾伦人工智能研究所已经提供了许多免费的 AI 资源。此外,研究团队还向 NLP 模型的原始输出添加了可视化表示,以帮助用户理解 AI。我们发现解释 AI 与运行程序一样重要。可视化和文本表示提供了对基于 BERT 模型潜力的清晰视图。

最后,我们探讨了 SRL 的范围和限制,以优化我们如何将该方法与其他 AI 工具结合使用。

Transformers将通过其分布式架构和输入格式继续改进 NLP 的标准化。

在下一章,第十一章让您的数据说话:故事、问题和答案中,我们将在通常只有人类表现良好的任务上挑战Transformers。我们将探索当面临命名实体识别NER)和问答任务时,Transformers的潜力。

问题

  1. 语义角色标注SRL)是一个文本生成任务。(真/假)

  2. 谓词是一个名词。(真/假)

  3. 动词是一个谓词。(真/假)

  4. 参数可以描述谁和什么在做某事。(真/假)

  5. 修饰语可以是副词。(真/假)

  6. 修饰语可以是一个地点。(真/假)

  7. 基于 BERT 的模型包含编码器和解码器堆叠。(真/假)

  8. 基于 BERT 的 SRL 模型具有标准的输入格式。(真/假)

  9. Transformers可以解决任何 SRL 任务。(真/假)

参考文献

加入我们书籍的 Discord 空间

加入书籍的 Discord 工作空间,与作者进行每月的问我任何事会话:

www.packt.link/Transformers

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第十一章:让你的数据说话:故事、问题和答案

阅读理解需要许多技能。当我们阅读一段文字时,我们注意关键词和主要事件,并创造内容的心理表征。然后我们可以利用我们对内容和表征的知识来回答问题。我们还会检查每个问题,以避免陷阱和错误。

无论它们变得多么强大,Transformers都不能轻松回答开放式问题。开放环境意味着有人可以就任何主题提出任何问题,而Transformers会正确回答。这对于某种程度的 GPT-3 来说是困难的,正如我们将在本章中看到的那样。然而,Transformers通常在封闭的问答环境中使用通用领域训练数据集。例如,在医疗保健和法律解释中的关键性答案通常需要额外的 NLP 功能。

然而,Transformers不能无论训练环境是否闭合都正确回答任何问题。如果一个序列包含多个主语和复合命题,Transformers模型有时会做出错误的预测。

本章将重点介绍构建问题生成器的方法,该生成器利用其他 NLP 任务帮助在文本中找到明确的内容。问题生成器将展示一些应用于实现问答的思想。

我们将首先展示问随机问题并期望Transformers每次都能良好响应的困难程度。

我们将通过引入命名实体识别NER)功能来帮助DistilBERT模型回答问题,该功能建议合理的问题。此外,我们还将为Transformers的问题生成器奠定基础。

我们将把一个预训练为鉴别器的 ELECTRA 模型添加到我们的问答工具箱中。

我们将在文本生成器的蓝图中添加语义角色标注SRL)功能。

然后,下一步部分将提供额外的想法来构建可靠的问答解决方案,包括实现Haystack框架。

最后,我们将直接进入 GPT-3 Davinci 引擎在线界面,探索开放环境下的问答任务。再次强调,无需开发、培训和准备!

在本章结束时,你将看到如何构建自己的多任务 NLP 助手或使用云 AI 进行问答。

本章涵盖以下主题:

  • 随机问答的极限

  • 利用命名实体识别根据实体识别创建有意义的问题

  • 开始设计Transformers问题生成器的蓝图

  • 测试使用 NER 找到的问题

  • 引入预训练为鉴别器的 ELECTRA 编码器

  • 使用标准问题测试 ELECTRA 模型

  • 利用语义角色标注根据谓词识别创建有意义的问题

  • 实施问答Transformers的项目管理指南

  • 分析如何利用 SRL 生成问题

  • 利用 NER 和 SRL 的输出来定义Transformers问题生成器的蓝图

  • 使用 RoBERTa 探索 Haystack 的问答框架

  • 使用 GPT-3 的界面无需开发或准备

让我们首先通过我们将应用的方法来分析问答任务的问题生成过程。

方法论

问答主要是作为一个涉及Transformers和包含准备提问和回答这些问题的数据集的 NLP 练习。Transformers被训练来回答在这个封闭环境中提出的问题。

然而,在更复杂的情况下,可靠的Transformers模型实现需要定制方法。

Transformers和方法

完美和高效的通用Transformers模型,无论是用于问答还是其他 NLP 任务,都不存在。对于一个特定的数据集和任务来说,最适合的模型是产生最佳输出的模型。

该方法在许多情况下优于模型。例如,一个适当的方法通常会比一个优秀模型但有缺陷的方法产生更高效的结果。

在本章中,我们将运行DistilBERTELECTRARoBERTa模型。有些比其他模型有更好的性能

但是,在关键领域中,性能并不保证结果。

例如,在太空火箭和航天器生产项目中,向 NLP 机器人提问意味着获得一个确切的答案。

假设用户需要在一个关于火箭再生式冷却喷嘴和燃烧室状态的一百页报告中提出问题。问题可能很具体,比如冷却状态可靠吗?这是用户从 NLP 机器人那里想要得到的底线信息。

简而言之,让 NLP 机器人、Transformers模型或其他任何东西做一个没有质量和认知控制的统计答案是太冒险了,也不会发生。可信赖的 NLP 机器人将连接到一个包含数据和规则的知识库,以在后台运行基于规则的专家系统来检查 NLP 机器人的答案。NLP Transformers模型机器人将产生一个流畅、可靠的自然语言答案,可能还是人声。

适用于所有需求的通用Transformers模型方法并不存在。每个项目都需要特定的功能和定制的方法,这取决于用户的期望值,变化将是巨大的。

本章将着眼于超出特定Transformers模型选择范围的问答的一般约束。本章不是一个问答项目指南,而是介绍了Transformers如何用于问答。

我们将专注于在没有事先准备的情况下使用问答在开放环境中。Transformers模型需要其他 NLP 任务和经典程序的帮助。我们将探索一些方法,以提供如何组合任务以达到项目目标的想法:

  • Method 0 探索了随机提问的试错方法。

  • Method 1 引入 NER 来帮助准备问答任务。

  • Method 2 尝试使用 ELECTRA Transformers模型来帮助默认Transformers。它还引入了 SRL 来帮助Transformers准备问题。

这三种方法的介绍表明,单一的问答方法对于高调的公司项目不起作用。添加 NER 和 SRL 将提高Transformers代理解决方案的语言智能。

例如,在我最早的一个 AI NLP 项目中,为航空航天公司的防御项目实施问答功能,我结合了不同的 NLP 方法,以确保提供的答案是100%可靠的。

您可以为您实施的每个项目设计一个多方法解决方案。

让我们从试错方法开始。

Method 0:试错

问答似乎非常简单。这是真的吗?让我们来看看。

打开本章将使用的 Google Colab 笔记本QA.ipynb。我们将逐个单元格地运行笔记本。

运行第一个单元格来安装 Hugging Face 的 transformers,这是我们将在本章中实施的框架:

!pip install -q transformers 

注意:Hugging Face transformers 不断发展,更新库和模块以适应市场。如果默认版本不起作用,您可能需要使用!pip install transformers==[与笔记本中的其他函数兼容的版本]来固定一个版本。

我们现在将导入 Hugging Face 的 pipeline,其中包含许多即用型Transformers资源。它们为 Hugging Face 库资源提供高级抽象函数,以执行各种任务。我们可以通过一个简单的 API 访问这些 NLP 任务。该程序是在 Google Colab 上创建的。建议使用免费的 Gmail 帐户在 Google Colab VM 上运行它。

通过一行代码导入pipeline

from transformers import pipeline 

一旦完成,我们有一行选项来实例化Transformers模型和任务:

  1. 使用默认的model和默认的tokenizer执行一个 NLP 任务:

    pipeline("<task-name>") 
    
  2. 使用自定义model执行一个 NLP 任务:

    pipeline("<task-name>", model="<model_name>") 
    
  3. 使用自定义model和自定义tokenizer执行 NLP 任务:

    pipeline('<taskname>', model='<model name>', tokenizer='<tokenizer_name>') 
    

让我们从默认模型和分词器开始:

nlp_qa = pipeline('question-answering') 

现在,我们只需要提供一段文本,然后我们将使用它来向Transformers提交问题:

sequence = "The traffic began to slow down on Pioneer Boulevard in Los Angeles, making it difficult to get out of the city. However, WBGO was playing some cool jazz, and the weather was cool, making it rather pleasant to be making it out of the city on this Friday afternoon. Nat King Cole was singing as Jo, and Maria slowly made their way out of LA and drove toward Barstow. They planned to get to Las Vegas early enough in the evening to have a nice dinner and go see a show." 

这个序列看起来非常简单,我们所需要做的就是将一行代码插入 API 中来提问并获得答案:

nlp_qa(context=sequence, question='Where is Pioneer Boulevard ?') 

输出是一个完美的答案:

{'answer': 'Los Angeles,', 'end': 66, 'score': 0.988201259751591, 'start': 55} 

我们刚刚用几行代码实现了一个问答Transformers NLP 任务!您现在可以下载一个包含文本、问题和答案的即用数据集。

实际上,本章可以在此结束,您将准备好进行问答任务了。然而,在实际实施中事情从来都不简单。假设我们必须为用户实现一个问答变换模型,让用户在数据库中存储的许多文档上提问。我们有两个重要的约束:

  • 我们首先需要运行变换器通过一组关键文档,并创建显示系统工作的问题

  • 我们必须展示如何保证变换器正确回答问题

几个问题立即出现:

  • 谁将找到要询问测试系统的问题?

  • 即使专家同意做这项工作,如果许多问题产生错误结果会怎么样?

  • 如果结果不令人满意,我们是否会继续训练模型?

  • 如果一些问题无论我们使用或训练哪个模型都无法回答,会发生什么?

  • 如果这在有限样本上有效,但过程耗时且无法扩展,因为成本过高,会怎样?

如果我们只是试试专家帮助我们提出的问题,看看哪些有效,哪些无效,那将永远不会完成。试错不是解决方案。

本章旨在提供一些方法和工具,以降低实施问答变换模型的成本。在为客户实施新数据集时,为问答问题找到好问题是一项相当大的挑战

我们可以将变换器视为我们可以根据需要组装的一套乐高®(LEGO®)堆积积木,使用编码器堆栈或解码器堆栈。我们可以使用一组小型、大型或超大XL)变换器模型。

我们还可以将我们在本书中探讨过的 NLP 任务看作是我们必须实施的项目中的解决方案的一套乐高®(LEGO®)集。我们可以组装两个或更多 NLP 任务来达到我们的目标,就像任何其他软件实现一样。我们可以从试错搜索问题转向系统方法。

在本章中:

  • 我们将继续逐个单元格运行QA.ipynb来探索每个部分描述的方法。

  • 我们还将使用AllenNLP NER 接口获取 NER 和 SRL 结果的可视化表示。您可以通过访问demo.allennlp.org/reading-comprehension,然后选择命名实体识别语义角色标注,并输入序列,在界面中输入句子。在本章中,我们将考虑使用的AllenNLP模型。我们只想获得可视化表示。

让我们从尝试使用 NER-first 方法为问题回答找到合适的 XL 变换器模型问题开始。

方法 1:NER 先

本节将使用 NER 来帮助我们找到好问题的想法。Transformers模型是持续训练和更新的。此外,用于训练的数据集可能会发生变化。最后,这些不是基于规则的算法,每次可能产生相同的结果。输出可能会在一个运行到另一个运行之间发生变化。NER 可以检测序列中的人、位置、组织和其他实体。我们首先运行一个 NER 任务,它将为我们提供段落的一些主要部分,以便我们专注于提问。

使用 NER 寻找问题

我们将继续逐步运行QA.ipynb。现在程序使用 NER 任务以默认模型和分词器初始化管道:

nlp_ner = pipeline("ner") 

我们将继续使用本章方法 0:试和错误部分中运行的看似简单的序列:

sequence = "The traffic began to slow down on Pioneer Boulevard in Los Angeles, making it difficult to get out of the city. However, WBGO was playing some cool jazz, and the weather was cool, making it rather pleasant to be making it out of the city on this Friday afternoon. Nat King Cole was singing as Jo and Maria slowly made their way out of LA and drove toward Barstow. They planned to get to Las Vegas early enough in the evening to have a nice dinner and go see a show." 

我们在QA.ipynb中运行了nlp_ner单元格:

print(nlp_ner(sequence)) 

输出生成了自然语言处理任务的结果。分数被四舍五入到两位小数以适应页面的宽度:

[{'word': 'Pioneer', 'score': 0.97, 'entity': 'I-LOC', 'index': 8}, 
{'word': 'Boulevard', 'score': 0.99, 'entity': 'I-LOC', 'index': 9}, 
{'word': 'Los', 'score': 0.99, 'entity': 'I-LOC', 'index': 11}, 
{'word': 'Angeles', 'score': 0.99, 'entity': 'I-LOC', 'index': 12}, 
{'word': 'W', 'score': 0.99, 'entity': 'I-ORG', 'index': 26}, 
{'word': '##B', 'score': 0.99, 'entity': 'I-ORG', 'index': 27}, 
{'word': '##G', 'score': 0.98, 'entity': 'I-ORG', 'index': 28}, 
{'word': '##O', 'score': 0.97, 'entity': 'I-ORG', 'index': 29}, 
{'word': 'Nat', 'score': 0.99, 'entity': 'I-PER', 'index': 59}, 
{'word': 'King', 'score': 0.99, 'entity': 'I-PER', 'index': 60}, 
{'word': 'Cole', 'score': 0.99, 'entity': 'I-PER', 'index': 61}, 
{'word': 'Jo', 'score': 0.99, 'entity': 'I-PER', 'index': 65}, 
{'word': 'Maria', 'score': 0.99, 'entity': 'I-PER', 'index': 67},
{'word': 'LA', 'score': 0.99, 'entity': 'I-LOC', 'index': 74}, 
{'word': 'Bar', 'score': 0.99, 'entity': 'I-LOC', 'index': 78}, 
{'word': '##sto', 'score': 0.85, 'entity': 'I-LOC', 'index': 79}, 
{'word': '##w', 'score': 0.99, 'entity': 'I-LOC', 'index': 80}, 
{'word': 'Las', 'score': 0.99 'entity': 'I-LOC', 'index': 87}, 
{'word': 'Vegas', 'score': 0.9989519715309143, 'entity': 'I-LOC', 'index': 88}] 

Hugging Face 的文档描述了在我们的案例中使用的标签。主要的标签包括:

  • I-PER,一个人的名字

  • I-ORG,一个组织名称

  • I-LOC,一个位置名称

结果是正确的。注意Barstow被分成了三个标记。

让我们在命名实体识别部分的AllenNLP上运行相同的序列(demo.allennlp.org/named-entity-recognition)以获得我们序列的可视化表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.1:NER

我们可以看到 NER 已经突出显示了我们将用于创建问答问题的关键实体。

让我们询问我们的Transformers两种类型的问题:

  • 与位置相关的问题

  • 与人有关的问题

让我们从位置问题开始。

位置实体问题

QA.ipynb生成了近 20 个实体。位置实体特别有趣:

[{'word': 'Pioneer', 'score': 0.97, 'entity': 'I-LOC', 'index': 8}, 
{'word': 'Boulevard', 'score': 0.99, 'entity': 'I-LOC', 'index': 9}, 
{'word': 'Los', 'score': 0.99, 'entity': 'I-LOC', 'index': 11}, 
{'word': 'Angeles', 'score': 0.99, 'entity': 'I-LOC', 'index': 12}, 
{'word': 'LA', 'score': 0.99, 'entity': 'I-LOC', 'index': 74}, 
{'word': 'Bar', 'score': 0.99, 'entity': 'I-LOC', 'index': 78}, 
{'word': '##sto', 'score': 0.85, 'entity': 'I-LOC', 'index': 79}, 
{'word': '##w', 'score': 0.99, 'entity': 'I-LOC', 'index': 80}, 
{'word': 'Las', 'score': 0.99 'entity': 'I-LOC', 'index': 87}, 
{'word': 'Vegas', 'score': 0.9989519715309143, 'entity': 'I-LOC', 'index': 88}] 
应用启发式方法

我们可以应用启发式方法,使用QA.ipynb生成的输出创建问题:

  • 将位置合并回其原始形式

  • 将模板应用到位置

本书的范围已经超出了为项目写经典代码的范围。我们可以编写一个能为我们完成工作的函数,如下伪代码所示:

for i in range beginning of output to end of the output:
    filter records containing I-LOC
    merge the I-LOCs that fit together
    save the merged I-LOCs for questions-answering 

NER 的输出将变为:

  • I-LOCPioneer Boulevard

  • I-LOCLos Angeles

  • I-LOCLA

  • I-LOCBarstow

  • I-LOCLas Vegas

我们可以使用两个模板自动生成问题。例如,我们可以应用一个随机函数。我们可以编写一个能为我们完成工作的函数,如下伪代码所示:

from the first location to the last location:
    choose randomly:
        Template 1: Where is [I-LOC]?
        Template 2: Where is [I-LOC] located? 

我们将自动生成五个问题。例如:

Where is Pioneer Boulevard?
Where is Los Angeles located?
Where is LA?
Where is Barstow?
Where is Las Vegas located? 

我们知道,有些问题不能直接用我们创建的序列回答。但我们也可以自动处理这个问题。假设问题是用我们的方法自动生成的:

  1. 输入一个序列

  2. 运行 NER

  3. 自动创建问题

假设问题是自动生成的,然后让我们运行它们:

nlp_qa = pipeline('question-answering')
print("Question 1.",nlp_qa(context=sequence, question='Where is Pioneer Boulevard ?'))
print("Question 2.",nlp_qa(context=sequence, question='Where is Los Angeles located?'))
print("Question 3.",nlp_qa(context=sequence, question='Where is LA ?'))
print("Question 4.",nlp_qa(context=sequence, question='Where is Barstow ?'))
print("Question 5.",nlp_qa(context=sequence, question='Where is Las Vegas located ?')) 

输出显示只有 问题 1 被正确回答了:

Question 1\. {'score': 0.9879662851935791, 'start': 55, 'end': 67, 'answer': 'Los Angeles,'}
Question 2\. {'score': 0.9875189033668121, 'start': 34, 'end': 51, 'answer': 'Pioneer Boulevard'}
Question 3\. {'score': 0.5090435442006118, 'start': 55, 'end': 67, 'answer': 'Los Angeles,'}
Question 4\. {'score': 0.3695214621538554, 'start': 387, 'end': 396, 'answer': 'Las Vegas'}
Question 5\. {'score': 0.21833994202792262, 'start': 355, 'end': 363, 'answer': 'Barstow.'} 

输出显示了 分数、答案的 起始结束 位置,以及 答案 本身。在这次运行中,问题 2分数0.98,尽管它错误地说明了 Pioneer BoulevardLos Angeles 中。

现在我们该怎么办?

现在是控制Transformers的时间了,通过项目管理来增加质量和决策功能。

项目管理

我们将检查四个例子,其中包括管理Transformers和管理它的硬编码函数的方法。我们将这四个项目管理示例分类为四个项目级别:简单、中级、困难和非常困难。项目管理不在本书的范围之内,因此我们将简要介绍这四个类别:

  1. 一个简单的项目 可以是一个小学的网站。老师可能会对我们所见到的感到高兴。文本可以显示在 HTML 页面上。我们自动获得的五个问题的答案可以与一些开发合并为五个断言,并以固定格式显示:I-LOC 在 I-LOC 中(例如,Barstow 在 California 中)。然后在每个断言下添加 (True, False)。老师所需要做的就是有一个管理员界面,允许老师点击正确答案来完成多项选择问卷!

  2. 一个中级项目 可以是封装Transformers的自动问题和答案,使用 API 检查答案并自动纠正的程序。用户看不到任何东西。这个过程是无缝的。Transformers产生的错误答案将被存储以供进一步分析。

  3. 一个困难的项目 将是在具有后续问题的聊天机器人中实现一个中级项目。例如,Transformers将 Pioneer Boulevard 正确放置在 Los Angeles 中。聊天机器人用户可能会问一个自然的后续问题,比如 在 LA 的哪里附近? 这需要更多的开发。

  4. 一个非常困难的项目 将是一个研究项目,培训Transformers识别数据集中数百万记录中的 I-LOC 实体,并输出地图软件 API 的实时流结果。

好消息是我们也可以找到一种利用我们所发现的方法。

坏消息是,实现的Transformers或任何现实项目中的 AI 需要强大的机器和项目经理、主题专家SMEs)、开发人员和最终用户之间大量的团队合作。

现在让我们尝试人物实体问题。

人物实体问题

让我们从Transformers的一个简单问题开始:

nlp_qa = pipeline('question-answering')
nlp_qa(context=sequence, question='Who was singing ?') 

答案是正确的。它说明了序列中谁在唱歌:

{'answer': 'Nat King Cole,'
 'end': 277,
 'score': 0.9653632081862433,
 'start': 264} 

现在我们将向Transformers提出一个需要一些思考的问题,因为它没有明确陈述:

nlp_qa(context=sequence, question='Who was going to Las Vegas ?') 

不能回答那个问题而不分析句子。转换器犯了一个大错误:

{'answer': 'Nat King Cole,'
 'end': 277,
 'score': 0.3568152742800521,
 'start': 264} 

转换器足够诚实,只显示了一个0.35的分数。这个分数可能因每次计算或不同转换器模型而异。我们可以看到转换器遇到了一个语义标记问题。让我们尝试通过应用 SRL-first 方法来更好地处理人物实体问题。

方法 2:首先进行 SRL

转换器找不到是谁驾车去Las Vegas,认为是来自Nat King Cole而不是JoMaria

发生了什么错了?我们能看到转换器的想法并获得解释吗?要找出,请返回语义角色建模。如果需要,花几分钟回顾第十章基于 BERT 的转换器的语义角色标记

让我们在语义角色标记部分的AllenNLP上运行相同的序列,demo.allennlp.org/semantic-role-labeling,以通过运行我们在上一章节中使用的 SRL BERT 模型来获取动词drove的视觉表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.2:在文本上运行的 SRL

SRL BERT 找到了 19 个帧。在本节中,我们专注于drove

注意:结果可能因每次运行或当 AllenNLP 更新模型版本时而有所不同。

我们可以看到问题所在。动词drove的论点是Jo 和 Maria。似乎可以推断出结论。

请记住,转换器模型不断发展。输出可能会有所不同;但是,概念保持不变。

真的吗?让我们在QA.ipynb中提出问题:

nlp_qa(context=sequence, question='Who are they?') 

输出是正确的:

{'answer': 'Jo and Maria',
 'end': 305,
 'score': 0.8486017557290779,
 'start': 293} 

我们能找到一个提出问题以获得正确答案的方法吗?我们将尝试通过改写问题来实现:

nlp_qa(context=sequence, question='Who drove to Las Vegas?') 

我们得到了稍微更好的结果:

{'answer': 'Nat King Cole was singing as Jo and Maria',
 'end': 305,
 'score': 0.35940926070820467,
 'start': 264} 

转换器现在理解Nat King Cole唱歌,而Jo 和 Maria在同时做一些事情。

我们仍然需要进一步,找到一个提出更好问题的方法。

让我们尝试另一个模型。

使用 ELECTRA 进行问答

在切换模型之前,我们需要知道我们正在使用哪个模型:

print(nlp_qa.model) 

输出首先显示该模型是一个在问答训练的 DistilBERT 模型:

DistilBertForQuestionAnswering((distilbert): DistilBertModel( 

该模型有6层和768个特征,如第6层所示(层从0n编号):

(5): TransformerBlock(
          (attention): MultiHeadSelfAttention(
            (dropout): Dropout(p=0.1, inplace=False)
            (q_lin): Linear(in_features=768, out_features=768, bias=True)
            (k_lin): Linear(in_features=768, out_features=768, bias=True)
            (v_lin): Linear(in_features=768, out_features=768, bias=True)
            (out_lin): Linear(in_features=768, out_features=768, bias=True) 

现在我们将尝试ELECTRA转换器模型。Clark等人(2020 年)设计了一个改进掩码语言建模MLM)预训练方法的转换器模型。

第三章Fine-Tuning BERT ModelsMasked language modeling小节中,我们看到 BERT 模型在训练过程中插入带有[MASK]的随机掩码标记。

Clark等人(2020)提出了一种可行的替代方案,使用了生成器网络而不仅仅是使用随机令牌。BERT 模型被训练以预测(屏蔽的)损坏令牌的标识。Clark等人(2020)训练了一个 ELECTRA 模型作为鉴别器,以预测屏蔽的令牌是否是生成的令牌。图 11.3显示了 ELECTRA 的训练方式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.3:ELECTRA 作为鉴别器进行训练

图 11.3显示,在送入生成器之前,原始序列会被屏蔽。生成器插入可接受的令牌而不是随机的令牌。ELECTRA Transformers模型训练以预测一个令牌是否来自原始序列还是已被替换。

一个 ELECTRA Transformers模型的架构和大多数超参数与 BERT Transformers模型相同。

我们现在希望看看是否能获得更好的结果。在QA.ipynb中要运行的下一个单元是使用ELECTRA-small-generator的问答单元:

nlp_qa = pipeline('question-answering', model='google/electra-small-generator', tokenizer='google/electra-small-generator')
nlp_qa(context=sequence, question='Who drove to Las Vegas ?') 

输出不是我们所期望的:

{'answer': 'to slow down on Pioneer Boulevard in Los Angeles, making it difficult to',
 'end': 90,
 'score': 2.5295573154019736e-05,
 start': 18} 

输出可能会从一个运行或Transformers模型到另一个变化;然而,想法仍然是一样的。

输出也发送了训练消息:

- This IS expected if you are initializing ElectraForQuestionAnswering from the checkpoint of a model trained on another task or with another architecture..
- This IS NOT expected if you are initializing ElectraForQuestionAnswering from the checkpoint of a model that you expect to be exactly identical.. 

你可能不喜欢这些警告消息,并可能得出这是一个糟糕的模型的结论。但一定要尽可能地探索给你提供的每一个途径。当然,ELECTRA 可能需要更多的训练。但尝试尽可能多地找到新的想法! 然后你可以决定是否进一步训练模型或转移到另一个模型。

我们现在必须考虑下一步要采取的步骤。

项目管理约束

我们并没有获得我们所期望的默认 DistilBERT 和 ELECTRA Transformers模型的结果。

在其他解决方案中,有三个主要选项:

  • 用额外的数据集训练 DistilBERT 和 ELECTRA 或其他模型。在现实项目中,训练数据集是一个昂贵的过程。如果需要实施新的数据集并改变超参数,训练可能会持续几个月。硬件成本也需要考虑在内。此外,如果结果不尽人意,项目经理可能会关闭项目。

  • 你也可以尝试使用现成的Transformers,尽管它们可能不符合你的需求,比如 Hugging Face 模型:huggingface.co/transformers/usage.html#extractive-question-answering

  • 通过使用额外的 NLP 任务来帮助问答模型,找到获得更好结果的方法。

在本章中,我们将重点关注寻找额外的 NLP 任务,以帮助默认的 DistilBERT 模型。

让我们使用 SRL 来提取谓词及其论证。

使用 SRL 来找到问题

AllenNLP 使用我们在SRL.ipynb笔记本中实现的基于 BERT 的模型,第十章使用基于 BERT 的Transformers进行语义角色标注

让我们在语义角色标注部分重新运行 AllenNLP 上的序列,demo.allennlp.org/semantic-role-labeling,以获取句子中谓词的可视化表示。

我们将进入我们一直在处理的序列:

The traffic began to slow down on Pioneer Boulevard in Los Angeles, making it difficult to get out of the city. However, WBGO was playing some cool jazz, and the weather was cool, making it rather pleasant to be making it out of the city on this Friday afternoon. Nat King Cole was singing as Jo and Maria slowly made their way out of LA and drove toward Barstow. They planned to get to Las Vegas early enough in the evening to have a nice dinner and go see a show. 

基于 BERT 模型找到了几个谓词。我们的目标是找到 SRL 输出的特性,可以根据句子中的动词自动生成问题。

我们将首先列出 BERT 模型产生的谓词候选者:

verbs={"began," "slow," "making"(1), "playing," "making"(2), "making"(3), "singing,",, "made," "drove," "planned," go," see"} 

如果我们必须编写一个程序,我们可以先引入一个动词计数器,如下面的伪代码所示:

def maxcount:
for in range first verb to last verb:
    for each verb
       counter +=1
       if counter>max_count, filter verb 

如果计数器超出可接受发生的次数(max_count),则该动词将在此实验中被排除。如果没有进一步的开发,要消除动词参数的多重语义角色将会太困难。

让我们也把mademake的过去式)从列表中移除。

我们的列表现在被限制在:

verbs={"began," "slow," "playing," "singing," "drove," "planned," go," see"} 

如果我们继续编写一个函数来过滤动词,我们可以寻找参数很长的动词。动词began有一个非常长的参数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.4:SRL 应用于动词“began”

began的参数太长,无法在截图中显示。文本版本显示了解释began参数有多困难:

began: The traffic [V: began] [ARG1: to slow down on Pioneer Boulevard in Los Angeles , making it difficult to get out of the city] . However , WBGO was playing some cool jazz] , and the weather was cool , making it rather pleasant to be making it out of the city on this Friday afternoon . Nat King Cole was singing as Jo and Maria slowly made their way out of LA and drove toward Barstow . They planned to get to Las Vegas early enough in the evening to have a nice dinner and go see a show . 

我们可以添加一个函数来过滤包含超出最大长度的参数的动词:

def maxlength:
for in range first verb to last verb:
    for each verb
       if length(argument of verb)>max_length, filter verb 

如果一个动词的参数长度超过了最大长度(max_length),则该动词将在此实验中被排除。暂时让我们把began从列表中移出:

我们的列表现在被限制在:

verbs={ "slow", "playing", "singing", "drove",   "planned"," go"," see"} 

我们可以根据我们正在处理的项目添加更多排除规则。我们还可以再次使用非常严格的max_length值调用maxlength函数,以提取可能对我们的自动问题生成器感兴趣的候选动词。参数最短的动词候选者可以转换为问题。动词slow符合我们设置的三条规则:它在序列中只出现一次,参数不太长,并且包含序列中一些最短的参数。AllenNLP 的可视化表示确认了我们的选择:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.5:SRL 应用于动词“slow”

文本输出可以很容易地被解析:

slow: [ARG1: The traffic] began to [V: slow] down [ARG1: on] [ARGM-ADV: Pioneer Boulevard] [ARGM-LOC: in Los Angeles] , [ARGM-ADV: making it difficult to get out of the city] . 

这个结果和接下来的输出可能会随着不断发展的转换模型而有所变化,但是想法仍然是一样的。动词slow被识别出来,而这是 SRL 输出的关键方面。

我们可以自动生成what模板。我们不会生成who模板,因为没有一个参数标记为I-PER(人物)。我们可以编写一个函数来管理这两种可能性,如下面的伪代码所示:

def whowhat:
   if NER(ARGi)==I-PER, then:
        template=Who is [VERB]  
   if NER(ARGi)!=I-PER, then:
     template=What is [VERB] 

这个函数需要更多的工作来处理动词形式和修饰词。然而,在这个实验中,我们将只应用该函数并生成以下问题:

What is slow? 

让我们用下面的单元格来运行默认的pipeline

nlp_qa = pipeline ('question-answering')
nlp_qa(context= sequence, question='What was slow?') 

结果是令人满意的:

{'answer': 'The traffic',
'end': 11, 
'score': 0.4652545872921081, 
'start': 0} 

默认模型,在这种情况下是DistilBERT,正确回答了问题。

我们的自动问答生成器可以做到以下几点:

  • 自动运行 NER

  • 用经典代码解析结果

  • 生成仅实体问题

  • 自动运行 SRL

  • 使用规则过滤结果

  • 使用 NER 结果生成仅 SRL 问题,以确定使用哪个模板

这个解决方案绝对并不完整。还需要更多的工作,可能需要额外的自然语言处理任务和代码。然而,这给出了实现任何形式的 AI 所需的艰苦工作的一个概念。

让我们尝试我们的方法与下一个过滤动词:playing。可视化表示显示参数是WBGO一些很酷的爵士乐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.6:应用于动词“playing”的 SRL

文本版本易于解析:

playing: The traffic began to slow down on Pioneer Boulevard in Los Angeles , making it difficult to get out of the city . [ARGM-DIS: However] , [ARG0: WBGO] was [V: playing] [ARG1: some cool jazz] 

这个结果和以下输出可能会随着不断发展的Transformers模型而有所不同,但思想仍然是一样的:识别动词及其参数。

如果我们运行whowhat函数,它会显示参数中没有I-PER。所选模板将是what模板,并且以下问题可能会自动生成:

What is playing? 

让我们在以下单元格中使用这个问题来运行默认的 pipeline:

nlp_qa = pipeline('question-answering')
nlp_qa(context=sequence, question='What was playing') 

输出也是令人满意的:

{'answer': 'cool jazz,,'
 'end': 153,
 'score': 0.35047012837950753,
 'start': 143} 

唱歌是一个很好的选择,whowhat函数会找到I-PER模板并自动生成以下问题:

Who is singing? 

我们已经在本章中成功测试了这个问题。

下一个动词是drove,我们已经标记为一个问题。Transformers无法解决这个问题。

动词go是一个很好的选择:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.7:应用于动词“go”的 SRL

需要进一步开发才能生成带有正确动词形式的模板。假设工作已完成并问模型以下问题:

nlp_qa = pipeline('question-answering')
nlp_qa(context=sequence, question='Who sees a show?') 

输出是错误的参数:

{'answer': 'Nat King Cole,'
 'end': 277,
 'score': 0.5587267250683112,
 'start': 264} 

我们可以看到Nat King ColeJoMaria在一个复杂序列中的出现会为Transformers模型和任何 NLP 模型造成歧义问题。需要更多的项目管理和研究。

下一步

实现问答或捷径的方法并不容易。我们开始实施可以自动生成问题的方法。自动生成问题是 NLP 的一个关键方面。

需要对更多 Transformer 模型进行预训练,包含命名实体识别(NER)、语义角色标注(SRL)和问答问题,以解决问题。项目经理还需要学习如何组合几个 NLP 任务来帮助解决特定任务,例如问答。

指代消解,demo.allennlp.org/coreference-resolution,可以帮助我们的模型识别我们工作的序列中的主要主语。这个由 AllenNLP 生成的结果显示了一个有趣的分析:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11.8:序列的指代消解

我们可以通过添加指代消解的输出来继续开发我们的程序:

Set0={'Los Angeles', 'the city,' 'LA'}
Set1=[Jo and Maria, their, they} 

我们可以将指代消解添加为一个预训练任务,或者将其作为问题生成器的后处理任务。无论哪种方式,模拟人类行为的问题生成器都可以显著提升问答任务的性能。我们将在问题回答模型的预训练过程中包含更多定制的额外 NLP 任务。

当然,我们可以决定使用新的策略来预训练我们在本章中运行的模型,例如 DistilBERT 和 ELECTRA,然后让用户提出他们希望的问题。我推荐两种方法都使用:

  • 为问答任务开发问题生成器。这些问题可以用于教育目的,训练 Transformer,甚至为实时用户提供思路。

  • 通过包含特定的 NLP 任务来对 Transformer 模型进行预训练,这将提高它们的问答性能。使用问题生成器进一步训练它。

使用 RoBERTa 模型探索 Haystack

Haystack 是一个具有有趣功能的问答框架。值得探索一下,看看它是否适合您的项目需求。

在本节中,我们将对我们在本章中使用其他模型和方法进行实验的句子进行问答。

打开 Haystack_QA_Pipeline.ipynb

第一个单元格安装运行 Haystack 所需的模块:

# Install Haystack
!pip install farm-haystack==0.6.0
# Install specific versions of urllib and torch to avoid conflicts with preinstalled versions on Colab
!pip install urllib3==1.25.4
!pip install torch==1.6.0+cu101-f https://download.pytorch.org/whl/torch_stable.html 

这个笔记本使用了一个 RoBERTa 模型:

# Load a  local model or any of the QA models on Hugging Face's model hub (https://huggingface.co/models)
from haystack.reader.farm import FARMReader
reader = FARMReader(model_name_or_path="deepset/roberta-base-squad2", use_gpu=True, no_ans_boost=0, return_no_answer=False) 

您可以回到第四章从头开始预训练 RoBERTa 模型,了解 RoBERTa 模型的一般描述。

笔记本的其余部分将回答我们在本章中详细探讨的文本的问题:

text = "The traffic began to slow down on Pioneer Boulevard in…/… have a nice dinner and go see a show." 

您可以比较之前章节的输出得到的答案,并决定您想要实现哪种 Transformer 模型。

使用 GTP-3 引擎探索问答

本节将尝试避免训练、微调、在服务器上加载程序,甚至使用数据集。相反,用户只需连接到他们的 OpenAI 账户并使用交互式教育界面即可。

一个 GPT-3 引擎在线教育界面将通过提供 E(解释)和 T(文本)来提供足够好的答案,如下所示:

E = 回答这段文本的问题

T = 在先驱大道上交通开始减速……/……吃一顿美味的晚餐,然后去看一场演出。

以下是以问答形式提出的一些问题和获得的答案:

  • 谁要去拉斯维加斯?: 乔和玛丽亚

  • 谁在唱歌?: 纳特·金·科尔

  • 正在播放什么样的音乐?: 爵士

  • 晚上的计划是什么?: 吃一顿美味的晚餐,然后去看一场演出

就是这样!这就是您在线运行各种教育 NLP 任务所需做的一切,即使没有 GPT-3 引擎的 API,也可以使用交互式界面。

你可以改变S(向 GPT-3 展示预期的内容)和E,并创建无尽的互动。下一代 NLP 诞生了!工业 4.0 的开发人员、顾问或项目经理需要掌握一套新的技能:认知方法、语言学、心理学和其他跨学科的维度。如果需要,您可以花时间返回到第七章GPT-3 引擎超人Transformers的崛起

我们已经探讨了使用Transformers进行问答的一些关键方面。让我们总结一下我们所做的工作。

摘要

在本章中,我们发现问答并不像看起来那么容易。实现一个Transformers模型只需几分钟。然而,让它正常运行可能需要几个小时或几个月!

我们首先让 Hugging Face 管道中的默认Transformers回答一些简单的问题。默认Transformers DistilBERT 对简单的问题回答得相当好。然而,我们选择了简单的问题。在现实生活中,用户提出各种各样的问题。Transformers可能会感到困惑,并产生错误的输出。

然后,我们决定是否继续随机提问并得到随机答案,还是开始设计一个问题生成器的蓝图,这是一个更有效的解决方案。

我们首先使用 NER 来找到有用的内容。我们设计了一个函数,可以根据 NER 输出自动生成问题。质量很有前途,但需要更多的工作。

我们尝试了一个 ELECTRA 模型,但并没有产生我们预期的结果。我们停顿了几分钟,决定是花费昂贵的资源来训练Transformers模型,还是设计一个问题生成器。

我们在问题生成器的蓝图中添加了 SRL,并测试了它可以生成的问题。我们还在分析中添加了 NER,并生成了几个有意义的问题。还引入了Haystack框架,以发现使用 RoBERTa 进行问答的其他方法。

最后,我们在没有 API 的情况下,直接在 OpenAI 教育交互界面中运行了一个使用 GPT-3 引擎的示例。云 AI 平台的功能和可访问性正在增加。

我们的实验得出了一个结论:多任务 Transformer 在复杂的 NLP 任务上会比单一任务训练的 Transformer 提供更好的性能。实现 Transformer 需要准备充分的多任务训练、经典代码中的启发式以及一个问题生成器。问题生成器可以进一步训练模型,方法是使用问题作为训练输入数据或作为独立解决方案。

在下一章节中,检测客户情绪以进行预测,我们将探讨如何在社交媒体反馈上实现情感分析。

问题

  1. 训练过的 Transformer 模型可以回答任何问题。(True/False)

  2. 问答不需要进一步的研究。它现在已经完美了。(True/False)

  3. 命名实体识别NER)在寻找有意义的问题时可以提供有用的信息。(True/False)

  4. 语义角色标注SRL)在准备问题时毫无用处。(True/False)

  5. 一个问题生成器是生成问题的绝佳方式。(True/False)

  6. 实现问答需要仔细的项目管理。(True/False)

  7. ELECTRA 模型与 GPT-2 具有相同的架构。(True/False)

  8. ELECTRA 模型与 BERT 具有相同的架构,但是被训练为判别器。(True/False)

  9. NER 能够识别一个地点并将其标记为 I-LOC。(True/False)

  10. NER 能够识别一个人并将其标记为 I-PER。(True/False)

参考文献

加入我们书籍的 Discord 空间

加入本书的 Discord 工作区,与作者进行每月的 问我任何事 会话:

www.packt.link/Transformers

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第十二章:检测客户情绪以进行预测

情感分析依赖于组合性原则。如果我们无法理解句子的部分,如何理解整个句子?这对于 NLP Transformers模型来说是一项困难的任务吗?我们将在本章中尝试几个Transformers模型以找出答案。

我们将从 斯坦福情感树库SST)开始。SST 提供了用于分析的复杂句子数据集。分析诸如 电影很棒 这样的句子很容易。但是,如果任务变得非常困难,如 虽然电影有点太长,但我真的很喜欢它。 这个句子被分割了。它迫使一个Transformers模型理解序列的结构和逻辑形式。

然后我们将测试几个Transformers模型,包括复杂句子和简单句子。我们会发现,无论我们尝试哪种模型,如果没有足够的训练,它都不会起作用。Transformers模型就像我们一样。它们是需要努力学习并尝试达到现实生活中人类基准的学生。

运行 DistilBERT、RoBERTa-large、BERT-base、MiniLM-L12-H84-uncased 和 BERT-base 多语言模型非常有趣!然而,我们会发现其中一些模型需要更多的训练,就像我们一样。

在此过程中,我们将看到如何利用情感任务的输出来改善客户关系,并了解一个您可以在网站上实现的漂亮的五星级界面。

最后,我们将使用 GPT-3 的在线界面进行情感分析,无需 OpenAI 账户的 AI 开发或 API!

本章涵盖以下主题:

  • 用于情感分析的 SST

  • 为长序列定义组合性

  • 使用 AllenNLP 进行情感分析(RoBERTa)

  • 运行复杂句子,探索Transformers的新领域

  • 使用 Hugging Face 情感分析模型

  • DistilBERT 用于情感分析

  • 尝试 MiniLM-L12-H384-uncased

  • 探索 RoBERTa-large-mnli

  • 探究 BERT-base 多语言模型

  • 使用 GPT-3 进行情感分析

让我们从 SST 开始。

入门:情感分析 transformers

本节将首先探索Transformers将用于情感分析的 SST。

接下来我们将使用 AllenNLP 运行一个 RoBERTa-large transformer。

斯坦福情感树库(SST)

Socher 等人(2013)设计了长短语的语义词空间。他们定义了应用于长序列的 组合性 原则。组合性原则意味着 NLP 模型必须检查复杂句子的组成表达式以及组合它们的规则,以理解序列的含义。

让我们从 SST 中取样以掌握组合性原则的含义。

本节和本章内容独立完整,您可以选择执行所述的操作,或者阅读章节并查看提供的屏幕截图。

前往交互式情感树库:nlp.stanford.edu/sentiment/treebank.html?na=3&nb=33

你可以进行你想要的选择。情感树图将显示在页面上。点击图像以获取情感树:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.1:情感树图

对于这个例子,我点击了包含提到在语言学中解构理论的先驱雅克·德里达的句子的第 6 图表。出现了一个又长又复杂的句子:

无论你是否受到德里达关于“他者”和“自我”的任何讲座的启示,德里达无疑是一个极具吸引力和富有趣味的人。

Socher等人(2013)致力于向量空间和逻辑形式中的组合性。

例如,定义统治雅克·德里达样本的逻辑规则意味着理解以下内容:

  • 如何解释单词无论还是以及将无论短语与句子其他部分分开的逗号

  • 如何理解逗号后句子的第二部分带有另一个

一旦向量空间被定义,Socher等人(2013)可以生成代表组合原则的复杂图表。

我们现在可以逐段查看图表。第一部分是句子的无论部分:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.2:复杂句子中的“无论”部分

句子已被正确地分成两个主要部分。第二部分也是正确的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.3:复杂句子的主要部分

我们可以从Socher等人(2013)设计的方法中得出几个结论:

  • 情感分析不能简化为在句子中计算积极和消极的词语

  • 一个Transformers模型或任何 NLP 模型必须能够学习组合原则,以理解复杂句子的构成成分如何与逻辑形式规则相互契合

  • 一个Transformers模型必须能够建立一个向量空间来解释复杂句子的微妙之处

我们现在将用一个 RoBERTa-large 模型将这一理论付诸实践。

使用 RoBERTa-large 进行情感分析

在本节中,我们将使用 AllenNLP 资源运行 RoBERTa-large Transformers。Liu等人(2019)分析了现有的 BERT 模型,并发现它们并没有训练得像预期的那样好。考虑到这些模型的生成速度,这并不令人惊讶。他们致力于改进 BERT 模型的预训练,以产生一个强大优化的 BERT 预训练方法RoBERTa)。

让我们首先在SentimentAnalysis.ipynb中运行一个 RoBERTa-large 模型。

运行第一个单元格以安装allennlp-models

!pip install allennlp==1.0.0 allennlp-models==1.0.0 

现在让我们尝试运行我们的雅克·德里达样本:

!echo '{"sentence": "Whether or not you're enlightened by any of Derrida's lectures on the other and the self, Derrida is an undeniably fascinating and playful fellow."}' | \
allennlp predict https://storage.googleapis.com/allennlp-public-models/sst-roberta-large-2020.06.08.tar.gz - 

输出首先显示 RoBERTa-large 模型的架构,该模型有24层和16个注意力头:

"architectures": [
  "RobertaForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "bos_token_id": 0,
  "eos_token_id": 2,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 1024,
  "initializer_range": 0.02,
  "intermediate_size": 4096,
  "layer_norm_eps": 1e-05,
  "max_position_embeddings": 514,
  "model_type": "roberta",
  "num_attention_heads": 16,
  "num_hidden_layers": 24,
  "pad_token_id": 1,
  "type_vocab_size": 1,
  "vocab_size": 50265
} 

如果需要,您可以花几分钟阅读 第三章 Fine-Tuning BERT Models 中的 BERT model configuration 部分的 BERT 架构描述,以充分利用该模型。

情感分析会产生介于0(负面)和1(正面)之间的数值。

输出然后产生情感分析任务的结果,显示输出 logits 和最终的正面结果:

prediction:  {"logits": [3.646597385406494, -2.9539334774017334], "probs": [0.9986421465873718, 0.001357800210826099] 

注意:算法是随机的,因此输出可能会在每次运行时变化。

输出还包含令牌 ID(可能会在每次运行时变化)和最终的输出标签:

"token_ids": [0, 5994, 50, 45, 47, 769, 38853, 30, 143, 9, 6113, 10505, 281, 25798, 15, 5, 97, 8, 5, 1403, 2156, 211, 14385, 4347, 16, 41, 35559, 12509, 8, 23317, 2598, 479, 2], "label": "1", 

输出还显示了令牌本身:

"tokens": ["<s>", "\u0120Whether", "\u0120or", "\u0120not", "\u0120you", "\u0120re", "\u0120enlightened", "\u0120by", "\u0120any", "\u0120of", "\u0120Der", "rid", "as", "\u0120lectures", "\u0120on", "\u0120the", "\u0120other", "\u0120and", "\u0120the", "\u0120self", "\u0120,", "\u0120D", "err", "ida", "\u0120is", "\u0120an", "\u0120undeniably", "\u0120fascinating", "\u0120and", "\u0120playful", "\u0120fellow", "\u0120.", "</s>"]} 

花些时间输入一些样本来探索设计良好且预训练的 RoBERTa 模型。

现在让我们看看如何使用其他 transformer 模型来使用情感分析来预测客户行为。

使用情感分析预测客户行为

此部分将在几个 Hugging Face transformer 模型上运行情感分析任务,以查看哪些模型产生了最佳结果,哪些模型我们简单地喜欢。

我们将使用 Hugging Face 的 DistilBERT 模型开始此过程。

使用 DistilBERT 进行情感分析

让我们使用 DistilBERT 运行情感分析任务,并看看我们如何使用结果来预测客户行为。

打开 SentimentAnalysis.ipynb 和Transformers安装和导入单元格:

!pip install -q transformers
from transformers import pipeline 

我们现在将创建一个名为 classify 的函数,它将使用我们发送给它的序列运行模型:

def classify(sequence,M):
   #DistilBertForSequenceClassification(default model)
    nlp_cls = pipeline('sentiment-analysis')
    if M==1:
      print(nlp_cls.model.config)
    return nlp_cls(sequence) 

请注意,如果您将 M=1 发送给该函数,它将显示我们正在使用的 DistilBERT 6 层、12 个头模型的配置:

DistilBertConfig {
  "activation": "gelu",
  "architectures": [
    "DistilBertForSequenceClassification"
  ],
  "attention_dropout": 0.1,
  "dim": 768,
  "dropout": 0.1,
  "finetuning_task": "sst-2",
  "hidden_dim": 3072,
  "id2label": {
    "0": "NEGATIVE",
    "1": "POSITIVE"
  },
  "initializer_range": 0.02,
  "label2id": {
    "NEGATIVE": 0,
    "POSITIVE": 1
  },
  "max_position_embeddings": 512,
  "model_type": "distilbert",
  "n_heads": 12,
  "n_layers": 6,
  "output_past": true,
  "pad_token_id": 0,
  "qa_dropout": 0.1,
  "seq_classif_dropout": 0.2,
  "sinusoidal_pos_embds": false,
  "tie_weights_": true,
  "vocab_size": 30522
} 

此 DistilBERT 模型的具体参数是标签定义。

现在我们创建一个序列列表(您可以添加更多),我们可以将其发送给 classify 函数:

seq=3
if seq==1:
  sequence="The battery on my Model9X phone doesn't last more than 6 hours and I'm unhappy about that."
if seq==2:
  sequence="The battery on my Model9X phone doesn't last more than 6 hours and I'm unhappy about that. I was really mad! I bought a Moel10x and things seem to be better. I'm super satisfied now."
if seq==3:
  sequence="The customer was very unhappy"
if seq==4:
  sequence="The customer was very satisfied"
print(sequence)
M=0 #display model cofiguration=1, default=0
CS=classify(sequence,M)
print(CS) 

在这种情况下,seq=3 被激活以模拟我们需要考虑的客户问题。 输出为负面,这正是我们要寻找的示例:

[{'label': 'NEGATIVE', 'score': 0.9997098445892334}] 

我们可以从这个结果中得出几个结论,以预测客户行为,编写一个函数来:

  • 将预测存储在客户管理数据库中。

  • 统计客户在某段时间内(周、月、年)投诉服务或产品的次数。 经常投诉的客户可能会转向竞争对手以获得更好的产品或服务。

  • 检测在负面反馈信息中不断出现的产品和服务。 产品或服务可能存在缺陷,需要质量控制和改进。

您可以花几分钟运行其他序列或创建一些序列来探索 DistilBERT 模型。

我们现在将探索其他 Hugging Face transformers。

使用 Hugging Face 模型列表进行情感分析

本节将探索 Hugging Face 的Transformers模型列表,并输入一些样本以评估它们的结果。想法是测试多个模型,而不仅仅是一个,并查看哪个模型最适合您的给定项目需求。

我们将运行 Hugging Face 模型:huggingface.co/models

对于我们使用的每个模型,您可以在 Hugging Face 提供的文档中找到模型的描述:huggingface.co/transformers/

我们将测试几个模型。如果您实现它们,您可能会发现它们需要微调甚至是对您希望执行的 NLP 任务进行预训练。在这种情况下,对于 Hugging Face Transformers,您可以执行以下操作:

  • 对于微调,您可以参考第三章对 BERT 模型进行微调

  • 对于预训练,您可以参考第四章从头开始预训练 RoBERTa 模型

让我们首先浏览 Hugging Face 模型列表:huggingface.co/models

然后,在任务窗格中选择文本分类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.4:选择文本分类模型

将显示一系列用于文本分类的Transformers模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.5:Hugging Face 预训练的文本分类模型

默认排序模式为排序:最多下载

现在我们将搜索一些有趣的Transformers模型,我们可以在线测试。

我们将从 DistilBERT 开始。

DistilBERT 用于 SST

distilbert-base-uncased-finetuned-sst-2-english 模型在 SST 上进行了微调。

让我们试试一个需要对组成原理有良好理解的例子:

"尽管客户似乎不满意,但事实上她是满意的,只是当时在想其他事情,这给了一个错误的印象。"

这个句子对于Transformers来说很难分析,需要逻辑规则训练。

输出是一个假阴性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.6:复杂序列分类任务的输出

假阴性并不意味着模型工作不正确。我们可以选择另一个模型。然而,这可能意味着我们必须下载并训练它更长时间更好!

在撰写本书时,类似 BERT 的模型在 GLUE 和 SuperGLUE 排行榜上排名靠前。排名将不断变化,但Transformers的基本概念不会改变。

现在我们将尝试一个困难但不那么复杂的示例。

这个例子是真实项目的一个关键教训。当我们尝试估计客户投诉的次数时,我们将得到假阴性和假阳性。因此,对于未来几年,定期的人工干预仍将是必要的

让我们试试一个 MiniLM 模型。

MiniLM-L12-H384-uncased

Microsoft/MiniLM-L12-H384-uncased 优化了老师的最后一个自注意力层的大小,以及对 BERT 模型的其他调整,以获得更好的性能。它有 12 层,12 个头部和 3300 万参数,并且比 BERT-base 快 2.7 倍。

让我们测试它对组成原则的理解能力:

尽管客户似乎不高兴,但事实上她很满意,只是在那时在想其他事情,这造成了误解。

输出很有趣,因为它产生了一个谨慎的分数(未决定):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.7: 复杂句子情感分析

我们可以看到这个输出不是决定性的,因为它在0.5左右。应该是积极的。

让我们尝试一个涉及含意的模型。

RoBERTa-large-mnli

一个多题材自然语言推理MultiNLI)任务,cims.nyu.edu/~sbowman/multinli/,可以帮助解决复杂句子的解释,当我们试图确定客户的意思时。推理任务必须确定一个序列是否导致下一个序列。

我们需要对输入进行格式化,并使用序列分割标记分割序列:

尽管客户似乎不高兴</s></s> 事实上她很满意,只是当时在想其他事情,这造成了误解

结果很有趣,尽管保持中性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.8: 针对稍微积极的句子获得的中性结果

但是,这个结果没有错误。第二个序列不是从第一个序列推断出的。结果非常正确。

让我们以“积极情感”多语言 BERT-base 模型结束我们的实验。

BERT-base 多语言模型

让我们在一个超级酷的 BERT-base 模型上运行我们的最终实验:nlptown/bert-base-multilingual-uncased-sentiment

它设计得非常好。

让我们用友好和积极的英文句子来运行它:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.9: 英文情感分析

让我们用法语尝试一下,“Ce modèle est super bien!”(“这个模型超级好!”,意思是“酷”):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.10: 法语情感分析

Hugging Face 上这个模型的路径是nlptown/bert-base-multilingual-uncased-sentiment。您可以在 Hugging Face 网站的搜索表单中找到它。其当前链接为huggingface.co/nlptown/bert-base-multilingual-uncased-sentiment?text=Ce+mod%C3%A8le+est+super+bien%21

您可以通过以下初始化代码在您的网站上实现它:

from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("nlptown/bert-base-multilingual-uncased-sentiment")
model = AutoModelForSequenceClassification.from_pretrained("nlptown/bert-base-multilingual-uncased-sentiment") 

这将需要一些时间和耐心,但结果可能会非常好!

您可以在您的网站上实施此转换器,以平均全球客户的满意度!您还可以将其用作持续反馈,以改善您的客户服务并预测客户的反应。

在我们离开之前,我们将看看 GPT-3 如何执行情感分析。

使用 GPT-3 进行情感分析

您需要一个 OpenAI 账户来运行本节的示例。教育界面不需要 API、开发或培训。您可以简单地输入一些推特,然后请求进行情感分析:

推特: 我觉得这部电影不那么令人兴奋,但不知怎么的我真的很享受看它!

情感: 积极

推特: 我以前从未吃过这样的辛辣食物,但觉得它超级好吃!

情感: 积极

输出是令人满意的。

现在我们将向 GPT-3 引擎提交一个困难的序列:

推特: 因为我们不得不考虑所有参数,所以很难找到我们在生活中真正喜欢的东西。

情感: 积极

输出是错误的!这个情感根本不是积极的。这句话显示了生活的困难。然而,“享受”这个词为 GPT-3 引入了偏见。

如果我们从序列中去除“享受”并用动词 替换,输出将是负面的:

推特: 因为我们不得不考虑所有参数,所以很难找到我们在生活中真正喜欢的东西。

情感: 消极

输出也是错误的!并不是因为生活难以理解,我们就可以得出这句话是负面的结论。正确的输出应该是中性的。然后我们可以要求 GPT-3 在流水线中执行另一个任务,例如解释为什么它很困难。

作为一个没有任务的用户运行 NLP 任务显示了工业 4.0(I4.0)的发展方向:更少的人为干预,更多的自动功能。 然而,我们知道某些情况下我们的新技能是必需的,比如在转换器产生意外结果时设计预处理功能。人类仍然是有用的!

第七章GPT-3 引擎崛起的超人类转换器运行 OpenAI GPT-3 任务 部分中描述了一种具有现成代码的推特分类示例。如果您愿意,您可以在该代码中实现本节的示例。

现在让我们看看我们如何仍然证明自己是有价值的资产。

在我们离开之前进行一些务实的 I4.0 思考

Hugging Face transformers 进行情感分析时包含了一句被判定为“中性”的句子。

但那是真的吗?

将这句话标记为“中性”让我感到不安。我很好奇 OpenAI GPT-3 能否做得更好。毕竟,GPT-3 是一个理论上可以做许多其未经过训练的事情的基础模型。

我再次检查了这句话:

虽然客户看起来不高兴,但实际上她却很满意,只是在那时在想其他事情,这给了一个错误的印象。

当我仔细阅读句子时,我能看到顾客是 she。当我更深入地观察时,我理解到 she 实际上是 satisfied。我决定不是盲目地尝试各种模型,直到找到一个有效的为止。一直尝试一个接一个的模型是没有生产力的。

我需要通过逻辑和实验来找到问题的根源。我不想依赖自动找到原因的算法。有时候我们需要使用我们的神经元!

问题可能是很难为机器识别 she 作为 customer 吗?就像我们在第十章中所做的那样,基于 BERT 的语义角色标注,让我们问问 SRL BERT。

用 SRL 进行调查

第十章以我建议使用 SRL 与其他工具结束,我们现在正在这样做。

我首先在demo.allennlp.org/上使用语义角色标注接口运行了 She was satisfied

结果是正确的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.11:简单句子的 SRL

这个谓词框架中的分析很清晰:was 是动词,SheARG1,而 satisfiedARG2

我们应该在一个复杂的句子中找到相同的分析结果,而我们做到了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.12:动词“satisfied”与其他单词合并,导致混淆

Satisfied 仍然是 ARG2,所以问题可能不在这里。

现在,焦点在ARGM-ADV上,它也修改了 was。这个字 false 是相当具有误导性的,因为ARGM-ADV是与包含 thinkingARG2相关的。

thinking 谓词给出了一个 false impression,但在这个复杂的句子中却没有被识别为谓词。难道 she was 是一个未知的省略,正如第十章中的SRL 范围的质疑部分所示?

通过输入完整句子而不使用省略号,我们可以快速验证:

Though the customer seemed unhappy, she was, in fact, satisfied but she was thinking of something else at the time, which gave a false impression.

SRL 的问题再次出现,正如我们在第十章中所看到的那样。我们现在有五个正确的谓词和五个准确的框架。

Frame 1 显示 unhappyseemed 正确相关:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.13:“Unhappy” 与 “seemed” 正确相关

Frame 2 显示 satisfied 现在从句子中分离出来,并在一个复杂句子中单独识别为 was 的参数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.14:“satisfied” 现在是 ARG2 中的一个独立单词

现在,让我们直接到包含thinking的谓语,这是我们希望 BERT SRL 能够正确分析的动词。现在我们压制了省略号并重复了“she was”在句子中,输出是正确的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.15:没有省略号的准确输出

现在,我们可以用两个线索结束我们的 SRL 调查:

  • 单词false对算法来说是一个让其难以理解复杂句子中其他单词的令人困惑的论点

  • she was的重复省略号

在我们转向 GPT-3 之前,让我们回到 Hugging Face,带着我们的线索。

用 Hugging Face 进行调查

现在让我们回到本章 DistilBERT 用于 SST 部分使用的 DistilBERT 基础 uncased fine-tuned SST-2 模型。

我们将调查我们的两个线索:

  • she was的省略号

    我们将首先提交一个没有省略号的完整句子:

    “尽管顾客似乎不快乐,但事实上,她是满意的,只是当时在想其他事情,给人以错误的印象”

    输出仍然是消极的:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    图 12.16:一个假阴性

  • 在一个原本积极的句子中出现了false

    现在我们将false从句子中移除,但留下省略号:

    “尽管顾客似乎不满意,但事实上,她很满意,只是当时在想其他事情,留下了这样的印象”

    中了!输出为积极:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    图 12.17:一个真阳性

我们知道单词false对 SRL 造成混淆,如果有was thinking的省略号。我们也知道false对我们使用的情感分析 Hugging Face transformer 模型造成困惑。

GPT-3 能做得更好吗?让我们看看。

用 GPT-3 游��场进行调查

让我们使用 OpenAI 的高级推文分类器的例子,并通过三个步骤修改它来满足我们的调查需求:

  • 步骤 1:向 GPT-3 展示我们期望的内容:

    句子:“顾客很满意”

    情感积极

    句子:“顾客并不满意”

    情感消极

    句子:“服务很 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    情感积极

    句子:“这是评论的链接

    情感中性

  • 步骤 2:展示少量输出格式示例:

    1\. "我喜欢新的蝙蝠侠电影!"

    2\. "我讨厌我的手机电量耗尽时的情况"

    3\. "我的一天过得如此 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fgitee.com%2FOpenDocCN%2Ffreelearn-dl-pt2-zh%2Fraw%2Fmaster%2Fdocs%2Ftfm-nlp%2Fimg%2FIcon_01.png&pos_id=img-5keXZGB9-1714450845018)"

    4\. "这是文章的链接"

    5\. "这个新的音乐视频让我大吃一惊"

    句子情感评分:

    1: 积极

    2: 消极

    3: 积极

    4: 中性

    5: 积极

  • 步骤 3:将我们的句子与其他句子一起输入(编号 3):

    1\. "我受不了这个产品"

    2\. "服务很差! ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fgitee.com%2FOpenDocCN%2Ffreelearn-dl-pt2-zh%2Fraw%2Fmaster%2Fdocs%2Ftfm-nlp%2Fimg%2FIcon_02.png&pos_id=img-jOOhwzvn-1714450845018)"

    3\. "尽管客户看起来不满意,但事实上她当时是满意的,只是想着其他事情,这给人以错误的印象"

    4\. "支持团队很棒!"

    5\. "这是产品的链接。"

    句子情感评分:

    1: 消极

    2: 积极

    3: 积极

    4: 积极

    5: 中性

输出似乎令人满意,因为我们的句子是积极的(编号 3)。这个结果可靠吗?我们可以在这里多次运行示例。但让我们深入到代码层面去找出答案。

GPT-3 代码

我们只需在游乐场中点击查看代码,复制它,并将其粘贴到我们的 SentimentAnalysis.ipynb 章节笔记本中。我们添加一行只打印我们想要看到的内容:

response = openai.Completion.create(
  engine="davinci",
  prompt="This is a Sentence sentiment classifier\nSentence: \"The customer was satisfied\"\nSentiment: Positive\n###\nSentence: \"The customer was not satisfied\"\nSentiment: Negative\n###\nSentence: \"The service was `![](https://gitee.com/OpenDocCN/freelearn-dl-pt2-zh/raw/master/docs/tfm-nlp/img/Icon_01.png)`\"\nSentiment: Positive\n###\nSentence: \"This is the link to the review\"\nSentiment: Neutral\n###\nSentence text\n\n\n1\. \"I loved the new Batman movie!\"\n2\. \"I hate it when my phone battery dies\"\n3\. \"My day has been `![](https://gitee.com/OpenDocCN/freelearn-dl-pt2-zh/raw/master/docs/tfm-nlp/img/Icon_01.png)`\"\n4\. \"This is the link to the article\"\n5\. \"This new music video blew my mind\"\n\n\nSentence sentiment ratings:\n1: Positive\n2: Negative\n3: Positive\n4: Neutral\n5: Positive\n\n\n###\nSentence text\n\n\n1\. \"I can't stand this product\"\n2\. \"The service was bad! ![](https://gitee.com/OpenDocCN/freelearn-dl-pt2-zh/raw/master/docs/tfm-nlp/img/Icon_02.png)\"\n3\. \"Though the customer seemed unhappy she was in fact satisfied but thinking of something else at the time, which gave a false impression\"\n4\. \"The support team was `![](https://gitee.com/OpenDocCN/freelearn-dl-pt2-zh/raw/master/docs/tfm-nlp/img/Icon_03.png)`![](https://gitee.com/OpenDocCN/freelearn-dl-pt2-zh/raw/master/docs/tfm-nlp/img/Icon_03.png)\"\n5\. \"Here is the link to the product.\"\n\n\nSentence sentiment ratings:\n",
  temperature=0.3,
  max_tokens=60,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0,
  stop=["###"]
)
r = (response["choices"][0])
print(r["text"]) 

输出不稳定,正如我们在以下回应中所看到的:

  • 运行 1:我们的句子(编号 3)是中性的:

    1: 消极

    2: 消极

    3: 中性

    4: 积极

    5: 积极

  • 运行 2:我们的句子(编号 3)是积极的:

    1: 消极

    2: 消极

    3: 积极

    4: 积极

    5: 中性

  • 运行 3:我们的句子(编号 3)是积极的

  • 运行 4:我们的句子(编号 3)是消极的

这将引导我们得出调查的结论:

  • SRL 表明,如果句子是简单而完整的(没有省略号,没有遗漏的单词),我们将得到可靠的情感分析输出。

  • SRL 表明,如果句子是中等难度的,输出可能可靠,也可能不可靠。

  • SRL 表明,如果句子是复杂的(省略号、多个命题、许多含糊不清的短语等),结果是不稳定的,因此不可靠。

开发者的现在和未来的工作岗位的结论是:

  • 云 AI 和即用模块将需要更少的 AI 开发。

  • 将需要更多的设计技能。

  • 发展用于供给 AI 算法、控制它们并分析其输出的经典流程管道将需要思考和有针对性的发展。

本章展示了开发者作为思想家、设计师和管道开发的巨大前景!

现在是总结我们的旅程并探索新的Transformers地平线的时候了。

摘要

在本章中,我们讨论了一些高级理论。组合性原则不是一个直观的概念。组合性原则意味着Transformers模型必须理解句子的每个部分才能理解整个句子。这涉及到将提供句子部分之间联系的逻辑形式规则。

情感分析的理论难度需要大量的Transformers模型训练、强大的机器和人力资源。虽然许多Transformers模型为许多任务进行了训练,但它们通常需要针对特定任务进行更多的训练。

我们测试了 RoBERTa-large、DistilBERT、MiniLM-L12-H384-uncased 和出色的 BERT-base 多语言模型。我们发现其中一些提供了有趣的答案,但需要更多的训练来解决我们在多个模型上运行的 SST 样本。

情感分析需要对句子有深入的理解和非常复杂的序列。所以,尝试 RoBERTa-large-mnli 是有意义的,以了解干扰任务会产生什么。这里的教训是,在像 transformer 模型这样非常不传统的东西上,不要墨守成规!尝试一切。在各种任务上尝试不同的模型。transformer 的灵活性使我们能够在同一模型上尝试许多不同的任务,或者在许多不同的模型上尝试相同的任务。

我们一路上收集了一些改善客户关系的想法。如果我们发现一个客户经常不满意,那么这个客户可能只是在寻找我们的竞争对手。如果有几个客户抱怨某个产品或服务,我们必须预见未来的问题并改善我们的服务。我们还可以通过 transformer 反馈的在线实时表现来展示我们的服务质量。

最后,我们直接在线使用 GPT-3 进行情感分析,除了使用界面之外什么也不用做!这是令人惊讶的有效,但我们看到人类仍然需要解决更困难的序列。我们看到 SRL 如何帮助识别复杂序列中的问题。

我们可以得出结论,开发人员在思考者、设计者和管道开发方面有着巨大的未来。

在下一章,使用 transformer 分析假新闻,我们将使用情感分析来分析对假新闻的情感反应。

问题

  1. 对于情感分析,没有必要为 transformer 进行预训练。(是/否)

  2. 一个句子总是积极的或消极的。它不能是中性的。(是/否)

  3. 合成性原理表示 transformer 必须理解句子的每一部分才能理解它。(是/否)

  4. RoBERTa-large 旨在改进 transformer 模型的预训练过程。(是/否)

  5. 一个 transformer 可以提供反馈,告诉我们客户是否满意。(是/否)

  6. 如果产品或服务的情感分析一直是负面的,这有助于我们做出适当的决策,以改善我们的服务。(是/否)

  7. 如果一个模型在一个任务上不能提供良好的结果,那么在更改模型之前,它需要更多的训练。(是/否)

参考文献

加入我们书籍的 Discord 空间

加入书籍的 Discord 工作空间,与作者进行每月的 问我任何事 会议:

www.packt.link/Transformers

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值