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

详解各种LLM系列|(2)LLaMA 2模型架构、 预训练、SFT内容详解 (PART-1) LLaMA 2模型架构、 预训练、SFT内容详解 阅读详情

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+e−x1​

因此,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}[x1′​x2′​​]=[cos(θ)sin(θ)​−sin(θ)cos(θ)​][x1​x2​​]
    在 RoPE 中,这种旋转操作会应用到高维向量的每对相邻维度上(如第 1 维和第 2 维,第 3 维和第 4 维),每对维度的旋转角度由位置和频率确定。

    具体来说,RoPE 对每个位置 ppp 以逐维不同的频率来进行旋转变换,确保较低维度捕捉较短距离的依赖,较高维度捕捉较长距离的依赖。

    相对位置优势

    这种基于旋转的位置编码能够隐式地表示相对位置。RoPE 的一个关键优势在于,经过旋转编码后,两个位置 ppp 和 p+kp+kp+k 的旋转向量之间的差异只取决于相对位置 kkk,而不是绝对位置。这意味着即使文本序列长度增加,RoPE 也能保持相对位置的关系,使其更具泛化能力,特别是在长文本处理上表现优异。

  3. RoPE的具体实现步骤

    RoPE 的实现涉及以下几个步骤:

    1. 输入处理:输入的查询向量 qqq 和键向量 k 是没有位置信息的高维向量。
    2. 位置嵌入:对每个位置 ppp 的查询和键向量,按照位置 ppp 对查询 qqq 和键 kkk 的偶数维和奇数维进行不同的旋转嵌入。
    3. 自注意力机制计算:经过旋转嵌入后,查询和键向量会进入自注意力机制进行打分计算,这个过程中,自然地引入了位置相关性和相对位置偏置。
    4. 输出生成:自注意力机制根据注意力权重生成新的向量表示,传递到后续的 Transformer 层。
  4. RoPE 相比传统位置编码的优势
    1. 处理长序列的能力

    RoPE 的设计使其可以扩展到更长的序列而不会丢失位置信息。传统的绝对位置编码在序列长度超过训练时的长度后,模型的表现会显著下降,因为位置编码无法很好地泛化。而 RoPE 通过旋转方式嵌入相对位置,具备良好的泛化能力,适用于长序列文本处理。

    2. 相对位置建模

    RoPE 的另一个显著优势是相对位置编码。对于许多 NLP 任务,词与词之间的相对距离往往比绝对位置更为重要。例如,在机器翻译或长文本生成任务中,模型必须理解词语之间的相对关系,而不仅仅是它们的固定位置。

    3. 计算效率

    RoPE 的旋转计算相对简单,能够高效地并行化计算。相较于需要额外层次处理的相对位置编码方案(如 Transformer-XL 中的相对位置编码),RoPE 在引入相对位置偏置的同时,保持了自注意力机制的计算效率。

  5. 具体使用例子

    给定一个查询向量 qqq 或键向量 kkk,我们通过以下旋转公式将位置信息嵌入:
    RoPE(q2i,q2i+1)=[cos⁡(θp)−sin⁡(θp)sin⁡(θp)cos⁡(θp)][q2iq2i+1] \text{RoPE}(q_{2i}, q_{2i+1}) = \begin{bmatrix} \cos(\theta_p) & -\sin(\theta_p) \\ \sin(\theta_p) & \cos(\theta_p) \end{bmatrix} \begin{bmatrix} q_{2i} \\ q_{2i+1} \end{bmatrix} RoPE(q2i​,q2i+1​)=[cos(θp​)sin(θp​)​−sin(θp​)cos(θp​)​][q2i​q2i+1​​]
    这里:

    • q2iq_{2i}q2i​和q2i+1q_{2i+1}q2i+1​分别是查询向量 qqq 的第 2i2i2i 和第 2i+12i+12i+1 维。
    • θp=p⋅θ\theta_{p}=p·\thetaθp​=p⋅θ是与位置 ppp 相关的旋转角度,通常设定为与维度相关的常数(如θ=10000−2id\theta=10000^{\frac{-2i}{d}}θ=10000d−2i​,其中ddd是查询向量的维度)
    • 这个变换将每对相邻维度 (2i,2i+1)(2i,2i+1)(2i,2i+1)旋转一个与位置 ppp 相关的角度。

