目录
5.3 主流架构
5.3.1 编码器-解码器架构
5.3.2 因果解码器架构
5.3.3 前缀解码器架构
5.4 长上下文模型
5.4.1 扩展位置编码
5.4.2 调整上下文窗口
5.4.3 长文本数据
5.5 新型模型架构
5.5.1 参数化状态空间模型
5.5.2 状态空间模型变种
5.3 主流架构
在预训练语言模型时代,自然语言处理领域广泛采用了预训练 + 微调的范式, 并诞生了以 BERT 为代表的编码器(Encoder-only)架构、以 GPT 为代表的解码 器(Decoder-only)架构和以 T5 为代表的编码器-解码器(Encoder-decoder)架构的 大规模预训练语言模型。随着 GPT 系列模型的成功发展,当前自然语言处理领域 走向了生成式大语言模型的道路,解码器架构已经成为了目前大语言模型的主流架构。进一步,解码器架构还可以细分为两个变种架构,包括因果解码器(Causal Decoder)架构和前缀解码器(Prefix Decoder)架构。学术界所提到解码器架构时,通常指的都是因果解码器架构。图 5.6 针对这三种架构进行了对 比。
图 5.6 三种主流架构的注意力模式比较示意图(蓝色、绿色、黄色和灰色的圆角矩形分别表示前缀词元之间的注意力、前缀词元和目标词元之间的注意力、目标词元之间的注意力以及掩码注意力)
5.3.1 编码器-解码器架构
编码器-解码器架构是自然语言处理领域里一种经典的模型结构,广泛应用于 如机器翻译等多项任务。原始的 Transformer 模型也使用了这一架构,组合了两个分别担任编码器和解码器的 Transformer 模块。如图 5.6 所示,此架构在编码器端采用了双向自注意力机制对输入信息进行编码处理,而在 解码器端则使用了交叉注意力与掩码自注意力机制,进而通过自回归的方式对输 出进行生成。基于编码器-解码器设计的预训练语言模型(诸如 T5 等)在众多自然语言理解与生成任务中展现出了优异的性能,但是目前只有如 FLAN-T5等少数大语言模型是基于编码器-解码器架构构建而成的。
5.3.2 因果解码器架构
当前,绝大部分主流的大语言模型采用了因果解码器架构。因果解码器采用 了 Transformer 中的解码器组件,同时做出了几点重要改动。首先,因果解码器没 有显式地区分输入和输出部分。如图 5.6 所示,该架构采用了单向的掩码注意力机 制,使得每个输入的词元只关注序列中位于它前面的词元和它本身,进而自回归 地预测输出的词元。此外,由于不含有编码器部分,因果解码器删除了关注编码 器表示的交叉注意力模块。经过自注意力模块后的词元表示将直接送入到前馈神 经网络中。在因果解码器架构中,最具有代表性的模型就是 OpenAI 推出的 GPT 系列。其中,GPT-3 将模型参数拓展到了 100B 级别,并展现出了强大的零样本和 少样本学习能力。伴随着 GPT-3 的成功,因果解码器被广泛采用于各种大语言模 型中,包括 BLOOM、LLaMA 和 Mistral 等。
5.3.3 前缀解码器架构
前缀解码器架构也被称为非因果解码器架构,对于因果解码器的掩码机制进 行了修改。该架构和因果解码器一样,仅仅使用了解码器组件。与之不同的是,该 架构参考了编码器-解码器的设计,对于输入和输出部分进行了特定处理。如图 5.6 所示,前缀解码器对于输入(前缀)部分使用双向注意力进行编码,而对于输出 部分利用单向的掩码注意力利用该词元本身和前面的词元进行自回归地预测。与 编码器-解码器不同的是,前缀解码器在编码和解码过程中是共享参数的,并没有 划分为独立的解码器和编码器。对于前缀解码器,也可以由现有的因果解码器继 续预训练转换而来,进而加速该模型的训练。
5.4 长上下文模型
在实际应用中,大语言模型对于长文本数据的处理需求日益凸显,尤其在长 文档分析、多轮对话、故事创作等场景下。在这些情况下,模型需要处理的文本的 长度常常超出预定义上下文窗口大小。例如,LLaMA-2 的上下文窗口限制为 4,096个词元。为了支持长文本处理,多家机构均已推出面向具有超长上下文窗口的大 语言模型或 API。例如,OpenAI 发布了支持 128K 上下文窗口的 GPT-4 Turbo,而 Anthropic 则推出了具有 200K 上下文窗口的 Claude-2.1。
给定一个预训练后的大语言模型,如何有效拓展其上下文窗口以应对更长的 文本数据成为当前学术界的研究焦点。目前,增强大语言模型长文本建模能力的 研究主要集中在两个方向:一是扩展位置编码,二是调整上下文窗口。除了探讨拓展上下文窗口的方法外,本部分将在最后探讨训练长上下文模型所需的长文本数据。
5.4.1 扩展位置编码
在基于 Transformer 架构的大语言模型中,模型的上下文建模能力通常受到训练集中文本数据长度分布的限制。一旦超出这个分布范围,模型的位置编码往往无法得到充分训练,从而导致模型处理长文本的性能下降。因此,当大语言模型面临超出其最大训练长度的任务时,需要对于位置编码进行扩展,以适应更长的绝对或相对位置。
实际上,某些特定的位置编码在超出原始上下文窗口的文本上,也能够表现 出较好的建模能力,这种能力通常被称为外推(Extrapolation)能力。在已有的基于相对位置的位置编码方法中,T5 偏置、ALiBi以及xPos等方法 都展现出了不同程度的外推能力。
然而,目前比较主流的位置编码方法 RoPE在未经特殊修改的情况下并不具备良好的外推能力。具体来说,在处理更长的文本时,RoPE在每个子空间上需要处理更大的旋转角度,而这些旋转角度可能会超过其训练中的角度分布范围。因此,很多研究工作在RoPE的基础上进行了重要改进,旨在提升其在不经过训练或继续训练的情况下对于长文本的建模能力。
直接微调
为了使大语言模型适应更长的上下文长度,一种直接的策略是使用相应的长文本数据对于模型进行微调。在这种情况下,模型可以直接根据相对位置计算出 对应的位置编码,而无需对 RoPE 本身进行任何修改。
在模型进行微调前,这些超出原始窗口的位置对应的注意力值会远大于窗口内的值。因此,如果不修改RoPE 而直接在长文本数据上进行微调,通常会导致收敛缓慢,并需要大量数据进行继续预训练。
位置索引修改
鉴于直接微调可能引发旋转角度增大和注意力值爆炸的问题,有必要对旋转 角度施加限制,以确保拓展后的上下文窗口中的旋转角度得到充分且有效的训练。为实现这一目标,可以通过修改位置索引来调整所有子空间的旋转角度,从而保证其不超过原始上下文窗口所允许的最大值。具体来说,位置索引的修改可采用以下两种方法:
- • 位置内插. 位置内插方法对于位置索引进行特定比例的缩放,以保证旋转角度不会超过原始上下文窗口的最大值。具体来说,该策略将所有位置索引上下文窗口和拓展后的上下文窗口的长度。通常来说,使用位置内插方法进行微调的训练代价较小。例如,只需要一千步左右的训练就可以将 LLaMA (33B) 的模型的上下文窗口长度从 2,048 拓展到 8,192 个词元。然而在处理较短的文本时,由于位置索引的缩放,可能会对模型的性能产生一定的负面影响。
- • 位置截断. 不同于位置内插,位置截断针对不同距离采用了不同的处理方式。该方法依据语言建模的局部性原理,对模型中近距离敏感的位置索引进行保留,同时截断或插值处理远距离的位置索引,确保其不超出预设的最大旋转角度。采用位置截断的ReRoPE和LeakyReRoPE方法首先设定一个不大于原始上下文窗口长度的窗口大小。在此窗口范围内的部分,仍使用原始相对位置索引;对于超出此窗口的部分,位置索引则会被截断至窗口大小,或通过线性插值方式,将目标上下文窗口长度的位置索引映射回原始上下文窗口长度。上述位置截断方法可通过以下通过这种方法对RoPE进行修改后,模型能够直接应用于更长的上下文而无需重新训练,并且依然保持对短文本的建模能力。然而,这种方法需要对注意力矩阵进行二次计算,进而增加了额外的计算开销。
基修改
RoPE:每个子空间都有一个对应的波长,表示在该子空间上旋转一周所需要的距离。然而,某些子空间的波长可能会超过上下文窗口的长度,导致模型在这些子空间上无法对完整的旋转周期进 行训练。这些子空间通常被称为关键子空间。在面临更长的文本时,RoPE 关键子空间的旋转角度对应的正余弦函数值并没有在训练阶段出现过,这就容易导致注意力值出现异常。因此,如果想要调整这些子空间的旋转角度分布,另一种方法是针对这些子空间的基进行缩放。对基的修改可以通过对基的底数修改以及对基的截断实现。
- • 底数调整. 通过调整底数可以改变旋转的角度。具体来说,按照一定比例增大底数可以对基进行缩小,从而缩小旋转的角度,使得模型在不经过额外训练的情况下能够处理更长的上下文窗口。其中,是一个大于等于放缩比例的数,通过对底数进行增大,实现缩小基来处理更长文本的能力。在实践中,不同方法通常会采用不同的值。例如,NTK-RoPE基于目标上下文窗口,将设置为;而 Dynamic-NTK-RoPE 则根据输入文本长度动态地将窗口大小进行调整 。如果要进一步提升模型的长文本建模能力,还可以在长文本数据上进行微调。此时,使用较大的底数通常能够获得更好的性能。
- • 基截断. 与底数调整相似,基截断方法通过修改关键子空间来避免产生过大的旋转角度。这种方法首先设定两个阈值和。根据每个子空间上的基与这两个阈值的比较结果,可以选择相应的调整策略来对基进行调整:当时,基的值会被保持不变;当 时,基会被设置为零;当时,基会被截断为一个较小的固定数值。通过上述的基截断操作,可以有效地防止在位置索引较大时出现超出预期分布的旋转角度,从而有助于实现更好的模型外推性能。然而,这种方法在一定程度上削弱了某些子空间对不同位置索引的区分能力,进而可能对模型的性能产生不利影响。
5.4.2 调整上下文窗口
为了解决Transformer架构对于上下文窗口的限制,除了使用扩展位置编码来拓宽上下文窗口外,另一种行之有效的策略是采用受限的注意力机制来调整原始的上下文窗口,从而实现对更长文本的有效建模。下面将详细介绍三种调整上下文窗口的方法。
并行上下文窗口
并行上下文窗口方法采用了一种分而治之的策略来处理输入文本。具体来说,该方法将输入文本划分为若干个片段,每个片段都进行独立的编码处理, 并共享相同的位置编码信息。在生成阶段,通过调整注意力掩码,使得后续生成的词元能够访问到前序的所有词元。然而,该方法无法有效地区分不同段落之间 的顺序关系,在某些特定任务上可能会限制模型的表现能力。
Λ 形上下文窗口
(a) 并行上下文窗口 (b) Λ形上下文窗口 (c) 词元选择
图 5.7 三种调整上下文窗口方法的示意图(白色表示被掩盖的词元,蓝色表示进行注意力计算的词元,块上面的数字表示位置编码的相对位置)
在处理长文本时,大语言模型有时会表现出一种不均匀关注的现象:它们 倾向于对序列起始位置以及邻近的词元赋予更高的注意力权重。基于这一观察, StreamingLLM等工作引入了 “Λ 形” 注意力掩码方法,能够有选择性地关注 每个查询的邻近词元以及序列起始的词元,同时忽略超出这一范围的其他词元。在 给定的有限内存资源下,这种方法能够生成几乎无限长的流畅文本。然而,由于无法有效利用被忽略的词元信息,这种方法无法充分利用所有的上下文信息。
词元选择
在Transformer的注意力模块中,对于每个词元的预测,并非所有先前词元都提供等量的贡献。实际上,小部分紧密相关词元的注意力分数总和就能够接近所 有词元的注意力分数总和。基于这样的一个实践观察,相关研究工作提出了词元选择方法,旨在挑选出最重要的k个词元,以实现对于完整注意力的有效拟合。词元选择方法可以通过查询与词元相似度和查询与词元所在分块的相似度实现。
• 查询与词元相似度. 在此类方法中,根据位置索引和上下文窗口,词元被划 分为窗口内的近距离词元和窗口外的远距离词元。对于窗口外的远距离词元,通常利用外部存储保存它们的键值对,并采用k近邻搜索方法来获取当前生成所需的个最相关词元。具体来说,在Transformer模型中,可以首先选定若干层,针对这些层从外部存储中检索到最相关词元的键值对,进一步将其送入注 意力计算模块中,为模型补充远程语义信息;而在其他层中,模型仍然针对上下 文窗口内的词元进行注意力计算。
• 查询与分块相似度. 分块级别的词元选择将序列划分为不同的长度固定的分块,并从分块序列中选择出最相关的部分分块。具体来说,模型首先将每个分块中所有的隐状态压缩为一个键向量表示,然后利用k近邻方法选出与查询最 相关的k个分块,并保证这些块中的总词元数目至多为 。这些分块中所有的 词元将按照它们在整个输入序列中的出现的顺序进行排序,并按照排序后的位置 赋予位置编码。随后,这些词元被送入注意力模块中处理。与词元级别的方法不同,分块级别的选择通常不需要外部存储,而是将所有数据存储在内存中。此外,不同的层和头可以根据自身的特性选择不同的词元集合,从而更为灵活地利用整个长序列的信息。因此,分块级别的词元选择能够在保证性能的同时降低计算复杂度和内存需求。
5.4.3 长文本数据
为了有效拓展模型的长文本建模能力,通常需要使用特殊准备的数据对于模 型进行继续预训练。本节将详细介绍如何确定所需的长文本数据量,以及如何合 理分布长文本数据的领域,以确保模型的长文本建模能力。
• 长文本数据量. 标准的预训练任务通常需要使用大量的文本数据。而对于面 向长文本建模的继续预训练来说,可以采用少量长文本数据进行轻量化的继续预训练。这一方法需要模型在初始预训练阶段已经学会了利用远程词元信息的能力, 仅需使模型适应更长的上下文窗口。一般而来说,只需在约 1B 级别的词元上执行 数百步的训练,就可以将 7B 或者 13B 大小的 LLaMA 系列模型的上下文窗口至 100K 词元以上的长度,并具有较好的长上下文利用能力。
• 长文本数据混合. 除了数据总量外,训练数据集中不同数据的混合也是影响 模型性能的关键因素,主要包括长文本的领域分布和长文本的类型。在预训练数据中,不同领域长文本的比例存在差异。一般而言,书籍、科学论文、代码仓库等领域包含较多的长文本数据。直接对这些长文本数据采样进行进一步继续预训练可能会导致与预训练数据分布的不匹配,导致模型过多的学习了某一领域长文本的特征,从而损害了在其他领域的影响。为了提升模型的泛化能力,长文本数据的领域应尽可能多样化,并且与预训练数据集的分布保持相似。除了数据的领域分布外,数据本身的语义特性也是数据混合需要考虑的问题。在 LongWanjuan中,研究人员基于连贯性、衔接性和复杂性将长文本数据分为整体型(完整的有意义的长文)、聚合型(多篇相关文本的聚合)和杂乱型(杂乱无章的文本)。实验结果显示,通过去除杂乱型的文本,并在保留整体型文本的同时对聚合型文本进行上采样构建的训练集,可以更好地提升模型的长文本建模能力。
5.5 新型模型架构
Transformer 模型自问世以来,在自然语言处理、计算机视觉等多个领域得到 了广泛应用,并展现出卓越的数据表示与建模能力。然而,Transformer 的自注意 力机制在计算每个词元时都需要利用到序列中所有词元的信息,这导致计算和存 储复杂度随输入序列长度的平方级别增长。在处理长序列时,这种复杂性会消耗 大量的计算资源与存储空间。为了解决这个问题,研究人员致力于新型模型架构 的设计。这些新型模型大多基于参数化状态空间模型(State Space Model, SSM)进 行设计,在长文本建模效率方面相比 Transformer 有了大幅改进,同时也保持了较 好的序列建模能力。在本节中,我们将首先对于参数化状态空间模型展开讨论,然 后针对状态空间模型的各种变种模型进行介绍。为了帮助读者更好地理解这些模 型之间的区别,我们在表 5.2 中对于它们进行了比较。
表 5.2 不同模型的比较(T 表示序列长度,H 表示输入表示的维度,N 表示状态 空间模型压缩后的维度,M 表示 Hyena 每个模块的层数)
模型 | 可并行性 | 解码复杂度 | 训练复杂度 |
Transformer | ✓ | | |
标准 SSM | ✓ | ||
Mamba | × | ||
RWKV | × | ||
RetNet | ✓ | ||
Hyena | ✓ |
5.5.1 参数化状态空间模型
状态空间模型是一种动态时域模型,在控制系统、经济学等多个领域都有着 广泛应用。近年来,深度学习领域也开始引入参数化状态空间模型对于序列数据 进行建模。通俗来说,参数化状态空间模型可以看作是循环神经网络和卷积神经 网络的“结合体”。一方面,该模型可以利用卷积计算对输入进行并行化编码。另 一方面,该模型在计算中不需要访问前序的所有词元,仅仅利用前一个词元就可 以自回归地进行预测。因此,该模型在解码时展现出了更高的计算效率。由于自然语言文本本质上是离散型序列数据。为了同时实现并行化计算和循环解码,状态空间模型在输入和输出之间引入了额外的状态变量。在使用卷积计算时,状态空间模型可以利用快速傅里叶变换加速计算效率,从而通过的复杂度建模整个序列。在 循环计算的时候,状态空间模型不需要和 Transformer 一样对前面所有时刻的状态 进行访问,而是仅仅需要前一个时刻的状态。因此,该模型仅仅需要
的复杂度就可以完成对整个序列的建模。由于具有更优的计算效率,状态空间模 型常常被用来对长序列数据进行建模。
5.5.2 状态空间模型变种
尽管状态空间模型计算效率较高,但是在文本任务上的表现相比 Transformer 模型仍有一定的差距。为此,一系列研究工作对于状态空间模型进行了性能改进, 在保证计算效率的同时提高其语言建模的能力。代表性模型包括 Mamba、 RWKV(Receptance Weighted Key Value)、RetNet(Retentive Network)和 Hyena 等。
- • Mamba. Mamba是一种状态空间模型的变种,主要思想是在状态空间模型的状态更新中引入了基于当前输入的信息选择(Selection)机制, 来确定当前时刻状态如何从前一时刻状态以及当前输入中提取信息,从而提升其 在语言建模上的性能。对于文本建模而言,模型需要能够自适应地基于输入和之前状态来实现更好的上下文表示效果。模型能够基于当前时刻的输入对上一时刻的状态 和当前时刻输入中的信息进行选择性过滤,从而实现更为有效的上下文表示。相比于标准状态空间模型,Mamba 展现出了更好的文 本建模性能,但是由于引入了关于 的非线性关系,Mamba 无法利用快速傅里叶 变换实现高效卷积计算。
- RWKV. RWKV尝试将 RNN 和 Transformer 的优点进行结合,继承了 Transformer 的建模优势和 RNN 的计算效率。作为一个主要技术创新,RWKV 在 每层的计算中使用词元偏移(Token Shift)来代替词元表示。在每一步的状态计 算中,它显示地引入了上一个词元,通过两个相邻的词元和进行线 性插值来代替作为后续模块的输入。进一步,RWKV 将 Transformer 中的多头 注意力模块和前馈网络模块分别替换为时间混合(Time-mixing)模块和频道混合(Channel-mixing)模块。其中,时间混合模块是一个类似于门控的 RNN 的网络, 并使用词元偏移对状态进行更新;频道混合模块是在前馈网络的基础上引入了词 元偏移进行映射。类似于 Mamba,RWKV 在解码过程中可以像 RNN 一样只参考 前一时刻的状态,但是在训练过程中缺乏并行计算的能力。
- RetNet. RetNet提出使用多尺度保留(Multi-scale Retention, MSR)机制 来代替多头注意力模块,从而提升计算效率。多尺度保留机制是在标准状态空间模 型的基础上,在状态更新的线性映射中引入了输入相关信息来提升序列建模能力。RetNet 还可以通过类似注意力操作的矩阵乘法,对所有词元的状态进行并行化计算。因此类似于标准状态空间模型,RetNet同时保留了循环计算和并行计算的优点。
- Hyena. Hyena 提出使用长卷积模块(Long Convolution)来替换 Transformer 架构中的注意力模块,从而借助卷积的快速傅里叶变换来提高计算效率。由于使用了卷积计算可以使用快速傅 里叶变换进行加速,在训练中,Hyena 可以实现
的计算复 杂度。但是在解码时,每次计算必须对前面所有的词元进行卷积,因此解码复杂度为
。
参考:
Datawhale-学用 AI,从此开始
配套代码库: 配套代码
GitHub - RUCAIBox/LLMSurvey: The official GitHub page for the survey paper "A Survey of Large Language Models".