购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 网络结构

当前的大语言模型几乎都基于Transformer [7] 架构,因此,本节首先简要介绍原始的Transformer架构,然后介绍大模型中的Transformer架构的演进。

2.3.1 Transformer架构

Transformer模型由Google于2017年提出,它首先被应用于机器翻译。机器翻译的目标是从源语言转换到目标语言。因此,原始的Transformer架构包含编码器和解码器两部分,如图2.4所示。

编码器和解码器都由多个基本的Transformer块堆叠而成(图2.4中的× L 表示堆叠了 L 块)。第 l 个Transformer块接收一个向量序列 作为输入,并输出一个等长的向量序列 在语义上的进一步的抽象。下面仔细讲解Transformer块的内部构成,以帮助读者理解语义抽象是怎么做的。

1.多头自注意力层

自注意力机制的主要思想是,序列中的每个词元都可以通过计算它与序列中其他所有词元的加权表示生成其最终表示。这些权重,即注意力分数,是通过Query和Key的点积计算得到的,并且通常还会考虑Value。为了防止在softmax函数计算过程中由于过大的权重导致的梯度爆炸或收敛效果过慢的问题,权重会除以一个缩放因子 ,通常是Key的维度的平方根,以稳定优化过程。缩放后的得分通过softmax函数归一化,转换为概率分布。每个自注意力头的计算可以表达为

其中, V 是自注意力层的输入向量。

这样,多头自注意力计算过程可以描述如下:

图2.4 Transformer架构

(1)多组投射。每组投射代表一个所谓的头。每组投射通过不同的权重矩阵 W Q W K W V 对输入向量 V 进行线性变换,生成对应的Query、Key和Value向量。

(2)并行计算自注意力。每个头独立计算自注意力,公式如下:

其中 d k 是Key向量的维度。

(3)拼接输出。每个头的自注意力输出被拼接在一起,形成一个较长的向量序列。

(4)线性投影。拼接后的向量序列通过一个线性层 W O 进行投影,公式如下:

