LLM 课程文档

🤗 Transformers 如何解决任务

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

🤗 Transformers 如何解决任务

Transformer 能做什么? 一节中,您了解了自然语言处理(NLP)、语音和音频、计算机视觉任务以及它们的一些重要应用。本页将深入探讨模型如何解决这些任务,并解释其内部工作原理。解决特定任务的方法有很多,一些模型可能会实现某些技术,甚至从新的角度来处理任务,但对于 Transformer 模型,其基本思想是相同的。由于其灵活的架构,大多数模型都是编码器、解码器或编码器-解码器结构的变体。

在深入研究具体的架构变体之前,了解大多数任务都遵循一个相似的模式是很有帮助的:输入数据通过模型处理,然后输出被解释用于特定任务。不同之处在于数据的准备方式、使用的模型架构变体以及输出的处理方式。

为了解释任务是如何解决的,我们将逐步介绍模型内部发生的事情,以输出有用的预测。我们将涵盖以下模型及其对应的任务:

  • Wav2Vec2 用于音频分类和自动语音识别(ASR)
  • Vision Transformer (ViT)ConvNeXT 用于图像分类
  • DETR 用于目标检测
  • Mask2Former 用于图像分割
  • GLPN 用于深度估计
  • BERT 用于使用编码器的 NLP 任务,如文本分类、词元分类和问答
  • GPT2 用于使用解码器的 NLP 任务,如文本生成
  • BART 用于使用编码器-解码器的 NLP 任务,如摘要和翻译

在继续之前,最好对原始的 Transformer 架构有一些基本的了解。了解编码器、解码器和注意力机制的工作原理将有助于您理解不同 Transformer 模型的工作方式。请务必查看我们的上一节以获取更多信息!

用于语言的 Transformer 模型

语言模型是现代 NLP 的核心。它们通过学习文本中词语或词元之间的统计模式和关系,来理解和生成人类语言。

Transformer 最初是为机器翻译设计的,此后,它已成为解决所有 AI 任务的默认架构。有些任务更适合 Transformer 的编码器结构,而另一些任务则更适合解码器。还有一些任务同时利用了 Transformer 的编码器-解码器结构。

语言模型的工作原理

语言模型通过训练来预测给定上下文下某个词语的概率。这使它们对语言有了基础的理解,可以推广到其他任务。

训练 Transformer 模型主要有两种方法:

  1. 掩码语言建模(MLM):由像 BERT 这样的编码器模型使用,这种方法随机掩盖输入中的一些词元,并训练模型根据周围的上下文预测原始词元。这使得模型能够学习双向上下文(同时关注被掩盖词语之前和之后的词语)。

  2. 因果语言建模(CLM):由像 GPT 这样的解码器模型使用,这种方法根据序列中所有之前的词元来预测下一个词元。模型只能使用左侧(之前的词元)的上下文来预测下一个词元。

语言模型的类型

在 Transformers 库中,语言模型通常分为三种架构类别:

  1. 仅编码器模型(如 BERT):这些模型使用双向方法来理解来自两个方向的上下文。它们最适合需要深入理解文本的任务,如分类、命名实体识别和问答。

  2. 仅解码器模型(如 GPT、Llama):这些模型从左到右处理文本,特别擅长文本生成任务。它们可以根据提示完成句子、写文章,甚至生成代码。

  3. 编码器-解码器模型(如 T5、BART):这些模型结合了两种方法,使用编码器理解输入,使用解码器生成输出。它们在序列到序列任务中表现出色,如翻译、摘要和问答。

transformer-models-for-language

正如我们在上一节中介绍的,语言模型通常在大量文本数据上以自监督的方式(无需人工标注)进行预训练,然后在特定任务上进行微调。这种被称为迁移学习的方法,使得这些模型能够用相对少量的任务特定数据适应许多不同的 NLP 任务。

在接下来的部分中,我们将探讨特定的模型架构以及它们如何应用于语音、视觉和文本领域的各种任务。

了解 Transformer 架构的哪个部分(编码器、解码器或两者)最适合特定的 NLP 任务是选择正确模型的关键。通常,需要双向上下文的任务使用编码器,生成文本的任务使用解码器,而将一个序列转换为另一个序列的任务则使用编码器-解码器。

文本生成

