当前位置:   article > 正文

【大模型】LLaMa系列演进及源码解析_llama1,llama2, llama3有什么区别

llama1,llama2, llama3有什么区别


本文转载自: LLaMa-1/2/3 原理+源码——拆解 (KV-Cache, RoPE, RMSNorm, GQA, SwiGLU)

一、背景介绍

主流的大语言模型都采用了Transformer架构,它是一个基于多层Self-attention的神经网络模型。

原始的Transformer由编码器(Encoder)和解码器(Decoder)两个部分构成,同时,这两个部分也可以独立使用。
在这里插入图片描述

Llama模型与GPT-2类似,也是采用了基于Decoder-Only的架构。在原始Vanilla Transformer Decoder的基础上,Llama进行了如下改动:

  • 为了增强训练稳定性,前置了层归一化(Pre-normalization),并使用RMSNorm 作为层归一化方法。
  • 为了提高模型性能,采用SwiGLU 作为激活函数。
  • 为了更好地建模长序列数据,采用RoPE 作为位置编码。
  • 为了平衡效率和性能,部分模型采用了GQA分组查询注意力机制(Grouped-Query Attention, GQA)。
  • 并且将self-attention改进为使用KV-Cache的Grouped Query。
  • 每个版本的Llama由于其隐藏层的大小、层数的不同,均有不同的变体。

二、LLaMa-1/2/3 演进

接下来,我们将展开看下每个版本的不同变体:
在这里插入图片描述

2.1 LLaMa-1系列的演进

  • LLaMa-1:Meta开源的Pre-trained Model,模型参数从 7B、13B、32B、65B 不等,LLaMa-7B在大多数基准测试上超过了Text-davinci-003(即GPT3-173B),相比于ChatGPT或者GPT4来说,LLaMa可能效果上还有差距,目前hugging face已集成了LLaMa的代码实现和开源模型。学术界和工业界都可以在此基础上进行学习和研究。
    在这里插入图片描述

  • Alpaca:斯坦福在LLaMa-7B的基础上监督微调出来的模型,斯坦福是用OpenAI的Text-davinci-003(即GPT3-173B)的API配合self-instruct技术,使用175个提示语种子自动生成了52K条提示-回复的指示数据集,在LLaMa-7B上微调得到的模型,在8张80G的A100上训练了3小时。

  • Vicuna:在LLaMa-13B的基础上使用监督微调得到的模型,数据集来自于ShareGPT 产生的用户对话数据,共70K条。使用Pytorch FSDP在8张A100上训练了一天。相较于Alpaca,Vicuna在训练中将序列长度由512扩展到了2048,并且通过梯度检测和flash attention来解决内存问题;调整训练损失考虑多轮对话,并仅根据模型的输出进行微调。通过GPT4来打分评测,Vicuna可以达到ChatGPT 90%的效果。

2.2 LLaMa2系列的演进

  • LLaMa2:采用了Llama 1的大部分预训练设置和模型架构,有 7B、13B、34B、70B四个参数量版本。LLaMa2和LLaMa1的最大差别是:Llama-2将预训练的语料扩充到了 2T token语料,同时将模型的上下文长度从2,048翻倍到了4,096,并在训练34B、70B的模型中引入了分组查询注意力机制(grouped-query attention, GQA)

在这里插入图片描述

  • LLaMa-2 Chat:有了更强大的基座模型Llama-2,Meta通过进一步的有监督微调(Supervised Fine-Tuning, SFT)基于人类反馈的强化学习(Reinforcement Learning with Human Feedback, RLHF)等技术对模型进行迭代优化(Pertrain -> SFT -> RLHF),并发布了面向对话应用的微调系列模型 Llama-2 Chat。

  • Code-LLaMa:得益于Llama-2的优异性能,Meta在2023年8月发布了专注于代码生成的Code-Llama,共有7B、13B、34B和70B四个参数量版本。

2.3 LLaMa3系列的演进

  • LLaMa3:包括8B和70B两个参数量版本。除此之外,Meta还透露,400B的Llama-3还在训练中。相比Llama-2,Llama-3支持8K长文本,并采用了一个编码效率更高的tokenizer,词表大小为128K。在预训练数据方面,Llama-3使用了超过15T token的语料,这比Llama 2的7倍还多。
    – 小型模型具有8B参数,其性能略优于Mistral 7B和Gemma 7B;
    – 中型模型则拥有70B参数,其性能介于ChatGPT 3.5和GPT 4之间;
    – 大型模型规模达到400B,目前仍在训练中,旨在成为一个多模态、多语言版本的模型,预期性能应与GPT 4或GPT 4V相当。

三、LLaMa关键技术点

3.1 Embedding

Embedding的过程:word -> token_id -> embedding_vector

其中第一步转化使用tokenizer的词表进行,第二步转化使用 learnable 的 Embedding layer。

在这里插入图片描述

