Transformers 文档
术语表
并获得增强的文档体验
开始使用
术语表
本术语表定义了通用的机器学习和 🤗 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 或 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]]
自编码模型(autoencoding models)
自回归模型(autoregressive models)
B
骨干网络(backbone)
骨干网络是输出原始隐藏状态或特征的网络(嵌入层和网络层)。它通常连接到 head,后者接受这些特征作为输入来进行预测。例如,ViTModel 是一个没有特定 head 的骨干网络。其他模型也可以使用 VitModel
作为骨干网络,例如 DPT。
C
因果语言建模(causal language modeling)
一种预训练任务,模型按顺序读取文本,并且必须预测下一个单词。它通常通过读取整个句子来完成,但在模型内部使用掩码来隐藏特定时间步的未来 token。
通道(channel)
彩色图像由三个通道中的值组合而成:红色、绿色和蓝色 (RGB),而灰度图像只有一个通道。在 🤗 Transformers 中,通道可以是图像张量的第一个或最后一个维度:[n_channels
, height
, width
] 或 [height
, width
, n_channels
]。
连接时序分类 (CTC)(connectionist temporal classification (CTC))
一种算法,允许模型在不知道输入和输出如何精确对齐的情况下进行学习;CTC 计算给定输入的全部可能输出的分布,并从中选择最可能的输出。CTC 常用于语音识别任务,因为由于说话人不同的语速等多种原因,语音并不总是与文本记录完全对齐。
卷积(convolution)
神经网络中一种类型的层,其中输入矩阵与较小的矩阵(内核或滤波器)按元素相乘,并且值在新的矩阵中求和。这被称为卷积运算,它在整个输入矩阵上重复进行。每个运算都应用于输入矩阵的不同部分。卷积神经网络 (CNN) 常用于计算机视觉。
D
DataParallel (DP)
一种用于在多个 GPU 上进行训练的并行技术,其中相同的设置被复制多次,每个实例接收不同的数据切片。处理并行完成,所有设置在每个训练步骤结束时同步。
在此处了解有关 DataParallel 工作原理的更多信息 here。
解码器输入 ID(decoder input IDs)
此输入特定于编码器-解码器模型,并且包含将馈送到解码器的输入 ID。这些输入应用于序列到序列的任务,例如翻译或摘要,并且通常以特定于每个模型的方式构建。
大多数编码器-解码器模型(BART、T5)从 labels
中自行创建 decoder_input_ids
。在这些模型中,传递 labels
是处理训练的首选方法。
请查看每个模型的文档,了解它们如何处理序列到序列训练的这些输入 ID。
解码器模型(decoder models)
也称为自回归模型,解码器模型涉及预训练任务(称为因果语言建模),其中模型按顺序读取文本,并且必须预测下一个单词。它通常通过读取整个句子并使用掩码来隐藏特定时间步的未来 token 来完成。
深度学习 (DL)(deep learning (DL))
使用具有多个层的神经网络的机器学习算法。
E
编码器模型(encoder models)
也称为自编码模型,编码器模型接受输入(例如文本或图像)并将它们转换为称为嵌入的浓缩数字表示。通常,编码器模型使用诸如 掩码语言建模 之类的技术进行预训练,该技术掩盖输入序列的部分并迫使模型创建更有意义的表示。
F
特征提取(feature extraction)
将原始数据选择和转换为一组特征的过程,这些特征对于机器学习算法更具信息性和实用性。特征提取的一些示例包括将原始文本转换为词嵌入,以及从图像/视频数据中提取重要特征(例如边缘或形状)。
前馈分块(feed forward chunking)
在 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,则不进行前馈分块。
微调模型(finetuned models)
微调是迁移学习的一种形式,它涉及采用预训练模型,冻结其权重,并将输出层替换为新添加的 模型头。模型头在您的目标数据集上进行训练。
有关更多详细信息,请参阅 微调预训练模型 教程,并了解如何使用 🤗 Transformers 微调模型。
H
模型头(head)
模型头指的是神经网络的最后一层,它接受原始隐藏状态并将它们投影到不同的维度。每个任务都有不同的模型头。例如
- GPT2ForSequenceClassification 是序列分类头 - 位于基础 GPT2Model 之上的线性层。
- ViTForImageClassification 是图像分类头 - 位于基础 ViTModel 之上的
CLS
token 的最终隐藏状态之上的线性层。 - Wav2Vec2ForCTC 是具有 CTC 的语言建模头,位于基础 Wav2Vec2Model 之上。
I
图像块
基于视觉的 Transformers 模型将图像分割成更小的图像块,这些图像块经过线性嵌入,然后作为序列传递给模型。您可以在模型的配置中找到模型的 patch_size
(或分辨率)。
推理
推理是在完成训练后,在新数据上评估模型的过程。请参阅 推理 Pipeline 教程,了解如何使用 🤗 Transformers 执行推理。
输入 IDs
输入 ID 通常是作为输入传递给模型时唯一需要的参数。它们是 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
标签
标签是一个可选参数,可以传递该参数,以便模型自行计算损失。这些标签应该是模型的预期预测:它将使用标准损失来计算其预测值与期望值(标签)之间的损失。
这些标签根据模型头的不同而有所不同,例如
- 对于序列分类模型 (BertForSequenceClassification),模型期望一个维度为
(batch_size)
的张量,批次中的每个值对应于整个序列的预期标签。 - 对于 token 分类模型 (BertForTokenClassification),模型期望一个维度为
(batch_size, seq_length)
的张量,每个值对应于每个单独 token 的预期标签。 - 对于 masked language modeling (BertForMaskedLM),模型期望一个维度为
(batch_size, seq_length)
的张量,每个值对应于每个单独 token 的预期标签:标签是 masked token 的 token ID,其余的值将被忽略(通常为 -100)。 - 对于序列到序列任务 (BartForConditionalGeneration, MBartForConditionalGeneration),模型期望一个维度为
(batch_size, tgt_seq_length)
的张量,每个值对应于与每个输入序列关联的目标序列。在训练期间,BART 和 T5 都将在内部生成适当的decoder_input_ids
和解码器注意力掩码。它们通常不需要提供。这不适用于利用 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
masked language modeling (MLM)
一种预训练任务,模型在其中看到文本的损坏版本,通常通过随机屏蔽一些 token 来完成,并且必须预测原始文本。
多模态
一种将文本与另一种输入类型(例如图像)结合的任务。
N
自然语言生成 (NLG)
所有与生成文本相关的任务(例如,Write With Transformers、翻译)。
自然语言处理 (NLP)
一种通用的说法,意为“处理文本”。
自然语言理解 (NLU)
所有与理解文本内容相关的任务(例如,对整个文本、单个单词进行分类)。
P
pipeline
🤗 Transformers 中的 pipeline 是一种抽象,指的是一系列按特定顺序执行的步骤,用于预处理和转换数据,并从模型返回预测结果。pipeline 中可能包含的一些示例阶段包括数据预处理、特征提取和归一化。
有关更多详细信息,请参阅 推理 Pipeline。
PipelineParallel (PP)
一种并行技术,其中模型在多个 GPU 之间垂直(层级)拆分,以便只有一个或几个模型层放置在单个 GPU 上。每个 GPU 并行处理 pipeline 的不同阶段,并处理批次中的一个小块。在此处了解有关 PipelineParallel 工作原理的更多信息 here。
像素值
传递给模型的图像数值表示的张量。像素值的形状为 [`batch_size`, `num_channels`, `height`, `width`], 并且是从图像处理器生成的。
池化
一种将矩阵缩小为较小矩阵的操作,可以通过取池化维度(或多个维度)的最大值或平均值来实现。池化层通常位于卷积层之间,以对特征表示进行下采样。
位置 IDs
与 RNN 将每个 token 的位置嵌入在其中不同,transformers 不知道每个 token 的位置。因此,模型使用位置 ID (position_ids) 来识别每个 token 在 token 列表中的位置。
它们是一个可选参数。如果未将 position_ids
传递给模型,则会自动创建 ID 作为绝对位置嵌入。
绝对位置嵌入在 [0, config.max_position_embeddings - 1]
范围内选择。一些模型使用其他类型的位置嵌入,例如正弦位置嵌入或相对位置嵌入。
预处理
将原始数据准备成可被机器学习模型轻松使用的格式的任务。例如,文本通常通过 tokenization 进行预处理。要更好地了解其他输入类型的预处理是什么样的,请查看 预处理 教程。
预训练模型
一个在某些数据(例如整个 Wikipedia)上进行过预训练的模型。预训练方法涉及自监督目标,可以是阅读文本并尝试预测下一个单词(请参阅 因果语言建模)或屏蔽一些单词并尝试预测它们(请参阅 masked language modeling (MLM))。
语音和视觉模型有自己的预训练目标。例如,Wav2Vec2 是一个语音模型,在对比任务上进行了预训练,该任务要求模型从一组“错误”的语音表示中识别“真实”的语音表示。另一方面,BEiT 是一个视觉模型,在 masked image modeling 任务上进行了预训练,该任务屏蔽了一些图像块,并要求模型预测被屏蔽的图像块(类似于 masked language modeling 目标)。
R
循环神经网络 (RNN)
一种使用在层上循环来处理文本的模型类型。
表示学习
机器学习的一个子领域,专注于学习原始数据的有意义的表示。表示学习技术的一些示例包括词嵌入、自编码器和生成对抗网络 (GANs)。
S
采样率
每秒采集的样本数(音频信号)的赫兹测量值。采样率是对连续信号(如语音)进行离散化的结果。
自注意力
输入的每个元素都会找出它们应该关注的其他输入元素。
自监督学习
一类机器学习技术,模型从无标签数据中创建自己的学习目标。它与无监督学习和监督学习的不同之处在于,学习过程是受监督的,但并非显式地来自用户。
自监督学习的一个例子是掩码语言建模,其中模型接收被移除了一定比例 token 的句子,并学习预测缺失的 token。
半监督学习
一种广泛的机器学习训练技术类别,与监督学习和无监督学习不同,半监督学习利用少量标签数据和大量无标签数据来提高模型的准确性。
半监督学习方法的一个例子是“自训练”,其中模型首先在标签数据上进行训练,然后用于对无标签数据进行预测。模型最有信心地预测的那部分无标签数据会被添加到标签数据集,并用于重新训练模型。
序列到序列 (seq2seq)
从输入生成新序列的模型,例如翻译模型或摘要模型(如 Bart 或 T5)。
分片 DDP
基础 ZeRO 概念的另一个名称,被 ZeRO 的各种其他实现所使用。
步幅
在卷积或池化中,步幅是指内核在矩阵上移动的距离。步幅为 1 意味着内核一次移动一个像素,步幅为 2 意味着内核一次移动两个像素。
监督学习
一种模型训练形式,直接使用标签数据来纠正和指导模型性能。数据被馈送到正在训练的模型中,其预测结果与已知的标签进行比较。模型根据预测的错误程度更新其权重,并重复该过程以优化模型性能。
T
张量并行 (TP)
用于在多个 GPU 上训练的并行技术,其中每个张量被分成多个块,因此不是将整个张量驻留在单个 GPU 上,而是将张量的每个分片驻留在其指定的 GPU 上。分片在不同的 GPU 上分别并行处理,结果在处理步骤结束时同步。这有时被称为水平并行,因为拆分发生在水平层面上。了解更多关于张量并行,请点击这里。
token
句子的一部分,通常是一个词,但也可能是一个子词(不常见的词通常被拆分成子词)或一个标点符号。
token 类型 IDs
一些模型的目的是对句子对或问答进行分类。
这些模型需要将两个不同的序列连接到一个“input_ids”条目中,这通常借助特殊 token 完成,例如分类器 ([CLS]
) 和分隔符 ([SEP]
) token。例如,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,也部署 token 类型 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]
第一个序列,用于问题的“上下文”,其所有 token 都用 0
表示,而第二个序列,对应于“问题”,其所有 token 都用 1
表示。
一些模型,如 XLNetModel 使用由 2
表示的附加 token。
迁移学习
一种技术,包括采用预训练模型并将其适应于特定于您任务的数据集。您可以利用从现有模型获得的知识作为起点,而不是从头开始训练模型。这加快了学习过程并减少了所需的训练数据量。
transformer
基于自注意力机制的深度学习模型架构。
U
无监督学习
一种模型训练形式,其中提供给模型的数据没有标签。无监督学习技术利用数据分布的统计信息来查找对手头任务有用的模式。
Z
零冗余优化器 (ZeRO)
并行技术,它执行张量的分片,有点类似于 TensorParallel,但整个张量在正向或反向计算时都会被重建,因此模型不需要修改。此方法还支持各种卸载技术,以补偿有限的 GPU 内存。了解更多关于 ZeRO,请点击这里。
< > 在 GitHub 上更新