注意力机制的改进

引入了分组查询注意力机制(Grouped-Query Attention, GQA),特别是用于处理参数规模较大的模型(例如 34B 和 70B)。这一改进提升了推理的可扩展性,降低了注意力计算时的内存消耗。

查询注意力机制(Grouped-Query Attention, GQA) 是 LLaMA 2 模型中引入的一种优化注意力计算的机制,特别是在处理大规模模型(如 34B 和 70B 参数模型)时,GQA 大幅减少了注意力计算的内存开销,并提高了模型的推理效率。

为了理解 GQA,首先需要了解传统的多头自注意力机制(Multi-Head Self-Attention, MHA),然后我们会介绍 GQA 是如何改进 MHA 的。

回顾多头自注意力机制(MHA)

在传统的多头自注意力机制中,自注意力计算分为多个“头”(attention heads)。每个注意力头会为输入序列生成查询(Query, Q)、键(Key, K)和值(Value, V),并分别进行自注意力计算。具体流程如下:

  1. 线性投影:每个输入向量(token embedding)会通过线性投影生成对应的 Q、K、V 向量。这意味着每个注意力头有自己独立的线性投影矩阵。

  2. 注意力计算:每个头都会独立地进行注意力计算,计算公式如下:
    Attention(Q,K,V)=softmax(QKTdk)V \text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}} \right) V Attention(Q,K,V)=softmax(dk​​QKT​)V
    其中 QQQ 是查询,KKK 是键,VVV 是值,dkd_kdk​ 是键向量的维度。

  3. 多头组合:所有注意力头的输出会被拼接起来,经过一个线性变换后,生成最后的输出。

传统的 MHA 通过引入多个注意力头,允许模型在不同的子空间中学习不同的注意力模式。然而,MHA 的一个缺点是,当模型参数增加时(如 34B 或 70B 参数模型),每个头都有独立的 Q、K、V 线性投影矩阵,这会显著增加内存和计算开销。

传统多头注意力机制的代码:
import torch
import torch.nn as nn
import torch.nn.functional as F

class MultiHeadSelfAttention(nn.Module):
    def __init__(self, embed_size, num_heads):
        super(MultiHeadSelfAttention, self).__init__()
        self.embed_size = embed_size
        self.num_heads = num_heads
        self.head_dim = embed_size // num_heads
        
        assert self.head_dim * num_heads == embed_size, "Embedding size needs to be divisible by heads"

        # 为每个头独立生成 Q、K、V
        self.query = nn.Linear(embed_size, embed_size, bias=False)
        self.key = nn.Linear(embed_size, embed_size, bias=False)
        self.value = nn.Linear(embed_size, embed_size, bias=False)

        # 最后的全连接层
        self.fc_out = nn.Linear(embed_size, embed_size)

    def forward(self, values, keys, query, mask):
        N = query.shape[0]
        value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]

        # 对每个输入进行线性变换得到 Q、K、V
        queries = self.query(query)
        keys = self.key(keys)
        values = self.value(values)

        # 将维度 (N, seq_length, embed_size) -> (N, num_heads, seq_length, head_dim)
        queries = queries.view(N, query_len, self.num_heads, self.head_dim).transpose(1, 2)
        keys = keys.view(N, key_len, self.num_heads, self.head_dim).transpose(1, 2)
        values = values.view(N, value_len, self.num_heads, self.head_dim).transpose(1, 2)

        # 注意力得分计算: QK^T / sqrt(d_k)
        energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])
        
        if mask is not None:
            energy = energy.masked_fill(mask == 0, float("-1e20"))
        
        attention = torch.softmax(energy / (self.head_dim ** (1 / 2)), dim=3)

        # 使用注意力权重加权 V
        out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(N, query_len, self.embed_size)

        return self.fc_out(out)
