深度学习架构师手册——理解神经网络变换器(Transformers)

不要将神经网络变换器与也被称为变压器的电气设备混淆,神经网络变换器是神经网络中的多面手变种。变换器能够处理和捕捉任何模态数据的模式,包括序列数据如文本数据和时间序列数据、图像数据、音频数据和视频数据。

变换器架构于2017年提出,目的是替代基于RNN的序列到序列架构,主要聚焦于机器翻译任务,即将文本数据从一种语言转换为另一种语言。变换器的表现优于基线的基于RNN的模型,并证明了我们不需要在数据的序列性质上施加固有的归纳偏差,这正是RNN所采用的方式。变换器随后成为神经网络架构家族的根基,并发展出多个变体,能够在其他数据模态中捕捉模式,同时不断提高原始基于文本序列数据任务的性能。这表明,我们通常不需要在模型中内建固有的归纳偏差,无论数据模态如何,相反,我们可以让模型学习这些固有的结构和模式。你有视频、文本或音频等序列数据吗?让神经网络学习其序列特性。你有图像数据吗?让神经网络学习像素之间的空间和深度关系。你明白了吧。

在我们深入探索变换器之前,休息一下,了解本章将涉及的主题:

  • 探索神经网络变换器
  • 全面解码原始变换器架构
  • 揭示仅使用编码器的变换器改进
  • 揭示仅使用解码器的变换器改进

探索神经网络变换器

图6.1提供了变换器的影响概述,这得益于众多变换器模型变体的出现。

变换器的架构中没有固有的归纳偏差设计。归纳偏差是指学习算法对数据所做的预设假设。这种偏差可以内建到模型架构或学习过程中,并有助于引导模型学习数据中的特定模式或结构。传统模型,如RNN,通过其设计融入归纳偏差,例如假设数据具有顺序结构,且元素的顺序很重要。另一个例子是CNN模型,它们专门设计用于处理网格状数据,如图像,通过卷积层和池化层的使用,将局部连接性和平移不变性作为归纳偏差融入其中。在这种情况下,模型架构本身对可学习的模式施加了某些约束。

变换器的设计思想是我们应该让模型根据提供的所有输入数据来决定如何以及在哪里聚焦。这一过程通过多个机制的组合来实现,每个机制以不同的方式决定聚焦的位置。因此,变换器完全依赖于输入数据提供的信息来确定数据中是否存在任何形式的归纳偏差。这些聚焦组件正式称为注意力层(attention layers)。图6.1中展示的变换器上的改进并没有偏离变换器的基础结构。通常,添加不同模态的改进是通过数据设置的变体完成的,以将输入数据结构适配到变换器的结构中,并且根据目标任务应用的不同,输出的预测细节也有所不同。

目前,变换器是具有最大能力的架构家族,能够学习和识别现实世界中存在的高度复杂的模式。更进一步,从2022年中到2023年,变换器展示了其信息容量仅受硬件资源容量的限制。目前,最大的一些变换器模型,其中一个规模比基础变换器大了许多倍,拥有惊人的5400亿个参数,是Google提供的一个名为PaLM的模型变体。此外,有传言称,OpenAI的GPT-4多模态文本生成模型(目前作为服务提供,并非开源模型)由多个模型或单个模型组成,参数总数超过一万亿个。这些巨大的模型通常需要几个月的训练才能达到最佳性能,同时需要具有高性能的最先进GPU。

你可能会想,为什么我们要训练如此庞大的模型,是否它所提供的价值值得投入?让我们评估一下OpenAI开发的一个变换器模型------GPT-3。GPT-3是一种语言模型,它接受输入文本并根据认为最合适和最有用的响应生成文本预测。现在,这涵盖了NLP领域中的许多任务,传统上这些任务是通过各自独立的模型完成的,使得它成为一个任务无关的模型。可以完成的任务包括机器语言翻译、阅读理解、推理、算术处理,通常能够展示广泛的语言理解能力,并根据查询输入文本提供不同格式的结果。例如,最终用户应用包括生成能够实现指定目标的任何编程语言代码,写具有指定主题的小说,获取任何已知公众人物的相关信息,总结客户反馈,通常或专注于某些主题,如"是什么让客户感到沮丧",以及在虚拟世界中为角色对话增添现实感。迄今为止,GPT-3在多个类别和行业中有超过300个应用,虽然这个数字看似不大,但将为NN的巨大能力带来更多创新和普及。

变换器经过多年的逐步改进,通过严谨的研究,但未大幅偏离基础架构。这意味着,理解原始架构是理解所有最新和最优秀的改进变换器(如GPT-3)的关键。因此,接下来让我们深入探讨2017年的原始变换器架构,讨论过去五年研究中哪些组件发生了变化或适应,诞生了新的模型架构。

