Transformer 文档

🤗 Transformer 如何解决任务

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

🤗 Transformer 如何解决任务

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

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

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

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

语音和音频

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

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

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

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

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

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

现在 wav2vec2 已经预训练,您可以使用您的数据对它进行微调,以进行音频分类或自动语音识别!

音频分类

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

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

自动语音识别

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

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

计算机视觉

解决计算机视觉任务有两种方法

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

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

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

图像分类

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

Transformer

ViT 完全用纯 Transformer 架构取代了卷积。如果您熟悉原始 Transformer,那么您已经掌握了理解 ViT 的大部分知识。

ViT 主要变化在于如何将图像输入 Transformer。

  1. 图像被分割成正方形的、不重叠的补丁,每个补丁都被转换成向量或*补丁嵌入*。补丁嵌入由一个二维卷积层生成,该层创建适当的输入维度(对于基本 Transformer,每个补丁嵌入为 768 个值)。如果你有一个 224x224 像素的图像,你可以将其分割成 196 个 16x16 的图像补丁。就像文本被标记成词一样,图像被“标记”成一系列补丁。

  2. 类似 BERT,一个*可学习嵌入* - 一个特殊的 [CLS] token - 被添加到补丁嵌入的开头。[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 模型的层设计更改。激活和归一化层更少,激活函数从 ReLU 切换到 GELU,并且使用 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 和类别标签之间计算,以找到最可能的类别。

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

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

深度估计

GLPN全局局部路径网络,是一个用于深度估计的 Transformer,它结合了 SegFormer 编码器和一个轻量级解码器。

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

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

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

自然语言处理

Transformer 最初是为机器翻译设计的,从那时起,它实际上已成为解决所有 NLP 任务的默认架构。一些任务适合 Transformer 的编码器结构,而另一些任务更适合解码器。尽管如此,其他任务也利用了 Transformer 的编码器-解码器结构。

文本分类

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 在预训练后,用于不同任务有多么容易。你只需要在预训练模型之上添加一个特定的头,就可以将隐藏状态操作为你想要的输出!

文本生成

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

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

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

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

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

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

摘要

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

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

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

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

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

翻译

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

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

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

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

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

< > 在 GitHub 上更新