文本生成涉及根据提示或输入创建连贯且与上下文相关的文本。

GPT-2 是一个在大量文本上预训练的仅解码器模型。它可以在给定提示的情况下生成令人信服(尽管不总是真实的!)的文本,并完成其他 NLP 任务,如问答,尽管没有明确为此进行训练。

  1. GPT-2 使用字节对编码 (BPE) 来对词语进行分词并生成词元嵌入。位置编码被添加到词元嵌入中,以指示序列中每个词元的位置。输入嵌入通过多个解码器块,输出最终的隐藏状态。在每个解码器块中,GPT-2 使用一个掩码自注意力层,这意味着 GPT-2 不能关注未来的词元。它只被允许关注左边的词元。这与 BERT 的 [mask] 词元不同,因为在掩码自注意力中,注意力掩码用于将未来词元的分数设置为 0

  2. 解码器的输出传递给一个语言建模头,该头进行线性变换,将隐藏状态转换为 logits。标签是序列中的下一个词元,这是通过将 logits 向右移动一位创建的。在移位的 logits 和标签之间计算交叉熵损失,以输出下一个最可能的词元。

GPT-2 的预训练目标完全基于因果语言建模,即预测序列中的下一个词。这使得 GPT-2 特别擅长涉及生成文本的任务。

准备好尝试文本生成了吗?查看我们完整的因果语言建模指南,学习如何微调 DistilGPT-2 并用它进行推理!

有关文本生成的更多信息,请查看[文本生成策略](generation_strategies)指南!

文本分类

文本分类涉及为文本文档分配预定义的类别,例如情感分析、主题分类或垃圾邮件检测。

BERT 是一个仅编码器模型,是第一个有效实现深度双向性以通过关注两侧的词语来学习更丰富的文本表示的模型。

  1. BERT 使用 WordPiece 分词法来生成文本的词元嵌入。为了区分单个句子和句子对,会添加一个特殊的 [SEP] 词元来区分它们。在每个文本序列的开头都会添加一个特殊的 [CLS] 词元。带有 [CLS] 词元的最终输出被用作分类头的输入,用于分类任务。BERT 还添加了一个片段嵌入,以表示一个词元属于句子对中的第一个句子还是第二个句子。

  2. BERT 的预训练有两个目标:掩码语言建模和下一句预测。在掩码语言建模中,输入词元中一定比例的词元被随机掩盖,模型需要预测这些词元。这解决了双向性的问题,即模型可能会作弊,看到所有的词语然后“预测”下一个词。预测的掩码词元的最终隐藏状态被传递到一个前馈网络,该网络对词汇表进行 softmax,以预测被掩盖的词语。

    第二个预训练目标是下一句预测。模型必须预测句子 B 是否跟随句子 A。一半的时间,句子 B 是下一句,另一半的时间,句子 B 是一个随机的句子。预测结果(是否是下一句)被传递到一个前馈网络,该网络对两个类别(IsNextNotNext)进行 softmax。

  3. 输入嵌入通过多个编码器层,输出最终的隐藏状态。

要将预训练模型用于文本分类,需要在基础 BERT 模型之上添加一个序列分类头。序列分类头是一个线性层,它接受最终的隐藏状态并进行线性变换,将其转换为 logits。在 logits 和目标之间计算交叉熵损失,以找到最可能的标签。

准备好尝试文本分类了吗?查看我们完整的文本分类指南,学习如何微调 DistilBERT 并用它进行推理!

词元分类

词元分类涉及为序列中的每个词元分配一个标签,例如在命名实体识别或词性标注中。

要将 BERT 用于命名实体识别(NER)等词元分类任务,需要在基础 BERT 模型之上添加一个词元分类头。词元分类头是一个线性层,它接受最终的隐藏状态并进行线性变换,将其转换为 logits。在 logits 和每个词元之间计算交叉熵损失,以找到最可能的标签。

准备好尝试词元分类了吗?查看我们完整的词元分类指南,学习如何微调 DistilBERT 并用它进行推理!

问答

问答涉及在给定的上下文或段落中找到问题的答案。

要将 BERT 用于问答,需要在基础 BERT 模型之上添加一个跨度分类头。这个线性层接受最终的隐藏状态并进行线性变换,以计算对应于答案的跨度开始和结束 logits。在 logits 和标签位置之间计算交叉熵损失,以找到与答案相对应的最可能的文本跨度。

准备好尝试问答任务了吗?查看我们完整的问答指南,学习如何微调 DistilBERT 并用它进行推理!

💡 注意到 BERT 在预训练后,用于不同任务是多么容易。您只需要在预训练模型上添加一个特定的头,就可以将隐藏状态处理成您想要的输出!

摘要

摘要涉及将较长的文本压缩成较短的版本,同时保留其关键信息和意义。

BARTT5 这样的编码器-解码器模型是为摘要任务的序列到序列模式设计的。我们将在本节中解释 BART 的工作原理,然后您可以在最后尝试微调 T5。

  1. BART 的编码器架构与 BERT 非常相似,接受文本的词元和位置嵌入。BART 的预训练方式是破坏输入,然后用解码器重建它。与其他具有特定破坏策略的编码器不同,BART 可以应用任何类型的破坏。其中,文本填充破坏策略效果最好。在文本填充中,多个文本跨度被替换为单个 [mask] 词元。这很重要,因为模型必须预测被掩盖的词元,这也教会了模型预测缺失词元的数量。输入嵌入和被掩盖的跨度通过编码器输出最终的隐藏状态,但与 BERT 不同,BART 不在末尾添加最终的前馈网络来预测一个词。

  2. 编码器的输出被传递给解码器,解码器必须预测被掩盖的词元以及编码器输出中任何未被破坏的词元。这为解码器恢复原始文本提供了额外的上下文。解码器的输出被传递给一个语言建模头,该头进行线性变换,将隐藏状态转换为 logits。在 logits 和标签(即向右移动一位的词元)之间计算交叉熵损失。

准备好尝试摘要任务了吗?查看我们完整的摘要指南,学习如何微调 T5 并用它进行推理!

有关文本生成的更多信息,请查看文本生成策略指南!

翻译

翻译涉及将文本从一种语言转换为另一种语言,同时保留其含义。翻译是序列到序列任务的另一个例子,这意味着您可以使用像 BARTT5 这样的编码器-解码器模型来完成。我们将在本节中解释 BART 的工作原理,然后您可以在最后尝试微调 T5。

BART 通过添加一个独立的随机初始化的编码器来适应翻译任务,该编码器将源语言映射为可以被解码为目标语言的输入。这个新编码器的嵌入被传递给预训练的编码器,而不是原始的词嵌入。源编码器通过使用模型输出的交叉熵损失来更新源编码器、位置嵌入和输入嵌入进行训练。模型参数在第一步中被冻结,然后在第二步中所有模型参数一起进行训练。BART 后来推出了一个多语言版本 mBART,专门用于翻译,并在多种不同语言上进行了预训练。

准备好尝试翻译任务了吗?查看我们完整的翻译指南,学习如何微调 T5 并用它进行推理!

正如您在本指南中所看到的,许多模型尽管处理不同的任务,却遵循相似的模式。理解这些共同的模式可以帮助您快速掌握新模型的工作原理,以及如何将现有模型调整以适应您的特定需求。

超越文本的模态

Transformer 不仅限于文本。它们也可以应用于其他模态,如语音和音频、图像和视频。当然,在本课程中,我们将重点关注文本,但我们可以简要介绍其他模态。

语音和音频

让我们首先探讨 Transformer 模型如何处理语音和音频数据,与文本或图像相比,这带来了独特的挑战。

Whisper 是一个编码器-解码器(序列到序列)Transformer,在 68 万小时的有标签音频数据上进行了预训练。如此大量的预训练数据使其能够在英语和许多其他语言的音频任务上实现零样本性能。解码器使 Whisper 能够将其学习到的语音表示映射到有用的输出,如文本,而无需额外的微调。Whisper 可以开箱即用。

图表来自 Whisper 论文

该模型有两个主要组成部分:

  1. 一个编码器处理输入音频。原始音频首先被转换为对数梅尔频谱图。然后,该频谱图通过一个 Transformer 编码器网络。

  2. 一个解码器接收编码后的音频表示,并自回归地预测相应的文本词元。它是一个标准的 Transformer 解码器,经过训练,在给定先前的词元和编码器输出的情况下,预测下一个文本词元。在解码器输入的开头使用特殊词元,以引导模型执行特定任务,如转录、翻译或语言识别。

