Transformers documentation

术语表

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

术语表

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

A

attention mask

注意力掩码是一个可选参数,用于将多个序列进行批量处理时。

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

例如,考虑以下两个序列:

>>> 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 中的张量。注意力掩码是一个二元张量,用于指示填充索引的位置,以便模型不会关注这些位置。对于 BertTokenizer,1 表示需要关注的值,而 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]]

自编码模型

参见 编码器模型 和 掩码语言建模

自回归模型

参见 因果语言建模 和 解码器模型

B

backbone

骨干网络(backbone)是输出原始隐藏状态或特征的网络(包括嵌入层和各个层)。它通常连接到一个头部(head),该头部以这些特征作为输入来做出预测。例如,ViTModel 是一个没有特定头部的骨干网络。其他模型也可以将 ViTModel 用作骨干网络,例如 DPT。

C

因果语言建模

预训练任务,模型按顺序读取文本并预测下一个词。通常的做法是读取整个句子,但在模型的某个时间步内使用掩码来隐藏未来的 token。

channel

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

连接时序分类(CTC)

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

卷积

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

D

DataParallel (DP)

一种用于多 GPU 训练的并行技术,其中相同的配置被复制多次,每个实例接收不同的数据切片。处理过程并行执行,并在每个训练步骤结束时同步所有配置。

了解有关 DataParallel 的更多信息。

解码器输入 ID

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

大多数编码器-解码器模型(BART、T5)会根据 labels 自行生成 decoder_input_ids。对于此类模型,传入 labels 是处理训练的首选方式。

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

解码器模型

解码器模型也称为自回归模型,其预训练任务(称为因果语言建模)要求模型按顺序读取文本并预测下一个词。通常的做法是在某个时间步读取整个句子,并使用掩码来隐藏未来的 token。

深度学习(DL)

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

E

编码器模型

也称为自编码模型,编码器模型接收输入(例如文本或图像),并将其转换为一种称为嵌入(embedding)的浓缩数值表示。编码器模型通常使用诸如掩码语言建模等技术进行预训练,该技术会遮蔽输入序列的部分内容,迫使模型生成更具语义意义的表示。

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,则不会执行前馈分块。

微调后的模型

微调是一种迁移学习形式,其过程是获取一个预训练模型,冻结其权重,并用新添加的 模型头 替换输出层。模型头将在您的目标数据集上进行训练。

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

H

head

模型头(model head)指的是神经网络中接受原始隐藏状态并将其投影到不同维度的最后一层。每个任务都有对应的模型头。例如:

I

图像块

基于视觉的 Transformers 模型会将图像切分为较小的图像块(patches),对其进行线性嵌入,然后作为序列输入模型。您可以在模型的配置中找到其 patch_size(即分辨率)。

推理

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

输入 ID

输入 id 通常是传递给模型作为输入的唯一必需参数。它们是 token 索引,即构成序列的 token 的数值表示,这些序列将作为模型的输入。

每个分词器的工作方式各不相同,但底层机制是相同的。下面是一个使用 BERT 分词器的示例,它是一个 WordPiece 分词器:

>>> from transformers import BertTokenizer

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

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

分词器负责将序列拆分为分词器词表中可用的 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。这可以通过直接将句子输入分词器来实现,该分词器利用了 🤗 Tokenizers 的 Rust 实现以获得最佳性能。

>>> inputs = tokenizer(sequence)

分词器会返回一个字典,其中包含其对应模型正常运行所需的所有参数。 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]

请注意,分词器会自动添加“特殊标记”(如果相关模型依赖于这些标记),这些特殊标记是模型有时会使用的特殊 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)之间的损失。

这些标签会根据模型头而有所不同,例如:

  • 对于序列分类模型(BertForSequenceClassification),模型期望一个维度为 (batch_size) 的张量,其中批次中的每个值对应于整个序列的预期标签。
  • 对于 token 分类模型(BertForTokenClassification),模型期望一个维度为 (batch_size, seq_length) 的张量,其中每个值对应各个 token 的预期标签。
  • 对于掩码语言建模(BertForMaskedLM),模型期望一个维度为 (batch_size, seq_length) 的张量,其中每个值对应各个 token 的预期标签:被掩码 token 的标签为其 token ID,其余位置的标签为需要忽略的值(通常为 -100)。
  • 对于序列到序列任务(BartForConditionalGeneration、MBartForConditionalGeneration),模型期望输入一个维度为 (batch_size, tgt_seq_length) 的张量,其中每个值对应与每个输入序列相关联的目标序列。在训练期间,BART 和 T5 会在内部自动构建合适的 decoder_input_ids 和 decoder attention masks,通常无需手动提供。此规则不适用于基于 Encoder-Decoder 框架的模型。
  • 对于图像分类模型(ViTForImageClassification),模型期望一个维度为 (batch_size) 的张量,其中批次中的每个值对应于每张图片的预期标签。
  • 对于语义分割模型(SegformerForSemanticSegmentation),模型期望一个维度为 (batch_size, height, width) 的张量,其中批次中的每个值对应于每个单独像素的预期标签。
  • 对于目标检测模型(DetrForObjectDetection),模型期望接收一个字典列表,其中每个字典包含 class_labels 和 boxes 键,批次中每个值分别对应单张图像的期望标签和边界框数量。
  • 对于自动语音识别模型(Wav2Vec2ForCTC),模型期望一个维度为 (batch_size, target_length) 的张量,其中每个值对应各个 token 的预期标签。

