Transformers 文档

术语表

术语表

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

A

注意力掩码

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

这个参数指示模型哪些标记应该被关注,哪些不应该被关注。

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

>>> 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]]

自动编码模型

参见 encoder modelsmasked language modeling

自回归模型

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

B

backbone

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

C

因果语言建模

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

频道

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

连接时序分类 (CTC)

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

卷积

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

D

数据并行 (DP)

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

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

解码器输入ID

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

大多数编码器-解码器模型(如BART、T5)会从labels中自动生成decoder_input_ids。在这类模型中,传递labels是处理训练的首选方式。

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

解码器模型

也被称为自回归模型,解码器模型涉及一个预训练任务(称为因果语言建模),其中模型按顺序读取文本并必须预测下一个单词。这通常是通过在某个时间步长使用掩码隐藏未来标记来读取整个句子来完成的。

深度学习 (DL)

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

E

编码器模型

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

F

特征提取

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

前馈分块

在transformer的每个残差注意力块中,自注意力层通常后面跟着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

头部

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

图像补丁

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

推理

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

输入ID

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

每个分词器的工作方式不同,但基本机制保持不变。以下是一个使用BERT分词器的示例,它是一个WordPiece分词器:

>>> from transformers import BertTokenizer

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

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

分词器负责将序列拆分为分词器词汇表中可用的标记。

>>> tokenized_sequence = tokenizer.tokenize(sequence)

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

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

这些标记随后可以转换为模型能够理解的ID。这可以通过直接将句子输入到标记器来完成,该标记器利用了🤗 Tokenizers的Rust实现以获得最佳性能。

>>> inputs = tokenizer(sequence)

分词器返回一个包含其对应模型正常工作所需所有参数的字典。分词索引位于键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

标签

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

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

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

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

基础模型(BertModel)不接受标签,因为这些是基础变换器模型,仅输出特征。

大型语言模型 (LLM)

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

M

掩码语言建模 (MLM)

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

多模态

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

N

自然语言生成 (NLG)

所有与生成文本相关的任务(例如,Write With Transformers,翻译)。

自然语言处理 (NLP)

一种通用的方式来表示“处理文本”。

自然语言理解 (NLU)

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

P

管道

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

更多详情,请参阅Pipelines for inference

PipelineParallel (PP)

并行技术中,模型在多个GPU之间垂直(层级)分割,因此模型的一个或几个层被放置在单个GPU上。每个GPU并行处理管道的不同阶段,并处理一小批数据。了解更多关于PipelineParallel的工作原理这里

像素值

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

池化

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

位置ID

与RNN不同,RNN中每个标记的位置已经嵌入其中,而transformer并不知道每个标记的位置。因此,模型使用位置ID(position_ids)来识别每个标记在标记列表中的位置。

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

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

预处理

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

预训练模型

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

语音和视觉模型有各自的预训练目标。例如,Wav2Vec2 是一个语音模型,通过对比任务进行预训练,该任务要求模型从一组“假”语音表示中识别出“真实”的语音表示。另一方面,BEiT 是一个视觉模型,通过掩码图像建模任务进行预训练,该任务会掩码部分图像块,并要求模型预测被掩码的图像块(类似于掩码语言建模目标)。

R

循环神经网络 (RNN)

一种使用循环层处理文本的模型类型。

表示学习

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

S

采样率

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

自注意力

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

自监督学习

一类机器学习技术,其中模型从未标记的数据中创建自己的学习目标。它与无监督学习监督学习不同,因为学习过程是监督的,但不是由用户明确监督的。

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

半监督学习

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

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

序列到序列 (seq2seq)

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

分片DDP

作为其他各种ZeRO实现中使用的基础ZeRO概念的另一个名称。

步幅

卷积池化中,步长指的是内核在矩阵上移动的距离。步长为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,还使用了标记类型ID(也称为段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]

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

一些模型,如XLNetModel,使用一个由2表示的额外标记。

迁移学习

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

变压器

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

U

无监督学习

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

Z

零冗余优化器 (ZeRO)

并行技术,对张量进行分片,类似于TensorParallel, 不同之处在于整个张量会在前向或反向计算时及时重建,因此不需要修改模型。此方法还支持各种卸载技术,以弥补有限的GPU内存。 了解更多关于ZeRO的信息这里

< > Update on GitHub