当前位置:   article > 正文

Transformers 介绍_transformer书籍

transformer书籍

重磅推荐专栏: 《大模型AIGC》《课程大纲》
本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在帮助读者更好地理解和应用这些领域的最新进展

2017年,谷歌的研究人员发表了一篇论文,提出了一种用于序列建模的新型神经网络架构。这种架构被称为Transformer,在机器翻译质量和训练成本方面都优于递归神经网络(RNNs)。

与此同时,一种名为ULMFiT的有效迁移学习方法表明,在一个非常大和多样化的语料库上,训练长短期记忆(LSTM)网络,可以用很少的标记数据,产生SOTA的文本分类器。

这些进展是当今最著名的两种transformers的催化剂:生成式预训练transformer(GPT)和来自transformer的双向编码器表示(BERT)。通过将transformer架构与无监督学习相结合,这些模型消除了从头开始训练特定任务架构的需要,并显著打破了NLP中的几乎所有基准。自从GPT和BERT发布以来,出现了大量的transformer模型;最突出的里程碑的时间轴如图1-1所示:
图1-1.transformers的时间线
但我们要理解transformers的新颖之处,我们首先需要解释一下:

  • 编码器解码器(encoder-decoder)框架
  • 注意力(Attention)机制
  • 迁移学习(Transfer learning)

在本章中,我们将介绍transformers普遍性的核心概念,了解他们擅长的一些任务,并以讲解Hugging Face的工具和库。

让我们首先探索编码器解码器框架和transformers崛起之前的架构。

1. 编码器解码器框架

在transformers出现之前,像LSTM这样的循环架构是NLP中的最新技术。这些体系结构在网络连接中包含一个反馈回路,允许信息从一个步骤传播到另一个步骤,这使它们成为建模像文本等顺序数据的理想选择。如图1-2的左侧所示,RNN接收一些输入(可以是单词或字符),通过网络输入,并输出一个称为隐藏状态的向量。
图1-2.及时展开RNN
与此同时,模型通过反馈循环将一些信息反馈给自己,然后可以在下一步中使用。如果我们“展开”如图1-2右侧所示的循环,这可以更清楚地看到:RNN将每个步骤中的状态信息传递给序列中的下一个操作。这允许RNN跟踪以前步骤中的信息,并将其用于输出预测。

这些架构被(并继续)广泛用于NLP任务、语音处理和时间序列。推荐阅读《循环神经网络的不合理有效性》

RNN发挥重要作用的一个领域是机器翻译系统的发展,其目标是将一种语言中的单词序列映射到另一种语言。这类任务通常用编码器-解码器或序列到序列的架构来处理,这非常适合于输入和输出都是任意长度的序列的情况。编码器的工作是将输入序列中的信息编码为一个数字表示,通常称为最后一个隐藏状态。然后将此状态传递给解码器,后者生成输出序列。

一般来说,编码器和解码器组件可以是任何一种可以建模序列的神经网络结构。这是图1-3中的一对RNN的说明,其中的英语句子“Transformers are great!”被编码为一个隐藏的状态向量,然后解码产生德语翻译“Transformer sind grossartig!”。输入字通过编码器按顺序输入,输出字从上到下,一次生成一个。

图1-3.具有一对RNNs的编码器-解码器架构(一般来说,有比此处显示的更多的循环层)
尽管它很简单,但这种架构的一个缺点是,编码器的最终隐藏状态创建了一个信息瓶颈:它必须表示整个输入序列的意义,因为这是解码器在生成输出时可能需要访问的所有信息。这对于长序列来说尤其具有挑战性,因为在将所有内容压缩为单一的固定表示的过程中,序列开头的信息可能会丢失

幸运的是,有一种方法允许解码器访问所有编码器的隐藏状态。一般该机制被称为注意力机制,它是许多现代神经网络结构的关键组成部分。了解RNN的关注力机制是如何发展,将使我们能够良好地理解Transformers架构。让我们来深入看看注意力机制。

2. 注意力机制

