Transformers 自然语言处理(四)
原文:
zh.annas-archive.org/md5/a1e65552fc41f3b5a667f63d9bed854c译者:飞龙
第十二章:检测客户情绪以进行预测
情感分析依赖于组合性原则。如果我们无法理解句子的部分,如何理解整个句子?这对于 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 是动词,She 是 ARG1,而 satisfied 是 ARG2。
我们应该在一个复杂的句子中找到相同的分析结果,而我们做到了:
图 12.12:动词“satisfied”与其他单词合并,导致混淆
Satisfied 仍然是 ARG2,所以问题可能不在这里。
现在,焦点在ARGM-ADV上,它也修改了 was。这个字 false 是相当具有误导性的,因为ARGM-ADV是与包含 thinking 的ARG2相关的。
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 显示 unhappy 与 seemed 正确相关:
图 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\. "我的一天过得如此 "4\. "这是文章的链接"5\. "这个新的音乐视频让我大吃一惊"句子情感评分:
1: 积极2: 消极3: 积极4: 中性5: 积极 -
步骤 3:将我们的句子与其他句子一起输入(编号 3):
1\. "我受不了这个产品"2\. "服务很差! "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 ``\"\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 ``\"\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! \"\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 ``\"\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 分析假新闻,我们将使用情感分析来分析对假新闻的情感反应。
问题
-
对于情感分析,没有必要为 transformer 进行预训练。(是/否)
-
一个句子总是积极的或消极的。它不能是中性的。(是/否)
-
合成性原理表示 transformer 必须理解句子的每一部分才能理解它。(是/否)
-
RoBERTa-large 旨在改进 transformer 模型的预训练过程。(是/否)
-
一个 transformer 可以提供反馈,告诉我们客户是否满意。(是/否)
-
如果产品或服务的情感分析一直是负面的,这有助于我们做出适当的决策,以改善我们的服务。(是/否)
-
如果一个模型在一个任务上不能提供良好的结果,那么在更改模型之前,它需要更多的训练。(是/否)
参考文献
-
Richard Socher, Alex Perelygin, Jean Wu, Jason Chuang, Christopher Manning, Andrew Ng, 和 Christopher Potts, 递归深度模型用于情感树库的语义组成性:
nlp.stanford.edu/~socherr/EMNLP2013_RNTN.pdf -
Hugging Face 管道、模型和文档:
-
刘银涵, 陈丹琪, 奥默·莱维, 迈克·刘易斯, 卢克·泽特莫耶, 和 维塞林·斯托扬诺夫, 2019, RoBERTa: 一个经过强化优化的 BERT 预训练方法:
arxiv.org/pdf/1907.11692.pdf -
艾伦人工智能研究所:
allennlp.org/ -
艾伦人工智能阅读理解资源:
demo.allennlp.org/sentiment-analysis -
RoBERTa-large 贡献者,吴照峰:
zhaofengwu.github.io/
加入我们书籍的 Discord 空间
加入书籍的 Discord 工作空间,与作者进行每月的 问我任何事 会议:
第十三章:用Transformers分析假新闻
我们生来就认为地球是平的。作为婴儿,我们在平坦的表面上爬行。在幼儿园时,我们在平坦的操场上玩耍。在小学时,我们坐在平的教室里。然后,我们的父母和老师告诉我们,地球是圆的,而在地球的另一边的人是倒挂着的。我们花了很长时间才明白他们为什么没有从地球上摔下来。即使今天,当我们看到美丽的日落时,我们还是看到“太阳落下”,而不是地球从太阳那边转过去!
辨别假新闻和真实新闻需要时间和努力。像孩子一样,我们不得不努力理清我们认为是假新闻的东西。
本章将涉及一些制造紧张关系的主题。我们将核实诸如气候变化、枪支管制和唐纳德·特朗普的推特等主题的事实。我们将分析推特、脸书帖子和其他信息来源。
我们的目标当然不是评判任何人或任何事物。假新闻涉及观点和事实。新闻往往取决于当地文化对事实的看法。我们将提供想法和工具,帮助他人在某一主题上收集更多信息,并在我们每天收到的信息丛林中找到自己的方向。
我们将专注于道德方法,而不是Transformers的性能。出于这个原因,我们不会使用 GPT-3 引擎。我们不会取代人类的判断。相反,我们为人类提供工具,让他们自己进行判断。GPT-3 引擎在许多任务上已达到了人类水平的表现。然而,我们应该将道德和伦理决策留给人类。
因此,首先,我们将开始定义导致我们对假新闻产生情感和理性反应的路径。
我们将然后定义一些利用Transformers和启发式方法识别假新闻的方法。
我们将利用前几章中建立的资源来理解和解释假新闻。我们不会进行评判。我们将提供能够解释新闻的Transformers模型。有些人可能更喜欢创建一个通用的绝对Transformers模型,以检测并断言一条消息是假新闻。
我选择用Transformers来教育用户,而不是对他们说教。这是我的观点,而不是事实!
本章涵盖以下主题:
-
认知 dissonance
-
对假新闻的情感反应
-
假新闻的行为表现
-
对假新闻的理性方法
-
假新闻的解决方案路线图
-
将情感分析Transformers任务应用于社交媒体
-
使用 NER 和 SRL 来分析枪支管制的感知
-
利用Transformers提取的信息找到可靠的网站
-
使用Transformers为教育目的生成结果
-
如何以客观但批判的眼光阅读前总统特朗普的推特
我们的第一步将是探索对假新闻的情感和理性反应。
对假新闻的情感反应
人类行为对我们的社会、文化和经济决策有着巨大的影响。我们的情绪影响着我们的经济,甚至比理性思考更为重要。行为经济学推动着我们的决策过程。我们购买消费品是出于我们的实际需求和满足情感欲望。我们甚至可能会在一时冲动之下购买一部超出预算的智能手机。
我们对假新闻的情感和理性反应取决于我们是慢思考还是快速对入信息做出反应。丹尼尔·卡内曼在他的研究和书籍*《思考,快与慢》(2013)*中描述了这一过程。
他和弗农·L·史密斯因行为经济学研究而获得了诺贝尔经济学奖。行为驱动我们之前认为是理性的决定。不幸的是,我们许多的决定是基于情感而不是理性的。
让我们将这些概念转化为应用于假新闻的行为流程图。
认知失调会引发情感反应。
认知失调将假新闻推到了 Twitter、Facebook 和其他社交媒体平台的顶峰。如果每个人都同意一条推文的内容,那么什么也不会发生。如果有人写了一条推文说:“气候变化很重要”,没有人会做出反应。
当我们的头脑中存在矛盾的思想时,我们会进入认知失调状态。因此,我们变得紧张、烦躁,就像烤面包机中的短路一样消耗我们的精力。
我们有许多例子可以思考。在户外戴口罩是否必要?封锁是好事还是坏事?冠状病毒疫苗有效吗?或者冠状病毒疫苗是危险的吗?认知失调就像一个音乐家在演奏简单曲子时不断犯错。这让我们疯狂!
假新闻综合症将认知失调指数级地增加!一位专家会断言疫苗是安全的,另一位专家会警告我们要小心。一位专家说在外面戴口罩没用,而另一位在新闻频道上坚持认为我们必须戴上!双方都指责对方传播假新闻!
对于一方来说,看起来很大一部分假新闻是另一方的真相。
我们处于 2022 年,美国的共和党人和民主党人仍然无法就 2020 年总统选举之后的国家选举规则达成一致意见,或者即将举行的选举的组织形式达成一致意见。
我们可以继续通过打开一份报纸找到其他无数话题,然后在另一份反对的报纸上找到另一种观点!尽管如此,从这些例子中可以得出一些本章的常识前提:
-
找到一个能够自动检测假新闻的Transformers模型是没有意义的。在社交媒体和多元文化表达的世界中,每个群体都对真相有一种认知,而另一方则在传播假新闻。
-
试图将我们的观点表达为来自一种文化到另一种文化的真理是毫无意义的。在一个全球化的世界里,不同国家、不同大陆和社交媒体的各个地方都有不同的文化。
-
绝对的假新闻是一个谬论。
-
我们需要找到假新闻的更好定义。
我的观点(当然,这不是事实!)是假新闻是一种只能通过认知推理来解决的认知失调状态。因此,解决假新闻问题正好像试图解决两个当事方之间或我们心中的冲突一样。
在本章和生活中,我建议通过使用转换模型来解构每一个冲突紧张局势和观点。我们并不是在“打击假新闻”,“寻找内心平静”,或者假装使用转换工具来寻找“对抗假新闻的绝对真理”。
我们使用转换工具来更深入理解一系列词语(一条消息),从而对某个话题形成更深刻、更广阔的观点。
一旦完成这些,让幸运的转换模型用户得到更好的视觉和观点。
为此,我设计了本章作为一个我们自己和其他人可以使用的课堂练习。转换工具是加深我们对语言序列理解、形成更广泛观点和发展认知能力的好方法。
让我们先看看当有人发布冲突性推特时会发生什么。
分析一条引发冲突的推特
下面的推特是在 Twitter 上发布的一条消息(我进行了改写)。在本章中显示的推特是原始数据集格式,而不是 Twitter 界面的显示。可以肯定的是,如果一个主要的政治人物或著名演员发推特,很多人会反对其内容:
气候变化是虚假的。这是自由派图谋破坏经济的一个阴谋。
这可能引发情绪反应。推特将从各个方面堆积起来。它将迅速传播并成为趋势!
让我们通过转换工具来分析这条推特,了解这条推特如何在某人的心里引起认知失调风暴。
打开Fake_News.ipynb,这是我们在本节中将要使用的笔记本。
我们将先从Allen 人工智能研究院获得资源。我们将运行我们在第十二章中用于情感分析的 RoBERTa 转换模型。
首先,我们需要安装allennlp-models。
!pip install allennlp==1.0.0 allennlp-models==1.0.0
AllenNLP 在不断更新版本。在撰写本文时,版本 2.4.0 已存在,但对本章提供的示例并无额外价值。随机算法或经过更新的模型会产生不同的输出。
然后我们用 Bash 运行下一条命令来详细分析推特的输出(模型和输出的信息):
!echo '{"sentence":"Climate change is bogus. It's a plot by the liberals to take the economy down."}' | \
allennlp predict https://storage.googleapis.com/allennlp-public-models/sst-roberta-large-2020.06.08.tar.gz -
输出显示这条推特是负面的。积极值为0,而负面值接近1:
"probs": [0.0008486526785418391, 0.999151349067688]
输出可能因为转换工具的随机算法而有所不同。
现在我们将前往 allennlp.org/ 获取分析的可视化表示。
输出可能会从一个运行到另一个运行改变。Transformer 模型持续进行训练和更新。本章的目标是专注于 Transformer 模型的推理。
我们选择 情感分析 (demo.allennlp.org/sentiment-analysis) 并选择 RoBERTa 大模型 运行分析。
我们得到了相同的负结果。然而,我们可以进一步调查,看看哪些词影响了 RoBERTa 的决定。
转到 模型解释。
解释模型将提供如何获得结果的见解。我们可以选择一个或查看三个选项:
-
简单梯度可视化:该方法提供两种可视化。第一种计算与输入相关的类别得分的梯度。第二种是从类别和输入推断出的显著性(主要特征)地图。
-
综合梯度可视化:这个模型不需要对神经网络进行任何更改。
-
设计调用梯度的动机是为了生成神经网络对其输入的预测的归因。
-
平滑梯度可视化:这种方法使用输出预测和输入来计算梯度。目标是识别输入的特征。然而,为了改进解释,添加了噪声。
在本节中,转到 模型解释,然后点击 简单梯度可视化 和 解释预测,以获取以下表示:
图 13.1:可视化前 3 个最重要的单词
is + bogus + plot 主要影响了负预测。
此时,你可能想知道为什么我们要看一个如此简单的例子来解释认知失调。解释来自以下推文。
一个坚定的共和党人写了第一条推文。我们称该成员为 Jaybird65。令他惊讶的是,一位同样是共和党人的人发了以下推文:
我是共和党人,认为气候变化意识是一件好事!
这条推文来自我们将称之为 Hunt78 的成员。让我们在 Fake_News.ipynb 中运行这个句子:
!echo '{"sentence":"I am a Republican and think that climate change consciousness is a great thing!"}' | \
allennlp predict https://storage.googleapis.com/allennlp-public-models/sst-roberta-large-2020.06.08.tar.gz -
输出当然是正的:
"probs": [0.9994876384735107, 0.0005123814917169511]
一个认知失调的风暴正在 Jaybird65 的脑海中酝酿。他喜欢 Hunt78,但不同意。他的思绪风暴正在加剧!如果你读了 Jaybird65 和 Hunt78 之间接连发生的推文,你会发现一些令 Jaybird65 难过的令人惊讶的事实:
Jaybird65 和 Hunt78 显然彼此认识。
-
如果你去他们各自的 Twitter 账户,你会发现他们都是猎人。
-
你可以看到他们都是坚定的共和党人。
Jaybird65 最初的推文是对 纽约时报 一篇声称气候变化正在摧毁地球的文章的反应。
Jaybird65 感到很困惑。他可以看到 Hunt78 和他一样是共和党人。他也是个猎人。那么 Hunt78 怎么会相信气候变化呢?
这个推特串的愤怒推文数量惊人。
然而,我们可以看到,虚假新闻讨论的根源在于对新闻的情感反应。对气候变化的理性方法应该是:
-
无论原因是什么,气候都在变化。
-
我们不需要因为改变人类而使经济崩溃。
-
我们需要继续制造电动汽车,在大城市增加更多的行走空间,并改善农业习惯。我们只需要以可能会带来收入的新方式经营业务。
但情感在人类中是很强烈的!
让我们来描述一下从新闻到情感和理性反应的过程。
虚假新闻的行为表示
虚假新闻始于情感反应,逐渐升级,并经常导致个人攻击。
图 13.2 表示了当认知失调阻碍我们的思维过程时,对虚假新闻的三阶段情感反应路径:
第 1 阶段:收到的新闻
两个人或一组人对他们通过各自媒体获得的新闻做出反应:Facebook、Twitter、其他社交媒体、电视、广播、网站。每个信息来源都包含偏见观点。
第 2 阶段:共识
两个人或一组人可以同意或不同意。如果他们不同意,我们将进入第 3 阶段,在此期间冲突可能会激化。
如果他们同意,共识会阻止热情的积聚,新闻被接受为真实新闻。然而,即使所有各方相信他们收到的新闻不是虚假的,这并不意味着它不是虚假的。以下是一些解释标记为非虚假新闻的新闻可能是虚假新闻的原因:
-
在 12 世纪早期,欧洲大多数人认为地球是宇宙的中心,太阳系围绕地球旋转。
-
1900 年,大多数人认为永远不会有一种飞越海洋的飞机。
-
2020 年 1 月,大多数欧洲人认为 COVID-19 只是影响中国而不是全球流行的病毒。
底线是,两个或甚至整个社会之间的共识并不意味着传入的新闻是真实还是虚假的。如果两个派系意见不一致,这将导致冲突:
图 13.2:从新闻到虚假新闻冲突的路径的表示
让我们面对现实吧。在社交媒体上,成员通常与持有相同观点的其他人汇聚在一起,并且无论如何都很少改变他们的想法。这种描述表明,一个人通常会坚持在推特上表达的观点,一旦有人挑战他们的消息,冲突就会升级!
第 3 阶段:冲突
一个虚假新闻冲突可以分为四个阶段:
-
3.1:冲突始于分歧。各方会在推特或 Facebook 或其他平台上发帖留言。经过几次交流后,冲突可能会消散,因为各方对这个话题不感兴趣。
-
3.2:如果我们回到
Jaybird65和Hunt78之间关于气候变化的讨论,我们知道情况可能会变得糟糕。对话正在升温! -
3.3:在某个时刻,不可避免地,一方的观点将变成虚假新闻。
Jaybird65会生气,并在多条推文中表现出来,他认为由于人类引起的气候变化是假新闻。Hunt78会生气,并表示否认人类对气候变化的贡献是假新闻。 -
3.4:这些讨论通常以人身攻击结束。即使我们不知道它是如何出现的,戈德温定律也经常进入对话。戈德温定律指出,在对话的某个时刻,一方会找到最糟糕的参考来描述另一方。有时会表现为“你们自由派就像希特勒试图通过气候变化压制我们的经济。”这种类型的信息可以在推特、Facebook 和其他平台上看到。它甚至出现在总统关于气候变化的演讲期间的实时聊天中。
是否有一种理性的方式可以缓和双方的讨论,让他们冷静下来,至少达成一种折中的共识以便继续前进?
让我们尝试通过 transformers 和启发式方法建立一种理性的方式。
对虚假新闻的理性处理方法
Transformers 是有史以来最强大的自然语言处理工具。本节将首先定义一种方法,可以将两方在虚假新闻上的冲突从情绪层面提升到理性层面。
然后我们将使用 transformer 工具和启发式方法。我们将对枪支管制和前总统特朗普在 COVID-19 大流行期间的推文运行 transformer 样本。我们还将描述可以与传统功能一起实施的启发式方法。
你可以实现这些 transformer 自然语言处理任务或其他你选择的任务。不管怎样,这个路线图和方法可以帮助老师、家长、朋友、同事以及任何寻求真相的人。因此,你的工作总是值得的!
让我们从包含 transformers 的虚假新闻的理性解决方案路线图开始。
定义一个虚假新闻解决路线图
图 13.3 定义了一个理性的虚假新闻分析流程路线图。该流程包含 transformer 自然语言处理任务和传统功能:
图 13.3:从对虚假新闻的情绪反应到理性表达
我们发现,一旦情绪反应开始,理性过程几乎总是会开始。理性过程必须尽快开始,以避免累积可能中断讨论的情绪反应。
第三阶段现在包含四个工具:
-
3.1: 使用情感分析来分析排名前列的“情感”正面或负面词汇。我们将在我们的
Fake_News.ipynb笔记本中使用AllenNLP资源来运行一个 RoBERTa 大型Transformers。我们将使用 AllenNLP 的可视化工具来可视化关键词和解释。我们在第十二章中介绍了情感分析,检测客户情绪以进行预测。 -
3.2: 命名实体识别(NER)用于从社交媒体消息中提取实体以进行第 3.4 阶段。我们在第十一章中描述了 NER,让你的数据说话:故事、问题和答案。我们将使用 Hugging Face 的 BERT Transformers模型来执行此任务。此外,我们将使用 AllenNLP.org 的可视化工具来可视化实体和解释。
-
3.3: 使用语义角色标注(SRL)来标注社交媒体消息中的动词,用于第 3.4 阶段。我们在第十章中描述了 SRL,使用基于 BERT 的Transformers进行语义角色标注。我们将在
Fake_News.ipynb中使用 AllenNLP 的 BERT 模型。我们将使用 AllenNLP.org 的可视化工具来可视化标注任务的输出。 -
3.4: 将描述可靠网站的参考文献,以显示经典编码如何帮助。
让我们从枪支管制开始。
枪支管制辩论
美国宪法的第二修正案断言以下权利:
A well regulated Militia, being necessary to the security of a free State, the right of the people to keep and bear Arms, shall not be infringed.
数十年来,美国在这个问题上分裂了:
-
一方面,许多人认为携带武器是他们的权利,他们不想忍受枪支管制。他们认为声称拥有武器会导致暴力是假新闻。
-
另一方面,许多人认为携带火器是危险的,没有枪支管制,美国将仍然是一个暴力国家。他们认为声称携带武器不危险是假新闻。
我们需要帮助每一个团体。让我们从情感分析开始。
情感分析
如果你阅读演讲期间的推文、Facebook 消息、YouTube 聊天或任何其他社交媒体,你会看到各方正在进行激烈的争斗。你不需要看电视节目。你只需吃着爆米花,看着推文之间的战斗撕裂各方!
让我们选取一条来自一方的推文和一条来自对立方的 Facebook 消息。我改变了成员的名字并改写了文本(考虑到消息中的侮辱,这并不是一个坏主意)。让我们从支持枪支的推文开始:
支持枪支的分析
这条推文是一个人的真实观点:
Afirst78: 我多年来一直有步枪和枪支,从未出过问题。我把孩子们培养得很好,所以他们也有枪支,除了兔子,从未伤害过任何东西。
让我们在Fake_News.ipynb中运行这个:
!echo '{"sentence": "I have had rifles and guns for years and never had a problem. I raised my kids right so they have guns too and never hurt anything except rabbits."}' | \
allennlp predict https://storage.googleapis.com/allennlp-public-models/sst-roberta-large-2020.06.08.tar.gz -
预测是积极的:
prediction: {"logits": [1.9383275508880615, -1.6191326379776], "probs": [0.9722791910171509, 0.02772079035639763]
我们现在将在 AllenNLP 上可视化结果。简单梯度可视化提供了一个解释:
图 13.4:一句话的简单梯度可视化
解释显示,对 Afirst78 的推文进行的情感分析突出显示了 rifles + and + rabbits。
每次运行或随着时间的推移结果可能会有所不同。这是因为Transformers模型正在持续训练和更新。然而,本章的重点在于过程,而不是特定结果。
我们将在每一步拾起想法和功能。Fake_News_FUNCTION_1 是本节的第一个函数:
Fake_News_FUNCTION_1:rifles + and + rabbits 可以被提取和记录以供进一步分析。我们可以看到在这个例子中,rifles并不“危险”。
我们现在将分析 NYS99 认为必须控制枪支的观点。
枪支管制分析
NYS99:“我一生中一直在我的社区听到枪声,失去了许多朋友,晚上害怕出门。”
让我们首先在 Fake_News.ipynb 中运行分析:
!echo '{"sentence": "I have heard gunshots all my life in my neighborhood, have lost many friends, and am afraid to go out at night."}' | \
allennlp predict https://storage.googleapis.com/allennlp-public-models/sst-roberta-large-2020.06.08.tar.gz -
结果自然是消极的:
prediction: {"logits": [-1.3564586639404297, 0.5901418924331665], "probs": [0.12492450326681137, 0.8750754594802856]
让我们使用 AllenNLP 在线工具找到关键词。我们运行示例,可以看到平滑梯度可视化突出显示以下内容:
图 13.5:一句话的平滑梯度可视化
关键词 afraid 在本节的功能 2 中显眼。我们现在知道 afraid 与 “guns” 相关联。
我们可以看到模型在解释这些认知上存在问题。我们的人类批判性思维仍然是必要的!
Fake_News_FUNCTION_2:afraid 和 guns(主题)可以被提取和记录以供进一步分析。
如果我们现在将我们的两个功能并排放置,我们就可以清楚地理解为什么两个团体在互相争斗:
-
Fake_News_FUNCTION_1:rifles+and+rabbitsAfirst78可能住在美国中西部的一个州。这些州中的许多人口不多,非常安静,并且享有低犯罪率。Afirst78可能从未去过大城市,享受着乡村宁静生活的乐趣。 -
Fake_News_FUNCTION_2:afraid+ 主题gunsNYS99可能住在美国大城市或主要美国大城市的大地区。犯罪率通常很高,暴力是日常现象。NYS99可能从未去过中西部州,也没见过Afirst78的生活方式。
这两种诚实而强烈的观点证明了为什么我们需要实施本章描述的解决方案。
更好的信息是减少假新闻战斗的关键。
我们将按照我们的流程对我们的句子应用命名实体识别。
命名实体识别(NER)
本章显示,通过使用几种Transformers方法,用户将通过不同角度获得更广泛的消息认知。HTML 页面可以总结本章的Transformers方法,甚至可以包含生产模式中的其他Transformers任务。
现在,我们必须将我们的流程应用到推特和 Facebook 消息上,尽管我们在消息中看不到任何实体。然而,程序并不知道这一点。我们将只运行第一条消息来说明这个过程的这一步。
我们将首先安装 Hugging Face transformers:
!pip install -q transformers
from transformers import pipeline
from transformers import AutoTokenizer, AutoModelForSequenceClassification,AutoModel
现在,我们可以运行第一条消息:
nlp_token_class = pipeline('ner')
nlp_token_class('I have had rifles and guns for years and never had a problem. I raised my kids right so they have guns too and never hurt anything except rabbits.')
由于没有实体,输出没有产生结果。然而,这并不意味着它应该从管道中去除。另一句话可能包含一个提供有关该地区文化线索的人的位置名称。
在我们继续之前,让我们检查一下我们正在使用的模型:
nlp_token_class.model.config
输出显示模型在注意力层使用了 9 个标签和 1024 个特征:
BertConfig {
"_num_labels": 9,
"architectures": [
"BertForTokenClassification"
],
"attention_probs_dropout_prob": 0.1,
"directionality": "bidi",
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 1024,
"id2label": {
"0": "O",
"1": "B-MISC",
"2": "I-MISC",
"3": "B-PER",
"4": "I-PER",
"5": "B-ORG",
"6": "I-ORG",
"7": "B-LOC",
"8": "I-LOC"
},
我们正在使用一个 BERT 24 层的 transformer 模型。如果您想探索架构,请运行nlp_token_class.model。
我们现在将在消息上运行 SRL。
语义角色标注(SRL)
我们将按照笔记本中找到的顺序,逐个运行Fake_News.ipynb的单元格。我们将考虑两种观点。
让我们从支持枪支的角度开始。
支持枪支 SRL
我们将首先在Fake_News.ipynb中运行以下单元格:
!echo '{"sentence": "I have had rifles and guns for years and never had a problem. I raised my kids right so they have guns too and never hurt anything except rabbits."}' | \
allennlp predict https://storage.googleapis.com/allennlp-public-models/bert-base-srl-2020.03.24.tar.gz -
输出非常详细,如果您想要详细调查或解析标签,可能会很有用,就像这段摘录中所示:
prediction: {"verbs": [{"verb": "had", "description": "[ARG0: I] have [V: had] [ARG1: rifles and guns] [ARGM-TMP: for years] and never had a problem ...
现在让我们在语义角色标注部分详细了解 AllenNLP。我们首先对这条消息运行 SRL 任务。第一个动词had表明Afirst78是一个经验丰富的枪支拥有者:
图 13.6:动词“had”的 SRL
had的参数总结了Afirst78的经验:I + rifles and guns + for years。
had的第二帧添加了信息I + never + had + a problem
raised的参数显示了Afirst78的父母经验:
图 13.7:动词“raised”的 SRL 和参数
参数解释了许多支持枪支立场:my kids + …have guns too and never hurt anything。
结果可能因每次运行或模型更新而有所不同,但流程保持不变。
我们可以将我们在这里找到的内容添加到我们的函数集合中进行一些解析:
-
Fake_News_FUNCTION_3:I+rifles and guns+for years -
Fake_News_FUNCTION_4:my kids+have gunstoo andnever hurt anything
现在让我们探索枪支控制消息。
枪支控制 SRL
我们将首先在Fake_News.ipynb中运行 Facebook 消息。我们将继续按照笔记本中创建的顺序逐个运行笔记本单元格:
!echo '{"sentence": "I have heard gunshots all my life in my neighborhood, have lost many friends, and am afraid to go out at night."}' | \
allennlp predict https://storage.googleapis.com/allennlp-public-models/bert-base-srl-2020.03.24.tar.gz -
结果详细标记了序列中的关键动词,就像以下摘录所示:
prediction: {"verbs": [{"verb": "heard", "description": "[ARG0: I] have [V: heard] [ARG1: gunshots all my life in my neighborhood]"
我们继续应用我们的流程,进入 AllenNLP,然后进入语义角色标注部分。我们输入句子并运行 transformer 模型。动词heard显示了这条消息的严峻现实:
图 13.8:动词“听到”的 SRL 表示
我们可以快速解析我们第五个功能的单词:
Fake_News_FUNCTION_5:一直听到+枪声+我一生都听到
动词失去显示了与之相关的重要论点:
图 13.9:动词“丢失”的 SRL 表示
我们已经拥有我们第六个功能所需的一切:
Fake_News_FUNCTION_6:失去+很多+朋友
建议在不同的转换模型澄清了消息的每个方面后,向用户提供参考网站是一个好主意。
参考网站
我们已经对 NLP 任务运行了转换器模型,并描述了需要开发以解析数据并生成六个功能的传统启发式硬编码。
请记住,结果可能会因每次运行而异。六个功能是在不同时间生成的,并且与上一节略有不同。但是,主要思想仍然相同。现在让我们专注于这六个功能。
-
Pro-guns:
Fake_News_FUNCTION_1:从未+问题+枪支 -
枪支管制:
Fake_News_FUNCTION_2:一直听到+害怕+枪支 -
Pro-guns:
Fake_News_FUNCTION_3:我+几年来持有步枪和枪支 -
Pro-guns:
Fake_News_FUNCTION_4:我的孩子们+有枪+从未伤害过任何东西 -
枪支管制:
Fake_News_FUNCTION_5:一直听到+枪声+我一生都听到 -
枪支管制:
Fake_News_FUNCTION_6:失去+很多+朋友
让我们重新组织列表,并分开两个观点,并得出一些结论以决定我们的行动。
支持枪支和枪支管制
反对枪支的论点是诚实的,但它们表明在美国主要城市发生的情况缺乏信息:
-
Pro-guns:
Fake_News_FUNCTION_1:从未+问题+枪支 -
Pro-guns:
Fake_News_FUNCTION_3:我+几年来持有步枪和枪支 -
Pro-guns:
Fake_News_FUNCTION_4:我的孩子们+有枪+从未伤害过任何东西
枪支管控的论点是诚实的,但它们表明在中西部大片安静地区发生了缺乏信息的情况:
-
枪支管制:
Fake_News_FUNCTION_2:一直听到+害怕+枪支 -
枪支管制:
Fake_News_FUNCTION_5:一直听到+枪声+我一生都听到 -
枪支管制:
Fake_News_FUNCTION_6:失去+很多+朋友
每个功能都可以被开发以通知另一方。
例如,让我们以伪代码的形式表达FUNCTION1:
Def FUNCTION1:
call FUNCTIONs 2+5+6 Keywords and simplify
Google search=afraid guns lost many friends gunshots
过程的目标是:
-
首先,运行转换模型来 解构和解释 消息。使用 NLP 转换器就像使用数学计算器一样。它可以产生良好的结果,但需要一个自由思考的人类大脑来解释它们!
-
然后,请一个经过训练的 NLP 人类用户更主动地、更好地搜索和阅读信息。
变换模型帮助用户更深入地理解信息;它们不会替用户思考!我们试图帮助用户,而不是讲课或洗脑他们!
需要解析来处理这些函数的结果。然而,如果我们有数百条社交媒体消息,我们可以自动让我们的程序完成整个工作。
链接将随着 Google 修改搜索而变化。然而,出现的第一个链接是有趣的,可以展示给持争议性枪支主张者看:
图 13.10:枪支和暴力
假设我们要用以下伪代码搜索支持枪支管制的人:
Def FUNCTION2:
call FUNCTIONs 1+3+4 Keywords and simplify
Google search=never problem guns for years kids never hurt anything
谷歌搜索未返回明确支持持争议性枪支主张者的积极结果。最有趣的是中立且教育性的:
图 13.11:枪支安全
你可以在亚马逊的书店、杂志和其他教育资料上进行自动搜索。
最重要的是,对持相反意见的人来说,能够交谈而不争吵是至关重要的。相互理解是发展双方共鸣的最佳方式。
有人可能会倾向于相信社交媒体公司。*我建议永远不要让第三方代表你的思维过程。*使用变换模型来解构信息,但保持主动!
在这个问题上达成共识可能是同意遵循持枪规则。例如,一个人可以选择要么不在家中拥有枪支,要么安全地将它们锁起来,这样孩子就无法接触到它们。
让我们继续讨论 COVID-19 和前总统特朗普的推文。
COVID-19 和前总统特朗普的推文
无论你的政治观点是什么,都有很多关于唐纳德·特朗普的言论以及对他的言论,需要一个专门的书来分析所有信息!这是一本技术,而不是政治书,所以我们将从科学的角度分析这些推文。
我们在本章的枪支管制部分描述了对假新闻的教育方法。我们不需要再次走过整个过程。
我们在我们的Fake_News.ipynb笔记本中的枪支管制部分,使用了 BERT 模型来实现和运行 AllenNLP 的 SRL 任务。
在本节中,我们将专注于假新闻的逻辑。我们将在 AllenNLP 的网站上运行 BERT 模型的 SRL 并可视化结果。
现在,让我们来看一些总统关于 COVID-19 的推文。
语义角色标注(SRL)
SRL 对我们所有人来说都是一个出色的教育工具。我们往往只是被动地阅读推文,听取他人对其的看法。用 SRL 来分解信息是发展社交媒体分析技能的好方法,以区分虚假信息和准确信息。
我建议在课堂上将 SRL transformers 用于教育目的。一个年轻的学生可以输入一条推特,并分析每个动词及其参数。这可以帮助年轻一代在社交媒体上成为积极的读者。
首先我们将分析一个相对一致的推特,然后是一个充满冲突的推特:
让我们分析一下在写这本书时发现的最新推特。我去掉了“黑人美国人”的名字,并改写了前总统的部分文本:
X 是一个伟大的美国人,因感染冠状病毒已被送往医院,并要求祈祷。你今天会和我一起为他祈祷,以及所有正在受新冠肺炎病痛折磨的人吗?
让我们去 AllenNLP 的语义角色标注部分,运行句子,并查看结果。动词hospitalized显示成员对事实保持接近:
图 13.12:动词“hospitalized”的 SRL 参数
这条信息很简单:X + hospitalized + with coronavirus。
动词requested表明信息变得政治化:
图 13.13:动词“requested”的 SRL 参数
我们不知道是这个人要求前总统祈祷,还是决定他会成为请求的中心。
一个很好的练习是展示一个 HTML 页面,然后问用户他们的看法。例如,可以要求用户查看 SRL 任务的结果,并回答以下两个问题:
前总统特朗普是被要求祈祷,还是因政治原因偏离了向他人提出的请求?
前总统特朗普称自己间接被要求为 X 祈祷是假新闻吗?
你可以思考一下,然后自己决定!
让我们看一个被推特禁止的情况。我去掉了名字,并改写了它并放低了语气。然而,当我们在 AllenNLP 上运行它并可视化结果时,我们得到一些令人惊讶的 SRL 输出。
这是缓和并改写的推特:
这些暴徒正在玷污 X 的记忆。
当抢劫开始时,必须采取行动。
尽管我删除了原始推特的主要部分,但我们可以看到 SRL 任务显示了推特中的糟糕联想:
图 13.14:动词“dishonoring”的 SRL 参数
对此的教育性方法应该是解释我们不应该将“暴徒”和“记忆”以及“抢劫”联系起来。它们根本不相符。
问一个用户为什么 SRL 参数不匹配会是一个重要的练习。
我建议进行许多这样的练习,以便 transformer 模型的用户们培养 SRL 技能,对他们所呈现的任何话题持批判性观点。
批判性思维是阻止假新闻传播的最佳方法!
我们已经通过Transformers、启发式和指导性网站讨论了假新闻的理性方法。然而,在最后,假新闻辩论中的很多热情归结为情绪化和非理性的反应。
在一个意见纷呈的世界中,你永远不会找到一个完全客观的Transformers模型来检测假新闻,因为对立的双方从一开始就无法就真相达成一致意见!一方会同意Transformers模型的输出。另一方会说这个模型是有偏见的,是由他们意见的敌人建造的!
最好的方法是倾听他人的意见并保持冷静!
在我们离开之前
本章更注重将Transformers应用于问题,而不是找到一个不存在的银弹Transformers模型。
你有两个主要选择来解决 NLP 问题:找到新的Transformers模型或者创建可靠、耐用的方法来实施Transformers模型。
我们现在将结束本章,转而解释Transformers模型。
总结
假新闻始于我们作为人类的情感历史的深处。当事件发生时,情绪接管以帮助我们迅速对情况做出反应。当我们受到威胁时,我们本能地做出强烈反应。
假新闻引发了强烈的反应。我们担心这些新闻可能会暂时或永久地损害我们的生活。我们中许多人相信气候变化可能会从地球上根除人类生命。还有人认为,如果我们对气候变化反应过激,我们可能会摧毁我们的经济并使社会崩溃。我们中一些人认为枪支是危险的。其他人提醒我们,美国宪法第二修正案赋予我们在美国拥有枪支的权利。
我们经历了关于 COVID-19、前总统特朗普和气候变化的其他激烈冲突。在每种情况下,我们看到情绪反应是最快形成冲突的。
然后,我们设计了一个路线图,将假新闻的情感感知提升到理性水平。我们使用一些Transformers NLP 任务来展示,在 Twitter、Facebook 消息和其他媒体中找到关键信息是可能的。
我们利用一些人认为是真实新闻,而另一些人认为是假新闻的新闻来为老师、父母、朋友、同事或者只是交谈的人们创造了一个理性。我们添加了经典的软件功能来帮助我们一路前行。
此时,你手头有一套Transformers模型、NLP 任务和样本数据集的工具箱。
你可以利用人工智能造福人类。将这些Transformers工具和思想付诸实施,使世界成为一个更好的地方,这取决于你。
了解Transformers的一个好方法是可视化它们的内部过程。我们将在下一章中分析Transformers如何逐渐构建序列的表示,解释黑匣子Transformers模型。
问题
-
标记为假新闻的新闻总是假的。(真/假)
-
所有人都同意的新闻总是准确的。(是/否)
-
Transformers可以用于对推文进行情感分析。(是/否)
-
可以通过运行 DistilBERT 模型的 NER 从 Facebook 消息中提取关键实体。(是/否)
-
关键动词可以通过运行基于 BERT 模型的 SRL 的 YouTube 聊天来识别。(是/否)
-
情感反应是对虚假新闻的自然第一反应。(是/否)
-
对虚假新闻的理性处理可以帮助澄清一个人的立场。(是/否)
-
将Transformers与可靠网站连接可以帮助某人理解为什么一些新闻是虚假的。(是/否)
-
Transformers可以总结可靠网站的内容,帮助我们理解一些被标记为虚假新闻的话题。(是/否)
-
如果你为了我们所有人的利益使用人工智能,你可以改变世界。(是/否)
参考资料
-
丹尼尔·卡尼曼,2013 年,思考,快与慢
-
拥抱面孔管道:
huggingface.co/transformers/main_classes/pipelines.html -
Allen 人工智能研究所:
allennlp.org/
加入我们书籍的 Discord 空间
加入该书的 Discord 工作空间,与作者进行每月的问我任何事会话:
第十四章:解释黑匣子Transformers模型
百万到十亿参数的Transformers模型看起来像是无法解释的巨大黑匣子。 因此,当处理这些令人震惊的模型时,许多开发者和用户有时会感到沮丧。 然而,最近的研究已经开始用创新的前沿工具解决了这个问题。
描述所有可解释的 AI 方法和算法超出了本书的范围。 因此,本章将专注于提供给Transformers模型开发者和用户洞察力的即用型视觉界面。
本章首先通过安装和运行Jesse Vig的BertViz来开始。 Jesse 在构建显示 BERT Transformers模型中注意力头活动的可视界面方面做得相当出色。 BertViz 与 BERT 模型交互,并提供了一个设计良好的交互界面。
我们将继续专注于使用语言可解释工具(LIT)来可视化Transformers模型的活动。 LIT 是一个非侵入性工具,可以使用 PCA 或 UMAP 来表示Transformers模型的预测。 我们将介绍 PCA 并使用 UMAP。
最后,我们将使用字典学习可视化Transformers穿越 BERT 模型层的旅程。 局部可解释的模型不可知解释(LIME)提供了可视化Transformers学习如何理解语言的实用函数。 该方法显示Transformers通常首先学习一个词,然后学习句子上下文中的词,最后是长距离依赖关系。
在本章结束时,您将能够与用户交互,以展示Transformers模型的活动可视化。 BertViz,LIT 和通过字典学习进行的可视化仍有很长的路要走。 然而,这些新生工具将帮助开发者和用户理解Transformers模型的工作方式。
本章涵盖以下主题:
-
安装和运行 BertViz
-
运行 BertViz 的交互界面
-
探究和非侵入性方法的区别
-
主成分分析(PCA)提醒
-
运行 LIT 分析Transformers输出
-
介绍 LIME
-
通过字典学习运行Transformers可视化
-
单词级多义消歧
-
可视化低级,中级和高级依赖性
-
可视化关键Transformers因素
我们的第一步将从安装和使用 BertViz 开始。
使用 BertViz 进行Transformers可视化
Jesse Vig的文章,Transformers模型中注意力的多尺度可视化,2019 年,认识到了Transformers模型的有效性。 但是,Jesse Vig解释了解密注意力机制是具有挑战性的。 该论文描述了 BertViz 的过程,即可视化工具。
BertViz 可以可视化注意力头活动并解释Transformers模型的行为。
BertViz 最初是为了可视化 BERT 和 GPT-3 模型而设计的。 在本节中,我们将可视化 BERT 模型的活动。
现在让我们安装并运行 BertViz。
运行 BertViz
可视化变形器注意头并与之交互只需五个步骤。
在 GitHub 仓库的Chapter14目录中打开BertViz.ipynb笔记本。
第一步是安装BertViz和必要的依赖。
步骤 1:安装 BertViz 并导入模块
笔记本安装了BertViz、Hugging Face transformers 和其他实现程序所需的基本要求:
!pip install bertViz
from bertViz import head_view, model_view
from transformers import BertTokenizer, BertModel
头视图和模型视图库现在已被导入。我们现在将加载 BERT 模型和分词器。
步骤 2:加载模型并检索注意力
BertViz 支持 BERT、GPT-2、RoBERTa 和其他模型。您可以在 GitHub 上查阅 BertViz 获取更多信息:github.com/jessevig/BertViz。
在本节中,我们将运行一个bert-base-uncased模型和一个预训练的分词器:
# Load model and retrieve attention
model_version = 'bert-base-uncased'
do_lower_case = True
model = BertModel.from_pretrained(model_version, output_attentions=True)
tokenizer = BertTokenizer.from_pretrained(model_version, do_lower_case=do_lower_case)
我们现在输入两个句子。您可以尝试不同的序列以分析模型的行为。sentence_b_start将在步骤 5:模型视图中必需:
sentence_a = "A lot of people like animals so they adopt cats"
sentence_b = "A lot of people like animals so they adopt dogs"
inputs = tokenizer.encode_plus(sentence_a, sentence_b, return_tensors='pt', add_special_tokens=True)
token_type_ids = inputs['token_type_ids']
input_ids = inputs['input_ids']
attention = model(input_ids, token_type_ids=token_type_ids)[-1]
sentence_b_start = token_type_ids[0].tolist().index(1)
input_id_list = input_ids[0].tolist() # Batch index 0
tokens = tokenizer.convert_ids_to_tokens(input_id_list)
就是这样!我们已经准备好与可视化界面进行交互。
步骤 3:头视图
我们只需添加一个最后一行来激活注意头的可视化:
head_view(attention, tokens)
第一层(layer 0)中的单词并非实际标记,但界面是教育性的。每一层的 12 个注意头以不同的颜色显示。默认视图设置为层 0,如图 14.1所示:
图 14.1:注意头的可视化
我们现在准备探索注意头。
步骤 4:处理和显示注意头
上面两列标记中的每种颜色表示该层编号的一个注意头。选择一个层编号并单击一个注意头(颜色)。
句子中的单词在注意中被分解成标记。然而,在本节中,单词tokens宽泛指words,以帮助我们了解变形器头是如何工作的。
我专注于图 14.2中的单词animals:
图 14.2:选择一个层、一个注意头和一个标记
BertViz显示模型在animals和几个单词之间建立了连接。这是正常的,因为我们只在层 0。
Layer 1 开始单独分离与之相关的单词animals,如图 14.3所示:
图 14.3:可视化第 1 层中注意头 11 的活动
注意头 11 在animals、people和adopt之间建立了一个连接。
如果我们点击cats,一些有趣的连接将显示在图 14.4中:
图 14.4:可视化猫与其他标记之间的连接
现在,单词cats与animals相关联。这种关联表明模型正在学习猫是动物。
您可以更改句子,然后单击图层和注意力头,以可视化Transformers如何建立连接。当然,您会发现限制。好的和坏的连接将向您展示Transformers的工作原理和失败情况。这两种情况对于解释Transformers的行为以及为什么它们需要更多层、参数和数据都是有价值的。
让我们看看 BertViz 如何显示模型视图。
步骤 5:模型视图
只需一行代码就可以获得一个带有 BertViz 的Transformers的模型视图:
model_view(attention, tokens, sentence_b_start)
BertViz 在一个视图中显示所有的层和头部,如 图 14.5 中所示:
图 14.5:BertViz 的模型视图模式
如果您单击其中一个头部,将获得一个带有单词对单词和句子对句子选项的头部视图。然后,您可以浏览注意力头,以查看Transformers模型在通过层时如何生成更好的表示。例如,图 14.6 显示了第一层中一个注意力头的活动:
图 14.6:模型较低层的注意力头活动
有时,表示会在分隔符 [SEP] 和单词之间建立连接,这并没有太多意义。但是,有时标记不会在每个层的每个注意力头中激活。此外,Transformers模型的训练水平限制了解释的质量。
无论如何,BertViz 仍然是一个有趣的教育工具和Transformers模型的可解释性工具。
现在让我们运行直观的 LIT 工具。
LIT
LIT 的可视化界面将帮助您找到模型处理不正确的示例,深入研究类似示例,查看在更改上下文时模型的行为以及与Transformers模型相关的更多语言问题。
LIT 不像 BertViz 那样显示注意力头的活动。然而,值得分析为什么事情出错了并尝试找到解决方案。
您可以选择均匀流形逼近与投影(UMAP)可视化或 PCA 投影仪表示。PCA 将在特定方向和幅度上进行更线性的投影。UMAP 将其投影分解为小型聚类。根据您分析模型输出的深入程度,这两种方法都是有意义的。您可以同时运行并获得相同模型和示例的不同视角。
本节将使用 PCA 运行 LIT。让我们从简要回顾 PCA 的工作原理开始。
PCA
PCA 将数据提升到更高的层次进行表示。
想象一下您在厨房里。您的厨房是一个 3D 笛卡尔坐标系。您厨房里的物体也都有特定的 x、y、z 坐标。
您想要烹饪一道菜,并将配料摆放在厨房桌上。您的厨房桌是您厨房里菜谱的较高级别表示。
厨房桌也在使用笛卡尔坐标系。但是当您提取厨房的主要特征以在厨房桌上表示菜谱时,您正在执行 PCA。这是因为您展示了一起适合制作特定菜谱的主要组件。
相同的表现可以应用于 NLP。例如,字典是一个词语列表。但是一起有意义的词语构成序列主成分的表示。
在 LIT 中序列的 PCA 表示将有助于可视化Transformers的输出。
获得 NLP PCA 表示的主要步骤是:
-
方差:数据集中一个词语的数值方差;其含义的频率和频率,例如。
-
协方差:多个单词的方差与数据集中另一个单词的相关性。
-
特征值和特征向量:要在笛卡尔系统中获得表示,我们需要协方差的向量和幅角表示。特征向量将提供向量的方向。特征值将提供它们的幅角。
-
派生数据:最后一步是通过将行特征向量乘以行数据来将特征向量应用于原始数据集:
-
要显示的数据 = 行特征向量 * 行数据
PCA 投影提供了清晰的数据点线性可视化以进行分析。
现在让我们运行 LIT。
运行 LIT
您可以在线运行 LIT 或在 Google Colaboratory 笔记本中打开它。单击以下链接以访问两个选项:
教程页面包含几种类型的 NLP 任务进行分析:
在本节中,我们将在线运行 LIT 并探索情感分析分类器:
单击自己探索这个演示,您将进入直观的 LIT 接口。Transformers模型是一个小型Transformers模型:
图 14.7:选择模型
您可以通过单击模型更改模型。您可以直接在 Hugging Face 提供的托管 API 页面上测试这种类型的模型和类似模型:
huggingface.co/sshleifer/tiny-distilbert-base-uncased-finetuned-sst-2-english
NLP 模型可能会根据 LIT 在线版本的后续更新而发生变化。概念保持不变,只是模型变化。
让我们从选择 PCA 投影仪和每个示例的二元0或1分类标签开始:
图 14.8:选择投影仪和标签类型
然后我们转到数据表,点击一个句子及其分类标签:
图 14.9:选择一句话
该算法是随机的,因此输出可能会在不同运行中有所变化。
在数据点编辑器中也会出现这个句子:
图 14.10:数据点编辑器
数据点编辑器允许您改变句子的上下文。例如,您可能想要找出为什么一个反事实的分类本应属于一个类别,但最终属于另一个类别。您可以改变句子的上下文,直到它出现在正确的类别中,以了解模型的工作原理及为何出现错误。
这个句子将与它的分类一起出现在 PCA 投影仪中:
图 14.11:正向聚类中的 PCA 投影仪
您可以在 PCA 投影仪中点击数据点,所选句子将出现在数据点编辑器中。这样,您可以比较结果。
LIT 包含许多您可以探索和使用的交互功能。
LIT 中得到的结果并不总是令人信服。然而,在许多情况下,LIT 提供了有价值的见解。同时,参与这些新兴的工具和技术是至关重要的。
现在让我们通过词典学习来可视化Transformers层。
通过词典学习的Transformers可视化
通过词典学习的Transformers可视化是基于Transformers因子的。
Transformers因子
Transformers因子是包含上下文单词的嵌入向量。一个没有上下文的单词可以有许多意义,从而产生多义问题。例如,单词separate可以是动词或形容词。此外,separate还可以意味着断开、区分、分散,以及许多其他定义。
Yun等人在 2021 年创造了一个包含上下文单词的嵌入向量。单词的嵌入向量可以由单词因子的稀疏线性表示构建。例如,根据数据集中句子的上下文,separate可以被表示为:
`separate=0.3" keep apart"+"0.3" distinct"+ 0.1 "discriminate"+0.1 "sever" + 0.1 "disperse"+0.1 "scatter"`
为了确保线性表示保持稀疏,我们不添加会创建大量 0 值矩阵的 0 因子。因此,我们不包括无用的信息,比如:
`separate= 0.0"putting together"+".0" "identical"`
整个关键是通过强制因子的系数大于 0 来保持表示的稀疏性。
每个单词的隐藏状态在每一层中都被检索出来。由于每一层在理解数据集中句子中单词的表示方面都有所进展,潜在的依赖关系逐渐增加。这种稀疏线性叠加的Transformers因子变成了一个带有稀疏系数向量的词典矩阵,我们可以将其总结为:
在其中:
-
(phi)是词典矩阵。
-
是待推断的稀疏系数向量
Yun等人在 2021 年补充说,,添加高斯噪声样本以强制算法搜索更深层的表示。
同样,为了确保表示保持稀疏,方程必须写成,使得(such that)。
作者将X指代为层的隐藏状态集合,将x指代为属于X的变换因子的稀疏线性叠加。
他们将自己稀疏字典学习模型总结为:
在词典矩阵中,:,c 指的是词典矩阵的一列,其中包含一个变换因子。
:,c 分为三个级别:
-
低级变换因子用于通过词级消歧解决多义问题
-
中级变换因子将我们进一步带入句子级模式,这将为低级模式带来重要的上下文。
-
高级变换模式帮助理解长程依赖关系
该方法是创新的、令人兴奋的,看起来效率很高。然而,目前还没有可视化功能。因此,Yun等人于 2021 年为 LIME 创造了必要的信息,这是一种标准的可解释人工智能方法,可以用于可视化他们的发现。
交互式变换器可视化页面基于 LIME 进行输出。以下部分是对 LIME 的简要介绍。
介绍 LIME
LIME代表局部可解释的模型-不可知解释。这一可解释的人工智能方法的名称说明了它的特点。它是模型不可知的。因此,我们可以立即得出有关通过词典学习进行变换器可视化方法的结论:
-
该方法不会深入研究变换器层的矩阵、权重和矩阵乘法。
-
该方法不会解释变换器模型的工作原理,就像我们在第二章中所做的那样,开始使用变换器模型的架构。
-
在本章中,该方法窥视了由变换因子的稀疏线性叠加提供的数学输出。
LIME 并不试图解析数据集中的所有信息。相反,LIME 通过检查预测周围的特征来判断模型是否局部可靠。
LIME 不适用于全局模型。它专注于预测的局部环境。
这在处理自然语言处理时尤为有效,因为 LIME 探索了一个词的上下文,为模型的输出提供了宝贵的信息。
在通过词典学习进行可视化时,一个实例x可以表示为:
此实例的可解释表示是一个二进制向量:
目标是确定特征或多个特征的局部存在或缺失。在 NLP 中,这些特征是可以重建为单词的令牌。
对于 LIME 来说,g代表一个Transformers模型或任何其他机器学习模型。G代表一组包含g在内的Transformers模型,以及其他模型:
因此,LIME 的算法可以应用于任何Transformers模型。
在这一点上,我们知道:
-
LIME 以一个词为目标,并搜索其他词的局部上下文
-
因此,LIME 提供了一个词的局部上下文,以解释为什么会预测这个词,而不是其他词
探索 LIME 等可解释 AI 并不在这本关于 NLP 的Transformers书籍的范围内。不过,有关 LIME 的更多信息,请参见参考部分。
现在让我们看看 LIME 是如何将自己融入通过字典学习的Transformers可视化方法中的。
现在让我们探索可视化界面。
可视化界面
访问以下网站以访问交互式的Transformers可视化页面:transformervis.github.io/transformervis/。
可视化界面提供了直观的说明,只需点击一次即可开始分析特定层的Transformers因素,如图 14.12所示:
图 14.12:选择一个Transformers因素
一旦选择了一个因素,您可以点击您想要为这个因素可视化的层:
图 14.13:每层的函数可视化
第一个可视化展示了按层激活因素的情况:
图 14.14:每层因素的重要性
因素421着眼于separate的词汇领域,正如下层所示:
图 14.15:在下层中对“separate”的表示
随着我们可视化更高的层级,会出现更长范围的表示。因素421从separate的表示开始。但在更高的层次上,Transformers开始形成对因素的更深层次的理解,并将separate与distinct相关联,如图 14.16所示:
图 14.16:Transformers要素的高层表示
尝试使用几个Transformers因素来可视化,以便逐层扩展他们对语言的理解和感知。
您会发现许多好例子,也会发现很多糟糕的结果。专注于好例子,以了解Transformers如何通过语言学习的方式。利用糟糕的结果来理解它为什么会犯错误。此外,可视化界面所使用的Transformers模型并非最强大或经过充分训练的模型。
无论如何,参与其中并保持对这个不断发展的领域的关注!
例如,您可以探索 Understanding_GPT_2_models_with_Ecco.ipynb,这是本章的 GitHub 存储库中的内容。它演示了Transformers在选择标记之前如何生成候选项。这是不言自明的。
在本节中,我们看到了Transformers如何逐层学习单词的含义。一个Transformers在做出选择之前会生成候选项。正如笔记本所示,Transformers模型是随机的,因此会在几个最高概率中进行选择。考虑以下句子:
"The sun rises in the_____."
您会选择什么词放在句子的结尾?我们都会犹豫。这也是Transformers所做的!
在这种情况下,GPT-2 模型选择了sky这个词:
图 14.17:完成一个序列
但是 GPT-2 模型可能会在另一次运行中选择其他候选项,就像图 14.18中显示的:
图 14.18:其他的完成候选项
我们可以看到sky出现在第一名。但morning也出现在第二名,并且也可以合适。如果我们多次运行模型,可能会得到不同的输出,因为模型是随机的。
看起来 AI 和Transformers的领域已经完备了。
然而,在我们继续之前,让我们看看为什么人们在这个领域仍然有很多工作要做。
探索我们无法访问的模型
本章探讨的可视化界面非常引人入胜。但仍然有很多工作要做!
例如,OpenAI 的 GPT-3 模型可以在线运行或通过 API 运行。因此,我们无法访问一些软件即服务(SaaS)Transformers模型的权重。这种趋势将在未来数年内增加和扩展。那些花费数百万美元用于研究和计算机动力的公司更倾向于提供按需付费的服务,而不是开源应用程序。
即使我们能够访问 GPT-3 模型的源代码或输出权重,使用可视化界面来分析 9,216 个注意力头(96 层 x 96 头)也将是相当具有挑战性的。
在很多情况下,寻找错误仍然需要一些人的参与。
例如,在英语到法语翻译中,coach这个词的多义性经常会造成问题。在英语中,coach 可以是一个训练别人的人,也可以是一辆公共汽车。法语中也有coach这个词,但它只适用于一个训练别人的人。
如果您去 OpenAI AI GPT-3 游乐场,openai.com/,并翻译含有coach这个词的句子,您可能会得到混合的结果。
句子 1 被 OpenAI 引擎正确翻译了:
English: The coach broke down, and everybody complained.
French: Le bus a eu un problème et tout le monde s'est plaint.
coach被翻译成了巴士,这是正确的。但需要更多的语境。
输出是随机的,所以翻译可能一次正确,下一次错误。
然而,第二句被误译了:
English: The coach was dissatisfied with the team and everybody complained.
French: Le bus était insatisfait du équipe et tout le monde s'est plaint.
这一次,GPT-3 引擎错过了coach指的是一个人,而不是一辆公共汽车的事实。相同的随机运行将提供不稳定的输出。
如果我们通过添加上下文来修改句子 2,我们将获得正确的翻译:
English: The coach of the football team was dissatisfied and everybody complained.
French: Le coach de l'équipe de football était insatisfait et tout le monde s'est plaint.
现在翻译中包含了法语单词coach,表示与本句英语单词coach相同的含义。添加了更多上下文。
OpenAI 的解决方案,AI 总体上,尤其是Transformers模型,都在不断进步。此外,大多数工业 4.0 的 AI 驱动微决策不需要如此复杂的 NLP 或翻译任务,并且非常有效。
但是,在 Cloud AI API 级别的人为干预和发展仍然需要相当长的时间!
总结
Transformers模型被训练来解决词级别的一词多义消歧
低层、中层和高层的依赖关系。通过连接训练百万到万亿参数模型来实现这一过程。解释这些巨型模型的任务似乎令人生畏。然而,一些工具正在涌现。
我们首先安装了BertViz。我们学会了如何使用交互式界面解释注意头的计算。我们看到了每一层的单词是如何与其他单词互动的。
本章继续定义了探查任务和非探查任务的范围。诸如 NER 之类的探查任务提供了有关Transformers模型如何表示语言的见解。然而,非探查方法分析模型如何做出预测。例如,LIT 将 PCA 项目和 UMAP 表示插入 BERT Transformers模型的输出中。然后,我们可以分析输出的集群以查看它们如何组合在一起。
最后,我们通过词典学习运行了Transformers可视化。用户可以选择一个Transformers因子来分析并可视化其在Transformers的低层到高层的表示演变。该因子将逐渐从一词多义的消歧到句子上下文分析,最终到长期依赖。
本章的工具将随着其他技术的发展而不断发展。然而,本章的关键重点是Transformers模型的活动可以以用户友好的方式进行可视化和解释。在下一章中,我们将发现新的Transformers模型。我们还将通过风险管理方法选择Transformers模型项目的最佳实现。
问题
-
BertViz 只显示了 BERT 模型最后一层的输出。(真/假)
-
BertViz 显示了 BERT 模型每一层的注意头。(真/假)
-
BertViz 展示了标记之间的关系。(真/假)
-
LIT 显示了类似 BertViz 的注意头的内部工作。(真/假)
-
探查是算法预测语言表示的一种方式。(真/假)
-
NER 是一个探查任务。(真/假)
-
PCA 和 UMAP 都不是探查任务。(真/假)
-
LIME 是与模型无关的。(真/假)
-
Transformers 通过逐层深化令牌之间的关系。(True/False)
-
视觉 Transformer 模型解释为可解释的人工智能增添了一个新的维度。(True/False)
参考资料
-
BertViz:Jesse Vig,2019,Transformer 模型中的注意力的多尺度可视化,2019,
aclanthology.org/P19-3007.pdf -
BertViz:
github.com/jessevig/BertViz -
LIT,情感分析表示的解释:
pair-code.github.io/lit/tutorials/sentiment/ -
通过字典学习进行 Transformer 可视化:Zeyu Yun,Yubei Chen,Bruno A Olshausen,Yann LeCun,2021,通过字典学习进行 Transformer 可视化:上下文嵌入作为 Transformer 因子的线性叠加,
arxiv.org/abs/2103.15949 -
通过字典学习的 Transformer 可视化:
transformervis.github.io/transformervis/
加入我们书籍的 Discord 空间
加入本书的 Discord 工作空间,与作者进行每月的问我任何事会话:
第十五章:从 NLP 到任务不可知的Transformers模型
到目前为止,我们已经检查了原始Transformers模型的变体,具有编码器和解码器层,以及具有仅编码器或仅解码器层的其他模型。此外,层和参数的大小已经增加。然而,Transformers的基本结构保留了其原始结构,具有相同的层和注意头的计算并行化。
在本章中,我们将探索尊重原始Transformers基本结构但进行了一些重大变化的创新Transformers模型。许多Transformers模型会出现,就像一个乐高^© 件盒给出的许多可能性一样。你可以以数百种方式组装这些部件!Transformers模型子层和层是先进 AI 的乐高^© 部件。
我们将从众多提供中选择哪个Transformers模型,并选择我们将实施它们的生态系统开始。
然后,我们将发现 Reformer 模型中的局部敏感哈希(LSH)桶和分块技术。然后我们将了解 DeBERTa 模型中解耦关注的含义。DeBERTa 还介绍了一种在解码器中管理位置的替代方法。DeBERTA 的高功率Transformers模型超越了人类基线。
我们的最后一步将是发现像 Vit、CLIP 和 DALL-E 这样的强大的计算机视觉Transformers。我们可以将 CLIP 和 DALL-E 添加到 OpenAI GPT-3 和 Google BERT(由 Google 训练)这个非常小的基础模型组中。
这些强大的基础模型证明了Transformers是任务不可知的。Transformers学习序列。这些序列包括视觉、声音以及任何以序列表示的数据类型。
图像包含类似语言的数据序列。我们将运行 ViT、CLIP 和 DALL-E 模型进行学习。我们将把视觉模型提升到创新水平。
在本章结束时,你将看到任务不可知Transformers的世界已经演变成了一个充满想象力和创造力的宇宙。
本章涵盖以下主题:
-
选择Transformers模型
-
Reforme Transformers模型
-
局部敏感哈希(LSH)
-
桶和分块技术
-
DeBERTA Transformers模型
-
解耦关注
-
绝对位置
-
具有 CLIP 的文本图像视觉Transformers
-
DALL-E,一个创意文本图像视觉Transformers
我们的第一步将是看看如何选择一个模型和一个生态系统。
选择一个模型和一个生态系统
我们认为通过下载转换器模型进行测试将需要机器和人力资源。而且,你可能会认为如果一个平台到这个时候还没有在线沙盒,那么进一步进行测试就会有风险,因为测试几个示例的工作量。
然而,像 Hugging Face 这样的网站会在实时自动下载预训练模型,正如我们将在The Reformer和DeBERTa部分看到的那样!那么我们该怎么办?由于这个,我们可以在 Google Colab 上运行 Hugging Face 模型,而不需要在本机上安装任何东西。我们还可以在线测试 Hugging Face 模型。
思路是分析而无需任何“安装”。在 2022 年,“无需安装”可能意味着:
-
在线运行一个Transformers任务
-
在预安装的 Google Colaboratory 虚拟机上运行一个Transformers,它可以无缝地下载一个预训练模型以完成任务,我们可以用几行代码来运行。
-
通过 API 运行一个Transformers
“安装”的定义在过去几年已经扩展了。 “在线”的定义也已经扩大。我们可以考虑使用几行代码来运行一个 API 作为元在线测试。
在本节中,我们将广义上谈到“无需安装”和“在线”。图 15.1显示了我们应该如何“在线”测试模型:
图 15.1:在线测试Transformers模型
正如下面展示的,这十年的测试变得灵活和高效:
-
Hugging Face 托管诸如 DeBERTa 和其他一些模型等 API 模型。此外,Hugging Face 还提供 AutoML 服务,用于在其生态系统中训练和部署Transformers模型。
-
OpenAI 的 GPT-3 引擎在在线游乐场上运行并提供 API。OpenAI 提供涵盖许多 NLP 任务的模型。这些模型无需训练。 GPT-3 的十亿参数零射引擎令人印象深刻。它显示出参数多的Transformers模型整体产生更好的结果。Microsoft Azure、Google Cloud AI、AllenNLP 和其他平台提供有趣的服务。
-
如果值得的话,可以通过阅读一篇论文来进行在线模型分析。Google 的Fedus等人在 2021 年的一篇关于Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity的论文是一个很好的例子。Google 增加了我们在第八章中研究的基于 T5 的模型的规模,即应用于法律和金融文件的 AI 文本摘要。这篇论文证实了像 GTP-3 这样的大型在线模型的策略。
然而,最终,选择一种解决方案的风险还是在你自己。在选择一种解决方案后,你花在探索平台和模型上的时间将有助于你优化项目的实施。
可以通过三种不同的方式托管你的选择,如图 15.2所示:
-
使用 API 在本地机器上。OpenAI、Google Cloud AI、Microsoft Azure AI、Hugging Face 和其他提供了良好的 API。一个应用程序可以在本地机器上而不是在云平台上,但可以通过 API 经过云服务。
-
在像亚马逊网络服务(AWS)或 Google Cloud 这样的云平台上。您可以在这些平台上训练、微调、测试和运行模型。在这种情况下,没有应用在本地机器上。一切都在云上。
-
可以从任何地方使用 API!在本地机器上,数据中心虚拟机上,或从任何地方。这意味着 API 将集成在一个物理系统中,比如风车、飞机、火箭或自动驾驶车辆。因此,系统可以通过 API 与另一个系统永久连接。
图 15.2: 为您的模型实现选项
最后,决定权在你手中。花点时间。测试、分析、计算成本,并团队合作听取不同的观点。你对转换器的工作方式了解得越多,你做出的选择就会越好。
现在让我们来探索改革者,这是原始转换器模型的一个变种。
改革者
Kitaev等人(2020 年)设计改革者来解决注意力和内存问题,为原始转换器模型添加功能。
改革者首先用局部敏感哈希(LSH)桶和分块来解决注意力问题。
LSH 在数据集中搜索最近的邻居。哈希函数确定如果数据点q接近p,那么hash(q) == hash(p)。在这种情况下,数据点是Transformers模型头的键。
LSH 函数将键转换为 LSH 桶(图 15.3 中的B1到B4),这个过程称为 LSH 分桶,就像我们将彼此相似的对象放在同一个排序的桶中一样。
排序的桶被分成块(图 15.3 中的C1到C4)进行并行化。最后,注意力仅在其块内和前一个块中的相同桶中应用:
图 15.3: LSH 注意力头
LSH 分桶和分块将复杂度从O(L²),即关注所有词对,减少到O(LlogL),即仅关注每个桶的内容。
改革者还解决了重新计算每一层输入而不是存储多层模型信息的内存问题。重新计算是按需实现的,而不是为一些大型多层模型消耗的千字节内存。
我们现在将使用在Fyodor Dostoevsky的*《罪与罚》*英文翻译上训练的一个改革者模型。
运行一个例子
让我们直接在托管的推理 API 上在线运行它。输入句子是:
这个学生贫困潦倒,不知所措。
在在线接口的链接中包含输入:
托管推理 API 与输入句子一起显示。点击计算以获得推理,结果将直接显示在输入下方:
图 15.4:Reformer 的托管推理 API
由于算法是随机的,您可能会得到不同的响应。Reformer 经过了合理的训练,尽管没有像 OpenAI 的 GPT-3 那样拥有数十亿位信息的超级计算机。Reformer 的结果并不令人印象深刻。它需要更多的训练和微调才能获得更好的结果。
OpenAI 的 GPT-3 引擎对文本完成产生了以下结果:
学生生活贫困,不知所措。他找不到可以求助的人,也找不到住的地方。他从包里拿出一个记事本开始写。他写道:
“我的名字叫 XXXXXXXXXX。我是 XXXXXXX 的学生。我没有家人,没有朋友,没有钱。”
结果更具说服力。注册后,您可以访问 OpenAI 的游乐场:openai.com/
注意:OpenAI GPT-3,与其他Transformers模型和大多数深度学习模型一样,基于随机算法。结果可能会有所不同。
这表明,包含数十亿参数的高度训练有素的Transformers模型可以胜过一种创新的Transformers模型架构。
超级计算机驱动的云 AI 平台是否会逐渐胜过本地尝试甚至功能较弱的云平台?在投资于一种解决方案之前,您需要通过原型解决这些问题。
注意:Transformers模型的随机性可能导致在运行这些模型时产生不同的结果。此外,在线平台不断变化其界面。我们需要接受并适应这一点。
DeBERTa 引入了另一种创新的架构,我们现在将对其进行探讨。
DeBERTa
通过分解还可以找到Transformers的另一种新方法。在 AI 中,分解允许您分离表示特征,使训练过程更加灵活。Pengcheng He,Xiaodong Liu,Jianfeng Gao和Weizhu Chen设计了 DeBERTa,这是Transformers的分解版本,并在一篇有趣的文章中描述了该模型:DeBERTa: Decoding-enhanced BERT with Disentangled Attention: arxiv.org/abs/2006.03654
DeBERTa 实现的两个主要思想是:
-
在Transformers模型中将内容和位置分离开来,分别训练这两个向量
-
在预训练过程中使用解码器中的绝对位置来预测屏蔽的标记
作者在 GitHub 上提供了代码:github.com/microsoft/DeBERTa
DeBERTa 超越了 SuperGLUE 排行榜上的人类基准:
图 15.5:DeBERTa 在 SuperGLUE 排行榜上的表现
在“让我们在 Hugging Face 的云平台上运行一个示例”之前,去除任何空格。
运行一个示例
要在 Hugging Face 的云平台上运行示例,请单击以下链接:
huggingface.co/cross-encoder/nli-deberta-base
托管推理 API 将显示一个示例和可能的类名称输出:
图 15.6:DeBERTa 的托管推理 API
可能的类名称是mobile,website,billing和account access。
结果很有趣。让我们将其与 GPT-3 关键词任务进行比较。首先,在openai.com/上注册一下
输入Text作为输入,并输入Keywords以要求引擎找到关键词:
文本:上周我升级了我的 iOS 版本,自那时起,每当我使用你们的应用时,我的手机就会过热。
关键词: app, overheating, phone
可能的关键词是app,overheating和phone。
我们已经学习了 DeBERTa 和 GPT-3 Transformers。现在我们将将Transformers扩展到视觉模型。
从任务无关模型到视觉Transformers
基础模型,正如我们在第一章“什么是Transformers?”中所看到的,具有两个独特而独特的属性:
-
涌现 - 符合基础模型标准的Transformers模型可以执行未经训练的任务。它们是在超级计算机上训练的大型模型。它们没有被训练来学习像许多其他模型那样的特定任务。基础模型学会了如何理解序列。
-
同质化 - 相同的模型可以在许多领域中使用相同的基本架构。基础模型可以通过数据比其他任何模型更快更好地学习新技能。
GPT-3 和 Google BERT(仅 Google 训练的 BERT 模型)是任务不可知的基础模型。这些任务不可知的模型直接引导到 ViT、CLIP 和 DALL-E 模型。Transformers有着奇特的序列分析能力。
Transformers模型的抽象程度导致多模态神经元:
- 多模态神经元可以处理可被标记为像素或图像片段的图像。然后它们可以在视觉Transformers中被处理为单词。一旦图像被编码,Transformers模型将标记视为任何单词标记,如图 15.7 所示:
图 15.7:图像可以编码为类似单词的标记
在本节中,我们将介绍以下内容:
-
ViT,将图像处理为单词片段的视觉Transformers
-
CLIP,将文本和图像编码的视觉Transformers
-
DALL-E,用文本构造图像的视觉Transformers
让我们开始探索 ViT,一个将图像处理为单词片段的视觉Transformers。
ViT - 视觉Transformers
Dosovitskiy等人(2021)在文章标题中总结了他们设计的视觉Transformers架构的精华:一张图片价值 16x16 个单词:大规模图像识别的Transformers。
图像可以转换为 16x16 单词的片段。
在查看代码之前,让我们先看一下 ViT 的架构。
ViT 的基本架构
视觉变换器可以将图像作为“单词”补丁来处理。在本节中,我们将按照三个步骤进行处理:
-
将图像拆分成补丁
-
补丁的线性投影
-
混合输入嵌入子层
第一步是将图像拆分成相同尺寸的补丁。
第一步:将图像拆分成补丁
图像被分割成n个补丁,如图 15.8 所示。只要所有补丁的尺寸相同(例如 16x16),就没有规定补丁数量的规定:
图 15.8:将图像拆分成补丁
相等尺寸的补丁现在代表我们序列的“单词”。如何处理这些补丁仍然是个问题。我们将看到每种视觉变换器都有自己的方法。
图像引用:本节和随后的几节中使用的猫的图像由DocChewbacca拍摄:www.flickr.com/photos/st3f4n/,于 2006 年。它属于 Flickr 免费许可证,creativecommons.org/licenses/by-sa/2.0/。有关更多详情,请查看 Flickr 上DocChewbacca的图片:www.flickr.com/photos/st3f4n/210383891
在这种情况下,对于 ViT,第 2 步是对展平的图像进行线性投影。
第二步:对展平的图像进行线性投影
第 1 步将图像转换为尺寸相等的补丁。补丁的动机是避免逐像素处理图像,但问题在于找到处理补丁的方法。
Google Research 团队决定设计一个由图像的展平图像的线性投影和通过分割图像获得的补丁组成的线性投影,如图 15.9 所示:
图 15.9:图像的线性投影
思路是获得一个类似单词的补丁序列。剩下的问题是嵌入展平图像序列。
第三步:混合输入嵌入子层
类似单词的图像序列可以适应变换器。问题在于它们仍然是图像!
Google Research 决定使用混合输入模型,如图 15.10 所示:
-
添加一个卷积网络以嵌入补丁的线性投影
-
添加位置编码以保留原始图像的结构
-
然后使用标准的原始 BERT 样式编码器处理嵌入的输入
图 15.10:混合输入子层和标准编码器
Google Research 找到了一种巧妙的方法将 NLP 变换器模型转换成视觉变换器。
现在,让我们在代码中实现一个 Hugging Face 视觉变换器示例。
代码中的视觉变换器
在本节中,我们将重点关注与视觉变换器特定体系结构相关的主要代码区域。
打开Vision_Transformers.ipynb,它位于本章的 GitHub 存储库中。
Google Colab VM 中包含许多预安装的软件包,如torch和torchvision。可以通过在笔记本的第一个单元格中取消注释该命令来显示它们:
#Uncomment the following command to display the list of pre-installed modules
#!pip list -v
然后前往笔记本的Vision Transformer(ViT)单元。该笔记本先安装了 Hugging Face transformers 并导入了必要的模块:
!pip install transformers
from transformers import ViTFeatureExtractor, ViTForImageClassification
from PIL import Image
import requests
注意:在撰写本书时,Hugging Face 警告我们,由于不断的演变,代码可能不稳定。但这不应阻止我们探索 ViT 模型。探索新领域正是前沿的所在!
然后我们从 COCO 数据集下载了一幅图像。如果你想进一步进行实验,可以在他们的网站上找到大量数据集:cocodataset.org/
让我们从 VAL2017 数据集中下载。按照 COCO 数据集网站的说明通过程序获取这些图像或在本地下载数据集。
VAL2017 包含了 5,000 张我们可以选择的图像,以测试这个 ViT 模型。你可以运行其中任何一张图像。
让我们用猫的图片测试笔记本。我们首先通过它们的 URL 检索猫的图片:
url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)
我们接下来要下载 Google 的特征提取器和分类模型:
feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')
该模型在 224 x 244 分辨率图像上进行训练,但在特征提取和分类时采用了 16 x 16 的块。笔记本运行模型并进行预测:
inputs = feature_extractor(images=image, return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
# model predicts one of the 1000 ImageNet classes
predicted_class_idx = logits.argmax(-1).item()
print("Predicted class:",predicted_class_idx,": ", model.config.id2label[predicted_class_idx])
输出为:
Predicted class: 285 : Egyptian cat
探索在预测后的代码,它提供了一些低层次的信息,其中包括:
-
model.config.id2label,会列出类的标签。这 1000 个标签类解释了为什么我们得到一个类而不是详细的文本描述:{0: 'tench, Tinca tinca',1: 'goldfish, Carassius auratus', 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias',3: 'tiger shark, Galeocerdo cuvieri',...,999: 'toilet tissue, toilet paper, bathroom tissue'} -
模型,该模型将显示从卷积输入子层开始的模型架构:(embeddings): ViTEmbeddings( (patch_embeddings): PatchEmbeddings( (projection): Conv2d(3, 768, kernel_size=(16, 16), stride=(16, 16)) )
在卷积输入嵌入子层之后,模型是一个类似 BERT 的编码器。
请花些时间探索这个创新的从 NLP 变换器到图像变换器的转变,迅速导向为一切都使用变换器。
现在,让我们了解另一个计算机视觉模型 CLIP。
CLIP
对比语言-图像预训练(CLIP)遵循了变换器的理念。它在其变换器类型的层中插入数据序列。这次,模型发送的是文本-图像对,而不是文本对。一旦数据被分词、编码和嵌入,CLIP,一个无关任务的模型,就像处理任何其他数据序列一样学习文本-图像对。
这种方法是对比的,因为它寻找图像特征中的对比。这是我们在一些杂志游戏中使用的方法,在这些游戏中,我们必须找到两幅图像之间的差异,对比。
让我们先看一下 CLIP 的架构,然后再看代码。
CLIP 的基本架构
对比:图像通过它们的差异和相似之处学习如何相互配合。通过(联合文本,图像)预训练,图像和字幕找到彼此的路径。预训练后,CLIP 学习新任务。
CLIP 是可转移的,因为它们可以学习新的视觉概念,就像 GPT 模型一样,比如视频序列中的动作识别。字幕带来了无尽的应用。
ViT 将图像分割成类似单词的补丁。CLIP 联合训练文本和图像编码器以最大化余弦相似度,如图 15.11所示:
图 15.11:联合训练文本和图像
图 15.11显示了Transformers将为文本输入运行标准Transformers编码器。它将在Transformers结构中为图像运行一个 ResNet 50 层 CNN。 ResNet 50 被修改为在具有多头 QKV 注意头的注意力池化机制中运行平均池化层。
让我们看看 CLIP 是如何学习文本-图像序列以进行预测的。
代码中的 CLIP
打开 GitHub 上本章的存储库中的Vision_Transformers.ipynb。然后转到笔记本的CLIP单元格。
该程序开始安装 PyTorch 和 CLIP:
!pip install ftfy regex tqdm
!pip install git+https://github.com/openai/CLIP.git
该程序还导入模块和 CIFAR-100 来访问图像:
import os
import clip
import torch
from torchvision.datasets import CIFAR100
有 10,000 张图像可用,索引介于 0 和 9,999 之间。下一步是选择我们要进行预测的图像:
图 15.12:选择一个图像索引
程序然后将模型加载到可用的设备上(GPU 或 CPU):
# Load the model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device)
图像已下载:
# Download the dataset
cifar100 = CIFAR100(root=os.path.expanduser("~/.cache"), download=True, train=False)
输入已准备好:
# Prepare the inputs
image, class_id = cifar100[index]
image_input = preprocess(image).unsqueeze(0).to(device)
text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in cifar100.classes]).to(device)
在运行预测之前,让我们可视化所选的输入:
import matplotlib.pyplot as plt
from torchvision import transforms
plt.imshow(image)
输出显示索引 15是一只狮子:
图 15.13:索引 15 的图像
本节中的图像来自于从小图像中学习多层特征,Alex Krizhevsky,2009 年:www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf。它们是CIFAR-10和CIFAR-100数据集的一部分(toronto.edu):www.cs.toronto.edu/~kriz/cifar.html
我们知道这是一只狮子,因为我们是人类。一个最初设计用于自然语言处理的Transformers必须学习图像是什么。现在我们将看到它能多好地识别图像。
在计算特征时,程序表明正在运行一个联合Transformers模型,将图像输入与文本输入分开:
# Calculate features
with torch.no_grad():
image_features = model.encode_image(image_input)
text_features = model.encode_text(text_inputs)
现在 CLIP 进行预测并显示前五个预测:
# Pick the top 5 most similar labels for the image
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
values, indices = similarity[0].topk(5)
# Print the result
print("\nTop predictions:\n")
for value, index in zip(values, indices):
print(f"{cifar100.classes[index]:>16s}: {100 * value.item():.2f}%")
如果您想获得更多或更少的预测结果,可以修改topk(5)。显示前五个预测:
Top predictions:
lion: 96.34%
tiger: 1.04%
camel: 0.28%
lawn_mower: 0.26%
leopard: 0.26%
CLIP 找到了狮子,这显示了Transformers架构的灵活性。
下一个单元格显示类别:
cifar100.classes
您可以浏览类别,看看只有一个标签的情况下,CLIP 的表现如何受限制。
[...,'kangaroo','keyboard','lamp','lawn_mower','leopard','lion',
'lizard', ...]
笔记本包含了其他几个单元格,描述了您可以探索的 CLIP 的架构和配置。
model 单元格特别有趣,因为您可以看到以类似于 ViT 模型的卷积嵌入开始,然后继续作为一个“标准”大小为 768 的Transformers,具有多头注意力的视觉编码器:
CLIP(
(visual): VisionTransformer(
(conv1): Conv2d(3, 768, kernel_size=(32, 32), stride=(32, 32), bias=False)
(ln_pre): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
(transformer): Transformer(
(resblocks): Sequential(
(0): ResidualAttentionBlock(
(attn): MultiheadAttention(
(out_proj): NonDynamicallyQuantizableLinear(in_features=768, out_features=768, bias=True)
)
(ln_1): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
(mlp): Sequential(
(c_fc): Linear(in_features=768, out_features=3072, bias=True)
(gelu): QuickGELU()
(c_proj): Linear(in_features=3072, out_features=768, bias=True)
)
(ln_2): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
)
model 单元格的另一个有趣之处是查看与图像编码器同时运行的大小为 512 的文本编码器:
(transformer): Transformer(
(resblocks): Sequential(
(0): ResidualAttentionBlock(
(attn): MultiheadAttention(
(out_proj): NonDynamicallyQuantizableLinear(in_features=512, out_features=512, bias=True)
)
(ln_1): LayerNorm((512,), eps=1e-05, elementwise_affine=True)
(mlp): Sequential(
(c_fc): Linear(in_features=512, out_features=2048, bias=True)
(gelu): QuickGELU()
(c_proj): Linear(in_features=2048, out_features=512, bias=True)
)
(ln_2): LayerNorm((512,), eps=1e-05, elementwise_affine=True)
)
浏览描述架构、配置和参数的单元格,了解 CLIP 如何表示数据。
我们展示了任务无关的Transformers模型将图像文本对处理为文本文本对。我们可以将任务无关模型应用于音乐文本、声音文本、音乐图像以及任何类型的数据对。
现在我们将探讨另一个任务无关的Transformers模型 DALL-E,它可以处理图像和文本。
DALL-E
与 CLIP 一样,DALL-E 是一个任务无关的模型。CLIP 处理文本图像对。DALL-E 分别处理文本和图像令牌。DALL-E 的输入是一个包含 1,280 个令牌的文本和图像的单一流。256 个令牌用于文本,1,024 个令牌用于图像。DALL-E 是一个像 CLIP 一样的基础模型。
DALL-E 的命名来源于 萨尔瓦多·达利 和 Pixar 的 WALL-E。DALL-E 的使用方法是输入文本提示并生成图像。然而,DALL-E 必须先学会如何用文本生成图像。
DALL-E 是 GPT-3 的 120 亿参数版本。
该Transformers使用文本-图像对数据集从文本描述生成图像。
DALL-E 的基本架构
与 CLIP 不同,DALL-E 将最多 256 个 BPE 编码的文本令牌与 32×32 = 1,024 个图像令牌连接起来,如 图 15.14 所示:
图 15.14:DALL-E 将文本和图像输入连接起来
图 15.14 显示,这一次我们的猫图像与输入文本连接在一起。
DALL-E 有一个编码器和一个解码器堆栈,其构建了将卷积功能注入到Transformers模型中的混合架构。
让我们窥探一下代码,看看模型是如何工作的。
代码中的 DALL-E
在本节中,我们将看到 DALL-E 如何重构图像。
打开 Vision_Transformers.ipynb。然后转到笔记本的 DALL-E 单元格。笔记本首先安装 OpenAI DALL-E:
!pip install DALL-E
笔记本下载图像并处理图像:
import io
import os, sys
import requests
import PIL
import torch
import torchvision.transforms as T
import torchvision.transforms.functional as TF
from dall_e import map_pixels, unmap_pixels, load_model
from IPython.display import display, display_markdown
target_image_size = 256
def download_image(url):
resp = requests.get(url)
resp.raise_for_status()
return PIL.Image.open(io.BytesIO(resp.content))
def preprocess(img):
s = min(img.size)
if s < target_image_size:
raise ValueError(f'min dim for image {s} < {target_image_size}')
r = target_image_size / s
s = (round(r * img.size[1]), round(r * img.size[0]))
img = TF.resize(img, s, interpolation=PIL.Image.LANCZOS)
img = TF.center_crop(img, output_size=2 * [target_image_size])
img = torch.unsqueeze(T.ToTensor()(img), 0)
return map_pixels(img)
程序现在加载 OpenAI DALL-E 编码器和解码器:
# This can be changed to a GPU, e.g. 'cuda:0'.
dev = torch.device('cpu')
# For faster load times, download these files locally and use the local paths instead.
enc = load_model("https://cdn.openai.com/dall-e/encoder.pkl", dev)
dec = load_model("https://cdn.openai.com/dall-e/decoder.pkl", dev)
我添加了 enc 和 dec 单元格,以便您可以查看编码器和解码器块,了解这种混合模型的工作原理:Transformers模型中的卷积功能和文本与图像输入的连接。
本节中处理的图像是 mycat.jpg(作者:Denis Rothman,版权所有,需取得书面许可方可复制)。该图像位于本书存储库的 Chapter15 目录中。它已被下载并处理:
x=preprocess(download_image('https://github.com/Denis2054/AI_Educational/blob/master/mycat.jpg?raw=true'))
最后,我们显示原始图片:
display_markdown('Original image:')
display(T.ToPILImage(mode='RGB')(x[0]))
输出显示图像:
图 15.15:一张猫的图片
现在,程序处理并显示重建图像:
import torch.nn.functional as F
z_logits = enc(x)
z = torch.argmax(z_logits, axis=1)
z = F.one_hot(z, num_classes=enc.vocab_size).permute(0, 3, 1, 2).float()
x_stats = dec(z).float()
x_rec = unmap_pixels(torch.sigmoid(x_stats[:, :3]))
x_rec = T.ToPILImage(mode='RGB')(x_rec[0])
display_markdown('Reconstructed image:')
display(x_rec)
重建后的图像看起来与原始图像极为相似:
图 15.16:DALL-E 重建了猫的图像
结果令人印象深刻。DALL-E 学会了如何自动生成图像。
在书写本书时,完整的 DALL-E 源代码尚不可用,也许永远都不会。目前尚未上线 OpenAI 的 API,用于从文本提示生成图像。但请保持关注!
与此同时,我们可以继续在 OpenAI 上发现 DALL-E:openai.com/blog/dall-e/
一旦你打开页面,就滚动到提供的示例下面。例如,我选择了旧金山 Alamo Square 的照片作为提示:
图 15.17:旧金山 Alamo Square 的提示
然后我将“在晚上”修改为“在早晨”:
图 15.18:修改提示
DALL-E 然后生成了大量的 text2image 图像:
图 15.19:从文本提示生成图像
我们已经实现了 ViT、CLIP 和 DALL-E,三种视觉Transformers。在结束之前,让我们简要总结一下。
一个不断扩大的模型宇宙
新的Transformers模型,就像新的智能手机一样,几乎每周都会出现。其中一些模型既令人惊叹又对项目经理构成挑战:
-
ERNIE 是一个持续的预训练框架,为语言理解提供了令人印象深刻的结果。
挑战:Hugging Face 提供了一个模型。这是一个完整的模型吗?这是百度训练的超越人类基线的模型吗(2021 年 12 月):
super.gluebenchmark.com/leaderboard?我们是否可以访问到最好的模型还是只有一个玩具模型?对于这样小型模型运行 AutoML 的目的是什么?我们是否能在百度平台或类似平台上获得访问权限?这会花费多少? -
SWITCH:一个经过稀疏建模优化的万亿参数模型。
挑战:这篇论文很棒。模型在哪里?我们将永远能够访问到真正完全训练好的模型吗?会花费多少?
-
Megatron-Turing:一个拥有 5000 亿参数的Transformers模型。
挑战:市场上最好的模型之一。我们是否可以通过 API 访问?它是否会是一个成熟的模型?会花费多少?
-
XLNET 像 BERT 一样进行了预训练,但作者认为它超过了 BERT 模型的性能。
论文:
proceedings.neurips.cc/paper/2019/file/dc6a7e655d7e5840e66733e9ee67cc69-Paper.pdf挑战:XLNET 是否真的超过了 Google BERT 的性能,Google 用于其活动的版本?我们是否可以访问到 Google BERT 或 XLNET 模型的最佳版本?
列表已经变得无穷无尽,而且还在增长!
测试它们仍然是一个超出前述问题的挑战。只有少数Transformers模型符合基础模型的条件。基础模型必须是:
-
完全训练,可执行一系列任务
-
能够执行其未经训练的任务,因为它已经达到了独特的 NLU 水平
-
足够大以保证相当准确的结果,比如 OpenAI GPT-3
许多网站提供的Transformers对于教育目的而言是有用的,但不能被视为足够训练和庞大以符合基准测试的。
最好的方法是尽可能地加深对Transformers模型的理解。在某个时刻,你会成为一名专家,通过大型技术创新的丛林将变得像选择智能手机一样容易!
摘要
新的Transformers模型不断出现在市场上。因此,通过阅读出版物和书籍,并测试一些系统,跟上前沿研究是一个好的实践。
这导致我们评估选择哪些Transformers模型以及如何实现它们。我们不能花几个月时间探索每个出现在市场上的模型。如果一个项目正在生产中,我们不能每个月都更换模型。工业 4.0 正在转向无缝的 API 生态系统。
学习所有模型是不可能的。然而,通过加深对Transformers模型的了解,可以快速理解一个新模型。
Transformers模型的基本结构保持不变。编码器和/或解码器堆栈的层保持相同。注意力头可以并行化以优化计算速度。
Reformer 模型应用LSH桶和分块。它还重新计算每个层的输入,而不是存储信息,从而优化了内存问题。然而,像 GPT-3 这样的十亿参数模型对于相同的示例产生可接受的结果。
DeBERTa 模型分解内容和位置,使训练过程更加灵活。结果令人印象深刻。然而,像 GPT-3 这样的十亿参数模型可以与 DeBERTa 的输出相媲美。
ViT、CLIP 和 DALL-E 带我们进入了迷人的任务无关的文本图像视觉Transformers模型的世界。结合语言和图像会产生新的、富有成效的信息。
问题仍然存在,即现成的人工智能和自动化系统将走多远。我们将尝试在下一章关于元人类崛起的章节中可视化基于Transformers的人工智能的未来。
问题
-
Reformer Transformers模型不包含编码器。(True/False)
-
Reformer Transformers模型不包含解码器。(True/False)
-
输入在 Reformer 模型中按层存储。(True/False)
-
DeBERTa Transformers模型分解内容和位置。(True/False)
-
在选择项目使用的预训练Transformers模型之前,有必要测试数百个预训练的Transformers模型。(True/False)
-
最新的Transformers模型总是最好的。(True/False)
-
每个自然语言处理任务最好有一个Transformers模型,而不是一个多任务Transformers模型。(True/False)
-
一个Transformers模型总是需要进行微调。(True/False)
-
OpenAI GPT-3 引擎可以在不进行微调的情况下执行广泛的自然语言处理任务。(True/False)
-
在本地服务器上实现 AI 算法总是更好的。(True/False)
参考文献
-
Hugging Face Reformer:
huggingface.co/transformers/model_doc/reformer.html?highlight=reformer -
Hugging Face DeBERTa:
huggingface.co/transformers/model_doc/deberta.html -
Pengcheng He,Xiaodong Liu,Jianfeng Gao,Weizhu Chen,2020 年,Decoding-enhanced BERT with Disentangled Attention:
arxiv.org/abs/2006.03654 -
Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, Sylvain Gelly, Jakob Uszkoreit, Neil Houlsby, 2020 年,一张图片等于 16x16 个单词: Transformers for Image Recognition at Scale:
arxiv.org/abs/2010.11929 -
OpenAI:
openai.com/ -
William Fedus, Barret Zoph, Noam Shazeer,2021 年,Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity:
arxiv.org/abs/2101.03961 -
Alec Radford, Jong Wook Kim, Chris Hallacy, Aditya Ramesh, Gabriel Goh, Sandhini Agarwal, Girish Sastry, Amanda Askell, Pamela Mishkin, Jack Clark, Gretchen Krueger, Ilya Sutskever, 2021, Learning Transferable Visual Models From Natural Language Supervision:
arxiv.org/abs/2103.00020 -
C7LIP:
github.com/openai/CLIP -
Aditya Ramesh, Mikhail Pavlov, Gabriel Goh, Scott Gray, Chelsea Voss, Alec Radford, Mark Chen, Ilya Sutskever, 2021, Zero-Shot Text-to-Image Generation:
arxiv.org/abs/2102.12092 -
DALL-E:
openai.com/blog/dall-e/
加入我们书籍的 Discord 空间
加入书籍的 Discord 工作空间,与作者进行每月的问我任何事会话: