Transformers 文档

🤗 Transformers 如何解决任务

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

🤗 Transformers 如何解决任务

🤗 Transformers 可以做什么中,你了解了自然语言处理 (NLP)、语音和音频、计算机视觉任务以及它们的一些重要应用。本页将仔细研究模型如何解决这些任务,并解释幕后发生了什么。解决给定任务的方法有很多种,一些模型可能实现某些技术,甚至从新的角度处理任务,但对于 Transformer 模型,总体思路是相同的。由于其灵活的架构,大多数模型都是编码器、解码器或编码器-解码器结构的变体。除了 Transformer 模型,我们的库还拥有几个卷积神经网络 (CNN),这些网络至今仍用于计算机视觉任务。我们还将解释现代 CNN 的工作原理。

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

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

在你继续深入之前,最好对原始 Transformer 架构有一些基本了解。了解编码器、解码器和注意力机制的工作原理将有助于你理解不同的 Transformer 模型是如何工作的。如果你是刚入门或需要复习,请查看我们的课程以获取更多信息!

语音和音频

Wav2Vec2 是一个自监督模型,在未标记的语音数据上进行预训练,并在标记的数据上进行微调,用于音频分类和自动语音识别。

该模型有四个主要组成部分

  1. 一个特征编码器接收原始音频波形,将其归一化为零均值和单位方差,并将其转换为一系列特征向量,每个向量长 20 毫秒。

  2. 波形本质上是连续的,因此它们不能像文本序列那样被分成单独的单元,文本序列可以被拆分成单词。这就是为什么特征向量被传递到一个量化模块,该模块旨在学习离散的语音单元。语音单元是从一个称为码本的码字集合中选择的(你可以将其视为词汇表)。从码本中,选择最能代表连续音频输入的向量或语音单元,并通过模型转发。

  3. 大约一半的特征向量被随机掩码,并且被掩码的特征向量被馈送到上下文网络,这是一个 Transformer 编码器,它还添加了相对位置嵌入。

  4. 上下文网络的预训练目标是一个对比任务。模型必须从一组错误的预测中预测被掩码预测的真实量化语音表示,从而鼓励模型找到最相似的上下文向量和量化语音单元(目标标签)。

现在 wav2vec2 已经过预训练,你可以将其在你的数据上进行微调,用于音频分类或自动语音识别!

音频分类

要将预训练模型用于音频分类,请在基础 Wav2Vec2 模型之上添加一个序列分类头。分类头是一个线性层,它接受编码器的隐藏状态。隐藏状态表示从每个音频帧学习到的特征,这些特征可能具有不同的长度。为了创建一个固定长度的向量,隐藏状态首先被池化,然后转换为类标签上的 logits。在 logits 和目标之间计算交叉熵损失,以找到最可能的类别。

准备好尝试音频分类了吗?查看我们完整的音频分类指南,了解如何微调 Wav2Vec2 并将其用于推理!

自动语音识别

要将预训练模型用于自动语音识别,请在基础 Wav2Vec2 模型之上添加一个语言建模头,用于连接时序分类 (CTC)。语言建模头是一个线性层,它接受编码器的隐藏状态,并将它们转换为 logits。每个 logit 代表一个 Token 类(Token 的数量来自任务词汇表)。在 logits 和目标之间计算 CTC 损失,以找到最可能的 Token 序列,然后将其解码为转录文本。

准备好尝试自动语音识别了吗?查看我们完整的自动语音识别指南,了解如何微调 Wav2Vec2 并将其用于推理!

计算机视觉

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

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

第三种方法是将 Transformer 与卷积混合使用(例如,Convolutional Vision TransformerLeViT)。我们不会讨论这些,因为它们只是结合了我们在此处考察的两种方法。

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

图像分类

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

Transformer

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

ViT 引入的主要变化在于图像如何馈送到 Transformer

  1. 图像被分割成正方形的非重叠图块,每个图块都变成一个向量或图块嵌入。图块嵌入是从一个卷积 2D 层生成的,该层创建了适当的输入维度(对于基本 Transformer,每个图块嵌入为 768 个值)。如果你有一个 224x224 像素的图像,你可以将其分割成 196 个 16x16 的图像图块。就像文本被标记化为单词一样,图像被“标记化”为图块序列。

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

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

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

准备好尝试图像分类了吗?查看我们完整的图像分类指南,了解如何微调 ViT 并将其用于推理!

CNN

本节简要解释卷积,但事先了解它们如何改变图像的形状和大小会很有帮助。如果你不熟悉卷积,请查看 fastai 书籍中的卷积神经网络章节

ConvNeXT 是一种 CNN 架构,它采用了新的现代网络设计来提高性能。但是,卷积仍然是模型的核心。从高层次的角度来看,卷积是一种操作,其中较小的矩阵(内核)与图像像素的小窗口相乘。它从中计算出一些特征,例如特定纹理或线条的曲率。然后它滑动到下一个像素窗口;卷积移动的距离称为步幅

一个没有填充或步幅的基本卷积,取自深度学习卷积算术指南。

你可以将此输出馈送到另一个卷积层,并且随着每个连续层,网络学习更复杂和抽象的东西,例如热狗或火箭。在卷积层之间,通常添加一个池化层来降低维度,并使模型对特征位置的变化更加鲁棒。

ConvNeXT 以五种方式实现 CNN 的现代化

  1. 更改每个阶段的块数,并使用更大的步幅和相应的内核大小“图块化”图像。非重叠滑动窗口使这种图块化策略类似于 ViT 将图像分割成图块的方式。

  2. 一个瓶颈层缩小了通道数,然后又恢复了它,因为执行 1x1 卷积速度更快,并且你可以增加深度。倒置瓶颈通过扩展通道数并缩小它们来执行相反的操作,这更节省内存。

  3. 将瓶颈层中典型的 3x3 卷积层替换为深度可分离卷积,它将卷积分别应用于每个输入通道,然后在最后将它们堆叠在一起。这扩大了网络宽度,从而提高了性能。

  4. ViT 具有全局感受野,这意味着由于其注意力机制,它可以一次看到更多的图像。ConvNeXT 尝试通过将内核大小增加到 7x7 来复制此效果。

  5. ConvNeXT 还进行了几项模仿 Transformer 模型的层设计更改。激活层和归一化层更少,激活函数切换为 GELU 而不是 ReLU,并且它使用 LayerNorm 而不是 BatchNorm。

卷积块的输出被传递到分类头,该分类头将输出转换为 logits,并计算交叉熵损失以找到最可能的标签。

对象检测

DETRDEtection TRansformer,是一种端到端对象检测模型,它将 CNN 与 Transformer 编码器-解码器相结合。

  1. 预训练的 CNN 骨干网络接收图像(由其像素值表示),并创建它的低分辨率特征图。将 1x1 卷积应用于特征图以降低维度,并创建一个具有高级图像表示的新特征图。由于 Transformer 是一个序列模型,因此特征图被展平为特征向量序列,这些向量与位置嵌入相结合。

  2. 特征向量被传递到编码器,编码器使用其注意力层学习图像表示。接下来,编码器隐藏状态与解码器中的对象查询相结合。对象查询是学习到的嵌入,它们专注于图像的不同区域,并且它们在通过每个注意力层时都会更新。解码器隐藏状态被传递到前馈网络,该网络预测每个对象查询的边界框坐标和类别标签,如果没有对象,则预测 no object

    DETR 并行解码每个对象查询,以输出 N 个最终预测,其中 N 是查询的数量。与一次预测一个元素的典型自回归模型不同,对象检测是一个集合预测任务(bounding boxclass label),它在一次传递中进行 N 个预测。

  3. DETR 在训练期间使用二分图匹配损失,将固定数量的预测与固定的一组真值标签进行比较。如果 N 个标签集中真值标签较少,则用 no object 类填充它们。此损失函数鼓励 DETR 在预测和真值标签之间找到一对一的分配。如果边界框或类别标签不正确,则会产生损失。同样,如果 DETR 预测了一个不存在的对象,它也会受到惩罚。这鼓励 DETR 在图像中找到其他对象,而不是专注于一个非常突出的对象。

在 DETR 之上添加了一个对象检测头,以找到类别标签和边界框的坐标。对象检测头有两个组成部分:一个线性层,用于将解码器隐藏状态转换为类别标签上的 logits,以及一个 MLP,用于预测边界框。

准备好尝试对象检测了吗?查看我们完整的对象检测指南,了解如何微调 DETR 并将其用于推理!

图像分割

Mask2Former 是一种通用架构,用于解决所有类型的图像分割任务。传统的分割模型通常是为图像分割的特定子任务量身定制的,例如实例分割、语义分割或全景分割。Mask2Former 将每个任务都框定为掩码分类问题。掩码分类将像素分组为 N 个段,并为给定图像预测 N 个掩码及其相应的类别标签。我们将在本节中解释 Mask2Former 的工作原理,然后你可以在最后尝试微调 SegFormer。

Mask2Former 有三个主要组成部分

  1. 一个 Swin 骨干网络接收图像,并通过 3 个连续的 3x3 卷积创建低分辨率图像特征图。

  2. 特征图被传递到一个像素解码器,它逐渐将低分辨率特征上采样为高分辨率的逐像素嵌入。像素解码器实际上生成多尺度特征(包含低分辨率和高分辨率特征),分辨率为原始图像的 1/32、1/16 和 1/8。

  3. 这些不同尺度的特征图中的每一个都依次馈送到一个 Transformer 解码器层,以便从高分辨率特征中捕获小对象。Mask2Former 的关键是解码器中的掩码注意力机制。与可以关注整个图像的交叉注意力不同,掩码注意力仅关注图像的特定区域。这更快,并且可以带来更好的性能,因为图像的局部特征足以供模型学习。

  4. DETR 类似,Mask2Former 也使用学习到的对象查询,并将它们与来自像素解码器的图像特征相结合,以进行集合预测(class labelmask prediction)。解码器隐藏状态被传递到一个线性层,并转换为类别标签上的 logits。在 logits 和类别标签之间计算交叉熵损失,以找到最可能的类别标签。

    掩码预测是通过将像素嵌入与最终解码器隐藏状态相结合生成的。在 logits 和真值掩码之间计算 sigmoid 交叉熵和 Dice 损失,以找到最可能的掩码。

准备好尝试图像分割了吗?查看我们完整的图像分割指南,了解如何微调 SegFormer 并将其用于推理!

深度估计

GLPNGlobal-Local Path Network,是一个用于深度估计的 Transformer,它结合了 SegFormer 编码器和一个轻量级解码器。

  1. 与 ViT 类似,图像被分割成一系列图块,但这些图像图块更小。这对于诸如分割或深度估计之类的密集预测任务更好。图像图块被转换为图块嵌入(有关如何创建图块嵌入的更多详细信息,请参阅图像分类部分),这些嵌入被馈送到编码器。

  2. 编码器接受图块嵌入,并将它们传递到多个编码器块中。每个块由注意力层和 Mix-FFN 层组成。后者的目的是提供位置信息。在每个编码器块的末尾是一个图块合并层,用于创建分层表示。每个相邻图块组的特征被连接起来,并且将线性层应用于连接的特征以将图块数量减少到 1/4 的分辨率。这成为下一个编码器块的输入,其中重复整个过程,直到您获得分辨率为 1/8、1/16 和 1/32 的图像特征。

  3. 一个轻量级解码器从编码器获取最后一个特征图(1/32 比例),并将其上采样到 1/16 比例。从这里,该特征被传递到 Selective Feature Fusion (SFF) 模块,该模块为每个特征从注意力图中选择和组合局部和全局特征,然后将其上采样到 1/8。重复此过程,直到解码后的特征与原始图像的大小相同。输出通过两个卷积层,然后应用 sigmoid 激活来预测每个像素的深度。

自然语言处理

Transformer 最初是为机器翻译设计的,从那时起,它实际上已成为解决所有 NLP 任务的默认架构。有些任务适合 Transformer 的编码器结构,而另一些任务更适合解码器。还有一些任务同时使用 Transformer 的编码器-解码器结构。

文本分类

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

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

  2. BERT 通过两个目标进行预训练:masked language modeling 和 next-sentence prediction。在 masked language modeling 中,输入标记的某些百分比被随机屏蔽,模型需要预测这些标记。这解决了双向性的问题,即模型可能会作弊并看到所有单词并“预测”下一个单词。预测的掩码标记的最终隐藏状态被传递到具有词汇表上 softmax 的前馈网络,以预测被掩码的单词。

    第二个预训练目标是 next-sentence prediction。模型必须预测句子 B 是否跟随句子 A。一半的时间句子 B 是下一个句子,另一半时间,句子 B 是一个随机句子。预测(无论是下一个句子还是不是下一个句子)都被传递到具有两个类别(IsNextNotNext)的 softmax 的前馈网络。

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

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

准备好尝试文本分类了吗?查看我们完整的文本分类指南,了解如何微调 DistilBERT 并将其用于推理!

标记分类

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

准备好尝试标记分类了吗?查看我们完整的标记分类指南,了解如何微调 DistilBERT 并将其用于推理!

问答

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

准备好尝试问答了吗?查看我们完整的问答指南,了解如何微调 DistilBERT 并将其用于推理!

💡 请注意,一旦 BERT 经过预训练,将其用于不同任务是多么容易。您只需要在预训练模型中添加一个特定的头,即可将隐藏状态操纵成您期望的输出!

文本生成

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

  1. GPT-2 使用 byte pair encoding (BPE) 来标记化单词并生成标记嵌入。位置编码被添加到标记嵌入中,以指示序列中每个标记的位置。输入嵌入通过多个解码器块传递,以输出一些最终的隐藏状态。在每个解码器块中,GPT-2 使用 masked self-attention 层,这意味着 GPT-2 无法关注未来的标记。它只允许关注左侧的标记。这与 BERT 的 mask 标记不同,因为在 masked self-attention 中,注意力掩码用于将未来标记的分数设置为 0

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

GPT-2 的预训练目标完全基于 causal language modeling,即预测序列中的下一个单词。这使得 GPT-2 特别擅长涉及生成文本的任务。

准备好尝试文本生成了吗?查看我们完整的causal language modeling 指南,了解如何微调 DistilGPT-2 并将其用于推理!

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

摘要

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

  1. BART 的编码器架构与 BERT 非常相似,并且接受文本的标记和位置嵌入。BART 通过破坏输入然后使用解码器重建输入来进行预训练。与其他具有特定破坏策略的编码器不同,BART 可以应用任何类型的破坏。但是,text infilling 破坏策略效果最佳。在 text infilling 中,许多文本跨度被替换为单个 mask 标记。这很重要,因为模型必须预测被掩码的标记,并且它教会模型预测缺失标记的数量。输入嵌入和掩码跨度通过编码器传递以输出一些最终的隐藏状态,但与 BERT 不同,BART 不会在最后添加最终的前馈网络来预测单词。

  2. 编码器的输出被传递到解码器,解码器必须预测被掩码的标记以及来自编码器输出的任何未损坏的标记。这提供了额外的上下文来帮助解码器恢复原始文本。来自解码器的输出被传递到语言建模头,该头执行线性变换以将隐藏状态转换为 logits。在 logits 和标签之间计算交叉熵损失,标签只是向右移动的标记。

准备好尝试摘要了吗?查看我们完整的摘要指南,了解如何微调 T5 并将其用于推理!

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

翻译

翻译是 sequence-to-sequence 任务的另一个示例,这意味着您可以使用像 BARTT5 这样的编码器-解码器模型来完成它。我们将在本节中解释 BART 的工作原理,然后您可以在最后尝试微调 T5。

BART 通过添加一个单独的随机初始化的编码器来适应翻译,以将源语言映射到可以解码为目标语言的输入。这个新编码器的嵌入被传递到预训练的编码器,而不是原始的单词嵌入。源编码器通过使用模型输出的交叉熵损失更新源编码器、位置嵌入和输入嵌入来训练。模型参数在第一步中被冻结,所有模型参数在第二步中一起训练。

BART 之后又推出了多语言版本 mBART,旨在用于翻译并在多种不同语言上进行了预训练。

准备好尝试翻译了吗?查看我们完整的翻译指南,了解如何微调 T5 并将其用于推理!

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

< > 在 GitHub 上更新