注意力机制背后的主要思想是,编码器不是为输入序列产生一个单一的隐藏状态,而是在解码器可以访问的每一步输出一个隐藏状态。然而,同时使用所有状态将为解码器创建一个巨大的输入,因此需要一些机制来确定使用哪些状态的优先级。这就是注意的作用所在:**它允许解码器在每一次解码时为每个编码器状态分配不同的权重。**这个过程如图1-4所示,其中显示了注意力机制在预测输出序列中第二个token的作用。
图1-4 一种具有一对RNN注意机制的编解码器结构
通过关注每步中哪些输入token最相关,这些基于注意力的模型能够学习生成的翻译中的单词和源句中的单词之间的重要对齐。例如,图1-5可视化了一个英语到法语的翻译模型的注意力权重,其中每个像素表示一个权重。
图1-5. RNN英语单词和法语生成翻译的编解码器对齐

图中显示了解码器如何能够正确地对齐单词 “zone” 和 “Area”,这在两种语言中是不同的顺序的。

虽然注意力机制能够产生更好的翻译,但对于编码器和解码器使用循环模型仍然有一个主要的缺点:计算本质上是顺序的,不能在输入序列中并行化。

使用Transformers,引入了一种新的建模范式:完全避免递归,而是完全依赖于一种称为自注意力(self-attention)的特殊注意形式。我们将在第3章中更详细地介绍self-attention,但其基本思想是允许attention在神经网络的同一层的所有状态上进行操作。如图1-6所示,其中编码器和解码器都有自己的self-attention机制,其输出被馈入前馈神经网络(FF NNs)。
图1-6 原生Transformer的编解码器体系结构

这种体系结构可以比循环模型训练得快得多,并为NLP最近的许多突破铺平了道路。

在最初的Transformer论文中,翻译模型是在各种语言的大量句子对语料库上从头开始训练的。然而,在自然语言处理的许多实际应用中,我们无法访问大量的标记文本数据来训练我们的模型。缺失了开始Transformer革命的最后一块东西:迁移学习

3. NLP中的迁移学习

目前在计算机视觉中,常见的做法是在迁移学习中训练像ResNet这样的卷积神经网络完成一个任务,然后使其对新任务进行调整或微调。这使得网络能够利用从原始任务中学到的知识。在架构上,这涉及到将模型分成一个身体和一个头部,其中头部是一个特定于任务的网络。在训练过程中,身体的权值会学习源域的广泛特征,并利用这些权值来初始化新任务的新模型。与传统的监督学习相比,这种方法通常会产生高质量的模型,这些模型可以在各种下游任务上更有效地进行训练,并且使用标记更少的数据。这两种方法的比较如图1-7所示。
图1-7.传统监督学习(左)和迁移学习(右)的比较
在计算机视觉中,这些模型首先在大规模数据集上进行训练,如ImageNet,其中包含数百万张图像。这个过程被称为预训练,其主要目的是教模型学习图像的基本特征,如边缘或颜色。然后,这些预训练过的模型可以在下游任务上进行微调,比如用相对较少的标记例子(通常每个类有几百个)对花的物种进行分类。微调模型通常比在相同数量的标记数据上从头开始训练的监督模型获得更高的精度。

虽然迁移学习成为计算机视觉的标准方法,但多年来并不清楚NLP的类似预训练过程是什么。因此,NLP应用程序通常需要大量的标记数据来实现高性能。即便如此,这种表现也不能与在视觉领域所取得的成就相比。

在2017年和2018年,几个研究小组提出了新的方法,最终使迁移学习成为NLP的工作。它始于OpenAI的研究人员的见解,他们通过使用从无监督的预训练中提取的特征,在情绪分类任务中获得了强大的表现。随后是ULMFiT,它引入了一个通用框架来适应预训练的LSTM模型的各种任务。

如图1-8所示,ULMFiT包括三个主要步骤:

在这里插入图片描述

  • 预训练
    最初的训练目标很简单:根据前面的单词预测下一个单词。此任务被称为语言建模。这种方法的优雅之处在于,不需要带有标记的数据,而且人们可以利用来自维基百科等来源的大量可用文本。
  • 领域迁移
    一旦语言模型在一个大规模的语料库上进行了预训练,下一步是将其适应于域内的语料库(例如,从维基百科到电影评论的IMDb语料库,如图1-8所示)。这一阶段仍然使用语言建模,但现在该模型必须预测目标语料库中的下一个单词。
  • 微调
    在这一步中,语言模型通过一个针对目标任务的分类层进行了微调(例如,在图1-8中对电影评论的情绪进行了分类)。

