00180 NLP Course - How do Transformers work? ubuntu
前言
在本节中,我们将高层次地了解Transformer模型的体系结构。
src link: https://huggingface.co/learn/nlp-course/chapter1/4
Operating System: Ubuntu 22.04.4 LTS
参考文档
有点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的更大版本,能够在不需要微调的情况下很好地执行各种任务(称为zero-shot学习)
这份清单远非全面,只是为了突出一些不同类型的Transformer模型。大体上,它们可以分为三类:
- GPT类似的(也称为自回归式的Transformer模型)
- BERT类似的(也称为自编码式的Transformer模型)
- BART/T5类似的(也称为序列到序列的Transformer模型)
我们将在后面更深入地探讨这些模型家族。
Transformers是语言模型
上述提到的所有Transformer模型(GPT、BERT、BART、T5等)都已被训练为语言模型。这意味着它们是在大量原始文本上以自监督的方式训练的。自监督学习是一种训练类型,其目标是从模型的输入中自动计算得出。这意味着不需要人类来标注数据!
这种类型的模型对其训练的语言发展出一种统计理解,但对于特定的实际任务来说并不是非常有用。因此,通用预训练模型会经历一个称为迁移学习的过程。在这个过程中,模型会在给定的任务上以监督的方式进行微调——也就是说,使用人类标注的标签。
一个任务的例子是预测句子中的下一个词,前提是已经阅读了前n个词。这被称为因果语言建模,因为输出依赖于过去的和当前的输入,但不依赖于未来的输入。
另一个例子是掩码语言建模,其中模型预测句子中的被掩码的词。
Transformer模型是大型模型
除了少数例外(如DistilBERT),提高性能的一般策略是增加模型的大小以及它们预训练的数据量。
不幸的是,训练一个模型,尤其是大型模型,需要大量的数据。这在时间和计算资源上变得非常昂贵。甚至还会转化为环境影响,如下图表所示。
这显示了一个由一支团队领导的项目,他们正试图减少预训练对环境的影响,这个模型(非常庞大)。为了获得最佳超参数而运行大量试验的足迹甚至会更高。
想象一下,如果每次研究团队、学生组织或公司想要训练一个模型,都是从零开始。这将导致巨大的、不必要的全球成本!
这就是为什么共享语言模型至关重要:共享训练好的权重并在已经训练好的权重之上进行构建,可以减少整个社区的总体计算成本和碳足迹。
顺便说一下,您可以通过几种工具来评估您的模型训练的碳足迹。例如,ML CO2 Impact 或集成在 🤗 Transformers 中的 Code Carbon。要了解更多信息,您可以阅读这篇博客文章,它将向您展示如何生成一个 emissions.csv 文件,其中包含您的训练足迹的估算,以及 🤗 Transformers 关于这个主题的文档。
迁移学习
预训练是从头开始训练模型的行为:权重是随机初始化的,训练开始时没有任何先验知识。
这种预训练通常是在非常大量的数据上完成的。因此,它需要非常大的数据语料库,训练可能需要长达数周的时间。
另一方面,微调是在模型预训练之后进行的训练。为了进行微调,您首先获取一个预训练的语言模型,然后在特定于您任务的数据集上执行额外的训练。等等——为什么不从一开始(即从零开始)就直接为您的最终用例训练模型呢?这里有几个原因:
- 预训练模型已经在与微调数据集具有某些相似性的数据集上进行了训练。因此,微调过程能够利用初始模型在预训练期间获得的知识(例如,对于NLP问题,预训练模型将对您用于任务的 语言具有一定的统计理解)。
- 由于预训练模型已经在大量数据上进行了训练,因此微调所需的数据量要少得多,以获得不错的结果。
- 由于同样的原因,获得良好结果所需的时间和资源也要少得多。
例如,可以利用在英语数据上预训练的模型,然后在arXiv语料库上进行微调,从而得到一个基于科学/研究的模型。微调只需要有限量的数据:预训练模型所获得的知识被“转移”过来,因此称之为迁移学习。
因此,微调模型在时间、数据、财务和环境成本上都较低。与完整的预训练相比,微调的训练约束更少,因此迭代不同的微调方案也更快、更容易。
这个过程也会比从零开始训练获得更好的结果(除非你有很多数据),这就是为什么你应该总是尝试利用预训练模型——尽可能接近你手头任务的模型——并进行微调。
通用架构
在本节中,我们将概述Transformer模型的一般架构。如果你不理解某些概念,请不要担心;后面有详细的章节会涵盖每一个组件。
介绍
该模型主要由两个块组成:
- 编码器(左):编码器接收输入并构建它的表示(其特征)。这意味着模型经过优化以从输入中获得理解。
- 解码器(右):解码器使用编码器的表示(特征)以及其他输入来生成目标序列。这意味着模型针对生成输出进行了优化。
这些部件中的每一个都可以独立使用,具体取决于任务:
- 纯编码器模型:适用于需要理解输入的任务,例如句子分类和命名实体识别。
- 仅解码器模型:适用于生成任务,例如文本生成。
- 编码器-解码器模型或sequence-to-sequence模型:适用于需要输入的生成任务,例如翻译或摘要。
我们将在后续章节中分别深入探讨这些架构。
注意力层
Transformer模型的一个关键特性是它们构建了特殊的层,称为注意力层。事实上,引入Transformer架构的论文标题就是“Attention Is All You Need”! 我们将在课程后面详细探讨注意力层的细节;现在,你需要知道的是,这个层会告诉模型在你传递给它的句子中关注特定的单词(或多或少忽略其他单词),在处理每个单词的表示时。
为了将这一点放入上下文中,考虑将文本从英语翻译成法语的任务。给定输入“You like this course”,翻译模型将需要同时关注相邻的单词“You”,以得到单词“like”的正确翻译,因为在法语中,动词“like”根据主语的不同有不同的变位。然而,句子的其余部分对于这个词的翻译并不有用。同样,当翻译“this”时,模型也需要关注单词“course”,因为“this”根据相关的名词是阳性还是阴性有不同的翻译方式。再次强调,句子中的其他单词对于“course”的翻译并不重要。在更复杂的句子(以及更复杂的语法规则)中,模型需要特别关注可能在句子中较远位置出现的单词,以正确翻译每个单词。
同样的概念适用于与自然语言相关的任何任务:一个单词本身具有含义,但这个含义深受上下文的影响,上下文可以是正在研究的单词之前或之后出现的任何其他单词(或单词组合)。
现在你已经对注意力层有了初步的了解,让我们更深入地看看Transformer架构。
原始架构
变换器架构最初是为翻译而设计的。在训练过程中,编码器接收某种语言的输入(句子),而解码器接收相同句子在目标语言中的版本。在编码器中,注意力层可以使用句子中的所有单词(因为正如我们刚刚看到的,一个给定单词的翻译可能取决于句子中它之前和之后的词语)。然而,解码器是按顺序工作的,并且只能关注它已经翻译的句子中的单词(因此,只有当前正在生成的单词之前的单词)。例如,当我们已经预测出翻译目标的前三个单词时,我们将它们传递给解码器,然后解码器使用编码器的所有输入来尝试预测第四个单词。
在训练过程中(当模型能够访问目标句子时),为了加快速度,解码器会接收整个目标句子,但它不允许使用未来的单词(如果它在尝试预测位置2的单词时能够访问位置2的单词,那么这个问题就不会太难了!)。例如,当尝试预测第四个单词时,注意力层将只能访问位置1到3的单词。
最初的Transformer架构是这样的,编码器在左边,解码器在右边:
请注意,解码器块中的第一个注意力层关注解码器的所有(过去)输入,而第二个注意力层使用编码器的输出。因此,它可以访问整个输入句子以最佳预测当前单词。这非常有用,因为不同的语言可能有将单词以不同顺序排列的语法规则,或者句子后面提供的一些上下文可能有助于确定给定单词的最佳翻译。
注意力掩码还可以在编码器/解码器中使用,以防止模型关注某些特殊单词——例如,当将句子批量处理以使所有输入长度相同时所使用的特殊填充词。
架构与检查点
在我们深入学习本课程中的Transformer模型时,您会看到关于架构、检查点和模型的不同提及。这些术语都有略微不同的含义:
- 架构:这是模型的骨架——即模型中每个层和每个操作的定义。
- 检查点(Checkpoints):这些是在给定架构中将要加载的权重。
- 模型(Model):这是一个不那么精确的泛称,它可以指“架构”或“检查点”。在本课程中,当需要减少歧义时,会明确指定是架构还是检查点。
例如,BERT是一个架构,而bert-base-cased是由谷歌团队为BERT首次发布训练的一组权重,它是一个检查点。然而,人们可以说“BERT模型”和“bert-base-cased模型”。
结语
第一百八十篇博文写完,开心!!!!
今天,也是充满希望的一天。