Transformers 4.37 中文文档(十一)(4)https://developer.aliyun.com/article/1564974
术语表
这个术语表定义了一般的机器学习和🤗 Transformers 术语,以帮助您更好地理解文档。
A
注意力掩码
注意力掩码是一个可选参数,用于将序列批处理在一起时使用。
www.youtube-nocookie.com/embed/M6adb1j2jPI
这个参数指示模型应该关注哪些令牌,哪些不应该。
例如,考虑这两个序列:
>>> from transformers import BertTokenizer >>> tokenizer = BertTokenizer.from_pretrained("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 通常用于语音识别任务,因为语音不总是与文本干净地对齐,原因有很多,比如说话者的不同语速。
卷积
神经网络中的一种层类型,其中输入矩阵与较小的矩阵(卷积核或滤波器)逐元素相乘,然后在新矩阵中求和。这被称为卷积操作,它在整个输入矩阵上重复。每个操作应用于输入矩阵的不同部分。卷积神经网络(CNNs)通常用于计算机视觉。
D
DataParallel(DP)
在多个 GPU 上进行训练的并行技术,其中相同的设置被复制多次,每个实例接收一个不同的数据切片。处理是并行进行的,并且所有设置在每个训练步骤结束时都是同步的。
了解有关 DataParallel 如何工作的更多信息在这里。
解码器输入 ID
这个输入是特定于编码器-解码器模型的,包含将馈送给解码器的输入 ID。这些输入应该用于序列到序列任务,例如翻译或摘要,并且通常以每个模型特定的方式构建。
大多数编码器-解码器模型(BART,T5)会自行从labels
创建它们的decoder_input_ids
。在这种模型中,传递labels
是处理训练的首选方式。
请查看每个模型的文档,了解它们如何处理这些输入 ID 以进行序列到序列训练。
解码器模型
解码器模型,也称为自回归模型,涉及一个预训练任务(称为因果语言建模),其中模型按顺序阅读文本,并预测下一个单词。通常通过在某个时间步骤隐藏未来标记的掩码来读取整个句子来完成。
www.youtube-nocookie.com/embed/d_ixlCubqQw
深度学习(DL)
使用多层神经网络的机器学习算法。
E
编码器模型
也称为自编码模型,编码器模型接受输入(如文本或图像)并将它们转换为称为嵌入的简化数值表示。通常,编码器模型使用诸如 masked language modeling 之类的技术进行预训练,该技术对输入序列的部分进行掩码,并迫使模型创建更有意义的表示。
www.youtube-nocookie.com/embed/H39Z_720T5s
F
特征提取
将原始数据选择和转换为一组更具信息性和有用的特征的过程,以供机器学习算法使用。特征提取的一些示例包括将原始文本转换为词嵌入,从图像/视频数据中提取重要特征,如边缘或形状。
前馈分块
在 transformers 中的每个残差注意力块中,自注意力层通常后面跟着 2 个前馈层。前馈层的中间嵌入大小通常大于模型的隐藏大小(例如,对于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,则不会进行前馈分块。
微调模型
微调是一种迁移学习形式,涉及采用预训练模型,冻结其权重,并用新添加的 model head 替换输出层。模型头在目标数据集上进行训练。
查看Fine-tune a pretrained model教程以获取更多详细信息,并了解如何使用🤗 Transformers 微调模型。
H
头
模型头指的是神经网络的最后一层,它接受原始隐藏状态并将其投影到不同的维度。每个任务都有一个不同的模型头。例如:
- GPT2ForSequenceClassification 是一个序列分类头 - 一个线性层 - 位于基础 GPT2Model 之上。
- ViTForImageClassification 是一个图像分类头 - 位于基础 ViTModel 的
CLS
令牌的最终隐藏状态之上的线性层。 - Wav2Vec2ForCTC 是一个带有 CTC)的语言建模头,位于基础 Wav2Vec2Model 之上。
我
图像补丁
基于视觉的 Transformer 模型将图像分成较小的补丁,这些补丁被线性嵌入,然后作为序列传递给模型。您可以在配置中找到模型的patch_size
- 或分辨率。
推理
推理是在训练完成后对新数据评估模型的过程。请参阅用于推理的 Pipeline教程,了解如何使用🤗 Transformers 执行推理。
输入 ID
输入 ID 通常是传递给模型的唯一必需参数。它们是标记索引,是构建序列的标记的数值表示,这些序列将作为模型的输入使用。
www.youtube-nocookie.com/embed/VFp38yj8h3A
每个分词器的工作方式不同,但基本机制保持不变。以下是使用 BERT 分词器的示例,它是一个WordPiece分词器:
>>> from transformers import BertTokenizer >>> tokenizer = BertTokenizer.from_pretrained("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
标签
标签是一个可选参数,可以传递给模型以便计算损失。这些标签应该是模型的预期预测:它将使用标准损失来计算其预测值和预期值(标签)之间的损失。
这些标签根据模型头不同而不同,例如:
- 对于序列分类模型(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)
一个泛指,指的是在大量数据上训练的变压器语言模型(GPT-3、BLOOM、OPT)。这些模型通常也具有大量可学习参数(例如 GPT-3 的 1750 亿)。
M
掩码语言建模(MLM)
一个模型看到文本的损坏版本,通常是通过随机屏蔽一些标记来完成,并且必须预测原始文本的预训练任务。
多模态
将文本与其他类型的输入(例如图像)结合的任务。
N
自然语言生成(NLG)
所有与生成文本相关的任务(例如,使用 Transformer 写作,翻译)。
自然语言处理(NLP)
一个通用的说法是“处理文本”。
自然语言理解(NLU)
所有与理解文本内容相关的任务(例如对整个文本进行分类,对单词进行分类)。
P
管道
在🤗 Transformers 中,管道是一个抽象,指的是按特定顺序执行的一系列步骤,用于预处理和转换数据,并从模型返回预测。管道中可能包含的一些示例阶段可能是数据预处理、特征提取和归一化。
有关更多详细信息,请参阅用于推断的管道。
PipelineParallel(PP)
一种并行技术,其中模型在多个 GPU 上垂直分割(层级),以便将模型的一个或多个层放置在单个 GPU 上。每个 GPU 并行处理管道的不同阶段,并处理一小批次的数据。了解有关 PipelineParallel 如何工作的更多信息,请查看这里。
像素值
传递给模型的图像的数值表示的张量。像素值的形状为[batch_size
, num_channels
, height
, width
],并且是从图像处理器生成的。
池化
将矩阵缩小为较小矩阵的操作,可以通过取池化维度的最大值或平均值来实现。池化层通常位于卷积层之间,用于降采样特征表示。
位置 ID
与 RNN 不同,RNN 的每个标记的位置都嵌入在其中,transformers 不知道每个标记的位置。因此,模型使用位置 ID(position_ids
)来识别列表中每个标记的位置。
它们是一个可选参数。如果没有将position_ids
传递给模型,那么这些 ID 将自动创建为绝对位置嵌入。
绝对位置嵌入被选择在范围[0, config.max_position_embeddings - 1]
内。一些模型使用其他类型的位置嵌入,如正弦位置嵌入或相对位置嵌入。
预处理
将原始数据准备成机器学习模型可以轻松消化的格式的任务。例如,文本通常通过标记化进行预处理。要了解其他输入类型的预处理是什么样子,可以查看预处理教程。
预训练模型
一个在某些数据上进行了预训练的模型(例如整个维基百科)。预训练方法涉及自监督目标,可以是阅读文本并尝试预测下一个单词(参见因果语言建模),或者遮蔽一些单词并尝试预测它们(参见遮蔽语言建模)。
语音和视觉模型有自己的预训练目标。例如,Wav2Vec2 是一个语音模型,它在对比任务上进行了预训练,要求模型从一组“假”语音表示中识别“真实”语音表示。另一方面,BEiT 是一个视觉模型,它在一个遮蔽图像建模任务上进行了预训练,遮蔽了一些图像块,并要求模型预测被遮蔽的块(类似于遮蔽语言建模目标)。
R
循环神经网络(RNN)
一种使用循环处理文本的模型类型。
表示学习
一种机器学习的子领域,专注于学习原始数据的有意义表示。一些表示学习技术的例子包括词嵌入、自编码器和生成对抗网络(GANs)。
S
采样率
每秒采样的样本数(音频信号)。采样率是将连续信号(如语音)离散化的结果。
自注意力
输入的每个元素找出它们应该关注的其他输入元素。
自监督学习
一类机器学习技术,其中模型从未标记数据中创建自己的学习目标。它与无监督学习和监督学习不同,学习过程是受监督的,但不是明确来自用户。
自监督学习的一个例子是掩码语言建模,其中模型传递带有一定比例标记的句子,并学习预测缺失的标记。
半监督学习
一种广泛的机器学习训练技术类别,利用少量标记数据和大量未标记数据来提高模型的准确性,与监督学习和无监督学习不同。
半监督学习方法的一个例子是“自训练”,其中模型在标记数据上进行训练,然后用于对未标记数据进行预测。模型以最大置信度预测的未标记数据部分被添加到标记数据集中,并用于重新训练模型。
序列到序列(seq2seq)
从输入生成新序列的模型,比如翻译模型或总结模型(比如 Bart 或 T5)。
分片 DDP
作为 ZeRO 概念的另一个名称,被各种其他 ZeRO 实现所使用。
步幅
在卷积或池化中,步幅指的是核在矩阵上移动的距离。步幅为 1 表示核每次移动一个像素,步幅为 2 表示核每次移动两个像素。
监督学习
一种直接使用标记数据来纠正和指导模型性能的模型训练形式。数据被馈送到正在训练的模型中,其预测与已知标签进行比较。模型根据其预测的不正确程度更新其权重,并重复该过程以优化模型性能。
T
张量并行性(TP)
在多个 GPU 上进行训练的并行技术,其中每个张量被分割成多个块,因此每个张量的碎片都驻留在其指定的 GPU 上,而不是整个张量驻留在单个 GPU 上。碎片在不同 GPU 上分别并行处理,并在处理步骤结束时进行同步。这有时被称为水平并行,因为分割发生在水平级别。在这里了解更多关于张量并行性的信息。
标记
句子的一部分,通常是一个词,但也可以是一个子词(不常见的词通常被分割为子词)或标点符号。
标记类型 ID
一些模型的目的是对句子对或问题回答进行分类。
www.youtube-nocookie.com/embed/0u3ioSwev3s
这些需要将两个不同序列连接在一个“input_ids”条目中,通常使用特殊标记的帮助来执行,例如分类器([CLS]
)和分隔符([SEP]
)标记。例如,BERT 模型构建其两个序列输入如下:
>>> # [CLS] SEQUENCE_A [SEP] SEQUENCE_B [SEP]
我们可以使用我们的分词器通过将两个序列作为两个参数(而不是像以前那样作为列表)传递给tokenizer
来自动生成这样一个句子,就像这样:
>>> from transformers import BertTokenizer >>> tokenizer = BertTokenizer.from_pretrained("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 的信息(perf_train_gpu_many#zero-data-parallelism)。