全面解码原始变换器架构

在我们深入探讨模型的结构之前,先来谈谈变换器的基本意图。

如前章所述,变换器也是一种利用编码器和解码器概念的架构家族。编码器将数据编码成所谓的代码,解码器则将代码解码成类似于原始、未经处理的数据格式。第一个变换器同时使用了编码器和解码器的概念来构建整个架构,并展示了其在文本生成中的应用。随后的适应和改进要么只使用了编码器,要么只使用了解码器,以实现不同的任务。然而,在变换器中,编码器的目标并不是压缩数据,以获得更小、更紧凑的表示,而是主要作为特征提取器。此外,变换器中解码器的目标也不是重建相同的输入数据。

注意

可以用变换器组件构建一个实际的自编码器结构,而不是使用CNN或RNN组件,但本书不讨论这一点。

原始变换器将编码器和解码器中的数据/权重维度固定为统一的单一尺寸,以便进行残差连接,使用的维度为512。

变换器还利用逻辑块结构来定义其创新性,这使得它们的规模可以轻松扩展。变换器的核心操作是识别输入数据样本中每个数据单元应聚焦于整个输入数据的哪个部分。这个聚焦机制通过一种称为注意力层的神经网络层来实现。注意力层有很多变体,本书不涉及。

变换器使用最简单的注意力变体,通过softmax激活来实现基于点积的注意力。由于softmax使得值加起来总是等于1.0,因此每一层通常会有一个最强的焦点。可以将其视为一种类似RNN中门控的形式,详细的RNN内容请参考第4章《理解循环神经网络》。变换器使用多个注意力层,每个输入都会以多种方式进行聚焦,多个注意力层的聚合体被称为多头注意力层。

变换器的输入和输出是以tokens的形式存在的。Tokens是指可以传入和传出变换器的输入数据的单独单元。虽然变换器的结构并没有明确假设这些tokens的序列性或分组性,但它们可以是顺序的或非顺序的、分组的或非分组的。通过自变换器提出以来的研究和进展,文本的tokens可以是单词或子词,图像的tokens可以是图像补丁,音频的tokens可以是音频数据的时间窗口(例如,1秒钟的窗口),视频的tokens可以是单一图像帧或一组图像帧。由于模型本身没有对任何数据模态类型施加固有的归纳偏差,因此数据的位置信息或顺序信息是通过tokens显式编码到数据中的。这些位置编码可以是增量的离散整数位置(1, 2, 3...),也可以是介于离散整数值之间的连续浮动位置(1.2, 1.4556, 2.42325...),从绝对位置到相对位置,最终,单一值的位置用于每个token或embedding,并且这些位置可以通过学习得到。原始变换器使用了一个映射函数,将绝对整数位置映射为相对浮动位置,考虑到tokens的数据维度和预期的统一数据维度大小,但最先进的模型通常采用可以学习的embedding。Embedding是一个查找表,将任何离散的类别数据编码为原始类别的高维、更复杂的表示,从而可以准确地区分不同的类别。需要注意的是,实际的输入数据token本身通常也会应用embedding,具体取决于输入数据(图像帧或补丁通常不使用embedding,因为它们已经具有高维度,而文本token是类别性的,使用embedding)。

图6.2展示了架构的高级概览:

编码器和解码器具有相似的结构,唯一的不同是解码器额外有一个中间的多头注意力层,它连接到编码器的输出以及一个掩蔽版本的多头注意力块。掩蔽的目的是防止使用不相关的数据,这在输入文本的下一段中将会变得明显。原始变换器中,编码器的目的是将输入数据的信息传递到解码器的多个块的中间多头注意力层。解码器的目的是最终生成输出,然后将其输入到按token连接的全连接层(正式称为逐点线性层),用于监督目标的预测。预测可以是回归或基于分类的目标,其中后者使用softmax激活函数。

注意

解码器还会接收其他数据,除了编码器的输出。

为了在不限制输出数量的情况下实现数据生成,变换器被设计为自回归模型。自回归模型使用第一次预测的结果作为第二次预测的输入,随后这些结果将作为下一个预测的输入。下图展示了这个预测过程的示例,使用文本数据,旨在实现从英语到普通话的机器翻译。

变换器的每次前向传播将预测一个单独的输出。在变换器输出中,考虑到句子结束符号的预测,以指示预测已经完成。然而,在训练过程中,并不需要执行这个自回归循环;相反,掩蔽是在随机位置生成的,以使目标token的所有未来token无效,防止模型直接复制单一的目标token并获取未来的token信息。简而言之,掩蔽机制在预测或推理阶段并不使用。

