LLM 课程文档
Transformer 模型是如何工作的?
并获取增强的文档体验
开始使用
Transformer 模型是如何工作的?
在本节中,我们将从高层次了解 Transformer 模型的架构。
Transformer 模型简史
以下是 Transformer 模型(简短)历史中的一些参考点
Transformer 架构于 2017 年 6 月被提出。最初研究的重点是翻译任务。随后推出了一些有影响力的模型,包括
2018 年 6 月:GPT,第一个预训练 Transformer 模型,用于在各种 NLP 任务上进行微调,并获得了最先进的结果
2018 年 10 月:BERT,另一个大型预训练模型,这个模型旨在生成更好的句子摘要(更多内容将在下一章中介绍!)
2019 年 2 月:GPT-2,GPT 的改进版(和更大版本),由于伦理问题,没有立即公开发布
2019 年 10 月:DistilBERT,BERT 的精简版本,速度快 60%,内存占用少 40%,并且仍然保留了 BERT 97% 的性能
2019 年 10 月:BART 和 T5,两个大型预训练模型,使用与原始 Transformer 模型相同的架构(首次这样做)
2020 年 5 月:GPT-3,GPT-2 的更大版本,能够在各种任务上表现良好,而无需微调(称为零样本学习)
此列表远非全面,仅旨在突出显示几种不同类型的 Transformer 模型。
- 大致来说,它们可以分为三类
- 类似 GPT (也称为自回归 Transformer 模型)
- 类似 BERT (也称为自编码 Transformer 模型)
类似 BART/T5 (也称为序列到序列 Transformer 模型)
我们将在后面更深入地探讨这些系列。
上面提到的所有 Transformer 模型(GPT、BERT、BART、T5 等)都已作为语言模型进行训练。这意味着它们已经在大量的原始文本上以自监督的方式进行了训练。自监督学习是一种训练类型,其中目标是从模型的输入中自动计算出来的。这意味着不需要人类来标记数据!
这种类型的模型发展了对其训练语言的统计理解,但对于特定的实际任务来说并不是很有用。因此,通用的预训练模型会经历一个称为迁移学习的过程。在此过程中,模型以监督方式(即使用人工标注的标签)在给定任务上进行微调。
一个任务的例子是预测句子中在阅读了 n 个前词之后的下一个词。这被称为因果语言建模,因为输出取决于过去和现在的输入,而不是未来的输入。
另一个例子是掩码语言建模,其中模型预测句子中的掩码词。

除了少数例外(如 DistilBERT),实现更好性能的通用策略是通过增加模型的大小以及预训练的数据量。
不幸的是,训练模型,尤其是大型模型,需要大量数据。这在时间和计算资源方面变得非常昂贵。它甚至会转化为环境影响,如下面的图表所示。
这显示的是一个(非常大的)模型的项目,该项目由一个有意识地试图减少预训练环境影响的团队领导。运行大量试验以获得最佳超参数的足迹将更高。
想象一下,如果每次研究团队、学生组织或公司想要训练模型时,都从头开始。这将导致巨大的、不必要的全球成本!
这就是为什么共享语言模型至关重要:共享训练后的权重并基于已训练的权重构建,可以降低社区的整体计算成本和碳足迹。
顺便说一句,您可以通过多种工具评估模型训练的碳足迹。例如 ML CO2 Impact 或集成在 🤗 Transformers 中的 Code Carbon。要了解更多信息,您可以阅读这篇 博客文章,它将向您展示如何生成一个 emissions.csv 文件,其中包含对您的训练足迹的估计,以及 🤗 Transformers 解决此主题的文档。
预训练是从头开始训练模型的行为:权重是随机初始化的,并且训练在没有任何先验知识的情况下开始。
这种预训练通常在大量数据上进行。因此,它需要非常大的数据语料库,并且训练可能需要数周时间。
- 另一方面,微调是在模型预训练后进行的训练。要执行微调,您首先需要获取一个预训练的语言模型,然后使用特定于您任务的数据集执行额外的训练。等等——为什么不直接从一开始(从头开始)为您的最终用例训练模型呢?原因有几个
- 预训练模型已经在与微调数据集具有某些相似之处的数据集上进行了训练。因此,微调过程能够利用初始模型在预训练期间获得的知识(例如,对于 NLP 问题,预训练模型将对您用于任务的语言具有某种统计理解)。
- 由于预训练模型已经在大量数据上进行了训练,因此微调需要更少的数据才能获得不错的结果。
出于同样的原因,获得良好结果所需的时间和资源量要少得多。
例如,可以利用在英语上训练的预训练模型,然后在 arXiv 语料库上对其进行微调,从而产生基于科学/研究的模型。微调只需要有限的数据量:预训练模型获得的知识被“转移”,因此得名迁移学习。
因此,微调模型具有更低的时间、数据、财务和环境成本。迭代不同的微调方案也更快更容易,因为训练的约束比完全预训练要少。
此过程也将比从头开始训练获得更好的结果(除非您有大量数据),这就是为什么您应该始终尝试利用预训练模型(尽可能接近您手头的任务的模型)并对其进行微调的原因。
在本节中,我们将介绍 Transformer 模型的通用架构。如果您不理解某些概念,请不要担心;稍后会有详细的章节介绍每个组件。
- 该模型主要由两个模块组成
- 编码器(左侧):编码器接收输入并构建其表示(其特征)。这意味着该模型经过优化以从输入中获取理解。
解码器(右侧):解码器使用编码器的表示(特征)以及其他输入来生成目标序列。这意味着该模型针对生成输出进行了优化。
- 这些部分中的每一个都可以根据任务独立使用
- 仅编码器模型:适用于需要理解输入的任务,例如句子分类和命名实体识别。
- 仅解码器模型:适用于生成任务,例如文本生成。
编码器-解码器模型 或 序列到序列模型:适用于需要输入的生成任务,例如翻译或摘要。
我们将在后面的章节中分别深入探讨这些架构。
Transformer 模型的一个关键特征是它们是用称为注意力层的特殊层构建的。事实上,介绍 Transformer 架构的论文的标题是“Attention Is All You Need”!我们将在本课程的后面部分探讨注意力层的细节;现在,您只需要知道,当处理每个单词的表示时,该层将告诉模型特别注意您传递给它的句子中的某些单词(或多或少忽略其他单词)。
为了将此置于上下文中,请考虑将文本从英语翻译成法语的任务。给定输入“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 模型”。