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中的张量。注意力掩码是一个二进制张量,指示填充索引的位置,以便模型不会关注它们。对于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
骨干网络
骨干网络是输出原始隐藏状态或特征的网络(嵌入和层)。它通常连接到头部,头部接收特征作为输入以进行预测。例如,ViTModel是一个没有特定头部的骨干网络。其他模型也可以使用VitModel
作为骨干网络,例如DPT。
C
因果语言建模
一种预训练任务,模型按顺序读取文本并预测下一个单词。通常通过读取整个句子,但在模型内部使用掩码隐藏特定时间步的未来令牌来实现。
通道
彩色图像由三个通道(红色、绿色和蓝色,即RGB)的值组合而成,灰度图像只有一个通道。在🤗 Transformers中,通道可以是图像张量的第一个或最后一个维度:[n_channels
, height
, width
] 或 [height
, width
, n_channels
]。
连接时序分类 (CTC)
一种算法,允许模型在不知道输入和输出如何精确对齐的情况下进行学习;CTC 计算给定输入的所有可能输出的分布,并从中选择最可能的输出。CTC 通常用于语音识别任务,因为语音由于说话者的不同语速等各种原因,并不总是能与文本记录完美对齐。
卷积
神经网络中的一种层类型,其中输入矩阵与较小的矩阵(核或滤波器)进行元素乘法,并将值求和到新矩阵中。这被称为卷积运算,它在整个输入矩阵上重复进行。每次运算都应用于输入矩阵的不同部分。卷积神经网络(CNN)常用于计算机视觉。
D
数据并行 (DP)
在多 GPU 上训练的并行化技术,其中相同的设置被复制多次,每个实例接收不同的数据切片。处理并行完成,所有设置在每个训练步骤结束时同步。
在此处了解有关数据并行工作原理的更多信息:DataParallel vs. DistributedDataParallel。
解码器输入 ID
此输入特定于编码器-解码器模型,包含将馈送到解码器的输入 ID。这些输入应用于序列到序列任务,例如翻译或摘要,通常以特定于每个模型的方式构建。
大多数编码器-解码器模型(BART、T5)会根据其labels
自行创建decoder_input_ids
。在此类模型中,传递labels
是处理训练的首选方式。
请查看每个模型的文档,了解它们如何处理这些输入 ID 以进行序列到序列训练。
解码器模型
也称为自回归模型,解码器模型涉及一个预训练任务(称为因果语言建模),其中模型按顺序读取文本并预测下一个单词。通常通过读取整个句子并使用掩码隐藏特定时间步的未来令牌来实现。
深度学习 (DL)
使用多层神经网络的机器学习算法。
E
编码器模型
也称为自编码模型,编码器模型接收输入(例如文本或图像)并将其转换为称为嵌入的浓缩数字表示。通常,编码器模型使用掩码语言建模等技术进行预训练,这些技术会掩盖输入序列的一部分,并强制模型创建更有意义的表示。
F
特征提取
将原始数据选择并转换为一组对机器学习算法更有信息和更有用的特征的过程。特征提取的一些示例包括将原始文本转换为词嵌入以及从图像/视频数据中提取重要特征(如边缘或形状)。
前向分块
在 Transformer 中的每个残差注意力块中,自注意力层之后通常跟着两个前向传播层。前向传播层的中间嵌入大小通常大于模型的隐藏大小(例如,对于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
头部
模型头是指神经网络的最后一层,它接收原始隐藏状态并将其投影到不同的维度。每个任务都有不同的模型头。例如:
- GPT2ForSequenceClassification 是一个基于GPT2Model的序列分类头——一个线性层。
- ViTForImageClassification 是一个基于ViTModel的图像分类头——一个在
CLS
令牌最终隐藏状态之上的线性层。 - Wav2Vec2ForCTC 是一个基于Wav2Vec2Model的语言建模头,带有CTC。
I
图像块
基于视觉的 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_labels
和boxes
键,其中批处理的每个值对应于每个独立图像的预期标签和边界框数量。 - 对于自动语音识别模型(Wav2Vec2ForCTC),模型期望一个维度为
(batch_size, target_length)
的张量,其中每个值对应于每个独立令牌的预期标签。
每个模型的标签可能不同,因此请务必查阅每个模型的文档以获取有关其特定标签的更多信息!
基本模型(BertModel)不接受标签,因为这些是基本转换器模型,仅输出特征。
大型语言模型 (LLM)
一个通用术语,指在大量数据上训练的 Transformer 语言模型(GPT-3、BLOOM、OPT)。这些模型通常也有大量的可学习参数(例如,GPT-3 有 1750 亿个)。
M
掩码语言建模 (MLM)
一种预训练任务,模型会看到文本的损坏版本(通常通过随机掩盖一些令牌),并必须预测原始文本。
多模态
结合文本和其他类型输入(例如图像)的任务。
N
自然语言生成 (NLG)
所有与生成文本相关的任务(例如,用 Transformers 写作,翻译)。
自然语言处理 (NLP)
“处理文本”的通用说法。
自然语言理解 (NLU)
所有与理解文本内容相关的任务(例如,对整个文本或单个单词进行分类)。
P
管道
🤗 Transformers 中的管道是一个抽象,指一系列按特定顺序执行的步骤,用于预处理和转换数据,并从模型返回预测。管道中可能包含的数据预处理、特征提取和归一化等阶段。
有关更多详细信息,请参阅推理管道。
管道并行 (PP)
一种并行化技术,其中模型在多个 GPU 上垂直(层级)分割,以便模型的一层或几层仅放置在一个 GPU 上。每个 GPU 并行处理管道的不同阶段,并在批处理的一小部分上工作。在此处了解有关管道并行工作原理的更多信息:从朴素模型并行到管道并行。
像素值
传递给模型的图像的数值表示张量。像素值的形状为 [batch_size
, num_channels
, height
, width
],并由图像处理器生成。
池化
一种将矩阵缩小为较小矩阵的操作,通过取池化维度(或多个维度)的最大值或平均值。池化层通常位于卷积层之间,用于下采样特征表示。
位置 ID
与 RNN 不同,Transformer 模型内部不嵌入每个令牌的位置,因此无法感知其位置。因此,位置 ID(position_ids
)由模型用于识别令牌列表中每个令牌的位置。
它们是可选参数。如果没有将position_ids
传递给模型,则会自动创建绝对位置嵌入。
绝对位置嵌入的范围是[0, config.max_position_embeddings - 1]
。一些模型使用其他类型的位置嵌入,例如正弦位置嵌入或相对位置嵌入。
预处理
将原始数据准备成机器学习模型易于使用的格式的任务。例如,文本通常通过分词进行预处理。要更好地了解其他输入类型的预处理方式,请查看预处理教程。
预训练模型
在某些数据(例如维基百科的全部内容)上进行预训练的模型。预训练方法涉及自监督目标,可以是阅读文本并尝试预测下一个单词(参见因果语言建模),或者掩盖一些单词并尝试预测它们(参见掩码语言建模)。
语音和视觉模型有自己的预训练目标。例如,Wav2Vec2 是一种语音模型,在对比任务上进行预训练,该任务要求模型从一组“假”语音表示中识别“真”语音表示。另一方面,BEiT 是一种视觉模型,在掩码图像建模任务上进行预训练,该任务掩盖一些图像块并要求模型预测掩盖的图像块(类似于掩码语言建模目标)。
R
循环神经网络 (RNN)
一种通过循环层来处理文本的模型。
表示学习
机器学习的一个子领域,专注于学习原始数据的有意义表示。表示学习技术的一些示例包括词嵌入、自编码器和生成对抗网络 (GAN)。
S
采样率
每秒采样的数量(音频信号)的赫兹测量值。采样率是对语音等连续信号进行离散化的结果。
自注意力
输入中的每个元素都会找出它们应该关注输入中的其他哪些元素。
自监督学习
机器学习技术的一个类别,其中模型从未标记数据中创建自己的学习目标。它与无监督学习和监督学习的不同之处在于,学习过程是受监督的,但不是用户明确监督的。
自监督学习的一个例子是掩码语言建模,其中模型接收部分词元被移除的句子,并学习预测缺失的词元。
半监督学习
一种广泛的机器学习训练技术,它利用少量带标签数据和大量无标签数据来提高模型的准确性,这与监督学习和无监督学习不同。
半监督学习方法的一个例子是“自训练”,其中模型在带标签数据上进行训练,然后用于对无标签数据进行预测。模型以最高置信度预测的无标签数据部分会被添加到带标签数据集中,并用于重新训练模型。
序列到序列 (seq2seq)
从输入生成新序列的模型,例如翻译模型或摘要模型(如 Bart 或 T5)。
分片式 DDP
作为各种其他 ZeRO 实现中使用的基础 ZeRO 概念的另一个名称。
步幅
在卷积或池化中,步幅指内核在矩阵上移动的距离。步幅为 1 意味着内核每次移动一个像素,步幅为 2 意味着内核每次移动两个像素。
监督学习
一种模型训练形式,它直接使用带标签数据来纠正和指导模型性能。数据被输入到正在训练的模型中,其预测结果与已知标签进行比较。模型根据其预测的错误程度更新其权重,并重复此过程以优化模型性能。
T
张量并行 (TP)
一种用于在多个 GPU 上训练的并行技术,其中每个张量被分割成多个块,因此整个张量不再只存在于单个 GPU 上,而是每个张量分片存在于其指定的 GPU 上。分片在不同的 GPU 上单独并行处理,处理步骤结束时同步结果。这有时被称为水平并行,因为分割发生在水平层面。在此了解更多关于张量并行的信息。
词元
句子的一部分,通常是一个词,但也可以是子词(不常见的词通常被分割成子词)或标点符号。
词元类型 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
表示的附加词元。
迁移学习
一种涉及获取预训练模型并将其调整到特定于任务的数据集的技术。无需从头开始训练模型,您可以利用从现有模型中获得的知识作为起点。这加快了学习过程并减少了所需的训练数据量。
Transformer
基于自注意力的深度学习模型架构。
U
无监督学习
一种模型训练形式,其中提供给模型的数据没有标签。无监督学习技术利用数据分布的统计信息来发现对当前任务有用的模式。
Z
零冗余优化器 (ZeRO)
一种并行技术,它对张量进行分片,与张量并行有些相似,不同之处在于,整个张量会在前向或后向计算时被重新构建,因此无需修改模型。此方法还支持各种卸载技术,以弥补有限的 GPU 内存。在此了解更多关于 ZeRO 的信息。
< > 在 GitHub 上更新