3.2 RMS Norm

  • Batch Norm 和 Layer Norm:都是减去均值Mean,除以方差Var,最终将归一化为正态分布N(0,1)。只不过两者是在不同的维度(batch还是feature)求均值和方差,(其中,减均值:re-centering 将均值mean变换为0,除方差:re-scaling将方差varance变换为1)。

在这里插入图片描述

  • RMS Norm(Root Mean Layer Norm):RMS Norm认为,Layer Norm成功的原因是re-scaling,因为方差Var计算的过程中使用了均值Mean,因此RMS Norm不再使用均值Mean,而是构造了一个特殊的统计量RMS代替方差Var。

为什么使用RMS Norm?
(1)RMS Norm计算量更小
(2)RMS的效果和Layer Norm一样好。

针对输入向量 a 的RMS Norm 函数计算公式如下:
在这里插入图片描述

此外,RMSNorm 还可以引入可学习的缩放因子gi 和偏移参数bi,从而得到:
在这里插入图片描述
RMSNorm 在HuggingFace Transformer 库中代码实现如下所示:

class LlamaRMSNorm(nn.Module):
    def __init__(self, hidden_size, eps=1e-6):
        """
        LlamaRMSNorm is equivalent to T5LayerNorm
        """
        super().__init__()
        self.weight = nn.Parameter(torch.ones(hidden_size))
        self.variance_epsilon = eps # eps 防止取倒数之后分母为0
    def forward(self, hidden_states):
        input_dtype = hidden_states.dtype
        variance = hidden_states.to(torch.float32).pow(2).mean(-1, keepdim=True)
        hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
        # weight 是末尾乘的可训练参数, 即g_i
        return (self.weight * hidden_states).to(input_dtype)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

为了使得模型训练过程更加稳定,GPT-2 相较于GPT 就提出了将Layer Norm前置,将第一个层归一化移动到多头自注意力层之前,第二个层归一化也移动到了全连接层之前,同时残差连接的位置也调整到了多头自注意力层与全连接层之后。层归一化中也采用了RMSNorm 归一化函数。

3.3 RoPE(Rotary Positional Encodding)

绝对Positional Encodding的使用过程:word -> token_id -> embedding_vector + position_encodding -> Encoder_Input

其中第一步转化使用tokenizer的词表进行,第二步转化使用 learnable 的 Embedding layer。将得到的embedding_vector 和 position_encodding 进行element-wise的相加,然后才做为input送入LLM的encoder。

在这里插入图片描述

对比Absolute PE 和 Relative PE:

  • Absolute PE 绝对位置编码:每次单独1个token的PE,每个token的PE之间没有关系,是一组固定的vector,反映每个token在sequence中的绝对位置。计算 query, key 和 value 向量之前加在输入序列X上, Q / K / V = W q / k / v ( X + P ) Q/K/V=W_{q/k/v}(X+P) Q/K/V=Wq/k/v(X+P),经典的位置编码向量 P 的计算方式是使用 Sinusoidal 函数。

  • Relative PE 相对位置编码:每次处理2个token的PE,只在计算attention时使用(在query@key时加在key上),反映2个token的相关度。

和相对位置编码(Relative PE)相比,旋转位置编码(RoPE) 具有更好的外推性,目前是大模型相对位置编码中应用最广的方式之一。

备注:什么是大模型外推性?(Length Extrapolation)

外推性是指大模型在训练时和预测时的输入长度不一致,导致模型的泛化能力下降的问题。
例如,如果一个模型在训练时只使用了512个token 的文本,那么在预测时如果输入超过512个
token,模型可能无法正确处理。这就限制了大模型在处理长文本或多轮对话等任务时的效果。

3.4 旋转位置编码(RoPE)

旋转位置编码(RoPE):RoPE 借助了复数的思想,出发点是通过绝对位置编码的方式,实现token间的相对位置编码。其目标是通过下述 f 运算,计算self-attention前,来给q,k 添加,其在sequence中的绝对位置信息m和n,得到qm 和kn,然后进行qm@kn:

在这里插入图片描述

3.5 SwiGLU Function

SwiGLU 激活函数是Shazeer 在文献中提出,并在PaLM等模中进行了广泛应用,并且取得了不错的效果,相较于ReLU 函数在大部分评测中都有不少提升。在LLaMA 中全连接层使用带有SwiGLU 激活函数的FFN(Position-wise Feed-Forward Network)的计算公式如下:
在这里插入图片描述

其中,σ(x) 是Sigmoid 函数。下图给出了Swish 激活函数在参数β 不同取值下的形状。可以看到当β 趋近于0 时,Swish 函数趋近于线性函数y = x,当β 趋近于无穷大时,Swish 函数趋近于ReLU 函数,β 取值为1 时,Swish 函数是光滑且非单调。
在这里插入图片描述
HuggingFace 的Transformer 库中 S w i s h β = 1 Swish_{\beta=1} Swishβ=1 函数使用 SILU 函数 代替。

3.6 KV-Cache

[待补充]

3.7 Grouped Multi-Query Attention

[待补充]

四、源码解析

[待补充]

参考资料

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/676300
推荐阅读
相关标签
  

闽ICP备14008679号