LLM 课程文档
Transformers 是如何工作的?
并获得增强的文档体验
开始使用
Transformers 是如何工作的?
在本节中,我们将了解 Transformer 模型的架构,并深入探讨注意力机制、编码器-解码器架构等概念。
🚀 我们正在这里提升难度。本节内容详细且技术性强,所以如果你不能立刻理解所有内容,也不必担心。我们将在课程的后续部分重新回顾这些概念。
Transformer 简史
以下是 Transformer 模型(短暂)历史中的一些参考点
Transformer 架构于 2017 年 6 月推出。最初的研究重点是翻译任务。随后,几款有影响力的模型相继问世,包括
2018 年 6 月:GPT,首个预训练的 Transformer 模型,用于在各种 NLP 任务上进行微调,并取得了最先进的成果。
2018 年 10 月:BERT,另一个大型预训练模型,旨在生成更好的句子摘要(下一章将详细介绍!)。
2019 年 2 月:GPT-2,GPT 的一个改进(且更大)版本,由于伦理问题未立即公开发布。
2019 年 10 月:T5,一个专注于多任务的序列到序列 Transformer 架构实现。
2020 年 5 月,GPT-3,一个比 GPT-2 更大的版本,能够在各种任务上表现出色,而无需进行微调(称为*零样本学习*)。
2022 年 1 月:InstructGPT,一个经过训练以更好地遵循指令的 GPT-3 版本。这份清单远非详尽,仅旨在突出几种不同类型的 Transformer 模型。广义上,它们可以分为三类
2023 年 1 月:Llama,一个能够生成多种语言文本的大型语言模型。
2023 年 3 月:Mistral,一个拥有 70 亿参数的语言模型,在所有评估基准上均优于 Llama 2 13B,它利用分组查询注意力(grouped-query attention)来加快推理速度,并使用滑动窗口注意力(sliding window attention)来处理任意长度的序列。
2024 年 5 月:Gemma 2,一系列轻量级、最先进的开放模型,参数范围从 20 亿到 270 亿不等,融合了交错的局部-全局注意力(interleaved local-global attentions)和分组查询注意力(group-query attention),其中较小的模型使用知识蒸馏进行训练,以提供与大 2-3 倍的模型相媲美的性能。
2024 年 11 月:SmolLM2,一款最先进的小型语言模型(参数范围从 1.35 亿到 17 亿),尽管其体积小巧,却实现了令人印象深刻的性能,为移动和边缘设备开启了新的可能性。
GPT-like(也称为*自回归* Transformer 模型)
BERT-like(也称为*自编码* Transformer 模型)
T5-like(也称为*序列到序列* Transformer 模型)
我们稍后将更深入地探讨这些系列。
Transformers 是语言模型
所有上述提到的 Transformer 模型(GPT、BERT、T5等)都是作为*语言模型*进行训练的。这意味着它们是在大量的原始文本上以自监督的方式进行训练的。
自监督学习是一种训练方式,其目标是从模型的输入中自动计算出来的。这意味着不需要人类来标注数据!
这类模型对其训练所用的语言形成了一种统计学上的理解,但对于特定的实际任务来说,这种模型的用处不大。因此,通用的预训练模型会经过一个称为*迁移学习*或*微调*的过程。在这个过程中,模型会在给定任务上以有监督的方式进行微调——也就是说,使用人工标注的标签。
任务的一个例子是,在阅读了前面的 *n* 个词后,预测句子中的下一个词。这被称为*因果语言建模*,因为输出取决于过去和现在的输入,而不是未来的输入。
另一个例子是*掩码语言建模*,模型在这种任务中预测句子中被掩盖的词。
Transformers 是大型模型
除了少数例外(如DistilBERT),实现更好性能的通用策略是增加模型的尺寸以及它们预训练时使用的数据量。

不幸的是,训练一个模型,特别是大型模型,需要大量的数据。这在时间和计算资源上都非常昂贵。它甚至会转化为环境影响,如下面的图表所示。
这展示了一个团队主导的(非常大的)模型项目,该团队有意识地尝试减少预训练对环境的影响。为了获得最佳超参数而进行大量试验的碳足迹会更高。
想象一下,如果每次研究团队、学生组织或公司想要训练一个模型时,都从头开始。这将导致巨大的、不必要的全球成本!
这就是为什么共享语言模型至关重要:共享训练好的权重并在已训练的权重之上进行构建,可以减少整个社区的计算成本和碳足迹。
顺便说一下,您可以通过多种工具来评估模型训练的碳足迹。例如 ML CO2 Impact 或 Code Carbon,后者已集成在 🤗 Transformers 中。要了解更多信息,您可以阅读这篇博客文章,它将向您展示如何生成一个包含训练碳足迹估算的 emissions.csv
文件,以及 🤗 Transformers 中关于此主题的文档。
迁移学习
预训练是从零开始训练模型的行为:权重是随机初始化的,训练开始时没有任何先验知识。
这种预训练通常在非常大量的数据上进行。因此,它需要一个非常大的数据语料库,并且训练可能需要长达数周的时间。
另一方面,微调是在模型预训练之后进行的训练。要进行微调,您首先获取一个预训练的语言模型,然后使用特定于您的任务的数据集进行额外的训练。等等——为什么不从一开始就为您的最终用例训练模型(从零开始)?有几个原因
- 预训练模型已经在与微调数据集有某些相似性的数据集上进行了训练。因此,微调过程能够利用初始模型在预训练期间获得的知识(例如,对于NLP问题,预训练模型将对您任务中使用的语言有某种统计学上的理解)。
- 由于预训练模型已经在大量数据上进行了训练,微调只需要很少的数据就能获得不错的结果。
- 出于同样的原因,获得良好结果所需的时间和资源要少得多。
例如,人们可以利用一个在英语上训练的预训练模型,然后在一个 arXiv 语料库上进行微调,从而得到一个基于科学/研究的模型。微调只需要有限的数据:预训练模型获得的知识被“迁移”了,因此得名*迁移学习*。
因此,微调模型的时间、数据、财务和环境成本都较低。迭代不同的微调方案也更快、更容易,因为训练的限制比完整的预训练要少。
这个过程也会比从头开始训练取得更好的结果(除非你有大量数据),这就是为什么你应该总是尝试利用一个预训练模型——一个尽可能接近你手头任务的模型——并对其进行微调。
通用 Transformer 架构
在本节中,我们将介绍 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` 是一个检查点,这是谷歌团队为 BERT 的首次发布而训练的一组权重。然而,人们可以说“BERT 模型”和“`bert-base-cased` 模型”。
< > 在 GitHub 上更新