多头注意力层除了实际的注意力机制外,还有一些其他关键操作。图6.4展示了展开的多头注意力层,以及之前提到的在缩放点积注意力层中的注意力机制。

将多头注意力层视为多个个体对同一数据进行不同聚焦模式的贡献。Q、K和V分别表示查询、键和值,其中查询表示单独的tokens,而键和值则是所有tokens的完整列表。线性层是多头注意力层中唯一存放权重的地方,每个查询、键和值组件都有自己的线性层。缩放点积注意力层是用于在训练过程中使用掩蔽来使未来的tokens无效的地方。这个层的一个独特部分是它通过线性层输出维度的平方根进行缩放,以防止softmax将焦点集中在不重要的区域。注意力机制的目的是找到每个token与整个输入tokens集合之间的相关性,换句话说,就是找出哪些tokens与哪些tokens发生了交互,并弄清楚它们彼此依赖的程度。回想一下,模型的维度必须保持固定大小,以确保值可以在不进行额外处理的情况下相加。由于多个注意力头的输出将被拼接而不是相加,因此线性层的维度必须在各个头之间均匀分配。例如,假设有8个头,并且数据/权重维度为512,那么每个头的查询、键和值的线性层维度将是512/8=64个神经元。图6.5展示了一个简单的例子,展示了工作流程中的输出及其形状,其中每个token的固定数据/权重维度为3,使用与图6.4相同的输入文本数据。

相同的操作将应用于另外两个查询词,"love"和"you"。一个注意力头的操作以一种方式聚焦于输入数据,而其他头则以不同的方式聚焦于输入数据。在编码器-解码器层中,查询来自解码器层,而键和值则来自编码器层。这使得解码器能够选择在给定的输入文本中聚焦于何处,从而生成下一个输出。图6.6展示了一种理解多头注意力输出的好方式,四个头的多头注意力聚焦于文本的不同部分。

变换器的正则化机制与其他先前架构(如CNN、RNN和MLP)中的正则化机制具有相同的目的,因此在这里不再讨论。到此为止,我们已经总结了变换器的所有组成部分。与旧的架构(如序列到序列或自编码器)相比,这种基础架构使我们能够实现更好的数据生成结果。尽管原始架构主要针对文本数据的应用,但这一概念已经被适应并应用于处理其他数据模态,如图像、视频和音频数据。回想一下,原始模型之后的改进和适应仅使用了编码器或仅使用了解码器。接下来的两个主题,我们将分别深入探讨这两个不同的概念。

揭示仅使用编码器的变换器改进

我们将讨论的基于变换器的架构改进的第一种类型是仅使用原始变换器的编码器部分的变换器,这些变换器使用相同的多头注意力层。采用仅编码器的变换器通常是因为没有使用掩蔽多头注意力层,因为不需要进行下一个token预测的训练设置。在这一系列改进中,训练目标和设置在不同的数据模态之间有所不同,在相同数据模态下的顺序改进也有所不同。然而,有一个概念在不同数据模态之间几乎是保持不变的,那就是使用半监督学习方法。对于变换器而言,这意味着首先执行一种形式的无监督学习,然后执行直截了当的监督学习方法。无监督学习为变换器提供了一种方式,基于对数据本质的更广泛理解来初始化其状态。这一过程也称为模型预训练,这是无监督学习的一种形式。无监督学习将在第8章《探索无监督深度学习》中更广泛地讨论。

一些改进是特定于数据模态的,主要包括文本特定的改进,并涉及优化任务类型的变化。其他改进是通用的变换器架构改进,可以泛化到不同的数据模态。我们将先聚焦于通用架构改进,然后再深入探讨专门为文本量身定制的改进,这些改进可能适用于其他数据模态,也可能不适用。首先,我们将介绍一个仅编码器结构的基础架构,称为BERT。