每个模型的标签可能有所不同,请务必查阅每个模型的文档以了解其特定标签的更多信息!

基础模型(BertModel)不接受标签,因为它们是基础的 transformer 模型,仅输出特征。

大型语言模型(LLM)

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

M

掩码语言建模(MLM)

一种预训练任务,模型会看到文本的损坏版本(通常通过随机掩码部分 token 实现),并需要预测原始文本。

多模态

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

N

自然语言生成(NLG)

所有与生成文本相关的任务(例如,使用 Transformers 进行写作、翻译)。

自然语言处理(NLP)

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

自然语言理解(NLU)

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

P

pipeline

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

有关更多详细信息,请参阅用于推理的管道。

PipelineParallel (PP)

一种并行技术,将模型在多个 GPU 上按垂直方向(层级别)进行切分,使得单个 GPU 上仅放置模型的一层或少数几层。每个 GPU 并行处理流水线中的不同阶段,并处理批次中的一小部分数据。有关 PipelineParallel 的更多信息,请参阅相关文档。

像素值

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

池化

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

位置 ID

与将每个 token 的位置信息嵌入其中的 RNN 不同,transformer 并不感知每个 token 的位置。因此,模型使用位置 ID(position_ids)来识别 token 列表中每个 token 的位置。

它们是可选参数。如果未向模型传入 position_ids,则会自动创建绝对位置嵌入作为 ID。

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

预处理

将原始数据整理为机器学习模型易于处理的格式的任务。例如,文本通常通过分词进行预处理。如需了解其他输入类型的预处理方式,请参阅 Preprocess 教程。

预训练模型

在部分数据(例如整个维基百科)上预训练过的模型。预训练方法涉及自监督目标,可以是阅读文本并尝试预测下一个词(参见因果语言建模),也可以是遮盖部分词语并尝试预测它们(参见掩码语言建模)。

语音和视觉模型拥有各自独立的预训练目标。例如,Wav2Vec2 是一个在对比学习任务上预训练的语音模型,该任务要求模型从一组“错误”的语音表示中识别出“正确”的语音表示。另一方面,BEiT 是一个在掩码图像建模任务上预训练的视觉模型,该任务会对部分图像块进行掩码处理,并要求模型预测这些被掩码的图像块(类似于掩码语言建模目标)。

R

循环神经网络 (RNN)

一种通过循环遍历层来处理文本的模型类型。

表示学习

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

S

采样率

以赫兹为单位的每秒采样数(即音频信号的采样点数)。采样率是对语音等连续信号进行离散化后的结果。

自注意力

输入中的每个元素都会确定它应该关注输入中的哪些其他元素。

自监督学习

一类机器学习技术,模型从无标签数据中自行构建学习目标。它与无监督学习和有监督学习的区别在于,学习过程受到监督,但这种监督并非来自用户的显式指令。

自监督学习的一个例子是掩码语言建模,其中模型接收部分词元被移除的句子,并学习预测缺失的词元。

半监督学习

机器学习训练技术的一个广泛类别,它利用少量标记数据和大量未标记数据来提高模型的准确性,这与监督学习和无监督学习不同。

半监督学习的一个示例方法是“自训练”(self-training):首先使用有标签数据训练模型,然后利用该模型对无标签数据进行预测。模型预测置信度最高的那部分无标签数据会被加入有标签数据集,并用于重新训练模型。

序列到序列(seq2seq)

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

分片 DDP

ZeRO 基础概念的其他名称,被 ZeRO 的各种其他实现所使用。

stride

在卷积或池化中,步长(stride)指的是卷积核在矩阵上移动的距离。步长为 1 表示卷积核每次移动一个像素,步长为 2 表示卷积核每次移动两个像素。

监督学习

一种模型训练形式,直接利用带标签的数据来纠正和指导模型表现。数据被输入到正在训练的模型中,其预测结果与已知标签进行比较。模型根据预测的错误程度更新其权重,并重复此过程以优化模型性能。

T

张量并行 (TP)

一种用于多 GPU 训练的并行技术,它将每个张量拆分为多个分片,使得张量不再完整地驻留在单个 GPU 上,而是每个分片驻留在其指定的 GPU 上。这些分片在不同的 GPU 上独立且并行地处理,并在处理步骤结束时同步结果。这有时被称为水平并行,因为拆分发生在水平维度上。有关张量并行的更多信息,请参见此处。

token

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

token 类型 ID

某些模型的用途是对句子对进行分类或执行问答任务。

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

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

我们可以将两个序列作为两个参数(而不是像之前那样作为列表)传递给 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)还会使用 token type ID(也称为 segment ID)。它们以二进制掩码的形式表示,用于识别模型中的两种序列类型。

分词器将此掩码作为 “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]

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

一些模型,例如 XLNetModel,会使用一个由 2 表示的额外 token。

迁移学习

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

transformer

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

U

无监督学习

一种模型训练形式,其中提供给模型的数据没有标签。无监督学习技术利用数据分布的统计信息,以发现对当前任务有用的模式。

Z

零冗余优化器(ZeRO)

一种并行技术,其张量分片方式与 TensorParallel 略有相似,但整个张量会在前向或反向计算前及时重建,因此无需修改模型。该方法还支持多种卸载技术,以弥补 GPU 内存不足的问题。有关 ZeRO 的更多信息,请参见 此处。

Update on GitHub