查询注意力机制(Grouped-Query Attention, GQA)

Grouped-Query Attention (GQA) 通过对查询(Q)的投影进行分组优化,大幅减少了计算和内存的使用。具体来说,GQA 保留了多个注意力头的设计,但共享查询的投影矩阵,而不是为每个头都独立投影查询向量。GQA 的核心思想是将多个注意力头分成几组,每组内的所有注意力头共享同一个查询投影矩阵。

GQA 的主要改进点:

共享查询投影:在 GQA 中,多个注意力头会共享一个查询投影矩阵,而不再为每个头都单独分配一个查询投影矩阵。这样减少了查询投影的计算复杂度和内存需求。

  • 例如,如果有 64 个注意力头,GQA 可能将这些头分为 4 组,每组 16 个头。组内的所有 16 个头共享同一个查询投影矩阵,而键和值仍然各自独立。

保持多头注意力的灵活性:尽管查询投影被分组共享,键(K)和值(V)的投影仍然是独立的。这意味着每个注意力头仍然可以在不同的子空间中捕捉不同的注意力模式,而不会丧失多头注意力机制的多样性。

GQA 的工作原理

查询投影分组:多个注意力头被分成几组(例如每组 8 或 16 个头),组内的所有注意力头共享同一个查询投影矩阵。这减少了模型中查询投影的总量。

键和值的独立投影:每个头仍然会独立生成键和值向量,从而保留每个头独立关注不同信息的能力。

自注意力计算:GQA 使用共享的查询投影矩阵来计算查询向量 QQQ,然后与独立的键和值一起进行标准的自注意力计算。尽管查询投影被共享,但每个头的键和值是不同的,因此每个头的注意力分数仍然可以有自己的模式。

多头组合:与传统 MHA 类似,所有注意力头的输出会被拼接起来,经过线性变换后生成最终的输出。

GQA 的优点

相比于传统的 MHA,GQA 在大规模模型中具有以下几个显著优点:

1. 减少内存占用
  • 由于查询投影矩阵被分组共享,GQA 显著减少了查询投影矩阵的总量。这在处理大规模模型(如 LLaMA 2 的 34B 和 70B 参数模型)时,能有效降低内存占用。
2. 提高推理效率
  • 通过减少查询投影的计算,GQA 可以加速推理过程,尤其是在大型模型中。传统的 MHA 随着注意力头的增加,计算量线性增长,而 GQA 通过共享查询投影减少了计算量,提升了推理效率。
3. 更好的可扩展性
  • GQA 尤其适用于大规模模型。在大模型中,MHA 的计算和内存瓶颈会变得更加明显,而 GQA 通过减少查询的独立投影,可以更好地扩展模型参数,同时保持较高的计算效率。
4. 保持多头的灵活性
  • 尽管 GQA 共享了查询的投影,但仍然保留了多头注意力机制的多样性。每个头的键和值投影仍然是独立的,因此 GQA 不会牺牲模型在不同子空间中学习不同模式的能力。