BERT(Bidirectional Encoder Representations from Transformers)架构,于2018年提出,实际上是一个仅解码器的变换器,使用相同的多头注意力层,并引入了一个可以泛化到其他数据模态的预训练任务,但它是为文本数据构建的。这个任务被称为掩蔽语言模型(MLM),其目标是预测随机掩蔽的输入token,并仅从这些token的输出中学习。请注意,变换器的编码器输出基于token,因此通过简单地添加一个按token分类的softmax层可以实现token分类。这个特定任务被证明是作为预训练方法非常有效的,它允许下游的监督任务实现更好的性能。由于tokens在原始序列中以不同位置被掩蔽,因此该架构被称为双向的,因为除了过去的tokens外,还可以使用未来的tokens的信息来预测过去的tokens。例如,15%的tokens被掩蔽,其中10%被随机替换为随机tokens作为噪声,使模型类似于去噪自编码器,从而使它对噪声具有鲁棒性。标准的自回归结构自然是单向的,且不能利用未来的tokens。BERT还引入了在单一输入表示中对多个句子的编码方式。这是通过添加一个具有自己学习到的嵌入的特殊分隔符token来实现的,用于标识文本之间的分隔,以及一个额外的段落嵌入来向变换器指示token属于哪个句子。这使得另一任务------下一个句子预测(NSP)------可以与MLM目标一起进行预训练优化。这是通过将第一个token保留为一个特殊的类别token(在图6.7中表示为CLS)来实现的,第一输出token用于预测下一个句子,其中正例是来自同一文档的两个连续句子,负例是通过将来自不同文档的句子配对生成的。预训练机制允许模型学习数据本质的可泛化模式,而这两个任务被证明能提高下游监督学习任务的性能。下游监督学习只需在所有tokens之间添加一个全局的全连接层,并且加上特定目标的层,如softmax。三个嵌入(位置嵌入、段落嵌入和token嵌入)会在将结果传入变换器之前加在一起。图6.7展示了这一架构。

该架构专注于表示额外输入的方法和通过多任务学习增加模型对数据模态本质的理解,并在多个下游基于文本的任务中超越了之前的性能。

现在我们已经介绍了基础的仅编码器模型,我们准备探索专门针对仅编码器变换器的不同进展类别。改进将按进展类别进行探索,而不是按模型,因为不同的模型结合了许多进展,这使得比较实际进展变得困难。这三种类型的改进如下:

  • 改进的基于数据模态的预训练任务
  • 在紧凑性、速度和效率方面的架构改进
  • 核心/功能架构改进

我们将跳过基于数据的改进细节,如使用多语言数据构建多语言BERT,或使用子词级别的tokens来减少词汇量并增加词汇之间的重用。

改进仅编码器的预训练任务和目标

回顾一下,MLM和NSP在基础BERT模型中被使用,而MLM被提到是一个用于理解文本语言的稳健任务,但它也可以轻松地适应其他数据模态的tokens。NSP被证明是不稳定的,并没有在每种情况下都具体帮助模型提高性能。一个改进方向是使用句子顺序预测(SOP)。与简单使用同一文档中正向连续句子的倒序作为负句子的做法相比,SOP在提高下游监督任务性能方面显示了更高的一致性。从概念上讲,它学习句子之间的凝聚力,而不是尝试同时预测两句是否来自同一主题。这个方法在2020年由ALBERT模型引入,主要专注于变换器效率。

另一个显著的改进是称为替代token检测(RTD)。RTD来自ELECTRA模型,预测一个token是否被随机替换,并要求所有token位置都要进行学习,而不像MLM过程仅学习掩蔽token的位置。这是对MLM目标的改进。

接下来,我们将深入探讨在紧凑性、速度和效率方面的架构改进。

改进仅编码器变换器的架构紧凑性和效率

变换器已经证明自己具备巨大的结构能力,能够处理随着模型增长而增加的信息。一些关于变换器的研究专注于将变换器模型扩展到数百亿参数的规模,适用于解码器和编码器模型。使用这些巨大模型取得的结果令人惊叹,但由于需要最先进的GPU和机器,这些模型不适合实际使用,因为它们并非大多数人都能负担得起或轻松获得。这时,架构的紧凑性和效率改进可以帮助平衡这一局面。由于我们大多受限于可用的硬件资源,如果模型能够在架构上高效地缩小尺寸,同时保持相同的性能,那么在将模型扩展到硬件资源的极限时,将获得一个更高效的模型。

这一方向上的一个显著改进再次来自ALBERT模型,这是一个轻量级的BERT模型。这里的一个关键改进是将嵌入层进行因式分解,类似于卷积层进行因式分解以进行深度卷积。使用较小的嵌入维度,并配合一个全连接层将小维度的嵌入映射到相同的目标维度。由于嵌入是重要的权重并且对参数数量有贡献,因式分解嵌入层允许变换器模型具有更少的参数。这使得BERT在较少的参数下能够更高效。需要注意的是,一些改进还增加了模型并行化并采用巧妙的内存管理,但这些内容不会在此深入讨论。然而,由于有一些方法可以加速模型的推理和训练阶段,这些内容将在第15章《在生产中部署深度学习模型》中讨论,该章节专注于部署。

改进仅编码器变换器的核心功能架构