Whisper 在一个庞大而多样化的数据集上进行了预训练,该数据集包含从网络上收集的 68 万小时的有标签音频数据。这种大规模、弱监督的预训练是其在多种语言和任务上实现强大零样本性能的关键。

现在 Whisper 已经预训练好了,您可以直接用它进行零样本推理,或者在您的数据上进行微调,以在特定任务(如自动语音识别或语音翻译)上获得更好的性能!

Whisper 的关键创新在于其训练数据规模空前,包含了来自互联网的多样化、弱监督的音频数据。这使得它能够非常好地泛化到不同的语言、口音和任务,而无需进行特定任务的微调。

自动语音识别

要将预训练模型用于自动语音识别,您需要利用其完整的编码器-解码器结构。编码器处理音频输入,解码器自回归地逐个词元生成转录文本。在微调时,模型通常使用标准的序列到序列损失(如交叉熵)进行训练,以根据音频输入预测正确的文本词元。

使用微调模型进行推理的最简单方法是在 pipeline 中使用。

from transformers import pipeline

transcriber = pipeline(
    task="automatic-speech-recognition", model="openai/whisper-base.en"
)
transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
# Output: {'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}

准备好尝试自动语音识别了吗?查看我们完整的自动语音识别指南,学习如何微调 Whisper 并用它进行推理!

计算机视觉

现在让我们转向计算机视觉任务,这些任务涉及理解和解释来自图像或视频的视觉信息。

处理计算机视觉任务有两种方法:

  1. 将图像分割成一系列图像块,并用 Transformer 并行处理它们。
  2. 使用现代的 CNN,如 ConvNeXT,它依赖于卷积层,但采用了现代的网络设计。

第三种方法是将 Transformer 与卷积结合起来(例如,卷积视觉 TransformerLeViT)。我们不会讨论这些,因为它们只是结合了我们在此研究的两种方法。

ViT 和 ConvNeXT 通常用于图像分类,但对于其他视觉任务,如目标检测、分割和深度估计,我们将分别研究 DETR、Mask2Former 和 GLPN;这些模型更适合这些任务。

图像分类

图像分类是计算机视觉的基础任务之一。让我们看看不同的模型架构如何解决这个问题。

ViT 和 ConvNeXT 都可以用于图像分类;主要区别在于 ViT 使用注意力机制,而 ConvNeXT 使用卷积。

ViT 完全用纯 Transformer 架构取代了卷积。如果您熟悉原始的 Transformer,那么您已经基本理解了 ViT。

ViT 引入的主要变化在于如何将图像输入到 Transformer 中:

  1. 一张图像被分割成多个不重叠的方形图像块,每个图像块都变成一个向量或图像块嵌入。图像块嵌入由一个二维卷积层生成,该层创建了正确的输入维度(对于基础 Transformer 来说,每个图像块嵌入有 768 个值)。如果您有一张 224x224 像素的图像,您可以将其分割成 196 个 16x16 的图像块。就像文本被分词成词语一样,图像被“分词”成一个图像块序列。

  2. 一个可学习的嵌入——一个特殊的 [CLS] 词元——被添加到图像块嵌入的开头,就像 BERT 一样。[CLS] 词元的最终隐藏状态被用作附加的分类头的输入;其他输出则被忽略。这个词元帮助模型学习如何编码图像的表示。

  3. 最后要添加到图像块和可学习嵌入中的是位置嵌入,因为模型不知道图像块的排列顺序。位置嵌入也是可学习的,并且与图像块嵌入具有相同的大小。最后,所有嵌入都被传递给 Transformer 编码器。

  4. 输出,特别是仅包含 [CLS] 词元的输出,被传递给一个多层感知器头(MLP)。ViT 的预训练目标就是分类。与其他分类头一样,MLP 头将输出转换为类别标签上的 logits,并计算交叉熵损失以找到最可能的类别。

准备好尝试图像分类了吗?查看我们完整的图像分类指南,学习如何微调 ViT 并用它进行推理!

注意 ViT 和 BERT 之间的相似之处:两者都使用一个特殊的词元([CLS])来捕捉整体表示,两者都在其嵌入中添加了位置信息,并且两者都使用 Transformer 编码器来处理词元/图像块序列。

< > 在 GitHub 上更新