Llama2 7B模型结构详细解析

Llama 2(由 Meta 于 2023 年发布)的模型结构建立在标准的 Decoder-only Transformer 架构之上,但在 Llama 1 的基础上进行了一些关键的优化和改进,以提高训练稳定性、推理效率和模型性能。

一、与 Transformer 架构的区别

Transformer模型是一种基于自注意力机制的神经网络模型,旨在处理序列数据,特别是在自然语言处理领域得到了广泛应用。Transformer模型的核心是自注意力机制( Self-Attention Mechanism),它允许模型关注序列中每个元素之间的关系。这种机制通过计算注意力权重来为序列中的每个位置分配权重,然后将加权的位置向量作为输出。模型结构上,Transformer由一个编码器堆栈和一个解码器堆栈组成,它们都由多个编码器和解码器组成。编码器主要由多头自注意力(Multi-Head Self-Attention)和前馈神经网络组成,而解码器在此基础上加入了编码器-解码器注意力模块。Transformer与LLaMA 的模型结构对比如下:

从 Transformer 的结构图中我们可以看出,Transformer 主要分为编码器(encoder)和解码器(decoder)两部分。而 LLaMA 仅使用了 Transformer 的解码器部分,采取了一个仅解码器(decoder-only)的结构。

在结构上,与Transformer模型相比,LLaMA2 的主要变化是:

1)将其中的层标准化(LayerNorm)替换为了均方根标准化(RMSNorm),前馈神经网络中使用了SwiGLU 激活函数;

2)多头注意力(Multi-Head Attention)换成了分组查询注意力(GQA,在 LLaMA 中则是多查询注意力 MQA);

3)将位置编码(Positional Encoding)替换为了旋转嵌入(Rotary Position Embedding,RoPE);

二、与 Llama 1 的主要区别

以下是 Llama 2 三个主要开源尺寸的具体架构参数:

与 Llama 的主要区别为:

  • 训练数据量增加 :Llama 2 的训练 token 数量达到了 2 万亿 (2T),比 Llama 1 的 1.4T 增加了约 40%,这直接提升了模型的知识储备和语言能力。
  • 引入 GQA:70B 模型采用 GQA 是工程上的重大优化,使得 70B 模型在消费级或中等算力集群上的推理变得可行。
  • 上下文长度 :Llama 1 的某些版本(如 34B Code Llama 之前的某些实验)或社区微调版尝试过更长上下文,但 Llama 2 基础版统一规范为 4096。(注:后续的 Llama 3 已将上下文扩展到 8k/128k,并全面普及 GQA 和 128k 词汇表)

三、RMS Normalization 均方根标准化和SwiGLU激活函数

3.1 RMS均方根标准化

LLaMA 2为了提高训练的稳定性,对每个transformer层的输入进行归一化,而不是输出进行归一化。同时,使用 RMS Norm 归一化函数。RMS Norm代码如下:

Layer Normalization(层归一化)和 RMSNormalization(均方根归一化)都是神经网络中用于稳定训练过程的归一化技术,都旨在对神经网络中的激活进行规范化处理,以减少训练过程中的内部协变量偏移(Internal Covariate Shift)问题。与 Layer Norm 相比,RMS Norm 的主要区别在于去掉了减去均值的部分,它可以使得网络的训练更加稳定,加快收敛速度,并在一定程度上改善网络的泛化能力。具体来说,每一层的标准化操作都会调整该层输入数据的均值和方差,使其保持在一个稳定的数值范围内。RMS Norm 的作者认为RMS归一化的模式简化了Layer Norm 的计算,可以减少约 7%∼64% 的计算时间。

3.2 SwiGLU 激活函数

是一种结合了 Swish 和 GLU 的激活函数,它结合了 Swish 的平滑性和GLU 的门控机制,能够有效地学习输入数据的不同特征。

GLU (Gated Linear Unit, 门控线性单元):其核心思想是将输入分为两部分,一部分作为"信息流"(线性变换),另一部分作为"门控流"(经过 Sigmoid 激活),两者逐元素相乘。门控机制允许网络动态地决定哪些信息应该被传递,哪些应该被阻断。

Swish / SiLU 激活函数:Swish 函数公式为 x⋅σ(βx),当 β=1 时,被称为 SiLU (Sigmoid Linear Unit)。相比于 ReLU,SiLU 是平滑的、非单调的,且在负值区域有微小的梯度,这有助于缓解深层网络中的梯度消失问题,并提供了更好的正则化效果。