这一方向上最显著的改进来自于2021年推出的 解码增强BERT与解耦注意力(DeBERTa) 模型,当前被认为是架构的SOTA(State-of-the-Art)。其核心思想是使用两种独立的位置编码嵌入,分别为相对位置和绝对位置。然而,这些位置嵌入并不是与输入token嵌入一起加在一起,而是作为独立的查询和键被输入到变换器的层中,并具有自己的全连接层。这允许获得三个显式的注意力图,具体是内容到位置的注意力、内容到内容的注意力和位置到内容的注意力。然后,这些不同的注意力图会被加在一起。相对位置被每个中间多头注意力层的内部缩放点积注意力层使用,通过充当键或查询,具体取决于它是被内容关注还是去关注内容。

这允许每一层明确地考虑原始的相对位置数据,而不是在经过多层后可能被遗忘。我们实际上是在为相对位置数据应用一种跳跃连接。相对编码使得模型能够通过在每个相对位置重复使用模式识别器,学习更具可泛化性的表示。这种解决方案类似于在不同的图像数据分区使用相同的卷积滤波器,而不是在整个图像上使用一个全连接层,这种方式无法在整个输入空间中重用模式识别器。至于绝对位置,它之所以只在文本数据中使用,是因为绝对位置对于区分不同事物的重要性是必要的,例如警察拥有比大多数人更多的权力,卡车比摩托车大。然而,绝对位置仅在最后几层中被一次性加入,使用了一种叫做增强掩蔽解码器(EMD)的机制。EMD将绝对位置嵌入作为缩放点积注意力的查询组件。没有具体的理由说明为什么它只应用于最后几层,可能它也可以扩展到每一层。

分桶机制

为了减少嵌入数量和参数数量,使用了分桶机制,将多个位置组合为一个数字。这可以看作是分组的位置数据,从而进一步提高模型的紧凑性。

揭示仅编码器变换器对其他数据模态的适应

变换器能够处理其他数据模态。首先,输入数据只需以正确的序列格式进行结构化。之后,由于预训练是变换器的核心,需要为仅编码器变换器设计合适的任务目标,以实现一个捕捉特定数据模态理解的预训练状态。尽管使用文本来介绍变换器时侧重于无监督的预训练方法,但它实际上可以是监督、无监督或半监督的,关键是将模型的权重设置为一个状态,使得后续的监督下游任务能够利用这一状态。

对于图像,Vision Transformer (ViT) ,于2021年提出,形成了一个基于图像的变换器,并证明了与卷积模型相比,变换器在图像任务中可以达到竞争性的性能。变换器处理图像时最棘手的问题之一是图像尺寸较大,处理整个大输入空间会迅速膨胀变换器的模型大小。ViT通过将图像分割成系统的补丁来解决这一问题,每个补丁随后会被输入到一个单独的全连接层,该层显著降低每个图像补丁的维度。降低维度后的补丁数据将作为变换器的token嵌入。补丁转换是将图像输入表示为变换器可处理的格式的必要过程。此外,这种基于补丁的机制引入了一些图像领域的归纳偏差,但架构的其余部分实际上是没有对图像数据施加归纳偏差的。由于变换器几乎总是与预训练方法结合使用以提高性能,ViT采用了与CNN模型系列类似的预训练风格,使用监督分类预训练。

对于音频,wav2vec 2.0 ,于2020年创建,采用了类似于其前身wav2vec的概念,但它使用了仅解码器的变换器作为架构的一部分。简要概述是,wav2vec 2.0首先使用1D卷积对特定时间窗口长度的音频进行编码,转换为低维空间的特征向量。每个窗口的编码特征向量随后被输入到解码器变换器,并作为tokens。这里应用了无监督预训练方法,类似于BERT的MLM,其中对输入编码特征向量的某一部分进行掩蔽,任务是预测被掩蔽的编码特征向量。预训练后,模型会针对下游任务进行微调,使用线性层紧接在变换器输出后进行任务,如语音识别。wav2vec 2.0在一个下游语音识别数据集上达到了新的SOTA,并证明了音频与变换器非常契合。

VideoBERT,由Google于2019年创建,不仅展示了为变换器建模视频数据的方法,还展示了变换器模型在使用视频和文本的多模态方式中学习联合表示的能力。需要注意的是,视频本身也本质上是多模态的,因为视频数据包含多个图像帧以及音频数据部分。在VideoBERT中,使用一个烹饪视频句子对数据集,其中清晰标注了每个烹饪动作的开始和结束时间戳,用于预训练模型。该模型通过将一预设数量的图像帧编码为特征向量来处理图像帧序列,使用预训练的3D卷积模型,并将特征向量视为token。这些编码的视频tokens随后与文本数据配对,使用与MLM类似的目标来预测被掩蔽的视频和文本tokens。然后,该模型可以作为视频和文本相关数据的特征提取器,或者通过在变换器模型输出上添加额外的线性层进行微调。

