其它章节内容请见机器学习之PyTorch、Scikit-Learn和Transformers
代码参见GitHub仓库
2017年,Google的研究人员发表了一篇论文,提出了一种新的用于序列建模(sequence modeling)的神经网络架构[1]。称之为Transformer,这种架构在机器翻译任务中的表现无论在翻译质量还是训练成本层面均优于循环神经网络(RNN)。
同时,一种称为ULMFiT的高效迁移学习方法表明,使用大规模多样化语料库对长短期记忆(LSTM)网络进行训练可以靠很少标注数据就产生一流的文本分类器[2]。
这些进展成为当今最著名的两个Transformer的催化剂:生成式预训练Transformer(GPT)[3]和双向编码器表征Transformer(BERT)[4]。通过将Transformer架构与无监督学习相结合,这些模型不再需要从头开始训练特定任务的架构,并且大幅超越自然语言处理(NLP)中的几乎所有基准测试。自GPT和BERT发布以来,出现了众多Transformer模型,其中最重要的一些时间节点如图1-1所示。
图1-1 Transformer发展时间线
这有点剧透了。为理解Transformer的创新之处,首先需要讲解如下内容:
- 编码器-解码器框架
- 注意力机制
- 迁移学习
本章中,我们将介绍助力Transformer普及的核心概念,了解它们擅长的部分任务,最后介绍Hugging Face工具和库的生态系统。
我们先探索编解码器框架以及Transformer兴起之前的那些架构。
编码器-解码器框架
在Transformer之前,循环架构(如LSTM)是NLP领域的一线技术。这些架构在网络连接中包含一个反馈环,允许信息从一个步骤传播到另一个步骤,使其非常适合建模文本等顺序数据。如图1-2左侧所示,RNN接收一些输入(可以是单词或字符),将其通过网络传递,并输出一个称为隐藏状态的向量。同时,模型通过反馈环向自身传递一些信息,然后可以在下一个步骤中使用。如果我们像图1-2右侧所示“展开”循环,可以更清楚地看到:RNN将其每个步骤的状态信息传递给序列中的下一个操作。这使RNN能够跟踪先前步骤的信息,并将其用于输出预测。
图1-2 在时间上展开RNN
这些架构曾广泛用于(当前仍在使用)NLP任务、语音处理和时间序列。读者可以在Andrej Karpathy的博文《循环神经网络的不合理有效性》中找到对它们能力的精彩阐述。
RNN在机翻系统的开发中发挥了重要作用,其目标是将一种语言中的词序列映射到另一种语言中。这种任务通常使用编码器-解码器或序列对序列架构[5],非常适合输入和输出都是任意长度序列的情况。编码器的任务是将输入序列的信息编码为一个称为最终隐藏状态的数值表征。然后,该状态传递给解码器,解码器生成输出序列。
通常,编码器和解码器组件可以是任意能够建模序列的神经网络架构。如图1-3所示,这是一对RNN的示例,其中英文句子”Transformers are great!”被编码为隐藏状态向量,然后解码为德文翻译”Transformer sind grossartig!”输入词逐一喂给编码器,输出词从上到下逐个生成。
图1-3. 带一对RNN的编码器-解码器架构(通常会比图中有更多的循环层)
尽管这种架构简洁优雅,但有一个弱点,编码器的最终隐藏状态会产生信息瓶颈:生成输出时,解码器只能访问到它,因此它需要表示整个输入序列的含义。对于长序列来说,这是一个特别具有挑战性的问题,因为在将所有内容压缩为一个固定表示时,可能会丢失序列开头的信息。
幸运的是,通过允许解码器访问编码器的所有隐藏状态,可以避免这个瓶颈。这一机制通常称为注意力[6],它是许多现代神经网络架构的关键组件。理解如何为RNN开发的注意力会让我们更好地理解Transformer架构的一个主要构建模块。下面深入学习。
注意力机制
注意力背后的主要思想是,编码器不再产生输入序列的单隐藏状态,而是在每个步骤输出一个解码器可访问的隐藏状态。然而,同时使用所有状态会给解码器带来海量的输入,因此需要有机制来确定优先使用哪些状态。这是就有了注意力:它允许解码器在每个解码时间步长为各编码器状态分配不同的权重或”注意力”。这一过程如图1-4所示,注意力在预测输出序列的第三个token时起到了作用。
图1-4. 用于一对RNN带有注意力机制的编解码器架构
通过关注每个时间步长上最相关的输入token,这些基于注意力的模型能够学习生成的翻译与源语句中的单词之间复杂的对齐。例如,图1-5展示了英文到法语翻译模型的注意力权重,其中每个像素表示一个权重。该图展示了解码器如何正确对齐两种语言中顺序不同的单词”zone”和”Area”。
图1-5. RNN编解码器对齐了英语中的单词和所生成的法语翻译(图源Dzmitry Bahdanau)
虽然注意力使翻译质量大为提升,但使用循环模型作为编码器和解码器仍存在一个主要缺点:计算是顺序进行的,无法形成输入序列的并行化。
Transformer引入了一种新的模型范式:完全抛弃循环,转而依赖一种称为自注意力的特殊注意力形式。我们将在第3章更详细地讨论自注意力,其基本思想是允许注意力在神经网络的相同层中对所有状态进行操作。如图1-6所示,编码器和解码器都有自己的自注意力机制,它们的输出喂给了前馈神经网络(FF NN)。相较于循环模型,这种架构可以更快速地进行训练,并为NLP领域的许多最新突破奠定了基础。
图1-6. 原始Transformer的编解码器架构
在原Transformer论文中,翻译模型是从头开始在各种语言的大规模句子对语料库上进行训练的。然而,在实际的NLP应用中,我们通常无法获取大量标注的文本数据来训练模型。要开启Transformer变革还需要一块终极拼图:迁移学习。
NLP中的迁移学习
如今在计算机视觉中使用迁移学习训练ResNet这样的卷积神经网络,然后再对新的任务适配或调优已成为日常操作。这样网络能够利用从原始任务中学习的知识。在架构上,涉及到将模型分为主体和头部,其中头部是一个任务相关的网络。在训练过程中,主体的权重学习源作用域的广泛特征,然后使用这些权重初始化新任务的新模型[7]。与传统的监督学习相比,这种方法通常能够产生高质量的模型,可以更有效地在各种下游任务上进行训练,并且使用的标记数据更少。图1-7中对这两种方法做了对比。
图1-7. 传统监督学习(左)和迁移学习(右)的对比
在计算机视觉中,模型首先在的大规模数据集上进行训练,比如包含几百万张图像的ImageNet。这个过程称为预训练,其主要目的是教会模型图像的基本特征,如边界或颜色。然后,这些预训练模型可以在下游任务上进行调优,例如使用相对较少的标记样本(通常每个类别几百个)对花卉进行分类。在标注数据数量相同的情况下,经过调优的模型通常能比从头开始训练的监督模型获得更高的准确性。
虽然迁移学习已经成为计算机视觉中的标准方法,但在NLP领域,很长一段时间并不清楚这种预训练处理是什么。因此,NLP应用通常需要大量标注数据才能达到高性能。饶是如此,也无法媲美视觉领域的表现。
2017年至2018年,几个研究团队提出了新的方法,最终使得迁移学习可用于NLP。首先是OpenAI的研究人员提出了一个见解,通过使用从无监督预训练中提取的特征[8],在情感分类任务上获得了强大的性能。接下来是ULMFiT,它引入了一个通用框架适配各种任务的预训练LSTM模型[9]。
如图1-8所示,ULMFiT包括三个主要步骤:
- 预训练(Pretraining)
- 初始的训练目标非常简单,基于前面的单词预测下一个单词。这个任务称为语言建模。这种方法的优雅之处在于不需要标记数据,可以利用像维基百科这种海量可用的文本数据[10]。
- 领域自适应(Domain adaptation)
- 一旦语言模型在大规模语料库上进行了预训练,下一步就是将其适配到特定领域的语料库中(例如,从维基百科到IMDb电影评论的语料库,如图1-8所示)。这个阶段仍然使用语言建模,但现在模型需要预测目标语料库中的下一个单词。
- 微调(Fine-tuning)
- 在这一步中,语言模型使用用于目标任务的分类层进行微调(例如,图1-8中的电影评论情感分类)。
图1-8:ULMFiT的流程(原图作者Jeremy Howard)
通过为NLP引入一个可行的预训练和迁移学习框架,ULMFiT提供了Transformer模型大热所缺少的关键部分。2018年,两个结合了自注意力机制和迁移学习的Transformer模型发布了:
- GPT
- 只使用Transformer架构的解码器部分,以及与ULMFiT相同的语言建模方法。GPT在BookCorpus[11]上进行了预训练,该语料库包含探险、奇幻和爱情等多种流派的7000本未发表的图书。
- BERT
- 使用Transformer架构的编码器部分,以及一种特殊形式的语言建模,称为掩码语言模型。掩码语言模型的目标是预测文本中随机遮蔽的单词。例如,给定一句话“我看着我的
[MASK]
,发现[MASK]
迟到了。”,模型需要预测用[MASK]
表示的被遮蔽单词最可能的候选项。BERT对BookCorpus和英文维基百科上进行了预训练。
GPT和BERT在各种NLP基准测试中成为新的领跑者,开启了Transformer模型的时代。
但由于不同的研究实验室使用不兼容的框架(PyTorch或TensorFlow)发布模型,将这些模型移植到自己的应用程序中通常并不容易。随着🤗Transformers的发布,逐步构建了适用于50多种架构的统一API。这个库促进了对Transformer研究的爆炸性增长,并迅速在NLP从业者中走红,使得如今将模型集成到真实应用中变得非常简单。下面就来学习一下。
Hugging Face Transformers:架起桥梁
将一种新机器学习架构应用于新任务可能会很复杂,通常包含以下步骤:
- 在代码中实现模型架构,通常基于PyTorch或TensorFlow。
- 从服务端加载预训练的权重(若有)。
- 预处理输入,将其传递给模型,并应用一些特定任务的后处理。
- 实现数据加载器,并定义用于训练模型的损失函数和优化器。
各步骤都需要为每个模型和任务编写自定义逻辑。按照传统(也有例外!),在研究小组发布新文章时,他们通常会发布代码以及模型权重。但这些代码往往没有标准化,并且经常需要花费数天的时间来适配新用例。
这就是🤗Transformers派上用场的地方!它提供了一个标准化的接口,适用于大量Transformer模型,并提供了用于适配新用例的代码和工具。该库目前支持三大主要的深度学习框架(PyTorch、TensorFlow和JAX),可轻松切换。此外,它还提供了特定任务的头部,因此可以轻松地对Transformer进行下游任务的微调,例如文本分类、命名实体识别和问答。这将从业者训练和测试少量模型的时间由一周变成一个下午!
下一节中,读者可亲身体验。我们将展示,只需几行代码,就可以使用Transformers来解决我们在实际应用中可能遇到的一些常见NLP任务。
Transformer应用之旅
每个NLP任务都以文本开始,就像下面这个虚构的在线订单客户反馈:
1 2 3 4 5 6 7 |
text = """Dear Amazon, last week I ordered an Optimus Prime action figure from your online store in Germany. Unfortunately, when I opened the package, I discovered to my horror that I had been sent an action figure of Megatron instead! As a lifelong enemy of the Decepticons, I hope you can understand my dilemma. To resolve the issue, I demand an exchange of Megatron for the Optimus Prime figure I ordered. Enclosed are copies of my records concerning this purchase. I expect to hear from you soon. Sincerely, Bumblebee.""" |
根据应用程序不同,所处理的文本可能是一个法律合同、产品描述,或者其他内容。在客户反馈场景中,你可能希望知道反馈是积极的还是消极的。这个任务被称为情感分析,是我们将在第二章更大的话题文本分类中谈到。现在,我们来看如何使用🤗Transformers提取文本情感。
文本分类
我们在后面的章节中也会看到,🤗Transformers 提供了一种分层的 API,允许在不同的抽象层上与库进行交互。本章中,我们将从管道开始,它会抽象出将原始文本转换为经过模型调优预测的一系列步骤。
在🤗Transformers 中,我们通过调用pipeline()
函数并提供我们所需的任务名称来实例化一个管道:
1 2 3 |
from transformers import pipeline classifier = pipeline("text-classification") |
注:通常应先安装PyTorch/TensorFlow及Transformers,如:
12 pip install torch torchvision torchaudiopip install transformersNotOpenSSLWarning: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the ‘ssl’ module is compiled with ‘LibreSSL 2.8.3’,这只是一条警告,解决方法有:
123 brew install openssl@1.1#或pip install urllib3==1.26.6zsh: command not found: brew
12 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"echo "export PATH=/opt/homebrew/bin:$PATH" >> ~/.zshrc
首次运行这段代码时,会看到一些进度条,因为管道会自动从Hugging Face Hub下载模型权重。第二次实例化管道时,库会注意到我们已经下载了权重,并使用缓存版本。默认,text-classification
管道使用的模型适用于情感分析,但它也支持多类别和多标签分类。
现在我们有了管道,下面来生成一些预测!每个管道将字符串文本(或字符串列表)作为输入,并返回一个预测列表。每个预测都是Python 字典,因此我们可以使用 Pandas 以DataFrame
漂亮的DataFrame
来显示它们:
1 2 3 4 |
import pandas as pd outputs = classifier(text) pd.DataFrame(outputs) |
label | score | |
---|---|---|
0 | NEGATIVE | 0.901546 |
本例中模型非常确信文本为负面情绪,这是有道理的,因为我们正在处理一个愤怒的客户投诉!请注意,对于情感分析任务,管道仅返回POSITIVE
或NEGATIVE
标签,因为另一个可通过计算1-score
来推断。
下面来看另一种常见任务,即识别文本中的命名实体。
命名实体识别
预测客户反馈的情绪是一个很好的开始,但通常我们还想知道反馈的具体项目或服务。在自然语言处理中,产品、地点和人物等现实世界中的对象称为命名实体,从文本中提取它们的过程称为命名实体识别(NER)。我们可以通过加载相应的管道并将客户评论提供给它来应用NER:
1 2 3 |
ner_tagger = pipeline("ner", aggregation_strategy="simple") outputs = ner_tagger(text) pd.DataFrame(outputs) |
entity_group | score | word | start | end | |
---|---|---|---|---|---|
0 | ORG | 0.879010 | Amazon | 5 | 11 |
1 | MISC | 0.990859 | Optimus Prime | 36 | 49 |
2 | LOC | 0.999755 | Germany | 90 | 97 |
3 | MISC | 0.556569 | Mega | 208 | 212 |
4 | PER | 0.590256 | ##tron | 212 | 216 |
5 | ORG | 0.669692 | Decept | 253 | 259 |
6 | MISC | 0.498350 | ##icons | 259 | 264 |
7 | MISC | 0.775361 | Megatron | 350 | 358 |
8 | MISC | 0.987854 | Optimus Prime | 367 | 380 |
9 | PER | 0.812096 | Bumblebee | 502 | 511 |
可以看到管道检测到了所有的实体,并为每个实体分配了类别,例如 ORG
(组织)、LOC
(地点)或 PER
(人物)。这里我们使用了aggregation_strategy
参数根据模型的预测结果对单词进行了分组。例如,实体”Optimus Prime”由两个单词组成,但被分配到单个类别:MISC
(其它)。得分告诉我们模型对其识别的实体有多大信心。我们可以看到它对”Decepticons”和第一个出现的”Megatron”的自信度最低,它们都未能作为单个实体进行分组。
注: 看到上表
word
列中那些奇怪的哈希符号(#
)了吗?这些是模型的分词器(tokenizer)产生的,它将单词分割成称为token的原子单元。我们将在第2章中学习有关标记化(tokenization)的所有知识。
提取文本中的所有命名实体很美好,但有时我们希望提出更具针对性的问题。这正是问答的用武之地。
问答
在问答中,我们向模型提供称为上下文的段落,以及一个问题,我们希望从中提取答案。然后,模型返回对应答复的文本范围。我们来看在提出关于客户反馈的具体问题时,会得到什么答案:
1 2 3 4 |
reader = pipeline("question-answering") question = "What does the customer want?" outputs = reader(question=question, context=text) pd.DataFrame([outputs]) |
score | start | end | answer | |
---|---|---|---|---|
0 | 0.631291 | 335 | 358 | an exchange of Megatron |
可以看到,跟回答一起返回还有start
和end
整数,它们对应回答段落的字符索引(就像NER标记一样)。在第7章中,我们将研究几种问答类型,这里的被称为抽取式问答,因为回答是直接从文本中抽取出来的。
通过这种方法,可以快速阅读和提取客户反馈中的相关信息。但是,如若收到海量冗长的投诉,没有时间全部阅读,该怎么办呢?我们来看看是否可以借助文本摘要模型来帮助解决这个问题!
文本摘要
文本摘要的目标是接收长文本作为输入,生成包含所有相关事实的简短版本。这是一个比之前的任务更加复杂的任务,因为它要求模型生成连贯的文本。现在读者应该很熟悉这一模式了,我们可以按照以下方式实例化一个摘要管道:
1 2 3 |
summarizer = pipeline("summarization") outputs = summarizer(text, max_length=45, clean_up_tokenization_spaces=True) print(outputs[0]['summary_text']) |
1 2 3 |
Bumblebee ordered an Optimus Prime action figure from your online store in Germany. Unfortunately, when I opened the package, I discovered to my horror that I had been sent an action figure of Megatron instead. |
这个摘要还不赖!虽然复制了原始文本的部分内容,但模型能够捕捉到问题的本质,并正确地识别到“Bumblebee”(出现在末尾)是投诉的作者。在本例中,还可以看到我们对管道传递了一些关键字参数,比如max_length
和clean_up_tokenization_spaces
;这些参数调整运行时的输出结果。
但是,如果收到的反馈是我们不懂的语言,该怎么办呢?可以使用Google翻译,或者可以让我们自己的transformer来进行翻译!
翻译
与摘要类似,翻译是一个输出生成文本的任务。下面我们使用翻译管道将英文文本翻译成德语:
1 2 3 4 |
translator = pipeline("translation_en_to_de", model="Helsinki-NLP/opus-mt-en-de") outputs = translator(text, clean_up_tokenization_spaces=True, min_length=100) print(outputs[0]['translation_text']) |
1 2 3 4 5 6 7 8 |
Sehr geehrter Amazon, letzte Woche habe ich eine Optimus Prime Action Figur aus Ihrem Online-Shop in Deutschland bestellt. Leider, als ich das Paket öffnete, entdeckte ich zu meinem Entsetzen, dass ich stattdessen eine Action Figur von Megatron geschickt worden war! Als lebenslanger Feind der Decepticons, Ich hoffe, Sie können mein Dilemma verstehen. Um das Problem zu lösen, Ich fordere einen Austausch von Megatron für die Optimus Prime Figur habe ich bestellt. Anbei sind Kopien meiner Aufzeichnungen über diesen Kauf. Ich erwarte, bald von Ihnen zu hören. Aufrichtig, Bumblebee. |
同样,模型生成了很好的翻译,正确使用了德语的形式代词,如”Ihrem”和”Sie”。这里我们还展示了如何替换管道中的默认模型,选择最适合应用程序的模型,读者可以在Hugging Face Hub上找到成千上万种语言对模型。在我们回顾整个Hugging Face生态之前,先来看最后一个应用。
文本生成
假设我们希望通过使用自动补全功能来更快地回复客户反馈。使用文本生成模型的实现如下:
1 2 3 4 5 |
generator = pipeline("text-generation") response = "Dear Bumblebee, I am sorry to hear that your order was mixed up." prompt = text + "\n\nCustomer service response:\n" + response outputs = generator(prompt, max_length=200) print(outputs[0]['generated_text']) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Dear Amazon, last week I ordered an Optimus Prime action figure from your online store in Germany. Unfortunately, when I opened the package, I discovered to my horror that I had been sent an action figure of Megatron instead! As a lifelong enemy of the Decepticons, I hope you can understand my dilemma. To resolve the issue, I demand an exchange of Megatron for the Optimus Prime figure I ordered. Enclosed are copies of my records concerning this purchase. I expect to hear from you soon. Sincerely, Bumblebee. Customer service response: Dear Bumblebee, I am sorry to hear that your order was mixed up. The order was completely mislabeled, which is very common in our online store, but I can appreciate it because it was my understanding from this site and our customer service of the previous day that your order was not made correct in our mind and that we are in a process of resolving this matter. We can assure you that your order |
好吧,也许我们不想使用这个自动补全来安抚Bumblebee,但读者应该明白意思了。
既然已经看到了几个Transformer模型的很酷的应用,读者可能想知道训练是在哪里进行的。我们在本章中使用的所有模型都是公开可用的,并已经针对所需任务进行了调优。但通常情况下,我们会希望在自己的数据上对模型进行调优,在接下来的章节中,我们将学习如何做到这一点。
但是,训练模型只是NLP项目的一小部分——能够高效地处理数据,与同事共享结果,并使我们的工作可复现也是关键组成部分。幸运的是,围绕着🤗Transformers有一个庞大的生态系统,提供了许多有用的工具,支持现代机器学习工作流程的大部分内容。下面来一窥究竟。
Hugging Face生态
一开始的🤗Transformers迅速成长为一个完整的生态系统,包括许多库和工具,可加速NLP和机器学习项目。Hugging Face生态主要由两个部分组成:一系列库及Hub,如图1-9所示。库提供代码,而Hub提供预训练模型权重、数据集、用于评估指标的脚本等。本节中,我们将简要介绍各个组成部分。我们将跳过🤗Transformers,因为已做过讨论,并且在全书中还会涉及其更多的内容。
图1-9:总览Hugging Face生态
Hugging Face Hub
如前所述,迁移学习是推动transformer成功的关键因素之一,因为它让我们可以重复使用预训练模型完成新任务。因此,能够快速加载预训练模型并进行实验非常重要。
Hugging Face Hub托管了超过20,000个免费模型。如图1-10所示,有任务、框架、数据集等过滤器,旨在帮助我们浏览Hub并快速找到合适的候选模型。正如我们在管道中看到的那样,在代码中加载合适的模型只需要一行代码。这让使用各种模型进行实验变得简单,并让我们可专注于项目中特定领域的部分。
图1-10. Hugging Face Hub的模型页面,左侧为筛选项,右侧为模型列表
除模型权重外,Hub还托管了数据集和用于计算指标的脚本,这样我们能够复现已发布的结果或把额外的数据用于我们的应用程序。
Hub还提供模型和数据集卡片,以记录模型和数据集的内容,帮助我们明确它们是否符合自己的需求。Hub最酷的功能之一是可以通过各种特定任务的交互式微件直接测试各种模型,如图1-11所示。
图1-11. Hugging Face Hub的一个示例模型卡片:右侧显示了推断微件,允许我们与模型进行交互
让我们继续介绍🤗Tokenizers。
注: PyTorch和TensorFlow也提供了自己的Hub,如果Hugging Face Hub上没有某些模型或数据集,也可以查看。
Hugging Face Tokenizers
本章中,我们所见到的每个管道示例背后都有一个将原始文本分割成更小的片段(称为token)的标记化(tokenization)步骤。我们将在第2章中详细了解这个过程,现在只需了解token可能是单词、单词的一部分,或者只是标点符号这样的字符就足够了。Transformer模型是根据这些标记的数值表示进行训练的,因此正确地进行这一步骤对于整个NLP项目非常重要!
🤗Tokenizers提供了许多标记化策略,并且由于其后端是Rust[12],它在文本标记化方面非常快速。它还负责所有的预处理和后处理步骤,例如规范化输入并将模型输出转换为所需的格式。使用🤗Tokenizers,我们可以与🤗Transformers加载预训练模型权重相同的方式加载标记器。
我们需要数据集和指标来训练和评估模型,那么来看一下负责这方面的🤗数据集。
Hugging Face数据集
加载、处理和存储数据集可能是一个繁琐的过程,特别是当数据集过大无法放入笔记本电脑的内存时。此外,通常需要实现各种脚本来下载数据并将其转换为标准格式。
🤗数据集通过为Hub上的成千上万个数据集提供标准接口来简化此过程。它还提供智能缓存(这样我们就不必在每次运行代码时重新进行预处理),并通过利用一种称为内存映射的特殊机制来避免RAM限制,该机制将文件的内容存储到虚拟内存中,并启用多个进程更高效地修改文件。该库还与流行的框架如Pandas和NumPy兼容,因此无需抛弃我们喜爱的数据处理工具。
但如果无法可靠地度量表现,好数据集和强大的模型也是无益的。不幸的是,经典的NLP指标存在许多不同的实现,可能会稍有差异,并导致带有欺骗性的结果。通过为许多指标提供脚本,🤗数据集有助于让实验更具再现性,结果更加可靠。
借助🤗Transformers、🤗Tokenizers和🤗Datasets库,我们拥有了训练自有Transformer模型的一切准备工作!但就像我们将在第10章中看到的那样,有时我们需要对训练循环具有更细粒度的控制。这就是生态中的最后一个库🤗Accelerate发挥作用的地方。
Hugging Face Accelerate
如果读者曾经需要在PyTorch中编写自己的训练脚本,那么当尝试将在笔记本电脑上运行的代码迁移到公司集群上运行时,可能会遇到一些困难。🤗Accelerate为常规的训练循环添加了一层抽象,它负责处理训练基础架构所需的所有自定义逻辑。它通过简化基础架构所需的更改来加速工作流程。
这些便是Hugging Face开源生态的核心组件。但在结束本章之前,我们来看一下尝试在真实世界中部署Transformer模型时面临的一些常见挑战。
Transformer的主要挑战
本章中,我们简要了解了可以使用Transformer模型解决的大量自然语言处理任务。阅读媒体头条时,有时可能会感觉它们的能力是无限的。可是虽然它们很有用,但Transformers还远非银弹。以下是相关的一些挑战,我们将在整本书中进行探讨:
- 语言
- NLP研究英语占统治地位。虽然有其他语言一些模型,但很难找到稀有或资源有限语言的预训练模型。在第4章中,我们将探讨多语言Transformer及其进行zero-shot跨语言迁移的能力。
- 数据可用性
- 虽然我们可以使用迁移学习大大减少模型所需的标记训练数据量,但与人类执行任务工作量相比,仍然很多。处理少标记或无标记数据的场景是第9章的主要课题。
- 处理长文档
- 自注意力在段落长文本上效果非常好,但当我们转移到像整个文档这样的更长文本时,它就变得很昂贵。我们在第11章中讨论了缓解这个问题的方法。
- 不透明性
- 与其他深度学习模型一样,Transformer在很大程度上是不透明的。很难或无法解开模型为什么做出某种预测。在这些模型部署用于做出关键决策时,这是一个特别巨大的挑战。我们将在第2章和第4章中探讨一些探测Transformer模型错误的方法。
- 偏见
- Transformer模型主要对互联网上的文本数据上进行预训练。这会将所有存在于数据中的偏见都注入到模型中。确保这些偏见不带有种族主义、性别歧视或更严重的问题很有挑战性。我们在第10章中更详细地讨论了其中一些问题。
尽管这些挑战看起来令人生畏,但很多是可以克服的。除了所列出的章节外,几乎在每一章中都会涉及这些话题。
总结
希望到目前为止,读者已经对如何开始训练和将这些多样化的模型集成到自己的应用程序中感到兴奋!在本章中我们看到,只需寥寥几行代码,就可以使用一流的模型进行分类、命名实体识别、问答、翻译和摘要等任务,但这其实只是“冰山一角”。
在接下来的章节中,我们将学习如何用Transformer适配各种用例,如构建文本分类器、或用于生产的轻量级模型,甚至是从头开始训练语言模型。我们将以上手实战的方式学习,这意味着对于每个概念,都会有相应的代码,读者可以在Google Colab或自己的GPU主机上运行这些代码。
现在,我们已经掌握了Transformer背后的基本概念,是时候上手处理我们的第一个应用程序了:文本分类。这正是下一章的主题!
- A. Vaswani等人,”Attention Is All You Need“,(2017)。这个标题非常吸引人,以至于后来至少有50篇论文在标题中都包含了”all you need”!
- J. Howard和S. Ruder,”Universal Language Model Fine-Tuning for Text Classification“,(2018)。
- A. Radford等人,”Improving Language Understanding by Generative Pre-Training“,(2018)。
- J. Devlin等人,”BERT: Pre-Training of Deep Bidirectional Transformers for Language Understanding“,(2018)。
- I. Sutskever,O. Vinyals和Q.V. Le,”Sequence to Sequence Learning with Neural Networks“,(2014)。
- D. Bahdanau,K. Cho和Y. Bengio,”Neural Machine Translation by Jointly Learning to Align and Translate“,(2014)。
- 权重是神经网络中可学习的参数。
- A. Radford,R. Jozefowicz和I. Sutskever,”Learning to Generate Reviews and Discovering Sentiment“,(2017)。
- 当前相关任务是ELMo(来自语言模型的嵌入),它展示了如何通过预训练LSTM模型为下游任务生成高质量的词嵌入。
- 对于英语更为如此,而对于大多数其它语言来说,获取大规模的数字化文本语料库可能很困难。找到弥合这一差距的方法是自然语言处理研究和活动的一个活跃领域。
- Y. Zhu等人,”Aligning Books and Movies: Towards Story-Like Visual Explanations by Watching Movies and Reading Books“,(2015)。
- Rust是一种高性能编程语言。