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 是语言模型
上面提到的所有 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
模型”。