查询注意力机制(GQA)的代码
class GroupedQueryAttention(nn.Module):
    def __init__(self, embed_size, num_heads, num_groups):
        super(GroupedQueryAttention, self).__init__()
        self.embed_size = embed_size
        self.num_heads = num_heads
        self.num_groups = num_groups  # 分组数
        self.head_dim = embed_size // num_heads
        
        assert self.head_dim * num_heads == embed_size, "Embedding size needs to be divisible by heads"
        assert num_heads % num_groups == 0, "Number of heads must be divisible by the number of groups"

        # 共享查询的投影矩阵
        self.shared_query = nn.Linear(embed_size, embed_size // num_groups, bias=False)  # 每组共享

        # 为每个头单独生成 K 和 V
        self.key = nn.Linear(embed_size, embed_size, bias=False)
        self.value = nn.Linear(embed_size, embed_size, bias=False)

        # 最后的全连接层
        self.fc_out = nn.Linear(embed_size, embed_size)

    def forward(self, values, keys, query, mask):
        N = query.shape[0]
        value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]
        
        # 为每个头生成 K 和 V
        keys = self.key(keys)
        values = self.value(values)

        # 将每组内的所有头共享查询投影矩阵
        queries = []
        group_size = self.num_heads // self.num_groups
        for i in range(self.num_groups):
            # 对查询进行分组计算
            q = self.shared_query(query)
            q = q.repeat(1, 1, group_size)  # 共享矩阵复制给组内的所有头
            queries.append(q)
        
        queries = torch.cat(queries, dim=-1)  # 将分组后的 Q 拼接起来

        # 调整维度以适应注意力计算: (N, seq_length, embed_size) -> (N, num_heads, seq_length, head_dim)
        queries = queries.view(N, query_len, self.num_heads, self.head_dim).transpose(1, 2)
        keys = keys.view(N, key_len, self.num_heads, self.head_dim).transpose(1, 2)
        values = values.view(N, value_len, self.num_heads, self.head_dim).transpose(1, 2)

        # 注意力得分计算: QK^T / sqrt(d_k)
        energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])
        
        if mask is not None:
            energy = energy.masked_fill(mask == 0, float("-1e20"))

        attention = torch.softmax(energy / (self.head_dim ** (1 / 2)), dim=3)

        # 使用注意力权重加权 V
        out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(N, query_len, self.embed_size)

        return self.fc_out(out)

代码解释:

energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])

该行代码使用了 torch.einsum 来计算注意力得分矩阵,其中 queries 和 keys 是多头自注意力机制中的查询和键张量。

queries 和 keys 的形状为 (N, S, num_heads, head_dim),经过变换,当前它们的形状为:

queries:(N, query_len, num_heads, head_dim),即nqhd:

N:批次大小(batch size)

q:查询序列长度(query length)

h:注意力头的数量(number of heads)

d:每个头的嵌入维度(embedding size per head)

keys`:`(N, key_len, num_heads, head_dim)`,即 `nkhd
  • N:批次大小
  • k:键的序列长度(key length)
  • h:注意力头的数量
  • d:每个头的嵌入维度

爱因斯坦求和约定

torch.einsum 使用字符串形式的爱因斯坦求和约定,"nqhd,nkhd->nhqk",用来描述张量的运算规则。这个规则可以分为几个部分:

  • 输入部分

    "nqhd,nkhd"
    

    描述了输入张量的维度:

    • queries 的维度是 nqhd,即 (N, query_len, num_heads, head_dim)。
    • keys 的维度是 nkhd,即 (N, key_len, num_heads, head_dim)。
  • 输出部分

    "nhqk"
    

    描述了输出张量的维度:

    • n:批次大小。
    • h:注意力头的数量。
    • q:查询序列长度。
    • k:键序列长度。

在这个表达式中,d(head_dim,嵌入维度)被省略掉了,因为 d 是被求和维度。torch.einsum 将在 d 维上进行内积操作,然后输出 (N, num_heads, query_len, key_len) 形状的张量。

注意力得分矩阵

这一步的结果 energy 是一个形状为 (N, num_heads, query_len, key_len) 的张量,它包含每个注意力头中每个查询位置与所有键位置之间的点积结果。该点积值表示查询和键之间的相似度,也就是注意力机制中的原始得分。

接下来,通常会对这个 energy 张量进行 softmax 归一化,以计算注意力权重,从而决定每个查询应该重点关注哪些键值。

传统多头自注意力机制(MHA)与 GQA 的区别
特性传统多头自注意力机制(MHA)查询注意力机制(GQA)
查询(Q)投影矩阵每个注意力头都有独立的查询投影矩阵查询投影矩阵在分组内的所有头中共享,减少了查询投影的计算量
键(K)和值(V)投影矩阵每个头有独立的键和值投影矩阵每个头仍然有独立的键和值投影矩阵,保持注意力头的灵活性
内存需求随着注意力头的数量线性增加通过共享查询投影减少内存占用
计算效率当注意力头数较多时,计算复杂度和内存开销大通过共享查询投影,计算效率更高,尤其是在大模型中
灵活性每个头都有独立的查询投影,因此具有较大的灵活性查询投影共享在一定程度上减少了灵活性,但仍保持键和值的独立性

