在之前的博客中,讨论了LLMs的训练数据及数据调度方法。这篇博客将聚焦于LLMs的另一个重要方面:模型架构。由于模型架构的复杂性和多样性,我将写一篇双语博客。这个版本是中文的,明天将发布英文版本(数据部分也将以中文发布一次)。这篇博客基于Datawhale学习文件和一个写的很好的综述。
6.1 典型架构
Transformer架构已成为创建各种LLMs的主导框架,使得语言模型的参数规模能够扩展到数百亿甚至数千亿。总体而言,当前LLMs的主要架构大致可分为三种类型:编码器-解码器、因果解码器和前缀解码器。在下面的总结表中可以看到:
- 编码器-解码器架构。 最初的Transformer模型采用编码器-解码器架构构建,包括两组Transformer块,分别用作编码器和解码器。编码器利用堆叠的多头自注意力层对输入序列进行编码,以生成其潜在表示,而解码器对这些表示进行交叉注意力,并自主生成目标序列。
- 因果解码器架构。 因果解码器架构包括单向注意力掩码,确保每个输入标记只能关注其前面和自身的标记。在解码器内部,输入标记和输出标记都以类似的方式进行处理。GPT系列模型是基于因果解码器架构开发的代表性语言模型。值得注意的是,GPT-3有效展示了这种架构的有效性,展示了LLMs出色的上下文学习能力。有趣的是,GPT-1和GPT-2并没有像GPT-3一样展现出同样的出色能力,这表明扩展在增强这种架构的模型容量方面起着至关重要的作用。在现有文献中,除非另有说明,“仅解码器架构”主要指的是因果解码器架构。
- 前缀解码器架构。 前缀解码器架构,也称为非因果解码器,修改了因果解码器的掩码机制,允许在前缀标记上进行双向注意力,而仅在生成的标记上进行单向注意力。与编码器-解码器架构类似,前缀解码器可以双向编码前缀序列,并以自回归方式预测输出标记,在编码和解码过程中共享相同的参数。与从头开始训练不同,一个实际的方法是持续训练因果解码器,然后将其转换为前缀解码器以加快收敛速度。
- 专家混合。 我们还可以通过专家混合(MoE)扩展前面提到的三种架构类型,其中每个输入的一部分神经网络权重被稀疏激活。MoE 的主要优势在于其灵活的模型参数扩展方法,同时保持固定的计算成本。相关文献已经证明,通过增加专家数量或总参数大小,可以实现显著的性能改进。然而,训练大型MoE模型可能会遇到不稳定性问题,因为路由操作的复杂、硬切换的性质。为了解决这个问题,引入了一些技术,比如在路由模块中选择性地使用高精度张量,或者用较小的范围初始化模型。
- 新型架构。 传统的Transformer架构通常面临二次计算复杂性的问题。因此,在训练和推断过程中,效率已成为处理长输入的关键问题。为了提高效率,一些研究致力于开发LLM的新架构。这些包括参数化状态空间模型、长卷积和集成递归更新机制的Transformer-like架构。这些新架构的主要优势有两个方面。
- 这些模型可以像RNN一样递归生成输出,这意味着它们在解码过程中只需要参考前一个状态。这通过消除传统Transformer中需要重新访问所有先前状态的需求,提高了解码过程的效率。
- 这些模型具有类似Transformer的能力,可以并行地编码整个句子。这与传统的RNN不同,后者需要逐标记地编码句子。因此,它们可以通过技术利用GPU并行性。这些技术使得具有这些新架构的模型能够以高度并行和高效的方式进行训练。
6.2 详细配置
6.2.1 Normalization
对于预训练LLMs来说,训练的稳定性是一个重大挑战。标准化是一种广泛使用的策略,用于解决这一问题并稳定神经网络的训练。在最初的Transformer中,使用了LayerNorm。然而,已经提出了几种高级的标准化技术作为LayerNorm的替代方案,例如RMSNorm和DeepNorm。
- LayerNorm:最初,BatchNorm是一种常用的标准化方法,但它在处理长度不同和小批量数据的序列数据时遇到了困难。因此,引入了LayerNorm来执行逐层标准化。它计算每层所有激活的均值和方差,以对激活进行重新居中和重新缩放。
- RMSNorm:RMSNorm旨在通过仅使用总激活的均方根(RMS),而不是均值和方差,来重新缩放激活,以增强LayerNorm的训练速度。研究表明,它在Transformer的训练速度和性能方面具有优势。
- DeepNorm:微软提出了DeepNorm来稳定深度Transformer的训练。通过将DeepNorm用作残差连接,Transformer可以扩展到1000层,展示了稳定性和良好性能的优势。
6.2.2 标准化位置
除了标准化方法,标准化位置在LLM中也起着关键作用。通常有三种标准化位置的选择:post-LN、pre-LN和sandwich-LN。
- Post-LN:在最初的Transformer中使用了Post-LN,位于残差块之间。然而,现有研究发现,使用Post-LN训练Transformer往往不稳定,因为在输出层附近存在大梯度。因此,在现有的LLM中,Post-LN很少被使用,除非与其他策略结合使用。
- Pre-LN:与Post-LN相反,Pre-LN应用于每个子层之前,并在最终预测之前额外放置一个LN。与使用Post-LN的Transformer相比,使用Pre-LN的Transformer在训练过程中更稳定。然而,它们的性能往往不如使用Post-LN的模型。尽管存在性能下降,大多数LLMs仍然采用Pre-LN,因为它具有训练稳定性。唯一的例外是,在训练参数超过100B的模型时,发现Pre-LN不稳定。
- Sandwich-LN:在Pre-LN的基础上,Sandwich-LN在残差连接之前添加额外的LN,以减轻Transformer层输出中的数值爆炸问题。然而有时Sandwich-LN无法稳定LLMs的训练,并可能导致训练崩溃。
6.2.3 激活函数
在前馈网络中正确设置激活函数对于获得良好性能至关重要。GeLU激活在现有的LLM中被广泛使用。此外,GeLU的变体在最新的LLM中也被使用,特别是SwiGLU和GeGLU的变体,在实践中通常能够获得更好的性能。然而,与GeLU相比,它们在前馈网络中需要额外的参数(约50%)。
6.2.4 位置嵌入
由于Transformer中的自注意力模块是置换等变的,因此使用位置嵌入(PE)来注入序列的绝对或相对位置信息进行建模。
绝对位置嵌入:在最初的Transformer中,使用了绝对位置嵌入。在编码器和解码器的底部,绝对位置嵌入被添加到输入嵌入中。在最初的Transformer中提出了绝对位置嵌入的两个变体,即正弦和学习位置嵌入,后者在现有的预训练语言模型中通常被使用。
相对位置嵌入:与绝对位置嵌入不同,相对位置嵌入是基于键和查询之间的偏移量生成的。Transformer-XL引入了相对位置嵌入的一种流行变体。注意分数的计算已经修改,引入了与相对位置对应的可学习嵌入。
旋转位置嵌入 (RoPE): 它涉及根据每个关键或查询的绝对位置设置特定的旋转矩阵。可以使用相对位置信息计算键和查询之间的得分。RoPE将查询和关键中的每个连续对元素组合为一个维度,从而使原始长度为d的嵌入得到 d2 \frac{d}{2}2d 维度。对于每个维度 i ∈ { 1 , . . . , d2}i \in \{1,…,\frac{d}{2}\}i∈{1,…,2d},涉及的元素对将根据旋转角度 t ⋅ θi t·\theta_it⋅θi 进行旋转,其中 ttt 表示位置索引, θi \theta_iθi是该维度中的基础。在正弦位置嵌入之后,RoPE将基础 θi \theta_iθi 定义为基数b(默认设置为10000)的幂:
Θ={ θ i= b −2(i−1)/d ∣i∈{1,2,…,d/2}}\Theta = \{\theta_i = b^{-2(i-1)/d}|i\in \{1,2,\dots,d/2\}\} Θ={θi=b−2(i−1)/d∣i∈{1,2,…,d/2}}
此外,一项最近的研究定义了每个维度所需旋转一个周期(2π)的距离,称为波长:
λ i=2π b 2(i−1)/d =2π/ θ i\lambda_i = 2 \pi b^{2(i-1)/d}= 2\pi/\theta_i λi=2πb2(i−1)/d=2π/θi
由于其出色的性能和长期衰减特性,RoPE已被广泛应用于最新的LLMs中。基于RoPE,xPos增强了Transformer的平移不变性和长度外推能力。在旋转角度向量的每个维度上,xPos引入了一种特殊的指数衰减,随着基数的增长而减小,从而在距离增加时减轻了训练过程中的不稳定性。
因为其重要性和复杂性,有一篇博客说的挺好的,可以看看这个博客: https://zhuanlan.zhihu.com/p/647109286。【注意:大量数学推导】
ALiBi: 该方法旨在增强Transformer的外推能力。类似于相对位置嵌入,它使用基于键和查询之间距离的惩罚来偏置注意力得分。与相对位置嵌入方法不同,ALiBi中的惩罚分数是预定义的,没有任何可训练参数。实证结果表明,ALiBi在长序列上优于几种流行的位置嵌入方法。此外,已经证明ALiBi还可以增强BLOOM中的训练稳定性。
6.2.5 注意力机制
注意力机制是Transformer的关键部分,使序列中的tokens能够相互作用并计算输入和输出序列的表示。
- 全局注意力:在最初的Transformer中,注意力机制以成对的方式运作,考虑序列中所有token 对之间的关系。它采用缩放点积注意力,其中隐藏状态被转换为查询、键和数值。此外,Transformer利用多头注意力,将查询、键和数值投影到不同头部的不同投影中。每个头部的输出被串联起来作为最终输出。
- 稀疏注意力:全局注意力的O( n 2)O(n^2) O(n2)复杂度在处理长序列时变得繁重。因此,提出了各种高效的Transformer变体来降低注意力机制的计算复杂度。例如,局部带状稀疏注意力,如分解注意力,已经在GPT-3中得到应用。每个查询只能根据其位置关注标记子集。
- 多查询/分组查询注意力:多查询注意力是指不同头部在键和数值上共享相同的线性变换矩阵的注意力变体。它在只轻微牺牲模型质量的情况下实现了更高的推理速度。具有多查询注意力的代表模型包括PaLM和StarCoder。为了在多查询注意力和多头注意力之间取得平衡,研究了分组查询注意力(GQA)。在GQA中,头部被分配到不同的组中,属于同一组的头部共享相同的变换矩阵。值得注意的是,GQA已经在最近发布的LLaMA 2模型中得到了采用和实证测试。
- FlashAttention:与大多数现有的近似注意力方法相反,这些方法在提高计算效率的同时牺牲了模型质量,FlashAttention旨在从IO感知的角度优化GPU上注意力模块的速度和内存消耗。更新版本FlashAttention-2进一步优化了GPU线程块和warp的工作分区,使得与原始FlashAttention相比速度提高了约2倍。
- PagedAttention:在服务器上部署LLM时,GPU内存通常被缓存的注意力键和数值张量(称为KV缓存)所占用。这主要是由于输入长度的变化导致了碎片化和过度保留的问题。受操作系统中经典分页技术的启发,PagedAttention被引入以增强部署的LLM的内存效率和吞吐量。具体而言,PagedAttention将每个序列分成子序列,并将这些子序列的相应KV缓存分配到非连续的物理块中。这种分页技术提高了GPU利用率,并在并行采样期间实现了有效的内存共享。
总之,现有文献建议采用以下详细配置以实现更强的泛化能力和训练稳定性:选择预RMSNorm进行层归一化,并选择SwiGLU或GeGLU作为激活函数。此外,建议不要在嵌入层后立即使用LN,因为这可能会导致性能下降。关于位置嵌入,RoPE或ALiBi是更好的选择,特别是对于长序列的更好性能。
END