上述不同数据模态的总结旨在提醒人们,变换器不仅能应用于文本数据,还能应用于其他数据模态,而不是作为这些模态当前SOTA的介绍。关键的收获是,不同的数据模态需要以序列的token格式进行组织,并且需要为仅编码器变换器设计合适的任务目标,以实现一个捕捉数据模态主要特征的预训练状态。此外,BERT的相同预训练方法可以轻松地适应其他数据模态。所以,与其称之为"掩蔽语言建模",也许更好的命名是"掩蔽token建模"。接下来,让我们揭示仅使用解码器的变换器改进。

揭示仅使用解码器的变换器改进

回顾一下,变换器的解码器模块专注于自回归结构。对于仅解码器变换器模型系列,预测tokens的自回归任务保持不变。随着编码器的移除,架构必须调整其输入,以接受多于一个的句子,类似于BERT的做法。开始、结束和分隔符tokens被用来顺序编码输入数据。在预测过程中,仍然会执行掩蔽操作,防止模型依赖当前token来预测来自输入数据的未来tokens,这与原始变换器以及位置嵌入类似。

深入探讨GPT模型系列

所有这些架构概念都由GPT模型(Generative Pre-training Transformer)于2018年引入,GPT代表生成式预训练。顾名思义,GPT也采用了无监督预训练作为初始阶段,随后进入监督微调阶段,处理任何下游任务。GPT专注于文本数据,但相同的概念可以应用于其他数据模态。GPT使用基本的语言建模任务进行预训练,给定先前的tokens作为上下文,预测下一个token,并使用固定窗口来限制输入的上下文token数量。权重预训练后,它会根据任何监督任务的目标进行微调。GPT-1利用相同的语言建模任务作为辅助目标,与主要的监督任务一起进行,以尝试提升下游任务的性能,并表明只有在较大的数据集上才能提升性能。此外,该模型首次展示了使用语言建模作为预训练任务对其他任务的可泛化性,即使不经过微调,仍能取得良好的结果。这种行为被称为零-shot学习,并将在第9章《探索无监督深度学习》中详细讨论。该模型在7,000本未出版的书籍上进行预训练,拥有1.17亿个参数,并包含12个重复的解码器块。

需要澄清的是,GPT模型在不进行微调的情况下(少样本或零样本学习)能够执行任务,并不否定微调在特定领域任务中的优势。尽管GPT系列模型在各种任务中展示了令人印象深刻的能力,微调仍可能对特定应用有利,从而提高性能,更好地适应特定任务的独特需求。

接下来的进展,GPT-2 并没有在架构上做出具体变化,而是强调了零-shot学习能力,并通过任务条件化的概念以及将GPT-1模型在层数、嵌入维度、上下文窗口大小和词汇大小方面扩大了10倍来进行改进。任务条件化的概念是告诉模型生成什么样的输出,而不是让其生成固定、已知的单一预测输出,后者由训练的任务类型决定。为了允许类似人类的真正灵活性,GPT-2没有添加任何新架构来适应任务条件化的概念,而是决定将变换器的文本输入直接用作任务条件化的方法。例如,输入自由格式文本如"我爱你 = , 我爱深度学习 ="自然会指导变换器执行从英语到普通话的翻译。这也可以用不同的方式完成,指定任务和上下文,例如"(翻译成中文), 我爱深度学习 ="。GPT-2通过使用语言建模目标在各种文本领域(如新闻文章、小说书籍、维基百科和博客)上进行预训练,使用的数据集比GPT-1的训练集要大得多。这项工作展示了真正的AI泛化潜力,尽管目前只使用了文本和图像数据。对于图像数据,这通过名为DALL-E的模型实现,该模型能够根据提供的输入文本生成图像。

最后,GPT-3模型于2020年推出。它与之前的进展相似,主要的变化是增加了模型各个组件的规模,并用不同的方式指定任务条件来表征不同类型的文本示例。我们在这里不再深入讨论。尽管GPT-2在没有微调的情况下在零-shot设置下表现良好,但只有通过微调,模型才能在多个文本语言数据集上超过先前的基准。GPT-3的庞大规模完全消除了微调的需求,通过超越先前的基准,且不需要任何微调。然而,这个模型需要专用的机器进行训练,并且对于个人或小型组织来说并不容易获取。目前,它是OpenAI的API服务的一部分。GPT-3展示了在没有任何微调的情况下,广泛适用于许多不同任务,其中一些最显著的用途包括为任何编程语言生成代码、讲故事以及生成极具人类特征的聊天机器人。这三种改进将许多基于语言任务的数据集的性能限制提升到了更高的水平,成为机器学习泛化组件的一个例子,同时也展示了变换器的巨大学习潜力,只有硬件资源的数量限制了它的能力。

