Transformers 文档

术语表

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

术语表

本术语表定义了通用的机器学习和 🤗 Transformers 术语,以帮助您更好地理解文档。

A

注意力掩码

注意力掩码是批量处理序列时使用的可选参数。

此参数向模型指示应关注哪些 tokens,以及不应关注哪些。

例如,考虑以下两个序列

>>> from transformers import BertTokenizer

>>> tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-cased")

>>> sequence_a = "This is a short sequence."
>>> sequence_b = "This is a rather long sequence. It is at least longer than the sequence A."

>>> encoded_sequence_a = tokenizer(sequence_a)["input_ids"]
>>> encoded_sequence_b = tokenizer(sequence_b)["input_ids"]

编码后的版本具有不同的长度

>>> len(encoded_sequence_a), len(encoded_sequence_b)
(8, 19)

因此,我们不能按原样将它们放在同一个张量中。第一个序列需要填充到第二个序列的长度,或者第二个序列需要截断到第一个序列的长度。

在第一种情况下,ID 列表将通过填充索引进行扩展。我们可以将列表传递给分词器,并要求它像这样填充

>>> padded_sequences = tokenizer([sequence_a, sequence_b], padding=True)

我们可以看到,在第一个句子的右侧添加了 0,使其与第二个句子长度相同

>>> padded_sequences["input_ids"]
[[101, 1188, 1110, 170, 1603, 4954, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 1188, 1110, 170, 1897, 1263, 4954, 119, 1135, 1110, 1120, 1655, 2039, 1190, 1103, 4954, 138, 119, 102]]

然后可以将其转换为 PyTorch 或 TensorFlow 中的张量。注意力掩码是一个二进制张量,指示填充索引的位置,以便模型不会关注它们。对于 BertTokenizer1 表示应该关注的值,而 0 表示填充值。此注意力掩码位于分词器返回的字典中,键为 “attention_mask”