上下文长度

LLaMA 2 将上下文长度从 2048 token 增加到 4096 token,这使模型能够处理更长的文本段落,特别是在对话场景和长文本总结中表现更好。

3.训练超参数

  • 使用了 AdamW 优化器,参数为 β1=0.9、β2=0.95,学习率使用余弦衰减调度,初始预热 2000 步,最终学习率衰减至峰值的 10%。模型使用了权重衰减(weight decay)0.1 和梯度裁剪(gradient clipping)1.0。
  • 训练时长和资源:为了减少训练时间,LLaMA 2 采用了 Meta 的研究超级计算集群(RSC),并使用 NVIDIA A100 GPUs。每个 GPU 的功率限制为 350-400W,总共花费 330 万 GPU 小时 进行预训练,碳排放总计 539 吨 CO2,100% 通过 Meta 的可持续性计划进行了抵消 。

4.优化点

更强的泛化能力:LLaMA 2 的设计在处理长上下文、减少幻觉、提升模型推理速度和内存效率等方面做了大量优化。这些优化使得模型在对话生成、文本总结等任务中表现优异,特别是在需要保持上下文一致性的场景下效果更好。

一文看懂LLAMA2(原理&模型&训练) Llama2作为一种基于Transformer架构的先进语言模型,通过自注意力机制和深度学习技术,实现了高效的自然语言理解和生成能力。其模型结构和训练方法在多个应用场景中展现了卓越的性能和广泛的应用价值。随着计算资源和技术的不断发展,Llama2在未来还将有更多的创新和突破,推动自然语言处理技术的发展和应用。通过本文的介绍,相信读者对Llama2的原理、模型结构和训练方法有了全面的了解。 阅读详情

相关推荐

三万字长文超详细解读LLama2!

自从Transformer架构问世以来,大型语言模型(Large Language Models, LLMs)以及AIGC技术的发展速度惊人,它们不仅在技术层面取得了重大突破,还在商业应用、社会影响等多个层面展现出巨大潜力。 随着ChatGPT的推出,这一技术日益走进大众视野,这也预示着一个由生成式AI塑造的未来正在加速到来。 与此同时,Meta AI Meta AI在2023年推出了LLama(Large Language Model Meta AI)系列大语言模型,这一模型初期是以较为封闭的形式面向特定

穿着帆布鞋也能走猫步 6243

[NLP] LLM---<训练中文LLama2(一)>训练一个中文LLama2的步骤

然而,这将需要我们给人类发送一些样本,在每轮优化后计分,这个流程需要耗费大量人工,且需要大量数据集,而人类阅读和标注的速度有限。等),但是坦白讲,质量都不高,大家可自行下载并需要进行清洗,清洗SFT数据是个耗时耗力的工作,但根据作者微调经验,一份高质量的SFT数据是相当重要的‼️(如果不清洗SFT数据,可能无法获得满意的SFT效果,建议大家在这块多花些时间) 中文SFT语料网上最近很多,大家自行下载。因为在llama官方所提供的词表中,中文的部分只有700个,这也是llama中文能力聊胜于无的原因。

摩登都市天空---专栏 3607

【AI大模型】LLaMa羊驼大模型详解

LLaMa模型结构:前面的词预测后面的词,经典的解码结构。位置编码用的是旋转自编码。大语言模型为什么取名为LLaMa(美洲鸵)?LLM发音困难。两个LL跟绕口令一样挑战舌头。大家想给它加点原音,帮助发音。有人加了A,就是LLaMa。3.模型的训练和数据:65B的模型使用2048块A100 80G的GPU,训练21天左右。(训练成本还是比较高的,训练的数据集同GPT一样)LLaMa模型训练的数据集。

weixin_53880910的博客 2809

[NLP] LLM---<训练中文LLama2(三)>对LLama2进行中文预料预训练