通过在NLP中引入一个可行的预训练和迁移学习框架,ULMFiT为Transformers提供了发展空间。2018年,发布了两款结合了自注意力机制和迁移学习的Transformers:

  • GPT
    仅使用Transformers结构中的解码器部分,以及与ULMFiT相同的语言建模方法。GPT是在包含7000本未出版的书籍的语料上进行预训练的,其中包括冒险、科幻和爱情题材。

  • BERT
    使用Transformers结构中的编码器部分,以及一种特殊形式的语言建模,称为掩码语言建模。掩码语言建模的目的是预测文本中的随机MASK的词。例如,有一句话,比如““I looked at my [MASK] and saw that [MASK] was late.”该模型需要预测由[MASK]表示的掩蔽词最可能的候选词。BERT在图书语料库和英语维基百科的进行了预训练。

GPT和BERT在各种NLP基准上开创了一种新的技术水平,并开创了Transformers的时代。

然而,随着不同的研究实验室在不兼容的框架中(PyTorch或Tensorflow)发布他们的模型,NLP从业者并不总是那么容易将这些模型移植到他们自己的应用程序中。随着 Huggingface Transformers 的发布,一个跨50多个架构的统一API逐步建立起来。这个库催化了对Transformers 的研究的爆炸式发展,并迅速渗透到NLP从业者中,使这些模型很容易集成到当今的许多现实应用程序中。我们来看看吧!

4. Huggingface Transformers

将新的机器学习架构应用于新任务是一项复杂的任务,通常包括以下步骤:

  1. 在代码中实现模型体结构,通常基于PyTorch或Tensorflow。
  2. 从服务器上加载预先训练好的权重(如果可用)。
  3. 预处理输入,将它们通过模型,并应用一些特定于任务的后处理
  4. 实现数据处理器,并定义损失函数和优化器来训练模型

每个步骤都需要为每个模型和任务提供自定义逻辑。通常当研究小组发布一篇新文章时,他们还将发布代码和模型权重。然而,这个代码很少标准化,通常需要数天的工程设计来适应新的用例。

这就是Huggingface Transformers来拯救NLP从业者的地方!它为广泛的Transformers模型提供了一个标准化的接口,以及代码和工具,以使这些模型适应新的用例。该库目前支持三个主要的深度学习框架(PyTorch、TensorFlow和JAX),并允许您在它们之间轻松切换。此外,它提供了特定于任务的头,因此您可以轻松地微调下游任务上的Transformers,如文本分类、命名实体识别和问题回答。这减少了一个从业者训练和测试一些模型所需的时间,从一周减少到一个下午!

阿里巴巴达摩院推出了“中文版”的 Huggingface Transformers —— ModelScope
ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!
虽然本专栏会基于Huggingface进行讲解,但是强烈推荐大家尝试使用ModelScope!ModelScope的框架与接口与Huggingface非常相似,而且拥有更多的中文模型,对于文档对于中文母语的同学们也更加友好!

你将在下一节中看到,我们将展示,只需几行代码,Huggingface Transformers就可以应用于处理一些你最常见的NLP应用程序。

5. Transformer 应用介绍

