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]]
自编码模型 (autoencoding models)¶
自回归模型 (autoregressive models)¶
B¶
主干 (backbone)¶
主干是输出原始隐藏状态或特征的网络(嵌入和层)。它通常连接到一个 头部,该头部接受特征作为输入以进行预测。例如,ViTModel 是一个没有特定头部的主干。其他模型也可以使用 ViTModel 作为主干,例如 DPT。
C¶
因果语言模型 (causal language modeling)¶
一种预训练任务,模型按顺序阅读文本,并预测下一个单词。这通常通过阅读整个句子但使用掩码在特定时间步隐藏未来的标记来完成。
通道 (channel)¶
彩色图像由三个通道的值组合而成:红色、绿色和蓝色(RGB),而灰度图像只有一个通道。在 🤗 Transformers 中,通道可以是图像张量的第一个或最后一个维度:[n_channels, height, width] 或 [height, width, n_channels]。
时序分类 (connectionist temporal classification, CTC)¶
一种算法,允许模型在不知道输入和输出之间确切对齐的情况下进行学习。CTC 计算给定输入的所有可能输出的分布,并从中选择最可能的输出。CTC 常用于语音识别任务,因为语音并不总是与转录本整洁地对齐,原因包括说话者的不同语速等。
卷积 (convolution)¶
神经网络中的一种层,输入矩阵与一个更小的矩阵(内核或过滤器)逐元素相乘,并在新矩阵中汇总值。这个操作称为卷积操作,并在整个输入矩阵上重复进行。每次操作应用于输入矩阵的不同部分。卷积神经网络(CNN)常用于计算机视觉。
D¶
数据并行 (DataParallel, DP)¶
一种用于在多个 GPU 上训练的技术,其中相同的设置被复制多次,每个实例接收不同的数据切片。处理过程并行进行,并在每个训练步骤结束时同步所有设置。
了解更多关于 DataParallel 的工作原理 请点击这里。
解码器输入 ID (decoder input IDs)¶
这是编码器-解码器模型特有的输入,包含将被传递给解码器的输入 ID。这些输入应用于序列到序列任务,如翻译或摘要,通常每种模型有自己的特定构建方式。
大多数编码器-解码器模型(如 BART 和 T5)会从 labels 自动生成 decoder_input_ids。在这些模型中,传递 labels 是处理训练的首选方式。
请查阅每种模型的文档,以了解它们如何处理这些输入 ID 的序列到序列训练。
解码器模型 (decoder models)¶
也称为自回归模型,解码器模型涉及一个预训练任务(称为因果语言模型),其中模型按顺序阅读文本并预测下一个单词。这通常通过阅读整个句子但使用掩码在特定时间步隐藏未来的标记来完成。
深度学习 (deep learning, DL)¶
使用多层神经网络的机器学习算法。
E¶
编码器模型 (encoder models)¶
也称为自编码模型,编码器模型将输入(如文本或图像)转换为一个更紧凑的数值表示,称为嵌入。通常,编码器模型使用技术如 遮蔽语言模型 进行预训练,该技术通过遮蔽输入序列的部分内容来强迫模型创建更有意义的表示。
F¶
特征提取 (feature extraction)¶
将原始数据选择和转换为对机器学习算法更有信息量和有用的一组特征的过程。例如,将原始文本转换为词嵌入,或从图像/视频数据中提取重要的特征如边缘或形状。
前馈分块 (feed forward chunking)¶
在每个残差注意力块中,自注意力层通常后面跟着两个前馈层。前馈层的中间嵌入大小通常大于模型的隐藏大小(例如对于 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)¶
精调(finetuning)是一种迁移学习的形式,涉及取一个预训练模型,冻结其权重,并替换输出层为新添加的 模型头部。模型头部在目标数据集上进行训练。
有关如何使用 🤗 Transformers 进行精调的更多信息,请参阅 精调预训练模型 教程。
H¶
头部 (head)¶
头部是神经网络的最后一层,它接受原始隐藏状态并将其映射到不同维度。每个任务都有不同的头部。例如:
- GPT2ForSequenceClassification 是一个序列分类头部——在基础 GPT2Model 之上添加的一个线性层。
- ViTForImageClassification 是一个图像分类头部——在基础 ViTModel 的
CLS令牌最终隐藏状态之上添加的一个线性层。 - Wav2Vec2ForCTC 是一个带 CTC 的语言建模头部——在基础 Wav2Vec2Model 之上。
I¶
图像块 (image patch)¶
基于视觉的 Transformer 模型将图像分割成更小的块,这些块被线性嵌入,然后作为序列传递给模型。您可以在模型配置中找到 patch_size 或分辨率。
推理 (inference)¶
推理是在训练完成后对新数据进行模型评估的过程。有关如何使用 🤗 Transformers 进行推理的更多信息,请参阅 推理管道 教程。
输入 ID (input IDs)¶
输入 ID 通常是传递给模型的唯一必需参数。它们是标记索引,是构建序列的标记的数值表示,这些序列将被用作模型的输入。
每个分词器的工作方式不同,但底层机制相同。以下是一个使用 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”
print(tokenized_sequence) # 输出:['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M']
# 将标记转换为 ID,这是模型可以理解的
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]
# 分词器会自动添加特殊标记(如果关联模型需要)
decoded_sequence = tokenizer.decode(encoded_sequence)
print(decoded_sequence) # 输出:[CLS] A Titan RTX has 24GB of VRAM [SEP]
L¶
标签 (labels)¶
标签是可选参数,用于让模型计算损失。这些标签应该是模型的预期预测值。它将使用标准损失来计算其预测值与预期值(标签)之间的损失。不同模型的标签不同。例如:
- 对于序列分类模型(如 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)不接受标签,因为这些是基础 Transformer 模型,只输出特征。
大型语言模型 (Large Language Models, LLM)¶
指在大量数据上训练的 Transformer 语言模型(如 GPT-3、BLOOM、OPT)。这些模型通常拥有大量可学习参数(如 GPT-3 拥有 1750 亿个参数)。
M¶
遮蔽语言建模 (Masked Language Modeling, MLM)¶
一种预训练任务,其中模型看到的是经过破坏的文本,通常通过随机遮蔽一些标记来完成,然后需要预测原始文本。
多模态 (multimodal)¶
结合文本和其他输入(如图像)的任务。
N¶
自然语言生成 (Natural Language Generation, NLG)¶
所有与生成文本相关的任务(例如,使用 Transformers 生成、翻译)。
自然语言处理 (Natural Language Processing, NLP)¶
处理文本的通用术语。
自然语言理解 (Natural Language Understanding, NLU)¶
所有与理解文本内容相关的任务(例如,对整个文本或单个单词进行分类)。
P¶
管道 (pipeline)¶
在 🤗 Transformers 中,管道是指一系列按特定顺序执行的步骤,用于预处理和转换数据并返回模型的预测。管道中的一些示例阶段包括数据预处理、特征提取和归一化。
有关更多信息,请参阅 推理管道。
管道并行 (PipelineParallel, PP)¶
一种并行技术,其中模型按层级别垂直拆分到多个 GPU 上,使得每个 GPU 只包含一个或几个层。每个 GPU 并行处理不同的管道阶段,并处理小批量的数据块。了解更多关于 PipelineParallel 的工作原理 请点击这里。
像素值 (pixel values)¶
传递给模型的图像的数值表示的张量。像素值的形状为 [batch_size, num_channels, height, width],由图像处理器生成。
池化 (pooling)¶
将矩阵缩小为更小矩阵的操作,通常通过取池化维度的最大值或平均值来完成。池化层通常位于卷积层之间,用于降采样特征表示。
位置 ID (position IDs)¶
与 RNN 不同,Transformers 对每个标记的位置没有内置的感知。因此,模型使用位置 ID (position_ids) 来标识每个标记在标记列表中的位置。
这是一个可选参数。如果没有传递 position_ids,它们会自动创建为绝对位置嵌入。
绝对位置嵌入在范围 [0, config.max_position_embeddings - 1] 中选择。一些模型使用其他类型的位置嵌入,如正弦位置嵌入或相对位置嵌入。
预处理 (preprocessing)¶
将原始数据准备成机器学习模型可以轻松使用的格式的任务。例如,文本通常通过分词进行预处理。有关其他输入类型预处理的更多信息,请参阅 预处理 教程。
预训练模型 (pretrained model)¶
在某些数据(如维基百科的全部内容)上预训练的模型。预训练方法涉及自监督目标,可以是阅读文本并尝试预测下一个单词(见 因果语言模型),或者遮蔽一些单词并尝试预测它们(见 遮蔽语言建模)。
语音和视觉模型也有自己的预训练目标。例如,Wav2Vec2 是一个预先训练的语音模型,它通过对比任务进行训练,要求模型从一组“错误”的语音表示中识别出“真实”的语音表示。另一方面,BEiT 是一个预先训练的视觉模型,它通过掩码图像建模任务进行训练,该任务遮蔽图像的一些补丁并要求模型预测遮蔽的补丁(类似于遮蔽语言建模目标)。
R¶
循环神经网络 (Recurrent Neural Network, RNN)¶
一种通过层上的循环来处理文本的模型。
表征学习 (representation learning)¶
机器学习的一个子领域,专注于从原始数据中学习有意义的表征。一些表征学习技术的例子包括词嵌入、自动编码器和生成对抗网络(GANs)。
S¶
采样率 (sampling rate)¶
每秒采样的次数(以赫兹为单位)。采样率是将连续信号(如语音)离散化后的结果。
自注意力 (self-attention)¶
输入的每个元素确定它们应该关注输入的哪些其他元素。
自监督学习 (self-supervised learning)¶
一种机器学习技术,模型从无标签数据中创建自己的学习目标。它与 无监督学习 和 监督学习 不同,因为学习过程是受监督的,但不是由用户显式指定。
一个自监督学习的例子是 遮蔽语言建模,其中模型被传递了部分标记被移除的句子,并学习预测缺失的标记。
半监督学习 (semi-supervised learning)¶
一种机器学习训练技术,利用少量有标签数据和大量无标签数据来提高模型的准确性。这与 监督学习 和 无监督学习 不同。
例如,“自训练”是一种半监督学习方法,模型首先在有标签数据上进行训练,然后用于对无标签数据进行预测。模型预测最自信的部分无标签数据将被添加到有标签数据集中,以重新训练模型。
序列到序列 (sequence-to-sequence, seq2seq)¶
生成新序列的模型,如翻译模型或摘要模型(如 Bart 或 T5)。
分片 DDP (Sharded DDP)¶
另一种实现 ZeRO 概念的方式,由各种 ZeRO 实现使用。
步长 (stride)¶
在 卷积 或 池化 中,步长是指内核在矩阵上移动的距离。步长为 1 表示内核每次移动一个像素,步长为 2 表示内核每次移动两个像素。
监督学习 (supervised learning)¶
一种直接使用带标签的数据来纠正和指导模型性能的训练方法。数据被输入到正在训练的模型中,其预测与已知标签进行比较。模型根据预测的错误程度更新权重,并重复该过程以优化模型性能。
T¶
张量并行 (Tensor Parallelism, TP)¶
一种在多个 GPU 上训练的并行技术,其中每个张量被拆分为多个块,因此张量的每个分片都驻留在指定的 GPU 上。分片被分别并行处理,然后在处理步骤结束时同步结果。这有时称为水平并行,因为拆分发生在水平层。了解更多关于张量并行的原理 请点击这里。
令牌 (token)¶
句子的一部分,通常是单词,也可以是子单词(不常见的单词通常被拆分为子单词)或标点符号。
令牌类型 ID (token Type IDs)¶
有些模型的任务是执行句子对分类或问答。
这些任务需要两个不同的序列连接成一个“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 表示。
迁移学习 (transfer learning)¶
一种技术,涉及将预训练模型适应特定于您任务的数据集。与其从头训练模型,不如利用现有模型中获得的知识作为起点。这加速了学习过程,并减少了所需的训练数据量。
Transformer¶
基于自注意力的深度学习模型架构。
U¶
无监督学习 (unsupervised learning)¶
一种模型训练方法,提供给模型的数据没有标签。无监督学习技术利用数据分布的统计信息来发现对任务有用的数据模式。
Z¶
零冗余优化器 (Zero Redundancy Optimizer, ZeRO)¶
一种并行技术,与 张量并行 类似,除了在前向或后向计算时重建整个张量,因此模型不需要修改。该方法还支持各种卸载技术以弥补有限的 GPU 内存。了解更多关于 ZeRO 的原理 请点击这里。