接下来,我们将讨论一种值得提及的稍微不同形式的解码器模型,称为XLNet模型

深入探讨XLNet模型

假设你和一个朋友都得到提示"_ _ 是一座城市",你们两个是否都会独立预测"纽约"来填补空白?这是仅编码器变换器的MLM目标的一个缺陷,因为它们通过一次预测多个tokens来学习。然而,标准的自回归模型不会受到这个问题的影响,因为它们的自回归特性意味着它们仅预测未来的单个token。仅编码器的变换器则具有双向序列支持,这可以提高性能。XLNet的主要工作思想是让自回归模型像仅编码器模型一样以双向方式关注数据,同时保持自回归模型仅预测单个输出的优势。

XLNet通过在MLM预训练期间对解码器变换器进行条件化,来实现两者的优势。其思想是通过使用掩蔽机制,对token序列的所有排列顺序进行预训练。标准的自回归模型在预训练期间按"1-2-3-4"的顺序使用,以预测第五个token,而在XLNet中,顺序可以改为"3-4-1-5",以预测第二个token。XLNet还引入了另一个额外的查询线性层隐藏状态,并配备一个额外的单一固定可学习嵌入,这将与每个token嵌入一起通过注意力层传递,作为与原始token内容流并行的额外流。这个额外的路径被称为查询流。整个过程被称为掩蔽双流注意力层,如图6.8所示。

内容流的前向传播机制对于序列顺序中的任何给定位置,能够同时关注其自身位置的内容和前面位置的内容,而基于查询的流对于序列顺序中的任何给定位置,只能关注前面位置的内容。图6.8(a)展示了内容流在模型中的实际位置1是如何能够关注其他位置的所有标记的,这归因于"3-2-4-1"的顺序,其中位置1被置换为最后一个标记。图6.8(b)展示了位置1的标记内容如何没有被用于更新表示为g的附加查询流路径数据,并且g组件作为查询来获取下一个g,作为注意力层的输出。如果模型的第四个位置需要更新,在内容流中只能关注第二和第三位置的内容,因为根据置换后的序列顺序,第一位置是未来的标记。根据这个概念,遮罩机制动态应用于防止每个h和g的位置关注其前面位置的内容,这些前面位置的内容在置换的序列顺序中是未定义的。注意,图6.8(c)中的w组件表示查询流在所有位置共享的单一权重嵌入。在预训练期间,查询流作为MLM目标的最终分类输出路径,其中最终的h组件被忽略。然而,当传递到微调阶段时,查询流组件和基于查询的线性层的隐藏状态将被丢弃或完全忽略。

这种在预训练期间利用单词预测语言建模目标的好处,同时实现数据的双向上下文,推动了下游监督学习任务的性能提升。

讨论解码器模型的其他进展

自从GPT问世以来,解码器仅模型的基础架构没有发生过重大变化。大部分工作集中在三个方面:

  1. 将变换器应用于不同的问题类型;
  2. 扩展模型规模至数百亿个参数;
  3. 聚焦于工程解决方案,使得一个巨型模型能够在现有硬件资源上进行训练。

其中,利用解码器仅变换器处理其他问题类型的最著名工作之一是OpenAI团队的DALL-E模型。变换器在DALL-E的第一版和第二版中都被用于自回归地根据文本输入和其他特定的实现输入预测紧凑的图像嵌入。这些图像嵌入随后通过其他机制转化为实际的图像嵌入。

在模型扩展方面,GPT-3展示了随着模型容量的增加,性能也能够提升。首先提到的是Megatron,它专注于通过工程策略提高变换器架构的效率,能够在512个GPU上训练,使得它比GPT-2大5.6倍。GPT-3超过了Megatron,但另一个值得注意的模型BLOOM使用Megatron作为基础,将其扩展到176B,匹配了GPT-3的175B模型大小。最值得注意的不是它比GPT-3大,而是BLOOM开创了一种新的范式------开源,这意味着研究人员和机构的集体工作和贡献也能够训练出高效且性能优异的模型。这些巨型模型过去一直是大型公司独占的,因为它们需要极大的硬件资源。除此之外,另一个在2022年发布的模型是PaLM,它将GPT扩展到5400亿个参数,超过了所有其他较小的GPT变种模型的表现。PaLM 2通过优化计算扩展规律,利用多样的多语言数据集并进行架构改进,提升了其在各种任务上的表现,包括英语和多语言理解、推理和代码生成。PaLM 2在多语言能力、分类、问答和翻译任务上表现出色,展现了其广泛的适用性。该模型还采用了控制令牌来减轻毒性,并提供了负责任的开发和部署指南。