由于第一阶段预训练会冻结transformer参数,仅训练embedding模型,因此,收敛速度较慢,如果不是有特别充裕的时间和计算资源,建议跳过该阶段。第二阶段预训练使用LoRA技术,为模型添加LoRA权重(adapter),训练embedding的同时也更新LoRA参数。,需预先执行下载其中一部分数据用于预训练或者使用其进行词表扩充训练。下载完之后,对其中的数据进行数据清洗,去除一些空行等。是如何从0到1进行中文词表扩充、模型预训练和微调的整个过程。本文预训练数据集使用一些。

摩登都市天空---专栏 2942

本地部署中文LLaMA模型实战教程,民间羊驼模型

LLaMA大部分是英文语料训练的,讲中文能力很弱。如果我们想微调训练自己的LLM模型,基于一个大规模中文语料预训练的模型比较好。目前开源项目很多,理想的项目要有以下特点:模型开源、训练代码开源、代码结构简单、环境容易安装、文档清晰。经过寻找与试验,我找到了一个比较好的项目。本博文要点如下:1 实战部分:模型下载与参数合并、模型命令行加载测试、模型部署为web网页(解决了一些报错问题)2 代码走读:模型参数合并、词表扩充3 原理分析:预训练与指令精调。

artistkeepmonkey的博客 8173

百度飞桨EasyDL图像分类:收费口车辆类型自动识别

车辆类型识别在高速收费路口的应用中,场景相对单一且拍摄角度一致,因此首次训练模型效果优异,准确率达到了95%,鉴于市面上的车辆类型不断更新迭代且部分车辆的主要特征也不断发生变化,因此可在模型投入应用后,持续收集模型实际运行过中产生的数据,定期添加数据进行模型迭代,保证模型效果。企业将AI模型应用到实际场景中以实现停车费用、过路费用的自动计算,在收费口中由相机对每个车辆进行拍摄,拍摄到的图片传输到预测设备上进行类型识别,基于识别出来的车辆类型自动进行费用计算。该功能可在发起训练时选选择对应的开关打开即可。..

PaddlePaddle 1673

【AI大模型】羊驼大模型详解_大模型 羊驼

可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。AI大模型应用所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。模型的提升一般模型本身没有多大的进化, 主要的提升是。

二狗的博客 906

介绍七种常见还危险的病毒(带样本)

简介:能够感染用户计算机bai系统中的.exe、.dll和.html文件,将自身加密以后缀加到目标文件中。样本(源文件):https://wwx.lanzoux.com/iJx4njrpz1c / https://wwx.lanzoui.com/iYRNLwd8ldc。英文名称:Virus.Win32.Viking.A(标准) / Worm.Win32.Fujack.A(标准)英文名称:Net-Worm.Win32.Blaster.A(标准)/ Lovesan.A/ Msblast.A。

2301_78858007的博客 8447

【AI大模型】羊驼大模型详解_大模型 羊驼,零基础入门到精通,收藏这一篇就够了

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;国内很多大模型都是学Alpaca模型的玩法,套壳LLaMA模型低成本训练出自己的模型。

heaven522的博客 2112

最全中文停用词表(可直接复制)

最全的停用此表整理 词表名 词表文件 中文停用词表 cn_stopwords.txt 哈工大停用词表 hit_stopwords.txt 百度停用词表 baidu_stopwords.txt 机器智能实验室停用词库 scu_stopwords.txt 以上停用词表链接:https://github.com/goto456/stopwords 以下是我常用的1893个停用词,可直接复制 ! " # $ % & ' ( ) * + , - -- . .. ... ....

dilifish的博客 12万+

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 253

第六十五回 时迁火烧翠云楼 吴用智取大名府-羊驼大模型的部署应用:llama.cpp和llama.c纯c编译安装部署 以及Ollama一键部署