每个NLP任务都以一段文本开始,比如以下关于某个在线订单的客户反馈:

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."""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

根据你的应用程序,你所使用的文本可以是法律合同、产品描述,或者完全是其他的东西。假设是客户反馈的情况下,你可能会想知道这些反馈是积极的还是消极的。这个任务被称为情绪分析,是我们将在第二章中探讨的更广泛的文本分类主题的一部分。现在,让我们来看看如何使用 Huggingface Transformers 从我们的文本中提取情感。

5.1 文本分类

正如我们将在后面的章节中看到的, Huggingface Transformers 有一个分层的API,它允许你在不同的抽象级别上与库进行交互。在本章中,我们将从pipelines开始,它抽象了将原始文本从微调模型转换为一系列预测结果所需的所有步骤。

在Huggingface Transformers 中,我们通过调用 pipeline() 函数,并提供我们感兴趣的任务的名称,来实例化一个pipeline:

from transformers import pipeline

classifier = pipeline("text-classification")
  • 1
  • 2
  • 3

第一次运行这段代码时,你会看到几个进度条,因为pipeline会自动从Hugging Face Hub下载模型权重。第二次实例化pipeline时,库会注意到你已经下载了权重,并将使用缓存的版本。默认情况下, text-classification pipeline使用了一个为情绪分析而设计的模型,但它也支持多类和多标签分类。

现在我们已经有了我们的pipeline了,让我们来做一些预测吧!每个pipeline都将一个文本字符串(或一个字符串列表)作为输入,并返回一个预测列表。每个预测结果都是一个Python字典,所以我们可以使用Pandas很好地显示为一个DataFrame:

import pandas as pd

outputs = classifier(text)
pd.DataFrame(outputs)   
  • 1
  • 2
  • 3
  • 4
	label	score
0	NEGATIVE	0.901546
  • 1
  • 2

在这种情况下,该模型非常有信心:文本是负面的情绪,这是合理的,因为我们正在处理的是来自一个愤怒的客户的投诉!请注意,对于情绪分析任务,pipeline只返回一个正标签或负标签中的一个,因为另一个可以通过计算1-score来推断。

现在让我们来看看另一个常见任务,在文本中的命名实体识别。

5.2 命名实体识别

预测客户反馈的情绪是很好的第一步,但你通常想知道反馈是关于特定的商品或服务的。在NLP中,真实世界的对象,如产品、地点和人被称为命名实体,从文本中提取它们被称为命名实体识别(NER)。我们可以通过加载相应的pipeline并提供我们的客户反馈文本,来进行NER:

ner_tagger = pipeline("ner", aggregation_strategy="simple")
outputs = ner_tagger(text)
pd.DataFrame(outputs)    
  • 1
  • 2
  • 3
	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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

您可以看到,管道检测到所有实体,并为每个实体分配了一个类别,如ORG(组织)、LOC(位置)或PER(人)。在这里,我们使用聚合策略参数,根据模型的预测对单词进行分组。例如,实体“擎天柱”由两个词组成,但被分配了一个类别:MISC(杂项)。这些分数告诉我们模型对它识别的实体有多有信心。我们可以看到,它对“霸天虎”和“威震天”的第一次出现最缺乏信心,但这两者都未能将其作为一个单一的实体进行分组。

看到上一个表中的单词列中那些奇怪的哈希符号(#)了吗?这些是由模型的标记器产生的,它将单词分成称为token的原子单位。你将在第二章中学习所有关于token的知识。

在文本中提取的所有命名实体都很好,但有时我们想问更有针对性的问题。这就是我们可以使用问答方式(question answering)的地方。

5.3 问答(机器阅读理解)

在问答任务中,我们为模型提供了一段称为上下文的文本,以及一个我们想提取其答案的问题。然后,该模型返回与答案对应的文本的片段。我们有时候也称其为机器阅读理解任务。让我们来看看,当我们询问一个关于客户反馈的具体问题时,我们会得到什么:

reader = pipeline("question-answering")
question = "What does the customer want?"
outputs = reader(question=question, context=text)
pd.DataFrame([outputs])
  • 1
  • 2
  • 3
  • 4
	score	start	end	answer
0	0.631291	335	358	an exchange of Megatron
  • 1
  • 2

我们可以看到,除了答案之外,pipeline还返回了与找到答案跨度的字符索引对应的开始位置数和结束位置数(就像NER标记一样)。我们将在第七章中研究几种类型的问题回答,但这种特殊的问题回答类型被称为提取式问题回答(extractive question answering),因为答案是直接从文本中提取的。

使用这种方法,您可以从客户的反馈中快速阅读和提取相关信息。但是,如果你得到了大量长篇大论的抱怨,却没有时间去读它们,那改怎么办呢?让我们看看一个摘要模型是否能有所帮助!

5.4 摘要

文本摘要的目标是**以一个长文本作为输入,并生成一个包含所有相关事实的简短版本。**这是一项比之前的任务要复杂得多的任务,因为它需要模型来生成连贯的文本。同样的,我们可以实例化一个摘要pipeline如下:

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.
  • 1
  • 2
  • 3

这个总结还不算太糟!虽然部分原始文本已经被复制,但该模型能够捕捉到问题的本质,并正确地识别出“大黄蜂”(出现在结尾)是投诉的作者。在这个例子中,你还可以看到,我们向pipeline传递了一些关键参数,如max_length和clean_up_tokenization_spaces;这些都允许我们在运行时调整输出。

但是当你得到一种你不理解的语言的反馈时会发生什么呢?你可以使用谷歌翻译,或者你可以使用你自己的transformer来为你翻译它!

5.5 翻译

与摘要一样,翻译是一个输出由生成的文本组成的任务。让我们使用一个翻译pipeline来将英语文本翻译成德语:

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
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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

同样,该模型产生了一个非常好的翻译,正确地使用了德语的形式代词,如“Ihrem”和“Sie”。在这里,我们还展示了如何覆盖pipeline中的默认模型来为你的应用程序选择最好的模型——你可以在Hugging Face Hub上找到数千个语言对的模型。在我们退一步看看整个Hugging Face生态系统之前,让我们来看看最后一个应用程序。

5.6 文本生成

假设你希望能够通过访问一个自动来更快地回复客户的反馈。使用文本生成模型,可以如下:

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
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

好吧,也许我们不想用这个来让"大黄蜂"消气,但你应该已经有了一定的想法。

现在你已经看到了一些很酷的Transformer模型的应用程序,你可能会想知道模型训练发生在哪里。我们在本章中使用的所有模型都是公开可用的,并且已经针对手头的任务进行了微调。但是,一般来说,你需要根据自己的数据来调整模型,在接下来的章节中,你将学习如何做到这一点。

但是,训练一个模型只是任何NLP项目的一小部分——能够有效地处理数据,与同事分享结果,并使你的工作具有可复用性也是关键的组成部分。幸运的是,Hugging Face Transformers 周围有一个实用的生态系统,这些工具支持许多现代机器学习的工作流程。让我们来看看吧。

6. Hugging Face 生态

从Hugging Face Transformers 从最开始到现在已经迅速发展成为一个完整的生态系统,以加速你的NLP和机器学习项目。Hugging Face生态系统主要由两部分组成:一个库和一个Hub,如图1- 9所示。
图1-9:Hugging Face 生态系统的概述

**库提供了代码,而Hub提供了预先训练好的模型权重、数据集、评估度量的脚本等等。**在本节中,我们将简要介绍各种组件,我们将在书中看到更多相关的介绍。

6.1 Hugging Face Hub

如前所述,迁移学习是驱动Transformers 成功的关键因素之一,因为它使在新任务中重用预先训练过的模型成为可能。因此,能够快速加载预先训练好的模型并使用它们运行实验是至关重要的。

Hugging Face Hub 提供了超过20,000个免费模型。如图1-10所示,有一些针对 tasks, frameworks, datasets等的过滤条件,旨在帮助你导航Hub并快速找到更理想的候选对象。
图1-10:拥抱面中心的Models页面,左侧显示过滤条件,右侧显示模型列表

正如我们在pipline 中看到的,在代码中加载一个有理想的模型只需要一行代码。这使得试验各种模型变得简单,并允许你专注于项目的领域特定部分。

除了模型权重之外,Hub还托管用于计算指标的数据集和脚本,这允许你重现已发布的结果或为应用程序利用其他数据。

Hub还提供了Model card和dataset card 来记录模型和数据集的内容,并帮助你做出更好的决定,以确定它们是否适合您。Hub最酷的特性之一是,你可以通过各种特定任务的交互式小部件直接尝试任何模型,如图1-11所示。

图1-11。右侧显示了Hugging Face Hub的示例模型卡:允许您与相应的模型交互

6.2 Hugging Face Tokenizers

在本章中看到的每个pipline示例的背后,都有一个Tokenizer骤,它将原始文本分割成称为Token的小块。我们将在第二章中详细介绍这是如何工作的,但现在它可以理解Token可能是单词,单词的一部分,或者只是像标点符号这样的字符。Transformers模型是根据这些Token的数值表示来训练的,所以正确地完成这一步骤对于整个NLP项目是非常重要的!
Hugging Face Tokenizer 提供了许多Tokenizer策略,由于它的Rust后端,它在Tokenizer文本方面速度非常快。它还负责所有的预处理和后处理步骤,例如规范化输入并将模型输出转换为所需的格式。使用Hugging Face Tokenizer ,我们可以加载Tokenizer组件,就像我们可以使用Hugging Face Transformers加载预先训练过的模型权重一样。

我们需要一个数据集和度量标准来训练和评估模型,所以让我们来看看Hugging Face Datasets,它负责这方面。

6.3 Hugging Face Datasets

加载、处理和存储数据集可能是一个繁琐的过程,特别是当数据集太大而无法容纳你的笔记本电脑的内存时。此外,您通常需要实现各种脚本来下载数据并将其转换为标准格式。

通过为可以在Hub上找到的数千个数据集提供一个标准接口,Hugging Face Datasets 简化了这个过程。它还提供了智能缓存(所以你不必重做预处理每次运行你的代码),通过利用一种称为内存映射(memory mapping)的特殊机制来避免RAM的限制,这种机制将文件的内容存储在虚拟内存中,并使多个进程能够更有效地修改文件。该库还可以与Pandas和NumPy等流行的框架进行互操作,所以你可以使用你喜欢的数据处理工具。

然而,如果你不能可靠地度量模型性能,那么拥有一个良好的数据集和强大的模型是毫无价值的。不幸的是,经典的NLP指标度量带有许多不同的实现,这些实现可能略有不同,并导致欺骗性的结果。通过为许多指标提供脚本,Hugging Face Datasets 有助于使实验更具可复用性,结果更可信

有了Hugging Face Transformers、Tokenizers 和 Datasets 库,我们就有了我们需要的一切来训练我们自己的Transformers模型!然而,正如我们将在第10章中看到的,在有些情况下,我们需要对训练循环进行细粒度的控制。这就是生态系统的最后一个库发挥作用的地方:Hugging Face Accelerate。

6.4 Hugging Face Accelerate

如果你曾经不得不在PyTorch中编写自己的培训脚本,那么在尝试将笔记本电脑上运行的代码移植到组织集群上运行的代码时,你可能会遇到一些麻烦。

Hugging Face Accelerate 为正常的训练循环添加了抽象层,以处理训练基础设施所需的所有自定义逻辑。通过在必要时简化基础设施的更改,这确实加速了你的工作流。

这总结了Hugging Face的开源生态系统的核心组成部分。但在结束这一章之前,让我们来看看尝试在现实世界中部署Transformers所带来的一些常见挑战。

7. Transformers面临的主要挑战

在本章中,我们简要了解了可以用Transformers模型处理的各种NLP任务。阅读媒体报导的标题,有时听起来好像他们的能力是无限的。然而,尽管Transformers很有用,但它们远不是灵丹妙药。以下是一些与之相关的挑战,我们将在整个书中探索:

  • 语言
    自然语言处理的研究以英语为主。对于其他语言也有几种模型,但是很难找到针对罕见或低资源语言的预训练模型。在第4章中,我们将探讨多语言transformers及其执行 zero-shot 跨语言转换的能力。

  • 数据可用性
    虽然我们可以使用迁移学习来显著减少我们的模型需要的标记训练数据的数量,但与人类执行任务的需求相比,这仍然是很多的问题。第9章的主题是处理那些你几乎没有标记数据的场景。

  • 长文档上的应用
    自我注意在长段落的文本中非常有效,但当我们转向像整个文档一样的长段文本时,它会变得非常昂贵。缓解这种情况的方法将在第11章中进行讨论。

  • 不可解释性
    与其他深度学习模型一样,Transformers在很大程度上是不透明的。很难或不可能解释“为什么”模型做出某种预测。当部署这些模型来做出关键决策时,这是一个特别困难的挑战。我们将在第2章和第4章中探讨一些探测Transformers模型误差的方法。

偏见
Transformers模型主要是对来自互联网的文本数据进行预训练的。这将数据中存在的所有偏见都被学习到模型中。确保这些数据既不是种族主义、性别歧视,或者更糟情况,是一项具有挑战性的任务。我们将在第10章中更详细地讨论其中的一些问题。

8. 小结

希望现在你能很兴奋地学习如何开始训练模型,并将这些通用模型集成到你自己的应用程序中!你在本章中看到,只需几行代码,就可以使用最先进的模型进行分类、命名实体识别、问答、翻译和摘要,但这实际上只是“冰山一角”。

在下面的章节中,你将学习如何使Transformers适应广泛的用例,例如构建文本分类器,或用于生产的轻量级模型,甚至从头开始训练语言模型。我们将采取实操的方法来讲解每个概念。

现在我们已经掌握了Transformers背后的基本概念,现在是时候掌握我们的第一个应用程序了:文本分类。这是下一章的主题!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/269745
推荐阅读
相关标签
  

闽ICP备14008679号