MultiHead( Q K V )=Concat(head 1 ,head 2 ,…,head h W O

其中Concat是拼接操作。

图2 . 5 [8] 清晰地表达了这一计算过程。

图2.5 多头注意力计算过程

为什么需要一个以上的注意力头呢?其原因是:一个注意力头的softmax函数往往主要集中在相似性的一方面;有了几个注意力头,模型就可以同时关注几方面了。例如,一个注意力头可以专注于主语与动词的互动,而另一个注意力头则可以找到附近的形容词。如果熟悉计算机视觉模型,就会发现它与卷积神经网络中的过滤器很相似,其中一个过滤器负责检测人脸,另一个过滤器负责在图像中寻找汽车的车轮。

2.前馈网络

前馈网络(Feed-Forward Network,FFN)接收自注意力子层的输出作为输入,并通过一个带有ReLU激活函数的两层全连接网络对输入进行更复杂的非线性变换,计算公式为

FFN( x )=ReLU( xW 1 + b 1 W 2 + b 2

实验证明,这一非线性变换会对模型最终的性能产生重要的影响。

3.残差连接和层归一化

Transformer块组成的网络结构通常都非常深,每一层中都包含复杂的非线性映射,这就导致模型的训练比较困难。因此,研究人员在Transformer块中引入了残差连接,以避免梯度消失问题,公式为

x l = f x l -1 )+ x l -1

此外,为了使每一层的输入输出稳定在一个合理的范围内,引入了层归一化(Layer Normalization,NL)技术,公式为

层归一化相对于残差连接的放置方式有两种:一种是后置层归一化(post layer normalization),将层归一化放在残差连接之后;另一种是前置层归一化(pre layer normalization),将层归一化放在残差连接之前。这两种放置方式如图2.6 [8] 所示。

原始Transformer采用前一种放置方式。后来的大模型架构通常采用后一种放置方式。在后一种放置方式下,训练通常更加稳定。

4.编码器和解码器

图2.6 层归一化的两种放置方式

原始Transformer模型是一个编码器-解码器(encoder-decoder)架构,这种设计特别适用于机器翻译等任务,因为它需要同时理解源语言的文本(编码器)并生成目标语言的文本(解码器)。原始Transformer的解码器部分的Transformer块中多了一个编码器-解码器注意层。它使得解码器能够利用编码器处理的输入序列信息生成输出序列。具体来说,在解码器生成下一个词元时,使用解码器的中间表示(Query)与编码器的输出(Key和Value)进行多头自注意力计算。这种设计使得模型能够在生成文本时同时考虑输入序列和以前生成的输出序列,从而生成更加连贯和准确的文本。

2.3.2 大模型的Transformer架构

现在的大模型是一种生成式模型,其主要目标是生成文本而不是翻译或理解。因此,它不需要编码器处理输入的源语言文本,而是直接从给定的文本序列生成新的文本,一般采取仅解码器(decoder-only)的架构。为了训练的效率和稳定性,通常会对标准的Transformer块的结构做一些改动。由于OpenAI自GPT-3之后就不再公开其技术细节,Google的PaLM模型架构就成为业界的标准。后续Meta开源的Llama系列吸收了PaLM的一些改动,成为一个成熟的类GPT架构。像百川智能、零一万物这样采用Llama架构开发的大模型,其网络架构也延续了这些改动。Llama模型架构如图2.7所示。

相对于标准的Transformer块,Llama模型架构的Transformer块在以下3方面做了改动。

1.前置归一化

Transformer块的输入应用了层归一化,称为前置归一化(pre-normalization),这种做法会让训练的热身计划(warm-up schedule)更健壮。层归一化使用RMSNorm(Root Mean Square layer Normalization,均方根层归一化),这个实现只计算输入的方差,计算效率更高。

2.自注意力

图2.7 Llama模型架构

Transformer块使用一种叫作自注意力的网络结构对输入的编码进行转换,这种网络结构有多组(称为多头),每组有3个矩阵,分别为Query、Key和Value。在对一个序列(sequence)做自回归解码时,一个标准做法是缓存之前的词元的Key和Value矩阵以加速自注意力的计算。随着批量大小和上下文长度的增加,缓存Key和Value矩阵占用的GPU内存会显著增加。一种优化方法是在一个Transformer块中的多头之间共享同一个Key和Value矩阵。根据共享的粒度分为MQA(Multi-Query Attention,多查询自注意力)和GQA(Grouped-Query Attention,分组查询自注意力)。MQA是在所有的头之间共享一个Key和Value矩阵,而GQA将头分组,一组共享一个Key和Value矩阵。和原始的多头自注意力(一个头对应一个Key和Value矩阵)相比,CQA性能没有什么变化,而MQA性能明显降低。此外,在推理时,一个关键技术是使用张量并行降低延迟。与MQA相比,GQA给予张量并行的空间更大,因此GQA被广泛采用。

3.激活函数

激活函数使用SwiGLU而不是ReLU,它有一个双线性层,包含3个参数矩阵,而不像标准Transformer的FFN层那样有两个矩阵,因此将FFN层输出矩阵第二维度从隐含层大小的4倍降为8/3倍。

2.3.3 MoE模型

模型的规模对提升性能至关重要。混合专家(Mixture of Experts,MoE)模型以其较低的计算需求,在预训练阶段能以更少的资源达到与稠密模型相似的质量,从而可以在有限的计算预算下显著地扩展模型或数据集的规模。尽管MoE模型的概念早在1991年就由Hinton和Jordan提出 [9] ,并被业界看好,但路由算法的复杂性和训练的不稳定性阻碍了它的发展。直到2017年稀疏性概念的引入 [10] 以及2021年Switch Transformers [11] 和2022年ST-MOE [12] 的提出,这些问题才得到有效解决。鉴于大语言模型预训练的高成本,基于Transformer的MoE模型成为构建更大规模的模型的有效选择。

基于Transformer的MoE模型将传统Transformer模型中的每个前馈网络层替换为MoE层。其中MoE层由两个核心部分组成:若干数量的专家网络(expert network)和一个门控网络(gating network)。

(1)MoE层包含若干专家网络(例如8个),每个专家网络本身是一个独立的神经网络。在实际应用中,这些专家网络通常是前馈网络,但它们也可以是更复杂的网络结构,甚至可以是MoE层本身,从而形成层级式MoE结构。

(2)MoE层的门控网络用于决定哪些词元被发送到哪个专家网络,所以通常也叫作路由器。有时,一个词元甚至可以被发送到多个专家网络。路由器与网络的其他部分一同进行训练。

下面探讨MoE模型的两个关键设计:稀疏性和路由算法。这两个设计外加一些细节上的优化(例如容量因子、专家网络并行计算等),使得MoE模型在不增加额外计算负担的情况下扩展规模和高效训练成为可能。

1.稀疏性

稀疏性的概念采用了条件计算的思想。在传统的稠密模型中,所有的参数都会对所有输入数据进行处理。相比之下,稀疏性允许模型仅针对系统的某些特定部分执行计算。这意味着并非所有参数都会在处理每个输入时被激活或使用,而是根据输入的特定特征或需求只调用和运行部分参数。在MoE模型中,一部分参数对应一个专家网络,每个专家网络负责处理输入数据集的一部分。专家网络越多,模型越稀疏。

条件计算的概念(即仅在每个样本的基础上激活网络的不同部分)使得在不增加额外计算负担的情况下扩展模型规模成为可能。这一策略在每个MoE层中实现了数以千计甚至更多的专家网络的有效利用。

2.路由算法

在稀疏模型设置中,输入词元必须动态路由至不同专家网络。路由算法的目标是高效地为每个词元选择专家网络,并确保负载均衡。

1)选择机制——门控网络

