在预训练语言模型时代,自然语言处理领域广泛采用了预训练 + 微调的范式,并诞生了以 BERT 为代表的编码器(Encoder-only)架构、以 GPT 为代表的解码器(Decoder-only)架构和以 T5 为代表的编码器-解码器(Encoder-decoder)架构的大规模预训练语言模型。本篇笔记将主要介绍解码器架构及长上下文模型,相关资料主要来自中国人民大学高瓴人工智能学院赵鑫教授团队出品的 《大语言模型》,感谢 DataWhale 组织的组队学习活动。
编码器-解码器架构
编码器-解码器架构是自然语言处理领域里一种经典的模型结构,广泛应用于如机器翻译等多项任务。原始的 Transformer 模型也使用了这一架构,组合了两个分别担任编码器和解码器的 Transformer 模块。此架构在编码器端采用了双向自注意力机制对输入信息进行编码处理,而在解码器端则使用了交叉注意力与掩码自注意力机制,进而通过自回归的方式对输出进行生成。
解码器架构
随着 GPT 系列模型的成功发展,当前自然语言处理领域走向了生成式大语言模型的道路,解码器架构已经成为了目前大语言模型的主流架构。进一步,解码器架构还可以细分为两个变种架构,包括因果解码器 (Causal Decoder) 架构和前缀解码器 (Prefix Decoder) 架构。值得注意的是,学术界所提到解码器架构时,通常指的都是因果解码器架构。
因果解码器架构
当前,绝大部分主流的大语言模型采用了因果解码器架构。因果解码器采用了 Transformer 中的解码器组件,同时做出了几点重要改动。首先,因果解码器没有显式地区分输入和输出部分。该架构采用了单向的掩码注意力机制,使得每个输入的词元只关注序列中位于它前面的词元和它本身,进而自回归地预测输出的词元。此外,由于不含有编码器部分,因果解码器删除了关注编码器表示的交叉注意力模块。经过自注意力模块后的词元表示将直接送入到前馈神经网络中。在因果解码器架构中,最具有代表性的模型就是 OpenAI 推出的 GPT 系列。其中,GPT-3 将模型参数拓展到了 100B 级别,并展现出了强大的零样本和少样本学习能力。伴随着 GPT-3 的成功,因果解码器被广泛采用于各种大语言模型中,包括 BLOOM、LLaMA 和 Mistral 等。
前缀编码器架构
前缀解码器架构也被称为非因果解码器架构,对于因果解码器的掩码机制进行了修改。该架构和因果解码器一样,仅仅使用了解码器组件。与之不同的是,该架构参考了编码器-解码器的设计,对于输入和输出部分进行了特定处理。前缀解码器对于输入(前缀)部分使用双向注意力进行编码,而对于输出部分利用单向的掩码注意力利用该词元本身和前面的词元进行自回归地预测。与编码器-解码器不同的是,前缀解码器在编码和解码过程中是共享参数的,并没有划分为独立的解码器和编码器。对于前缀解码器,也可以由现有的因果解码器继续预训练转换而来,进而加速该模型的训练。当前,基于前缀解码器架构的代表性大语言模型包括 GLM- 130B和 U-PaLM。
长上下文模型
在实际应用中,大语言模型对于长文本数据的处理需求日益凸显,尤其在长文档分析、多轮对话、故事创作等场景下。在这些情况下,模型需要处理的文本的长度常常超出预定义上下文窗口大小。例如,LLaMA-2 的上下文窗口限制为 4,096。个词元。为了支持长文本处理,多家机构均已推出面向具有超长上下文窗口的大 语言模型或 API。例如,OpenAI 发布了支持 128K 上下文窗口的 GPT-4 Turbo,而 Anthropic 则推出了具有 200K 上下文窗口的 Claude-2.1。
给定一个预训练后的大语言模型,如何有效拓展其上下文窗口以应对更长的文本数据成为当前学术界的研究焦点。目前,增强大语言模型长文本建模能力的研究主要集中在两个方向:一是扩展位置编码,二是调整上下文窗口。
扩展位置编码
在基于 Transformer 架构的大语言模型中,模型的上下文建模能力通常受到训练集中文本数据长度分布的限制。一旦超出这个分布范围,模型的位置编码往往 无法得到充分训练,从而导致模型处理长文本的性能下降。因此,当大语言模型 面临超出其最大训练长度的任务时,需要对于位置编码进行扩展,以适应更长的 绝对或相对位置。
实际上,某些特定的位置编码在超出原始上下文窗口的文本上,也能够表现出较好的建模能力,这种能力通常被称为外推(Extrapolation) 能力。值得注意的是,尽管这种外推能力可以确保模型在长文本上继续生成流畅的文本,但模型对长文本本身的理解能力可能无法达到与短文本相同的水平。为了真正增强长文本建模能力,通常还需要在更长的文本上进行一定的训练。
然而,目前比较主流的位置编码方法 RoPE 在未经特殊修改的情况下并不具备良好的外推能力。具体来说,在处理更长的文本时,RoPE 在每个子空间上需要处理更大的旋转角度,而这些旋转角度可能会超过其训练中的角度分布范围。
形式化来说,对于一个原始上下文窗口为 𝑇max 的模型,目标是将其上下文窗口扩展到𝑇m′ax(其中𝑇m′ax>𝑇max)。在RoPE的每个子空间𝑖上,对于相对位置𝑡,旋转角度 𝑓 (𝑡,𝑖) = 𝑡 · 𝜃𝑖 的修改可以分解为对距离 𝑡 的修改 𝑔(𝑡) 和对基 𝜃𝑖 的修改h(𝑖)。因此,新的旋转角度可以表示为如下形式:
𝑓 (𝑡, 𝑖) = 𝑔(𝑡) · h(𝑖).
直接微调
为了使大语言模型适应更长的上下文长度,一种直接的策略是使用相应的长文本数据对于模型进行微调。在这种情况下,模型可以直接根据相对位置计算出对应的位置编码,而无需对 RoPE 本身进行任何修改。
在模型进行微调前,这些超出原始窗口的位置对应的注意力值会远大于窗口内的值。因此,如果不修改 RoPE 而直接在长文本数据上进行微调,通常会导致收敛缓慢,并需要大量数据进行继续预训练。
位置索引修改
于直接微调可能引发旋转角度增大和注意力值爆炸的问题,有必要对旋转角度施加限制,以确保拓展后的上下文窗口中的旋转角度得到充分且有效的训练。为实现这一目标,可以通过修改位置索引 𝑔(𝑡) 来调整所有子空间的旋转角度,从而保证其不超过原始上下文窗口所允许的最大值。具体来说,位置索引的修改可采用以下两种方法:
位置内插
位置内插方法对于位置索引进行特定比例的缩放,以保证旋转角度不会超过原始上下文窗口的最大值。具体来说,该策略将所有位置索引乘以一个小于1的系数𝑇max/𝑇m′ax(其中𝑇max<𝑇m′ax),𝑇max和𝑇m′ax分别表示原始上下文窗口和拓展后的上下文窗口的长度。
在更长的文本上进行训练会导致出现比原始上下文窗口内更大的最大旋转 角度𝑇m′ax·𝜃𝑖。在模型进行微调前,这些超出原始窗口的位置对应的注意力值会远 大于窗口内的值。因此,如果不修改 RoPE 而直接在长文本数据上进行微调,通常 会导致收敛缓慢,并需要大量数据进行继续预训练。
位置截断
不同于位置内插,位置截断针对不同距离采用了不同的处理方式。该方法依据语言建模的局部性原理,对模型中近距离敏感的位置索引进行保留,同时截断或插值处理远距离的位置索引,确保其不超出预设的最大旋转角度。
通过这种方法对 RoPE 进行修改后,模型能够直接应用于更长的上下文而无需重新训练,并且依然保持对短文本的建模能力。然而,这种方法需要对注意力矩阵进行二次计算,进而增加了额外的计算开销。
基修改
根据前面对 RoPE 的介绍,每个子空间 𝑖 都有一个对应的波长 𝜆𝑖,表示在该子空间上旋转一周所需要的距离。然而,某些子空间的波长可能会超过上下文窗口的长度(𝜆𝑖 > 𝑇max),导致模型在这些子空间上无法对完整的旋转周期进行训练。这些子空间通常被称为关键子空间。在面临更长的文本时,RoPE 关键子空间的旋转角度对应的正余弦函数值并没有在训练阶段出现过,这就容易导致注意力值出现异常。因此,如果想要调整这些子空间的旋转角度分布,另一种方法是针对这些子空间的基 h(𝑖) 进行缩放。对基的修改可以通过对基的底数修改以及对基的截断实现,下面介绍这些修改方法,这里不展开了。
调整上下文窗口
为了解决 Transformer 架构对于上下文窗口的限制,除了使用扩展位置编码来拓宽上下文窗口外,另一种行之有效的策略是采用受限的注意力机制来调整原始的上下文窗口,从而实现对更长文本的有效建模。下面将详细介绍三种调整上下文窗口的方法。
并行上下文窗口
并行上下文窗口方法采用了一种分而治之的策略来处理输入文本。具体来说,该方法将输入文本划分为若干个片段,每个片段都进行独立的编码处理,并共享相同的位置编码信息。在生成阶段,通过调整注意力掩码,使得后续生成的词元能够访问到前序的所有词元。然而,该方法无法有效地区分不同段落之间的顺序关系,在某些特定任务上可能会限制模型的表现能力。
Λ形上下文窗口
在处理长文本时,大语言模型有时会表现出一种不均匀关注的现象:它们倾向于对序列起始位置以及邻近的词元赋予更高的注意力权重。基于这一观察, StreamingLLM 等工作引入了 “Λ 形” 注意力掩码方法,能够有选择性地关注每个查询的邻近词元以及序列起始的词元,同时忽略超出这一范围的其他词元。在给定的有限内存资源下,这种方法能够生成几乎无限长的流畅文本。然而,由于无法有效利用被忽略的词元信息,这种方法无法充分利用所有的上下文信息。
词元选择
在 Transformer 的注意力模块中,对于每个词元的预测,并非所有先前词元都提供等量的贡献。实际上,小部分紧密相关词元的注意力分数总和就能够接近所有词元的注意力分数总和。基于这样的一个实践观察,相关研究工作提出了词元选择方法,旨在挑选出最重要的 𝑘 个词元,以实现对于完整注意力的有效拟合。词元选择方法可以通过查询与词元相似度和查询与词元所在分块的相似度实现。
长文本数据
为了有效拓展模型的长文本建模能力,通常需要使用特殊准备的数据对于模型进行继续预训练。本节将详细介绍如何确定所需的长文本数据量,以及如何合理分布长文本数据的领域,以确保模型的长文本建模能力。
长文本数据量
标准的预训练任务通常需要使用大量的文本数据。而对于面向长文本建模的继续预训练来说,可以采用少量长文本数据进行轻量化的继续预训练。这一方法需要模型在初始预训练阶段已经学会了利用远程词元信息的能力,仅需使模型适应更长的上下文窗口。一般而来说,只需在约 1B 级别的词元上执行数百步的训练,就可以将 7B 或者 13B 大小的 LLaMA 系列模型的上下文窗口至 100K 词元以上的长度,并具有较好的长上下文利用能力。然而,值得注意的是,模型在处理短文本时的性能可能会受到一定程度的影响。
长文本数据混合
除了数据总量外,训练数据集中不同数据的混合也是影响模型性能的关键因素,主要包括长文本的领域分布和长文本的类型。在预训练数据中,不同领域长文本的比例存在差异。一般而言,书籍、科学论文、代码仓库等领域包含较多的长文本数据。直接对这些长文本数据采样进行进一步继续预训练可能会导致与预训练数据分布的不匹配,导致模型过多的学习了某一领域长文本的特征,从而损害了在其他领域的影响。为了提升模型的泛化能力,长文本数据的领域应尽可能多样化,并且与预训练数据集的分布保持相似。
新型模型架构
Transformer 模型自问世以来,在自然语言处理、计算机视觉等多个领域得到了广泛应用,并展现出卓越的数据表示与建模能力。然而,Transformer 的自注意力机制在计算每个词元时都需要利用到序列中所有词元的信息,这导致计算和存储复杂度随输入序列长度的平方级别增长。在处理长序列时,这种复杂性会消耗大量的计算资源与存储空间。为了解决这个问题,研究人员致力于新型模型架构的设计。这些新型模型大多基于参数化状态空间模型(State Space Model, SSM) 进行设计,在长文本建模效率方面相比 Transformer 有了大幅改进,同时也保持了较好的序列建模能力。
状态空间模型是一种动态时域模型,在控制系统、经济学等多个领域都有着广泛应用。近年来,深度学习领域也开始引入参数化状态空间模型对于序列数据进行建模。通俗来说,参数化状态空间模型可以看作是循环神经网络和卷积神经网络的“结合体”。一方面,该模型可以利用卷积计算对输入进行并行化编码。另一方面,该模型在计算中不需要访问前序的所有词元,仅仅利用前一个词元就可以自回归地进行预测。因此,该模型在解码时展现出了更高的计算效率。
尽管状态空间模型计算效率较高,但是在文本任务上的表现相比 Transformer 模型仍有一定的差距。为此,一系列研究工作对于状态空间模型进行了性能改进,在保证计算效率的同时提高其语言建模的能力。代表性模型包括 Mamba 、 RWKV(Receptance Weighted Key Value)、RetNet(Retentive Network)和 Hyena 等。
Mamba
Mamba 主要思想是在状态空间模型的状态更新中引入了基于当前输入的信息选择(Selection)机制,来确定当前时刻状态如何从前一时刻状态以及当前输入中提取信息,从而提升其在语言建模上的性能。模型能够基于当前时刻的输入 𝒙𝑡 对上一时刻的状态 𝑺𝑡−1 和当前时刻输入 𝒙𝑡 中的信息进行选择性过滤,从而实现更为有效的上下文表示。相比于标准状态空间模型,Mamba 展现出了更好的文本建模性能,但是由于引入了关于𝒙𝑡 的非线性关系,Mamba无法利用快速傅里叶变换实现高效卷积计算。
RWKV
RWKV (Receptance Weighted Key Value)尝试将 RNN 和 Transformer 的优点进行结合,继承了 Transformer 的建模优势和 RNN 的计算效率。作为一个主要技术创新,RWKV 在每层的计算中使用词元偏移(Token Shift)来代替词元表示。在每一步的状态计算中,它显示地引入了上一个词元 𝒙𝑡−1,通过两个相邻的词元 𝒙𝑡 和 𝒙𝑡−1 进行线性插值来代替 𝒙𝑡 作为后续模块的输入。进一步,RWKV 将 Transformer 中的多头注意力模块和前馈网络模块分别替换为时间混合(Time-mixing)模块和频道混合(Channel-mixing)模块。其中,时间混合模块是一个类似于门控的 RNN 的网络,并使用词元偏移对状态进行更新;频道混合模块是在前馈网络的基础上引入了词元偏移进行映射。类似于 Mamba,RWKV 在解码过程中可以像 RNN 一样只参考前一时刻的状态,但是在训练过程中缺乏并行计算的能力。
RetNet
RetNet提出使用多尺度保留(Multi-scale Retention, MSR)机制来代替多头注意力模块,从而提升计算效率。多尺度保留机制是在标准状态空间模型的基础上,在状态更新的线性映射中引入了输入相关信息来提升序列建模能力。RetNet 还可以通过类似注意力操作的矩阵乘法,对所有词元的状态进行并行化计算。因此类似于标准状态空间模型,RetNet 同时保留了循环计算和并行计算的优点。
Hyena
Hyena提出使用长卷积模块(Long Convolution)来替换 Trans-former 架构中的注意力模块,从而借助卷积的快速傅里叶变换来提高计算效率。
Hyena 在每层的长卷积模块中包含了 𝑀 个滤波器,即每个相对位置 𝑡 有一个相应的滤波器 𝒉(𝑡),然后将这些滤波器组合成卷积核 𝑲 = (𝒉(1), . . . , 𝒉(𝑇))。利用该卷积核与输入序列 [𝒙1, . . . , 𝒙𝑡 ] 进行卷积,可以对序列中不同位置的信息进行聚合,得到每个位置的中间表示 𝒛𝑡 。最后,再使用门控函数 𝒈(𝑡)(基于输入 𝒙𝑡 )对中间表示 𝒛𝑡 进行加权,得到该模块的最终输出。
由于使用了卷积计算可以使用快速傅里叶变换进行加速,在训练中,Hyena 可以实现 𝑂 (𝑇 𝑀 𝐻 log 𝑇 + 𝑇 𝑀 𝐻 2 ) 的计算复 杂度。但是在解码时,每次计算必须对前面所有的词元进行卷积,因此解码复杂 度为 𝑂(𝑇𝑀𝐻 + 𝑀𝐻2)。
Q.E.D.