LLAMA2入门(一)-----预训练

Llama 2 是预训练和微调的LLM系列,Llama 2 和 Llama 2-Chat 模型的参数规模达到 70B。Llama 2-Chat 模型专门为对话场景进行了优化。

这是一个系列的文章,会分别从LLAMA2的预训练,微调,安全性等方面进行讲解。

1.数据来源

  • 数据集:LLaMA 2 的训练数据来源于公开可用的数据集,并未使用来自 Meta 产品或服务的数据。为了避免隐私泄露,数据集中剔除了来自某些网站的高风险个人信息。
  • 数据量:模型共预训练了 2 万亿个 token,比 LLaMA 1 增加了约 40%。同时,数据集上调了最具事实性的来源,以提升模型知识储备,减少幻觉(hallucination)的发生。
  • 去重和清洗:数据经过了更严格的清洗和去重处理,旨在提供更干净且更具代表性的数据集。

2.训练细节

模型架构

LLaMA 2 使用了标准的 Transformer 架构(Vaswani et al., 2017),并基于 LLaMA 1 进行了优化,包括使用预归一化(pre-normalization)RMSNorm、SwiGLU 激活函数(Shazeer, 2020)以及旋转位置嵌入(RoPE, Su et al. 2022)。这些优化提升了模型处理长上下文的能力。

(1) 基础架构
  • LLaMA 2 使用的是自回归语言模型(Auto-regressive Language Model),这意味着模型是通过预测每个词在给定上下文中的下一个词来进行训练的。
  • 标准的 Transformer 架构:模型使用经典的 Transformer 架构 ,最初由 Vaswani 等人提出,这是一种基于自注意力机制的架构,能够处理长距离依赖关系并捕捉句子中的语义结构。
  • 归一化层:LLaMA 2 采用了预归一化策略(Pre-normalization),具体使用了 RMSNorm 来替代传统的 LayerNorm。这使得模型的训练更为稳定,尤其是在处理深层网络时。
(2) 改进的激活函数

LLaMA 2 使用了 SwiGLU 激活函数,而不是传统的 ReLU 或 GeLU。SwiGLU 是一种更复杂的非线性激活函数,能够提高模型的表现,特别是在大规模模型中 。

为什么要使用SwiGLU激活函数?

SwiGLU 的公式如下:
SwiGLU(x)=(Linear(x)⋅SiLU(Linear(x))) SwiGLU(x)=(Linear(x)⋅SiLU(Linear(x))) SwiGLU(x)=(Linear(x)SiLU(Linear(x)))
其中,SiLU(Sigmoid Linear Unit)是一个常用的非线性激活函数,定义为:
SiLU(x)=x⋅σ(x) SiLU(x)=x⋅σ(x) SiLU(x)=xσ(x)
其中σ(x)σ(x)σ(x) 是 Sigmoid 函数 11+e−x\frac{1}{1+e^{−x}}1+ex1

因此,SwiGLU 实际上是对输入进行了两次线性变换,并通过 SiLU 将两个结果结合起来,这种组合使得模型可以捕获更丰富的特征表示。

  1. SwiGLU有更高的表达能力

    SwiGLU 通过双线性变换和 SiLU 非线性结合,提供了更强的表达能力。具体体现在:

    • 非线性表现更强:SwiGLU 在输入空间上提供了更复杂的非线性映射,能够捕获数据中更加复杂的模式。相比于传统的 ReLU,它避免了“梯度消失”或“梯度爆炸”的问题,同时也比 GeLU 更能灵活地处理不同输入。
    • 激活函数的平滑性:SiLU 是一种平滑的激活函数,这意味着它在小输入值附近表现平稳,输出变化相对缓和。与 ReLU 不同,SiLU 不会像 ReLU 那样在负数部分输出恒为零,这有助于模型更好地处理负值输入,从而提高训练稳定性。
  2. 计算效率更高

    虽然 SwiGLU 包含了两次线性变换,但由于它与 SiLU 激活函数结合,SwiGLU 可以充分利用并行计算硬件(如 GPU 和 TPU)来高效执行。因此,它相比于一些复杂的非线性函数(如 ReLU 或 Tanh)在计算开销上并没有显著增加,同时提升了模型的性能。

  3. 更好的梯度流动

    SwiGLU 结合了 SiLU 的平滑性和双线性变换的组合,使得它能够在梯度反向传播时提供更好的梯度流动,这尤其在深层网络中表现出色。在 LLaMA 2 这样的大规模 Transformer 模型中,模型层数很多,使用 SwiGLU 可以有效地缓解梯度消失问题,确保模型能够在训练过程中更好地学习到深层次的特征。

(3)位置嵌入

旋转位置嵌入(RoPE):LLaMA 2 使用了旋转位置嵌入(Rotary Positional Embeddings, RoPE),这是一种改进的相对位置编码方式,能够处理更长的上下文信息,并提高模型在长文本上的性能 。

  1. 位置编码的重要性

    Transformer 模型本质上是不具备顺序感的,因为它们并没有卷积或递归结构,而是通过自注意力机制(Self-Attention)在序列中的所有词之间计算注意力权重。因此,在处理语言任务时,必须显式地告诉模型每个词在序列中的位置,以便模型能够理解句子中的词序。

    传统的 Transformer 使用绝对位置编码(Absolute Positional Encoding),这意味着每个位置(token)的信息是通过一个固定的向量表示,该向量在训练开始时被注入到输入中。然而,绝对位置编码无法很好地建模词与词之间的相对位置关系,特别是当序列长度增加时,绝对位置编码的表现会下降。

  2. RoPE的核心思想

    旋转位置嵌入(RoPE) 通过引入旋转操作来嵌入相对位置信息。它通过对输入的查询和键(Query 和 Key)向量进行逐元素的旋转变换,将位置信息嵌入到自注意力机制的计算中,从而保留了序列中词之间的相对位置。

    RoPE 的核心思想是将每个 token 的查询和键向量按照其位置进行旋转,而这种旋转是连续的,能够保持词与词之间的相对距离信息。这意味着,相比于绝对位置编码,RoPE 不需要依赖固定的位置编码表格,而是通过对向量进行旋转操作来隐式地表示相对位置。

    RoPE 的数学定义如下:

    旋转变换

    给定二维向量 [x1,x2][x1,x2][x1,x2],我们可以定义它的旋转变换为:
    [x1′x2′]=[cos⁡(θ)−sin⁡(θ)sin⁡(θ)cos⁡(θ)][x1x2]\begin{bmatrix} x'_1 \\ x'_2 \end{bmatrix} =\begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}[x1x2]=[cos(θ)sin(θ)sin(θ)cos(θ)][

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒惰才能让科技进步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值