标准的 SwiGLU 运算可以表示为:

SwiGLU 在 Transformer FFN 中的具体结构为:

SwiGLU 的优势:

  1. 非线性能力:SwiGLU通过Swish激活函数引入非线性,这使得模型能够学习和表示更复杂的数据模式 。

  2. 门控特性:GLU的门控机制允许模型动态地调整信息流,使得模型在处理长序列数据时能够更好地捕捉长距离依赖关系 。

  3. 梯度稳定性:SwiGLU在负输入区域提供非零的梯度,有助于缓解梯度消失问题,从而提高模型的训练稳定性 。

  4. 可学习参数:SwiGLU的参数可以通过训练学习,使得模型可以根据不同任务和数据集动态调整,增强了模型的灵活性和适应性 。

四、 Group Multi Query Attention 分组查询注意力

在各种多头注意力机制比较中,原始的多头注意力机制(MHA,Multi-Head Attention)使得QKV 三部分具有相等数量的"头",且它们之间是一一对应的。每一次计算注意力时,各个头部的QKV 独立执行自己的计算,最后将所有头部的结果加在一起作为输出。标准的 MHA 就是这样一个模型,其中 Q、K、V 分别对应了 h 个 Query、Key 和 Value 矩阵。

相对于 MHA,多查询注意力(MQA,Multi-Query Attention)则略有不同。MQA 保持了原来的 Query 头数,但是只为 K 和 V 各设置了一个头,即所有的 Query 头部都共享同一个 K 和 V 组合,即为"多查询"。据实验发现,这种机制通常可以提高 30%-40% 的吞吐量,对性能的影响相对较小。MQA 是一种多头注意力的变体,被广泛用于自回归的解码。与 MHA 不同,MQA 让所有的头部在 K 和 V 之间实现共享,每个头部只保留一份 Query 参数,从而大大降低了 K 和 V 矩阵的参数量。

分组查询注意力(GQA,Grouped-Query Attention)综合了 MHA 和 MQA,即避免了过多的性能损失,又能够利用 MQA 的推理加速。在GQA中,Query部分进行分组,每个组共享一组KV。GQA把查询头分成G组,每个组内部的头部共享一个相同的K和V组合。当G设为1,即GQA-1,则所有Query都共享同一组K和V,这时的GQA等效于MQA;而当G等于头的数量,即GQA-H,那么这时的GQA等效于MHA,具体差异及整体结构见下图:

五、旋转(Rotary Position Embedding,RoPE)位置编码

旋转位置编码 RoPE 是一种固定式的绝对位置编码策略,但是它的绝对位置编码配合Transformer 的 Attention 内积注意力机制能达到相对位置编码的效果。RoPE 的本质对两个token 形成的 Query 和 Key 向量做一个变换,使得变换后的 Query 和 Key 带有位置信息,进一步使得 Attention 的内积操作不需要做任何更改就能自动感知到相对位置信息 。换句话说 RoPE 的出发点和策略用的相对位置编码思想,但是实现方式的确用的是绝对位置编码。

公式表明 RoPE 没有额外需要模型自适应学习的参数,因此 RoPE 是一种高效的编码方式。绝对位置编码表明 RoPE 给文本的每个位置单词都分配了一个位置表征,和三角 sin-cos 位置编码一样,RoPE 通过 token 在句子中的位置,token embedding中每个元素的位置,这两个要素一起确定位置编码的表达,给出 RoPE 的公式如下:

该公式是将一个原始的token向量改造为一个注入位置信息之后的新向量过程:

其中。第一项代表某个位置为 m 的 token 的原始 Query 向量,0~d-1 代表向量每个位置的元素,d 代表向量的维度;

第二项为一个同样长度是 d 的带有 cos 三角函数的向量,它和 Query 向量逐位相乘;

第三项由原始 Query 变换而来,第四项和第二项类似区别是将cos替换为sin。

该公式的目的是将原始Query向量改造成一个带有位置信息的新向量,位置信息由参数 m 和 θ 进行表征,其中 m 为 token 在句子中的位置,θ 的下标和向量中各元素的位置直接相关。

θ 和向量中各元素的位置的关系:

因此,只要给到某个 token 的输入 Query 向量,知道 token 在上下文窗口下处于第几位,就可以将它的 Query 向量通过 RoPE 的公式改造为一个新的向量形式,新形成的向量和原向量维度完全一致。

剩下的细节,请参考如下文章:

大模型系列:快速通俗理解Transformer旋转位置编码RoPE_rope位置编码-CSDN博客