>>> padded_sequences["attention_mask"]
[[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

autoencoding models

请参阅 编码器模型掩码语言建模

autoregressive models

请参阅 因果语言建模解码器模型

B

backbone

backbone 是输出原始隐藏状态或特征的网络(嵌入和层)。它通常连接到一个 head,后者接受这些特征作为输入来进行预测。例如,ViTModel 是一个没有特定 head 的 backbone。其他模型也可以使用 VitModel 作为 backbone,例如 DPT

C

因果语言建模

一种预训练任务,模型按顺序读取文本,并且必须预测下一个单词。它通常通过读取整个句子来完成,但在模型内部使用掩码来隐藏特定时间步的未来 token。

通道

彩色图像由三个通道中的值的某种组合构成:红色、绿色和蓝色 (RGB),而灰度图像只有一个通道。在 🤗 Transformers 中,通道可以是图像张量的第一个或最后一个维度:[n_channels, height, width] 或 [height, width, n_channels]。

连接时序分类 (CTC)

一种算法,允许模型在不知道输入和输出如何精确对齐的情况下进行学习;CTC 计算给定输入的所有可能输出的分布,并从中选择最可能的输出。CTC 常用于语音识别任务,因为由于说话人不同的语速等多种原因,语音并不总是与文本记录完全对齐。

卷积

神经网络中一种类型的层,其中输入矩阵与一个较小的矩阵(核或滤波器)逐元素相乘,并将值求和到一个新的矩阵中。这被称为卷积运算,该运算在整个输入矩阵上重复进行。每个运算都应用于输入矩阵的不同片段。卷积神经网络 (CNN) 常用于计算机视觉。

D

DataParallel (DP)

一种在多个 GPU 上进行训练的并行技术,其中相同的设置被多次复制,每个实例接收不同的数据切片。处理并行完成,所有设置在每个训练步骤结束时同步。

了解更多关于 DataParallel 如何工作的信息,请点击这里

decoder input IDs

此输入特定于编码器-解码器模型,并且包含将馈送到解码器的输入 ID。这些输入应用于序列到序列任务,例如翻译或摘要,并且通常以特定于每个模型的方式构建。

大多数编码器-解码器模型 (BART, T5) 从 labels 中自行创建 decoder_input_ids。在这样的模型中,传递 labels 是处理训练的首选方式。

请查看每个模型的文档,以了解它们如何处理序列到序列训练的这些输入 ID。

解码器模型

解码器模型也称为自回归模型,涉及预训练任务(称为因果语言建模),其中模型按顺序读取文本,并且必须预测下一个单词。它通常通过读取带有掩码的整个句子来完成,以隐藏特定时间步的未来 token。

深度学习 (DL)

使用具有多个层的神经网络的机器学习算法。

E

编码器模型

编码器模型也称为自编码模型,它接受输入(例如文本或图像)并将其转换为称为嵌入的浓缩数值表示形式。通常,编码器模型使用诸如 masked language modeling(掩码语言建模)之类的技术进行预训练,该技术掩盖输入序列的部分内容,并迫使模型创建更有意义的表示形式。

F

特征提取

将原始数据选择和转换为一组对于机器学习算法而言信息量更大且更有用的特征的过程。特征提取的一些示例包括将原始文本转换为词嵌入,以及从图像/视频数据中提取重要特征(例如边缘或形状)。

前馈分块

在 transformers 的每个残差注意力块中,自注意力层之后通常是 2 个前馈层。前馈层的中间嵌入大小通常大于模型的隐藏大小(例如,对于 google-bert/bert-base-uncased)。

对于大小为 [batch_size, sequence_length] 的输入,存储中间前馈嵌入 [batch_size, sequence_length, config.intermediate_size] 所需的内存可能占内存使用量的很大一部分。Reformer: The Efficient Transformer 的作者注意到,由于计算独立于 sequence_length 维度,因此在数学上等效于分别计算两个前馈层 [batch_size, config.hidden_size]_0, ..., [batch_size, config.hidden_size]_n 的输出嵌入,然后将它们连接到 [batch_size, sequence_length, config.hidden_size],其中 n = sequence_length,这牺牲了计算时间来减少内存使用,但产生了数学上等效的结果。

对于使用函数 apply_chunking_to_forward() 的模型,chunk_size 定义了并行计算的输出嵌入的数量,因此定义了内存和时间复杂度之间的权衡。如果 chunk_size 设置为 0,则不进行前馈分块。

微调模型

微调是一种迁移学习的形式,它涉及采用预训练模型,冻结其权重,并将输出层替换为新添加的 模型 head。模型 head 在您的目标数据集上进行训练。

有关更多详细信息,请参阅微调预训练模型教程,并了解如何使用 🤗 Transformers 微调模型。

H

head

模型 head 指的是神经网络的最后一层,它接受原始隐藏状态并将它们投影到不同的维度上。每个任务都有不同的模型 head。例如

I

图像块

基于视觉的 Transformers 模型将图像分割成更小的块,这些块被线性嵌入,然后作为序列传递给模型。您可以在模型的配置中找到模型的 patch_size - 或分辨率。

推理

推理是在训练完成后在新数据上评估模型的过程。请参阅 推理Pipeline 教程,了解如何使用 🤗 Transformers 执行推理。

input IDs

input IDs 通常是传递给模型作为输入的唯一必需参数。它们是 token 索引,是构建将用作模型输入的序列的 token 的数值表示。

每个 tokenizer 的工作方式都不同,但底层机制保持不变。这是一个使用 BERT tokenizer 的示例,它是一个 WordPiece tokenizer

>>> from transformers import BertTokenizer

>>> tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-cased")

>>> sequence = "A Titan RTX has 24GB of VRAM"

Tokenizer 负责将序列拆分为 tokenizer 词汇表中可用的 token。

>>> tokenized_sequence = tokenizer.tokenize(sequence)

token 可以是单词或子词。例如,这里的 “VRAM” 不在模型词汇表中,因此它被拆分为 “V”、“RA” 和 “M”。为了指示这些 token 不是单独的单词,而是同一单词的一部分,为 “RA” 和 “M” 添加了双哈希前缀

>>> print(tokenized_sequence)
['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M']

然后可以将这些 token 转换为模型可以理解的 ID。这可以通过直接将句子馈送到 tokenizer 来完成,tokenizer 利用 🤗 Tokenizers 的 Rust 实现来实现最佳性能。

>>> inputs = tokenizer(sequence)

Tokenizer 返回一个字典,其中包含其对应模型正常工作所需的所有参数。token 索引位于键 input_ids

>>> encoded_sequence = inputs["input_ids"]
>>> print(encoded_sequence)
[101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102]

请注意,tokenizer 会自动添加“特殊 token”(如果关联的模型依赖于它们),这些是模型有时使用的特殊 ID。

如果我们解码之前的 ID 序列,

>>> decoded_sequence = tokenizer.decode(encoded_sequence)

我们将看到

>>> print(decoded_sequence)
[CLS] A Titan RTX has 24GB of VRAM [SEP]

因为这是 BertModel 期望其输入的方式。

L

labels

labels 是一个可选参数,可以传递该参数以使模型自行计算损失。这些 labels 应该是模型的预期预测:它将使用标准损失来计算其预测值与期望值(label)之间的损失。

这些 labels 根据模型 head 的不同而有所不同,例如

  • 对于序列分类模型 (BertForSequenceClassification),模型期望维度为 (batch_size) 的张量,其中批次的每个值对应于整个序列的预期 label。
  • 对于 token 分类模型 (BertForTokenClassification),模型期望维度为 (batch_size, seq_length) 的张量,其中每个值对应于每个单独 token 的预期 label。
  • 对于掩码语言建模 (BertForMaskedLM),模型期望维度为 (batch_size, seq_length) 的张量,其中每个值对应于每个单独 token 的预期 label:labels 是掩码 token 的 token ID,其余的值将被忽略(通常为 -100)。
  • 对于序列到序列任务 (BartForConditionalGeneration, MBartForConditionalGeneration),模型期望维度为 (batch_size, tgt_seq_length) 的张量,其中每个值对应于与每个输入序列关联的目标序列。在训练期间,BART 和 T5 都将在内部生成适当的 decoder_input_ids 和解码器注意力掩码。通常不需要提供它们。这不适用于利用 Encoder-Decoder 框架的模型。
  • 对于图像分类模型 (ViTForImageClassification),模型期望维度为 (batch_size) 的张量,其中批次的每个值对应于每个单独图像的预期 label。
  • 对于语义分割模型 (SegformerForSemanticSegmentation),模型期望维度为 (batch_size, height, width) 的张量,其中批次的每个值对应于每个单独像素的预期 label。
  • 对于目标检测模型 (
  • 对于自动语音识别模型 (

每个模型的标签可能有所不同,因此请务必始终查阅每个模型的文档,以获取有关其特定标签的更多信息!

基础模型 (

大型语言模型 (LLM)

一个通用术语,指代在大量数据上训练的 Transformer 语言模型(GPT-3、BLOOM、OPT)。这些模型也往往具有大量的可学习参数(例如,GPT-3 为 1750 亿)。

M

掩码语言建模 (MLM)

一种预训练任务,模型会看到文本的损坏版本(通常通过随机掩盖某些 token 来完成),并且必须预测原始文本。

多模态

一种将文本与其他类型的输入(例如图像)相结合的任务。

N

自然语言生成 (NLG)

所有与生成文本相关的任务(例如,

自然语言处理 (NLP)

一种通用的说法,意为“处理文本”。

自然语言理解 (NLU)

所有与理解文本内容相关的任务(例如,对整个文本、单个词语进行分类)。

P

pipeline

在 🤗 Transformers 中,pipeline 是一种抽象概念,指的是按特定顺序执行的一系列步骤,用于预处理和转换数据,并从模型返回预测结果。pipeline 中可能包含的一些示例阶段包括数据预处理、特征提取和归一化。

有关更多详细信息,请参阅

流水线并行 (PP)

一种并行技术,其中模型在多个 GPU 之间垂直(层级)拆分,以便只有一个或几个模型层放置在单个 GPU 上。每个 GPU 并行处理 pipeline 的不同阶段,并处理小批次数据块。要了解有关流水线并行如何工作的更多信息,请点击

像素值

传递给模型的图像数值表示的张量。像素值的形状为 [batch_size, num_channels, height, width],并且由图像处理器生成。

池化

一种将矩阵缩小为较小矩阵的操作,通过取池化维度中的最大值或平均值来实现。池化层通常位于卷积层之间,用于下采样特征表示。

位置 ID

与 RNN 将每个 token 的位置嵌入到其中不同,Transformer 不知道每个 token 的位置。因此,模型使用位置 ID (position_ids) 来识别每个 token 在 token 列表中的位置。

它们是一个可选参数。如果未将 position_ids 传递给模型,则 ID 将自动创建为绝对位置嵌入。

绝对位置嵌入在范围 [0, config.max_position_embeddings - 1] 中选择。一些模型使用其他类型的位置嵌入,例如正弦位置嵌入或相对位置嵌入。

预处理

将原始数据准备成机器学习模型可以轻松使用的格式的任务。例如,文本通常通过 token 化进行预处理。要更好地了解其他输入类型的预处理是什么样的,请查看

预训练模型

已经在某些数据(例如,所有维基百科)上预训练过的模型。预训练方法涉及自监督目标,可以是阅读文本并尝试预测下一个词(请参阅

语音和视觉模型有自己的预训练目标。例如,Wav2Vec2 是一种语音模型,在对比任务上进行预训练,该任务要求模型从一组“错误”的语音表示中识别出“真实”的语音表示。另一方面,BEiT 是一种视觉模型,在掩码图像建模任务上进行预训练,该任务掩盖了一些图像 patch,并要求模型预测被掩盖的 patch(类似于掩码语言建模目标)。

R

循环神经网络 (RNN)

一种模型类型,它使用在层上循环的方式来处理文本。

表征学习

机器学习的一个子领域,专注于学习原始数据的有意义的表征。表征学习技术的一些示例包括词嵌入、自编码器和生成对抗网络 (GAN)。

S

采样率

每秒采集的样本数(音频信号)的赫兹测量单位。采样率是离散化连续信号(如语音)的结果。

自注意力机制

输入的每个元素找出它们应该关注输入的其他哪些元素。

自监督学习

一种机器学习技术类别,其中模型从无标签数据中创建自己的学习目标。它与

自监督学习的一个例子是

半监督学习

一种广泛的机器学习训练技术类别,与

半监督学习方法的一个例子是“自训练”,其中模型在标记数据上进行训练,然后用于对未标记数据进行预测。模型预测最有信心的未标记数据部分被添加到标记数据集并用于重新训练模型。

序列到序列 (seq2seq)

从输入生成新序列的模型,例如翻译模型或摘要模型(如

分片 DDP

基础

步幅

监督学习

一种模型训练形式,它直接使用标记数据来纠正和指导模型性能。数据被馈送到正在训练的模型中,并且将其预测与已知的标签进行比较。模型根据其预测的错误程度更新其权重,并重复该过程以优化模型性能。

T

张量并行 (TP)

一种在多个GPU上进行训练的并行技术,其中每个张量被拆分成多个块。因此,不是将整个张量驻留在单个GPU上,而是将张量的每个分片驻留在其指定的GPU上。分片在不同的GPU上分别并行处理,并在处理步骤结束时同步结果。这有时被称为水平并行,因为拆分发生在水平层面上。了解更多关于张量并行的信息请点击这里

词元

句子的一部分,通常是一个词,但也可能是一个子词(不常见的词通常被拆分成子词)或一个标点符号。

词元类型 ID

一些模型的目的是对句子对或问答进行分类。

这些需要将两个不同的序列连接到一个“input_ids”条目中,这通常借助特殊词元完成,例如分类器 ([CLS]) 和分隔符 ([SEP]) 词元。例如,BERT 模型构建其双序列输入的方式如下

>>> # [CLS] SEQUENCE_A [SEP] SEQUENCE_B [SEP]

我们可以使用我们的 tokenizer 通过将两个序列作为两个参数(而不是像以前那样的列表)传递给 tokenizer 来自动生成这样的句子,像这样

>>> from transformers import BertTokenizer

>>> tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-cased")
>>> sequence_a = "HuggingFace is based in NYC"
>>> sequence_b = "Where is HuggingFace based?"

>>> encoded_dict = tokenizer(sequence_a, sequence_b)
>>> decoded = tokenizer.decode(encoded_dict["input_ids"])

这将返回

>>> print(decoded)
[CLS] HuggingFace is based in NYC [SEP] Where is HuggingFace based? [SEP]

对于一些模型来说,这足以理解一个序列在哪里结束,另一个序列在哪里开始。然而,其他模型,如 BERT,也部署词元类型 ID(也称为段 ID)。它们表示为一个二进制掩码,用于识别模型中的两种序列类型。

tokenizer 将此掩码作为“token_type_ids”条目返回

>>> encoded_dict["token_type_ids"]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]

第一个序列,用于问题的“上下文”,其所有词元都用 0 表示,而第二个序列,对应于“问题”,其所有词元都用 1 表示。

一些模型,如 XLNetModel 使用由 2 表示的附加词元。

迁移学习

一种技术,涉及采用预训练模型并将其适配到特定于您任务的数据集。您可以利用从现有模型获得的知识作为起点,而不是从头开始训练模型。这加快了学习过程并减少了所需的训练数据量。

Transformer 模型

基于自注意力机制的深度学习模型架构。

U

无监督学习

一种模型训练形式,其中提供给模型的数据未被标记。无监督学习技术利用数据分布的统计信息来查找对手头任务有用的模式。

Z

零冗余优化器 (ZeRO)

一种并行技术,它执行张量的分片,有点类似于 TensorParallel,但整个张量会在前向或后向计算时被重建,因此模型不需要修改。此方法还支持各种卸载技术,以补偿有限的 GPU 内存。了解更多关于 ZeRO 的信息请点击这里

< > 在 GitHub 上更新