为词元选择专家网络有多种方法。一种简单且高性能的方法是门控网络使用一个线性变换+softmax操作,即线性层的输出logits通过softmax函数进行归一化,转换为概率分布。路由器根据softmax概率选择专家网络。

2)负载均衡——辅助损失+专家容量

然而,在这种简单实现下,门控网络往往倾向于主要激活相同的几个专家网络。这种情况可能会自我加强,由于“受欢迎”的专家网络训练得更快,因此它们更容易被选择。为了缓解这个问题,在模型中引入了辅助损失,旨在鼓励给予所有专家网络相同的重要性。辅助损失确保所有专家网络接收到数量大致相等的训练样本,从而平衡了专家网络的选择。

辅助损失存在训练稳定性的问题,ST-MoE引入了Router z-loss,在保持了模型性能的同时显著提升了训练的稳定性。这种损失机制通过惩罚门控网络中较大的logits发挥作用,目的是促使数值的绝对值保持较小,这样可以有效减少计算中的舍入误差。这一点对于那些依赖指数函数进行计算的门控网络尤其重要。

由于MoE路由的动态性,训练或推理时每个专家网络在一个批次(batch)中要处理的词元数是不确定的,因此需要考虑如何设置专家网络容量,以避免某些专家网络过载而其他专家网络空闲的情况。为每个专家网络设置一个容量因子(capacity factor)用于调整其负载。容量因子一旦确定,专家网络容量就确定下来,也就意味着每个专家网络处理固定大小的批次。如果一个词元路由到的两个专家网络的容量都达到上限,词元就会溢出并通过残差连接传递到下一层。容量因子是可调节的,不过增加容量因子会导致更高的设备间通信成本,因此需要在负载均衡性和成本之间做出权衡。

3.其他优化

MoE模型的训练可以通过专家网络并行提高计算效率。专家网络并行是通过在不同的设备上分布专家网络的参数和计算量实现的。这种方法允许MoE模型在保持每个设备上的计算负载相对稳定的同时提高总体的计算能力。在专家网络并行中,由于专家网络分布在不同的设备上,因此需要有效的通信机制均衡不同设备上的计算负载。这通常涉及全交换(all-to-all)通信模式,即每个设备都需要与其他设备交换信息,以确保词元能够被正确地路由和处理。

4.Mistral的MoE模型架构

Mistral公司推出的Mixtral 8x7B [13] 模型是经典的MoE大语言模型。它使用与Llama相似的Transformer架构,将前馈块替换成MoE层。本节以该模型为例介绍MoE层的具体情况。

MoE层由一个门控网络和一组专家网络组成,如图2.8所示。对于一个输入,MoE层的输出是几个专家网络的输出的加权和。专家网络的权重由门控网络确定。

图2.8 MoE层

给定 n 个专家网络{ E 0 E 1 ,…, E n -1 },对于输入 x ,输出为

其中, E i x )为第 i 个专家网络的输出, G x i 为第 i 个专家网络对应的门控网络的输出部分。

实现 G x )有多种方法,一种简单且高性能的方法是通过在线性层的前 K 个较大的logits上采用softmax函数实现,即

G x )=softmax(TopK( xW g ))

其中, xW g 计算结果就是输入 x 经过线性变换得到的logits。

这样,在处理每个词元时,实际参与处理的参数就只是模型全部参数的一部分。例如, n =8, K =2,那么在处理每个词元时,实际参与的专家网络只有两个,涉及的参数只是全部参数的1/4。

理论上,这种MoE架构有很多优势。例如,如果保持 K 不变,增大 n ,那么就可以在不增加计算代价的情况下增加模型的参数。

在Transformer模型中,MoE层独立应用于每个词元,并取代Transformer块的前馈网络层。对于Mixtral 8x7B模型,使用SwiGLU架构作为专家网络输出函数 E i x ),并设置 K =2。这意味着每个词元被路由到两个SwiGLU子块,每个SwiGLU子块对应不同的权重集。因此,对于输入 x ,输出为 wzzTEr52vCSWAWIDMR1KY8ubL5XPbv/tB4uhPtlOHZVv0EyhowrUTOyMGAmoMt8E

点击中间区域
呼出菜单
上一章
目录
下一章
×