LLaMA羊驼模型是元宇宙平台公司(Meta)公开发布的一款大型语言模型。该模型建立在Transformer基础架构上,采用了多层神经网络结构,有助于捕捉和学习数据中的复杂模式。这种设计使得LLaMA模型在自然语言处理方面表现突出,能够进行语义分析、情感识别和文本生成,广泛应用于人工智能各种场景。羊驼模型最显著的特点之一是它的开源性,这意味着任何研究人员或开发者都可以访问和使用该模型的源代码。此外,羊驼模型是在公开预训练数据上进行训练的,这保证了其通用性和可复现性。

skywalk8163的专栏 1844

9篇3章7节:基于 R 语言的 FAERS 数据提取与合并

本文主要探讨了 FAERS 数据提取与合并的操作流程。首先,通过程序化方法从本地存储的 FAERS ASCII 文件中提取指定季度或范围内的单药报告数据,并可通过参数设置控制数据存储位置、处理方式、计算资源分配以及报告者职业类别等。随后,通过批量读取的方式对多个季度的 DRUG 文件进行循环处理,并将其合并为一个综合数据框。

MD Code 1267

【AI大模型】羊驼大模型详解_零基础入门到精通,看完这篇就足够了~

可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。原生的基础LLaMa用的语料是通用语料。微调的本质并不是能把模型效果变好,微调的目的是让模型更适应于我们的数据。作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。国内很多大模型都是学Alpaca模型的玩法,套壳LLaMA模型低成本训练出自己的模型。

heaven522的博客 1411

金融数字化——详解2025年金融智能体深度应用报告【附全文阅读】

《2025年金融智能体深度应用报告》显示,金融智能体已实现80%部署率,推动行业效率提升30%-50%。报告指出智能体通过"感知-推理-规划-执行-进化"机制突破大模型局限,在风控、客服、投研等100+场景实现自动化。典型案例显示,工商银行信贷审批效率提升60%,蚂蚁数科智能客服解决80%问题。尽管面临系统协同、标准缺失等挑战,未来趋势将向多模态交互、自主进化和ESG投资等方向拓展。

cdfunlove的博客 205

高比例风电电力系统储能运行及配置研究(python&Matlab实现)

目录1 概述2 案例3 Matlab实现 3.1 题目及分析3.2 Matlab代码 4 七个题全部代码(值得学习) 下面我们先以第二题为例,然后给出Matlab代码:先考虑风电装机300MW直接替代机组3的发电功率曲线,观察系统功率平衡发生的变化情况。然后在此场景下,以最小发电成本为目标函数,将负荷分配给两台火电机组1、2和风电机组,绘制机组日发电计划图。再将风电装机容量作为一个决策变量,以最小发电成本为目标函数,求取最小发电成本对应的风电装机容量,绘制机组日发电计划图。1. 风电装机300MW、直接

weixin_46039719的博客 1741

【AI大模型】羊驼大模型详解

在自己的数据上进行微调,让模型能够满足自己的需求。微调的本质并不是能把模型效果变好,微调的目的是让模型更适应于我们的数据。65B的模型使用2048块A100 80G的GPU,训练21天左右。(训练成本还是比较高的,训练的数据集同GPT一样)国内很多大模型都是学Alpaca模型的玩法,套壳LLaMA模型低成本训练出自己的模型。LLaMa模型结构:前面的词预测后面的词,经典的解码结构。模型的提升一般模型本身没有多大的进化, 主要的提升是。LLaMa模型训练的数据集。完整的大模型课程:《AI大模型训练营》

qq_24428851的博客 991

Linkage Mapper 工具参数详解——Building Network and Map Linkages

此文档用于解析使用LinkageMapper各输入输出参数详情以及可能的影响,并介绍了如何解释模型输出结果和输出参数,适合刚入手的人。篇幅很长很啰嗦,是因为每个参数都解释的万分细致。

sumuses的博客 6119
上一篇: 人工智能顶会CVPR2022《革新AI预训练:探索KDEP及其在知识蒸馏中的破局之道》论文解读
下一篇: LLAMA2入门(二)-----Transformer基础知识
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

懒惰才能让科技进步

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

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

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

打赏作者

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

抵扣说明:

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

余额充值