Transformer 如何工作?
在本节中,我们将从宏观层面了解 Transformer 模型的架构。
Transformer 的历史
以下是 Transformer 模型(简短)历史上的几个参考点
Transformer 架构于 2017 年 6 月首次提出。最初研究的重点是翻译任务。此后又推出了一些有影响力的模型,包括
**2018 年 6 月**:Transformer 架构,第一个用于各种 NLP 任务的微调的预训练 Transformer 模型,并获得了最先进的结果
**2018 年 10 月**:GPT,另一个大型预训练模型,专门设计用于生成更好的句子摘要(下一章将详细介绍!)
**2019 年 2 月**:BERT,GPT 的改进(更大)版本,由于伦理问题,未立即公开发布
**2019 年 10 月**:GPT-2,BERT 的蒸馏版本,速度快 60%,内存占用减少 40%,同时仍保留 BERT 97% 的性能
**2019 年 10 月**:DistilBERT 和 T5,两个使用与原始 Transformer 模型相同架构的大型预训练模型(第一个使用此架构的模型)
**2020 年 5 月**,BART,GPT-2 的更大版本,能够在无需微调的情况下(称为*零样本学习*)执行各种任务
此列表远非详尽,仅用于突出显示几种不同类型的 Transformer 模型。广义上,它们可以分为三类
- GPT 类(也称为*自回归* Transformer 模型)
- BERT 类(也称为*自编码* Transformer 模型)
- BART/T5 类(也称为*序列到序列* Transformer 模型)
我们将在后面更深入地探讨这些系列。
Transformer 是语言模型
上面提到的所有 Transformer 模型(GPT、BERT、BART、T5 等)都是作为*语言模型*训练的。这意味着它们是在大量原始文本上以自监督的方式训练的。自监督学习是一种训练类型,其中目标是自动从模型的输入中计算出来的。这意味着人类不需要为数据贴标签!
这种类型的模型会发展出对它训练所用语言的统计理解,但它对具体的实际任务并不太有用。因此,通用预训练模型随后会经历一个称为*迁移学习*的过程。在此过程中,模型会以监督的方式对特定任务进行微调——即使用人类标注的标签。
任务的一个示例是在阅读完前*n*个词后预测句子中的下一个词。这称为*因果语言建模*,因为输出取决于过去和现在的输入,但不取决于未来的输入。
另一个例子是*掩码语言建模*,其中模型预测句子中掩码的词。
Transformer 是大型模型
除了少数例外(如 DistilBERT),提高性能的一般策略是增加模型的尺寸以及它们用于预训练的数据量。
不幸的是,训练模型,尤其是大型模型,需要大量数据。这在时间和计算资源方面成本很高。它甚至会转化为环境影响,如以下图表所示。
这显示了一个由一个团队(非常大)模型项目,该团队有意识地试图减少预训练的环境影响。运行大量试验以获得最佳超参数的足迹会更高。
想象一下,如果每个研究团队、学生组织或公司都想要从头开始训练模型,将会导致巨大的、不必要的全球成本!
这就是为什么共享语言模型至关重要的原因:共享训练后的权重并在已训练的权重基础上构建,可以降低社区的整体计算成本和碳足迹。
顺便说一句,您可以通过多种工具评估模型训练的碳足迹。例如,ML CO2 Impact 或 Code Carbon(已集成到 🤗 Transformers 中)。要了解更多信息,您可以阅读这篇文章 博客文章,它将向您展示如何生成一个 emissions.csv
文件,其中包含对您的训练足迹的估计,以及 🤗 Transformers 关于此主题的 文档。
迁移学习
预训练是指从头开始训练模型的过程:模型权重被随机初始化,训练在没有任何先验知识的情况下开始。
这种预训练通常在海量数据上进行。因此,它需要一个非常大的语料库,并且训练可能需要数周时间。
另一方面,微调是在模型预训练之后进行的训练。要进行微调,您首先需要获取一个预训练的语言模型,然后使用特定于您的任务的数据集进行额外的训练。等等 - 为什么不简单地从一开始(从头开始)为您的最终用例训练模型呢?这里有几个原因
- 预训练模型已经在一个与微调数据集具有某些相似性的数据集上进行了训练。因此,微调过程能够利用初始模型在预训练期间获得的知识(例如,对于 NLP 问题,预训练模型将对您用于任务的语言具有一定的统计理解)。
- 由于预训练模型已经在大量数据上进行了训练,因此微调需要更少的数据量就能获得不错的结果。
- 出于同样的原因,获得良好结果所需的时间和资源要少得多。
例如,可以使用在英语上训练的预训练模型,然后在 arXiv 语料库上对其进行微调,从而得到一个以科学/研究为基础的模型。微调只需要少量数据:预训练模型获得的知识被“迁移”,因此称为迁移学习。
因此,微调模型具有更低的时间、数据、财务和环境成本。它也更快更容易地迭代不同的微调方案,因为训练比完全预训练限制更少。
此过程也会比从头开始训练获得更好的结果(除非您拥有大量数据),这就是您应该始终尝试利用预训练模型 - 一个尽可能接近您手头任务的模型 - 并对其进行微调的原因。
通用架构
在本节中,我们将介绍 Transformer 模型的通用架构。如果您不理解某些概念,请不要担心;后面有详细的章节介绍每个组件。
介绍
该模型主要由两个模块组成
- 编码器(左):编码器接收输入并构建其表示(特征)。这意味着该模型被优化为从输入中获取理解。
- 解码器(右):解码器使用编码器的表示(特征)以及其他输入来生成目标序列。这意味着该模型被优化为生成输出。
根据任务,这两个部分可以独立使用
- 仅编码器模型:适合需要理解输入的任务,例如句子分类和命名实体识别。
- 仅解码器模型:适合生成式任务,例如文本生成。
- 编码器-解码器模型或序列到序列模型:适合需要输入的生成式任务,例如翻译或摘要。
我们将在后面的章节中分别深入研究这些架构。
注意力层
Transformer 模型的一个关键特征是它们是使用名为注意力层的特殊层构建的。事实上,介绍 Transformer 架构的论文标题是“注意力是你所需要的一切”!我们将在本课程的后面探索注意力层的细节;现在,您只需要知道此层将告诉模型在处理每个单词的表示时,要注意句子中特定的单词(或多或少地忽略其他单词)。
为了将此置于上下文中,请考虑将文本从英语翻译成法语的任务。给定输入“You like this course”,翻译模型将需要关注相邻词“You”以获得“like”的正确翻译,因为在法语中,动词“like”的词形变化不同,具体取决于主语。然而,句子的其余部分对于该词的翻译没有用。同样,在翻译“this”时,模型也需要关注词“course”,因为“this”的翻译不同,具体取决于关联的名词是阳性还是阴性。同样,句子的其他词对于“course”的翻译无关紧要。对于更复杂的句子(以及更复杂的语法规则),模型可能需要特别关注出现在句子中更远处的词,以便正确翻译每个词。
同样的概念适用于与自然语言相关的任何任务:一个词本身具有含义,但该含义受到上下文的深远影响,上下文可以是该词之前或之后的任何其他词(或词语)。
现在您已经了解了注意力层的含义,让我们仔细看看 Transformer 架构。
原始架构
Transformer 架构最初是为翻译而设计的。在训练期间,编码器接收某种语言的输入(句子),而解码器接收相同语言的所需目标语言的句子。在编码器中,注意力层可以使用句子中的所有词(因为,正如我们刚刚看到的那样,给定词的翻译可能取决于句子中该词之前和之后的内容)。但是,解码器按顺序工作,只能关注它已经翻译过的句子中的词语(因此,只有当前生成词之前的词语)。例如,当我们预测了翻译目标的前三个词时,我们将其提供给解码器,然后解码器使用编码器的所有输入来尝试预测第四个词。
为了在训练期间加快速度(当模型可以访问目标句子时),解码器被提供完整的目标,但它不允许使用未来的词语(如果在尝试预测位置 2 的词语时,它可以访问位置 2 的词语,那么这个问题就不难了!)。例如,在尝试预测第四个词时,注意力层将只能访问位置 1 到 3 的词语。
原始的 Transformer 架构如下所示,左侧是编码器,右侧是解码器
请注意,解码器块中的第一个注意力层关注解码器的所有(过去)输入,但第二个注意力层使用编码器的输出。因此,它可以访问整个输入句子以最佳地预测当前词语。这非常有用,因为不同的语言可能有不同的语法规则,这些规则会将词语以不同的顺序排列,或者句子后面的某些上下文可能有助于确定给定词语的最佳翻译。
注意力掩码也可以在编码器/解码器中使用,以防止模型关注某些特殊词语 - 例如,用于在将句子批处理在一起时使所有输入具有相同长度的特殊填充词语。
架构与检查点
在本课程中,当我们深入研究 Transformer 模型时,您将看到架构和检查点以及模型的提及。这些术语都具有略微不同的含义
- 架构:这是模型的骨架 - 模型中每个层和每个操作的定义。
- 检查点:这些是在给定架构中将被加载的权重。
- 模型:这是一个笼统的术语,不像“架构”或“检查点”那样精确:它可以指两者。本课程会在需要时明确指定架构或检查点,以减少歧义。
例如,BERT 是一种架构,而 bert-base-cased
是一组由 Google 团队为 BERT 的第一个版本训练的权重,它是一个检查点。但是,人们也可以说“BERT 模型”和“bert-base-cased
模型”。