术语表
本术语表定义了通用机器学习和 🤗 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中的张量。注意掩码是一个二进制张量,指示了填充索引的位置,这样模型就不会注意到它们。对于Bert分词器,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
骨干网络是输出原始隐藏状态或特征的神经网络(嵌入层和层)。它通常连接到一个头部,该头部接受特征作为输入进行预测。例如,ViTModel是一个没有特定头部上的骨干网络。其他模型也可以使用VitModel
作为骨干,例如DPT。
C
因果语言建模
一种预训练任务,模型按照文本顺序读取并预测下一个单词。通常通过读取整个句子但在模型内部使用掩码隐藏特定时间步的长token来完成。
频道
彩色图像由红、绿、蓝(RGB)三个通道的某些组合值构成,而灰度图像只有一个通道。在🤗 Transformers中,通道可以是图像张量的第一个或最后一个维度:[n_channels
, height
, width
] 或 [height
, width
, n_channels
]。
连接主义时间分类(CTC)
一种允许模型在不知道输入和输出如何对齐的情况下学习的算法;CTC计算给定输入的所有可能的输出分布,并从中选择最可能的输出。CTC常用于语音识别任务,因为由于演讲者不同的说话速度等各种原因,语音并不总是干净地与转录对齐。
卷积
了一种神经网络中的层,输入矩阵与一个较小的矩阵(核或滤波器)逐元素相乘,然后将值相加到一个新的矩阵中。这被称为卷积操作,在整个输入矩阵上进行重复。每个操作应用于输入矩阵的不同部分。卷积神经网络(CNNs)常用于计算机视觉。
Đ
DataParallel (DP)
在一个多GPU上训练的并行技术,在相同设置被复制多次时,每个实例接收一个不同的数据切片。处理是并行的,并且在每个训练步骤结束后,所有设置都被同步。
在这里了解更多关于DataParallel如何工作的信息。
解码器输入ID
此输入针对编码器-解码器模型,包含将输入到解码器中的输入ID。这些输入应用于序列到序列任务,如翻译或摘要,并且通常以针对每个模型特定的方式构建。
大多数编码器-解码器模型(BART,T5)从它们的自己创建他们的decoder_input_ids
。在这些模型中,传递是处理训练的首选方式。
请查看每个模型的文档,以了解它们如何处理序列到序列训练中的这些输入ID。
解码模型
也称为自回归模型,解码模型包括一个预训练任务(称为因果语言模型),其中模型按照顺序读取文本,并预测下一个单词。这通常是通过在特定时间步长使用掩码来隐藏整个句子中的未来标记。
深度学习(DL)
使用具有多个层的神经网络的学习算法。
E
编码模型
也称为自动编码模型,编码模型接受输入(如文本或图像)并将它们转换为称为嵌入的简化和数值表示。通常,编码模型使用如掩码语言模型等技术预训练,该方法会掩盖输入序列的一部分,并迫使模型生成更有意义的表示。
F
特性提取
将原始数据选择和转换为一系列对机器学习算法更有信息和有用的特征的过程。特性提取的例子包括将原始文本转换为词嵌入,以及从图像/视频数据中提取重要的特征,如边缘或形状。
前馈分块
在转换器(transformers)的每个残差注意力块中,自我注意力层通常后面跟着2个前馈层。前馈层的中间嵌入大小通常大于模型的隐藏大小(例如,对于 google-bert/bert-base-uncased
)。
对于一个大小为 [batch_size, sequence_length]
的输入,存储中间前馈嵌入 [batch_size, sequence_length, config.intermediate_size]
所需的内存可以占据内存使用的大部分。在论文《Reformer: The Efficient Transformer》(https://arxiv.org/abs/2001.04451)的作者注意到,由于计算与 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 是一个语言模型头部,带有基于 CTC 的导航,位于 Wav2Vec2Model 的基础模型之上。
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。这可以通过直接将句子送入分词器来完成,分词器利用了Rust实现的🤗 Tokenizers以获得最佳性能。
>>> 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
labels
标签是可选参数,可以传递给模型以便通过自身计算损失。这些标签应该是模型预期的预测值:使用标准损失计算其预测值与期望值(标签)之间的损失。
这些标签因模型头部而异,例如
- 对于序列分类模型(BertForSequenceClassification),模型期望一个维度为
(batch_size)
的tensor,每个批次对应于整个序列的预期标签。 - 对于标记分类模型(BertForTokenClassification),模型期望一个维度为
(batch_size, seq_length)
的tensor,其中的每个值对应于每个单独标记的预期标签。 - 对于掩码语言模型(例如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)
这是一个通用术语,指的是在大量数据上训练的变换器语言模型(如GPT-3、BLOOM、OPT)。这些模型通常也有大量可学习参数(例如GPT-3的1750亿)。
M
掩码语言模型(MLM)
一种预训练任务,模型看到文本的损坏版本,通常通过随机掩盖一些标记来实现,并必须预测原始文本。
多模态
一种将文本与其他类型的输入(例如图像)结合的任务。
N
自然语言生成(NLG)
所有与生成文本相关的任务(例如,使用Transformers写作,翻译)。
自然语言处理(NLP)
一种通用的“处理文本”的说法。
自然语言理解(NLU)
与理解文本内容所有相关任务(例如分类全文、单个单词)。
P
流水线
🤗 Transformers中的流水线是一个用来表示一系列步骤的抽象概念,这些步骤按照特定顺序执行以预处理和转换数据,并从模型返回预测。流水线中可能包含的一些示例阶段包括数据预处理、特征提取和归一化。
更多详情请参阅推理流水线。
管道并行 (PP)
将模型垂直(层级别)拆分为多个 GPU 的并行技术,使得只有模型的一个或几个层放置在单个 GPU 上。每个 GPU 并行处理管道的不同阶段,并在小批量数据上工作。了解更多关于 PipelineParallel 的工作方式 这里。
像素值
传递给模型的一个图像的数值表示的张量。像素值具有形状 [batch_size
, num_channels
, height
, width
],并由图像处理器生成。
池化
将矩阵减少到更小矩阵的操作,可以是取池化维度(s)的最大值或平均值。池化层通常位于卷积层之间,以降低特征表示的下采样。
位置ID
与每个标记位置都嵌入其中的RNN不同,转换器并不了解每个标记的位置。因此,模型使用位置ID(position_ids
)来识别列表中每个标记的位置。
它是一个可选参数。如果不向模型传递任何position_ids
,则自动创建绝对位置嵌入作为ID。
绝对位置嵌入的范围是在[0, config.max_position_embeddings - 1]
之间选择的。一些模型使用其他类型的位置嵌入,如正弦位置嵌入或相对位置嵌入。
预处理
这是将原始数据准备好以便易于机器学习模型消费的任务。例如,文本通常通过分词进行预处理。要了解其他输入类型的预处理,请查看预处理教程。
预训练模型
在某种数据上(例如整个维基百科)上预训练的模型。预训练方法涉及自监督目标,可以是阅读文本并尝试预测下一个单词(见因果语言建模)或掩盖一些单词并尝试预测它们(见掩码语言建模)。
语音和视觉模型都有自己的预训练目标。例如,Wav2Vec2 是一个在对比任务上预训练的语音模型,该任务要求模型从一组"错误"的语音表示中识别出“真实”的语音表示。另一方面,BEiT 是一个在图像掩盖建模任务上预训练的视觉模型,它掩盖了一些图像块,并要求模型预测掩盖的图像块(类似于掩盖语言建模目标)。
R
循环神经网络(RNN)
一种使用层循环来处理文本的模型类型。
表示学习
机器学习的一个子领域,该子领域专注于学习原始数据的有效表示。表示学习技术的例子包括词嵌入、自动编码器和生成对抗网络(GAN)。
S
采样率
每秒采取的样本数(音频信号)的测量值。采样率是将连续信号(如语音)离散化得到的结果。
自注意力
输入的每个元素都会找出它们应该关注输入的哪些其他元素。
自监督学习
一类机器学习技术,其中模型从未标记数据中创建自己的学习目标。它与无监督学习和有监督学习不同之处在于学习过程受监督,但不是从用户那里的监督。
自监督学习的一个例子是掩码语言建模,其中模型会收到一些标记被移除的句子,并学会预测缺失的标记。
半监督学习
一种广义的机器学习训练技术,它利用少量标记数据和大量未标记数据来提高模型精度,与监督学习和无监督学习不同。
半监督学习方法的例子是“自训练”,模型先在标记数据上训练,然后用来对未标记数据进行预测。模型对未标记数据预测最自信的部分被添加到标记数据集中,并用于重新训练模型。
序列到序列(seq2seq)
生成从输入中提取的新序列的模型,例如翻译模型或摘要模型(如Bart或T5)。
碎片分布式数据并行(Sharded DDP)
类似ZeRO其他实现中使用的零冗余优化器(ZeRO)概念。
步长
在卷积或池化中,步长是指内核在矩阵上移动的距离。步长为1表示内核每次移动一个像素,步长为2表示内核每次移动两个像素。
监督学习
一种直接利用标记数据来校正和指导模型性能的模型训练形式。将数据输入到正在训练的模型中,并将其预测与已知标签进行比较。模型根据其预测的错误程度更新其权重,并重复此过程以优化模型性能。
T
张量并行(TP)
多GPU并行训练的技术,其中每个张量被分割成多个片段,因此不再是整个张量驻留在单个GPU上,而是每个片段驻留在指定的GPU上。在不同GPU上分别并行处理这些片段,并在处理步骤结束时同步结果。这有时被称为横向并行,因为分割发生在横向层面。了解更多关于张量并行技术请点击这里。
token
句子的一部分,通常是单词,也可以是子词(非通用词常被分割成子词)或标点符号。
token类型IDs
某些模型的作用是对句子或问题的配对进行分类或问答。
这些模型需要将两个不同的序列连接到单个“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冗余优化器 (ZeRO)
与TensorParallel类似,但整个张量在正向或反向计算时都会重建的并行化技术。因此,模型无需修改。该方法还支持各种卸载技术以补偿有限的GPU内存。了解更多关于ZeRO的信息,请访问此处。
< > GitHub更新