在为特定任务选择变换器模型时,采取平衡的方法至关重要,除了性能指标,还需要考虑其他因素。模型大小和资源需求在决定所选模型的可行性和适用性方面发挥着重要作用。虽然像GPT-3这样的较大模型展示了令人印象深刻的能力,但它们的资源需求可能并不适合所有情况,尤其是对于计算资源有限的个人或小型组织来说。

在选择变换器模型时,权衡模型大小、性能和资源需求之间的取舍是至关重要的。在某些情况下,较小的模型可能提供足够的性能,同时更加高效且环保。此外,微调通常可以提高模型在领域特定任务中的表现,即使它的大小不如一些最著名的模型,如GPT-3。最终,最佳选择取决于特定任务的独特要求和约束,以及可用于模型训练和部署的资源。

总结

变换器是多功能的神经网络,能够捕捉任何数据模态之间的关系,而不需要架构中明确的数据特定偏差。与其直接使用能够处理不同数据模态的神经网络架构,不如根据数据输入结构进行精心设计,并结合合适的训练任务目标来成功构建一个高效的变换器。即使是当前的SOTA架构,预训练的好处仍然适用。预训练的过程是转移学习的一部分,在监督学习和无监督学习章节中将更深入讨论。变换器目前可以执行数据生成和监督学习任务,并且越来越多的研究正在尝试将变换器应用于未曾探索的特定任务和数据模态。随着变换器技术的不断发展,未来几年将出现更多深度学习的创新。

到目前为止,您已经获得了根据您的数据和需求选择和设计神经网络架构所需的知识。第二至六章中介绍的大多数架构和概念在从零开始实现时确实比较复杂,但借助开源工作(例如:github.com/rwightman/p...)和许多深度学习框架,使用这些模型只需导入库并添加几行代码。事实上,了解每个架构背后的实现细节并不是必需的,因为如今采用公开的、包含预训练权重的大型数据集的工作非常方便。然而,理解这些架构的实现细节在以下情况下将非常有益:

  • 当某些事情失败或没有按预期工作时(例如模型没有收敛到最优解,或数据形状不符合预期等);
  • 当需要根据您的数据集、运行时要求或性能要求选择更合适的架构时;
  • 当您发明一个崭新的神经网络层时;
  • 当您想解码神经网络实际学到了什么,以及理解神经网络为什么做出某个预测时。我们将在第11章《解释神经网络预测》和第12章《解读神经网络》中进一步探讨这一点;
  • 当您想将一个架构领域的概念迁移到另一个领域时。例如,DenseNet和ResNet中的跳跃连接可以轻松迁移到MLP中。

既然您已经读完了这一章,涵盖了与神经网络架构相关的所有内容,值得为自己鼓掌。现在,您已经掌握了关于处理图像(CNN)、时间序列或序列数据(RNN)、处理表格数据(MLP)的模型,以及全能的模型(变换器)的知识。然而,架构的性能与数据类型、数据结构、数据预处理方法、权重学习和优化方法、损失函数和优化任务密切相关。有关这些组件的更多细节将在第8章《探索监督式深度学习》和第9章《探索无监督式深度学习》中解读。

在下一章中,我们将探讨一种新兴的方法------神经架构搜索,来自动设计神经网络模型。

相关推荐
程序边界1 分钟前
从烟囱到融合:一次MongoDB迁移引发的架构重构深思
mongodb·重构·架构
又折桃枝换酒钱4 分钟前
CycleChart:一个统一的基于一致性学习的双向图表理解与生成框架(翻译与解读)
人工智能·深度学习·学习
Asize5 分钟前
无状态 Stateless:大模型为什么记不住你是谁
javascript·人工智能·架构
echoVic15 分钟前
Agent 的会话为什么是一棵树,而不是一串消息
架构·agent
echoVic30 分钟前
Plan 模式为什么不能只是一个权限开关
架构·agent
echoVic33 分钟前
运行中的修改,到底什么时候生效
架构·agent
echoVic36 分钟前
为什么 Agent 的每个请求,都要先拍一张快照
架构·agent
烬羽1 小时前
组件拆了,逻辑没拆——自定义 Hook 才是 React 业务逻辑的正当归属
react.js·架构·typescript
小月土星1 小时前
自定义业务 Hook:从零解剖一个 React + TypeScript Todo 应用:用金字塔思维看透前端架构
react.js·架构·前端框架
AI 小老六1 小时前
Brainstorming 与 grill-me 在 AI 产品设计和工程决策中的分工边界
人工智能·ai·架构·创业创新