概念
预训练
是从头开始训练模型的行为:随机初始化权重,并且在没有任何先验知识的情况下开始训练。这种预训练通常是在非常大量的数据上进行的。因此,它需要非常大的语料库,训练可能需要长达数周的时间。
微调
是在对模型进行预训练之后进行的训练。要执行微调,您首先需要一个预训练的语言模型,然后使用特定于您的任务的数据集执行额外的训练。基于预训练模型微调,只需要有限数量的数据:预训练模型获得的知识是“迁移”的,因此称为迁移学习。
Transformers
该模型主要由两个块组成:
-
编码器(左):编码器接收输入并构建它的表示(其特征)。这意味着模型经过优化以从输入中获取理解。
-
解码器(右):解码器使用编码器的表示(特征)和其他输入来生成目标序列。这意味着该模型针对生成输出进行了优化。
这些部分中的每一个都可以独立使用,具体取决于任务:
- 仅编码器模型:适用于需要理解输入的任务,例如句子分类和命名实体识别。
- 仅解码器模型:适用于文本生成等生成任务。
- 编码器-解码器模型或序列到序列模型:适用于需要输入的生成任务,例如翻译或摘要。
注意层
只需要知道这一层会告诉模型在处理每个单词的表示时特别注意你传递给它的句子中的某些单词(并或多或少地忽略其他单词)。
在每个阶段,编码器的注意力层可以访问初始句子中的所有单词,而解码器的注意力层只能访问输入中给定单词之前的单词。
pipeline
https://nbviewer.org/github/zyds/transformers-code/blob/master/01-Getting%20Started/02-pipeline/pipeline.ipynb
Transformers 库中最基本的对象是函数pipeline()
。它将模型与其必要的预处理和后处理步骤连接起来,使我们能够直接输入任何文本并获得可理解的答案:
1 |
|
1 |
|
多个input
1 |
|
1 |
|
默认情况下,此pipeline选择一个特定的预训练模型,该模型已针对英语情感分析进行了微调。创建classifier
对象时会下载并缓存模型。如果重新运行该命令,将使用缓存的模型,无需再次下载模型。
将一些文本传递到管道时涉及三个主要步骤:
-
文本被预处理为模型可以理解的格式。使用分词器进行预处理
-
预处理的输入被传递给模型。
-
模型的预测经过后处理,因此您可以理解它们。
管道将三个步骤组合在一起:预处理、通过模型传递输入和后处理:
1 |
|
Transformer 模块输出的向量通常很大。它一般具有三个维度:
- 批量大小:一次处理的序列数(在我们的示例中为 2)。
- 序列长度:序列的数字表示的长度(在我们的示例中为 16)。
- Hidden size : 每个模型输入的向量维度。
由于最后一个值,它被称为“高维”。隐藏大小可能非常大(对于较小的模型,768 是常见的,而在较大的模型中,这可以达到 3072 或更多)。
如果我们将预处理的输入提供给我们的模型,我们可以看到这一点:
已复制
1 |
|
已复制
1 |
|
Example
1 |
|
模型
1 |
|
生成
1 |
|
1 |
|
分词
https://nbviewer.org/github/zyds/transformers-code/blob/master/01-Getting%20Started/03-tokenizer/tokenizer.ipynb
分词器是 NLP 流水线的核心组件之一。它们服务于一个目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此分词器需要将我们的文本输入转换为数字数据。
1 |
|
文本转换为数字称为编码。编码分两步完成:标记化tokenization,然后转换为输入 ID
- 文本拆分为单词(或单词的一部分、标点符号等),通常称为token
- 这些标记转换成数字,它们构建一个张量并将它们提供给模型,tokenizer 有一个vocabulary,这就是为什么我们需要使用模型名称实例化分词器,以确保我们使用与预训练模型时相同的规则。
- 在以batch输入到模型的方式中,需要对过短的数据进行填充,过长的数据进行截断保证数据长度符合模型能接受的范围,同时batch内的数据维度大小一致
1 |
|
Train
1 |
|