Datawhile 组队学习Tiny-universe Task01

news2024/9/19 23:02:36

Task01:LLama3模型讲解

仓库链接:GitHub - datawhalechina/tiny-universe: 《大模型白盒子构建指南》:一个全手搓的Tiny-Universe

参考博客:LLaMA的解读与其微调(含LLaMA 2):Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子牙_llama微调-CSDN博客

https://zhuanlan.zhihu.com/p/694072728

Part1:LLama的发展历程

LLaMA(Large Language Model Assistant)一系列大型开源语言模型,自2023年以来,已经经历了几次重要的迭代和升级。以下是LLaMA模型的发展历程:

  1. LLaMA 1系列:2023年2月,Meta发布了LLaMA 1,这是一系列基于Transformer架构的模型,包括7B、13B、30B和65B四个参数量版本。这些模型在超过1T token的语料上进行了预训练,并且在多个基准测试中表现出色,超越了当时具有175B参数的GPT-3模型。LLaMA 1的开源策略使其迅速成为开源社区中受欢迎的大模型之一,促进了基于LLaMA的生态圈的发展。

  2. LLaMA 2系列:2023年7月,Meta发布了LLaMA 2,包括7B、13B、34B和70B四个参数量版本。与LLaMA 1相比,LLaMA 2将预训练的语料扩充到了2T token,并将模型的上下文长度从2048翻倍到了4096。此外,LLaMA 2引入了分组查询注意力机制(Grouped Query Attention, GQA)等技术,进一步提升了模型性能。

  3. LLaMA 3系列:2024年4月,Meta发布了LLaMA 3,包括8B和70B两个参数量版本,并且透露了400B参数量的版本正在训练中。LLaMA 3在技术上实现了全面升级,支持更长的上下文长度,采用了更高效的tokenizer,并且在推理、代码生成和指令跟随等方面展现出卓越的性能。

LLaMA模型的开源策略不仅推动了AI技术的普及和创新,也为广大开发者提供了宝贵的研究资源,加速了AI技术的商业化进程,并促进了多模态、多语言技术的发展。随着技术的不断进步和应用场景的不断拓展,LLaMA模型预计将在更多领域发挥重要作用,为人类社会带来更加智能、便捷的生活体验。

Part2:LLama3的主要特点

LLaMA 3模型作为Meta公司在人工智能领域的最新贡献,具有以下几个主要特点:

  1. 更大的词汇表和上下文支持:LLaMA 3模型采用了128,256个标记的分词器,相比之前的32,000个标记有显著提升,这使得模型能够更有效地编码文本,无论是输入还是输出,都可能带来更强的多语言处理能力和整体性能提升。此外,模型支持的上下文长度也得到了增加,能够处理更长的序列,这对于理解和生成文本尤为重要。

  2. 分组查询注意力(Grouped-Query Attention, GQA):LLaMA 3模型采用了分组查询注意力技术,这是一种优化的自注意力机制,可以提高模型处理长距离依赖关系的能力,同时提高推理效率。这对于处理长文本和复杂语言结构非常有帮助。

  3. 大规模预训练数据:LLaMA 3使用了超过15万亿个Token的庞大数据集进行训练,这是之前模型的数倍。这些数据涵盖了广泛的主题和语言,使得模型在多种任务和领域上都表现出色。

  4. 多语言能力:LLaMA 3的预训练数据集融入了超过5%的非英语内容,覆盖了超过30种不同的语言,这使得LLaMA 3具备更强的多语言处理能力,能够更好地服务于全球用户。

这些特点使得LLaMA 3在大型语言模型领域中具有显著的地位,并且由于其开源特性,它有望推动AI技术的普及和创新。LLaMA 3模型的发布,不仅在技术上实现了多项创新,更在多个应用场景中展现出强大的性能,预示着开源大模型时代的来临。

Part3:LLama3的网络结构

LLaMA 3模型的网络结构遵循了Transformer架构的设计,这是当前大型语言模型(LLMs)中常用的架构。以下是LLaMA 3模型网络结构的一些关键特点:

  1. 解码器架构

    • Transformer模型通常由编码器(Encoder)和解码器(Decoder)组成。在LLaMA 3中,使用的是纯解码器架构,这意味着模型专注于生成响应或翻译,而不是同时进行编码和解码。
    • 解码器架构特别适合于文本生成任务,因为它能够基于之前的输出继续生成文本,这对于聊天机器人、文本摘要、机器翻译等应用至关重要。
  2. 自注意力机制

    • 自注意力机制是Transformer的核心,它允许模型在处理每个词元时考虑到整个输入序列,从而捕捉长距离依赖关系。
    • 自注意力层通过计算词元之间的注意力权重来工作,这些权重表明在生成响应时应该给予每个词元多少关注。
  3. 多头注意力

    • 多头注意力机制是自注意力的一个扩展,它将自注意力过程复制多次,每个“头”学习输入数据的不同表示。
    • 这增加了模型的容量,使其能够同时学习多种特征和模式,提高了对复杂语言结构的处理能力。
  4. 前馈网络

    • 前馈网络是Transformer中的另一个关键组件,它对自注意力层的输出进行处理,引入非线性变换。
    • 这些网络通常是逐位置的,意味着它们独立地对序列中的每个位置应用相同的操作,这有助于模型学习更复杂的特征。
  5. 残差连接和层归一化

    • 残差连接允许模型在每个子层(自注意力和前馈网络)的输出中添加输入,这有助于信息在深层网络中的流动,减轻梯度消失的问题。
    • 层归一化是在每个子层之后应用的,它对每个样本的特征进行归一化,有助于稳定训练过程并加快收敛速度。
  6. 分组查询注意力(Grouped-Query Attention, GQA)

    • GQA是一种优化技术,它通过将查询(Query)分组来减少自注意力计算的复杂性,从而提高模型的效率。
    • 这种方法在处理长序列时特别有用,因为它可以减少计算量和内存需求,同时保持模型性能。
  7. 位置编码

    • 位置编码是Transformer模型中的一个关键概念,因为模型本身无法直接理解序列中词元的顺序。
    • 位置编码向模型提供关于词元在序列中位置的信息,通常通过添加一组正弦和余弦函数来实现,这些函数的频率随位置变化。

这些特点共同构成了LLaMA 3模型的网络结构,使其能够有效地处理和生成自然语言。每个组件都经过精心设计,以确保模型在各种NLP任务中都能表现出色。

RMSNorm

RMSNorm(Root Mean Square Normalization)是一种归一化技术,是 Layer Normalization 的一个变体,它在训练深度神经网络时有助于稳定梯度并加速收敛。以下是 RMSNorm 的一些关键特点和工作原理:

  1. 归一化过程

    • RMSNorm 对每个特征维度的输入进行归一化,使得它们的均值接近于0,标准差接近于1。这是通过计算输入的均值和根均方(RMS,即标准差的平方根)来实现的。
  2. 计算方式

    • 对于给定的输入张量 X,RMSNorm 首先计算每个特征维度的均值 μ 和根均方 σ(标准差 μ​)。
    • 然后,每个特征值会被归一化,其中 x 是输入张量中的元素。

                                     \mu = \frac{1}{H} \sum_{i=1}^{H} x_i

                                 \sigma = \sqrt{\frac{1}{H} \sum_{i=1}^{H} (x_i - \mu)^2}

                             \text{normalized\_x} = \frac{x - \mu}{\sigma}

  • 可学习参数

    • RMSNorm 通常包含两个可学习参数 γγ 和 ββ,这些参数在训练过程中与归一化的输出相乘和相加,以允许模型学习最佳的缩放和偏移量。
    • 最终的归一化输出为:

                                \text{output} = \gamma \cdot \text{normalized\_x} + \beta

  • 与Layer Normalization的比较

    • Layer Normalization 计算每个样本的均值和方差,并对每个样本的特征进行归一化。这有助于减少内部协变量偏移,但在处理长序列时可能不太有效。
    • RMSNorm 计算每个特征维度的均值和根均方,而不是每个样本的,这使得它在处理长序列时更加有效,因为它考虑了整个批次的信息。

代码实现

class RMSNorm(nn.Module):
    def __init__(self, dim, eps=1e-8):
        super(RMSNorm, self).__init__()
        self.dim = dim
        self.eps = eps
        self.scale = nn.Parameter(torch.ones(dim))

    def forward(self, x):
        mean = x.mean(dim=-1, keepdim=True)
        rms = torch.sqrt(x.var(dim=-1, keepdim=True, unbiased=False) + self.eps)
        x_norm = x / rms
        return self.scale * x_norm

GQA

分组查询注意力(Grouped Query Attention),是一种优化的自注意力机制,旨在提高大型语言模型的效率和性能。这种方法通过将查询(queries)分组来减少计算复杂度,同时保持或甚至提高模型的性能。GQA在处理长序列时尤其有用,因为它可以减少自注意力操作中的冗余计算。

在标准的自注意力机制中,每个输入元素都会生成一个查询、键(keys)和值(values),然后计算所有查询与所有键的点积,以确定每个元素应该关注序列中的哪些部分。这种方法在处理长序列时计算量很大,因为它需要对序列中的每个元素进行全对全的比较。

GQA通过以下步骤来优化这一过程:

  1. 分组查询:将查询(queries)分成多个组,每组只与对应的键(keys)和值(values)进行交互。这样可以减少需要计算的点积的数量。

  2. 点积和注意力权重:在每个组内计算点积和注意力权重,然后应用softmax函数来获得归一化的注意力权重。

  3. 加权和:使用注意力权重对每个组内的值(values)进行加权和,得到最终的输出。

  4. 残差连接和层归一化:与标准的Transformer层一样,GQA的输出通常会与输入进行相加(残差连接),然后进行层归一化(Layer Normalization)。

GQA的关键优势在于它能够在不牺牲太多准确性的情况下减少计算量,这对于在资源受限的环境中部署大型模型尤为重要。

class GQALayer(nn.Module):
    def __init__(self, dim, num_heads, group_size):
        super(GQALayer, self).__init__()
        self.num_heads = num_heads
        self.group_size = group_size
        self.head_dim = dim // num_heads
        self.scale = self.head_dim ** -0.5

        self.to_qkv = nn.Linear(dim, dim * 3, bias=False)

        self.to_out = nn.Linear(dim, dim)

    def forward(self, x):
        batch_size, seq_length, dim = x.shape

        groups = x.view(batch_size, seq_length // self.group_size, self.group_size, dim)

        qkv = self.to_qkv(groups)
        q, k, v = qkv.chunk(3, dim=-1)

        q = q * self.scale

        attn_weights = torch.matmul(q, k.transpose(-2, -1))
        attn_weights = F.softmax(attn_weights, dim=-1)

        out = torch.matmul(attn_weights, v)
        out = out.transpose(1, 2).reshape(batch_size, -1, dim)

        out = self.to_out(out)

        return out

RoPE

旋转编码(Rotary Positional Embedding,简称RoPE)是一种用于Transformer模型中的位置编码技术。它旨在改进模型对序列中单词位置信息的处理,特别是在处理长序列时。RoPE的核心思想是通过将位置信息编码为旋转矩阵,然后将这些矩阵与词嵌入相乘,从而使模型能够更有效地利用位置信息。

RoPE的关键特点包括:

  1. 旋转矩阵:对于序列中的每个位置,RoPE使用两个旋转矩阵(一个用于每个维度的偶数和奇数位置)来编码位置信息。这些矩阵是基于正弦和余弦函数构建的,它们能够保持相对位置信息,即使在序列很长时也是如此。

  2. 与词嵌入的结合:RoPE通过将旋转矩阵与词嵌入相乘来整合位置信息,这允许模型在处理每个词时同时考虑其位置和内容。

  3. 相对位置编码:RoPE能够捕捉序列中单词之间的相对位置关系,这对于理解文本中的句法和语义结构非常重要。

RoPE的数学表达式如下:

对于序列中的每个位置 p,我们定义两个旋转矩阵 R_{p, 2i}和 ​R_{p, 2i+1},其中 i 是维度索引。这些矩阵的元素定义为:

                                 R_{p, 2i} = \begin{bmatrix} \cos(\omega_p) & -\sin(\omega_p) \\ \sin(\omega_p) & \cos(\omega_p) \end{bmatrix}

                ​​​​​​​        ​​​​​​​        R_{p, 2i+1} = \begin{bmatrix} \cos(\omega_{p+1}) & -\sin(\omega_{p+1}) \\ \sin(\omega_{p+1}) & \cos(\omega_{p+1}) \end{bmatrix}

其中 \omega_p​ 是位置 p 的角度,通常由位置索引和缩放因子决定。

然后,对于每个词嵌入 e_t 在位置 t,我们应用RoPE:

                                \mathbf{e}'_{t, 2i} = \mathbf{e}_{t, 2i} \cdot R_{t, 2i}

        ​​​​​​​                        \mathbf{e}'_{t, 2i+1} = \mathbf{e}_{t, 2i+1} \cdot R_{t, 2i+1}

这里 e_t'是应用RoPE后的位置编码词嵌入,e_{t,2i} 和 e_{t, 2i+1} 是词嵌入 etet​ 中的相邻维度对。

RoPE的实现通常涉及为序列中的每个位置定义一对旋转矩阵,这些矩阵基于正弦和余弦函数构建,并且与位置索引相关联。这些矩阵然后与词嵌入的相应维度相乘,以注入位置信息。RoPE的设计允许模型在计算自注意力时考虑到单词的相对位置,这对于理解文本中的句法和语义结构至关重要。

class RotaryPositionalEmbedding(torch.nn.Module):
    def __init__(self, dim, max_seq_len=512):
        super(RotaryPositionalEmbedding, self).__init__()
        self.dim = dim
        self.max_seq_len = max_seq_len
        self.inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2).float() / dim))

    def forward(self, x):
        seq_len, batch_size, _ = x.shape
        positions = torch.arange(0, seq_len).unsqueeze(1).unsqueeze(2).to(x.device)
        freqs = torch.einsum("i,j->ij", positions, self.inv_freq)
        cos_terms = torch.cos(freqs)
        sin_terms = torch.sin(freqs)
        x1 = x[..., ::2] * cos_terms + x[..., 1::2] * sin_terms
        x2 = -x[..., ::2] * sin_terms + x[..., 1::2] * cos_terms
        x_new = torch.stack((x1, x2), dim=-1).reshape(seq_len, batch_size, self.dim)
        return x_new

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新的突破,如何让AI与人类对话变得“顺滑”:Moshi背后的黑科技

你有没有想过,当我们跟智能音箱、客服机器人或者语音助手对话时,它们是怎么“听懂”我们说的话,又是怎么迅速给出回应的?就好像你对着Siri、Alexa说一句:“给我订个披萨”,它立刻明白你想要干嘛,然后帮你下单。背后的技术其实比我们想象的要复杂得多,但现在,有了Moshi…

Qt_布局管理器

目录 1、QVBoxLayout垂直布局 1.1 QVBoxLayout的使用 1.2 多个布局管理器 2、QHBoxLayout水平布局 2.1 QHBoxLayout的使用 2.2 嵌套的Layout 3、QGridLayout网格布局 3.1 QGridLayout的使用 3.2 设置控件大小比例 4、QFormLayout 4.1 QFormLayout的使用 5、…

【2024】前端学习笔记8-内外边距-边框-背景

学习笔记 外边距:Margin内边距:Padding边框:Border背景:Background 外边距:Margin 用于控制元素周围的空间,它在元素边框之外创建空白区域,可用于调整元素与相邻元素(包括父元素和兄…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月19日新模型预测第92弹

经过90多期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,90多期一共只错了10次,这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0…

教育政策与智能技术:构建新时代教师队伍

据最新统计,我国目前拥有各级各类教师共计1891.8万人,这一庞大的教师群体不仅支撑起了全球规模最大的教育体系,更成为了推动教育创新与变革的主力军。面对教育数字化的不断发展,育人内容、目标要求、方式方法的全面升级&#xff0…

【测向定位】差频MUSIC算法DOA估计【附MATLAB代码】

​微信公众号:EW Frontier QQ交流群:554073254 摘要 利用多频处理方法,在不产生空间混叠的情况下,估计出高频区域平面波的波达方向。该方法利用了差频(DF),即两个高频之间的差。这使得能够在可…

鹏鼎控股社招校招入职SHL综合能力测评:高分攻略及真题题库解析答疑

鹏鼎控股(深圳)股份有限公司,成立于1999年4月29日,是一家专注于印制电路板(PCB)的设计、研发、制造与销售的高新技术企业。公司总部位于中国广东省深圳市,并在全球多个地区设有生产基地和服务中…

【软考】数据字典(DD)

目录 1. 说明2. 数据字典的内容2.1 说明2.2 数据流条目2.3 数据存储条目2.4 数据项条目2.5 基本加工条目 3. 数据词典管理4. 加工逻辑的描述4.1 说明4.2 结构化语言4.3 判定表4.3 判定树 5. 例题5.1 例题1 1. 说明 1.数据流图描述了系统的分解,但没有对图中各成分进…

软件自动定时启动器-添加可执行文件软件,设置启动的时间,也可以设置关闭的时间-供大家学习研究参考

点击添加软件,可以添加可执行文件软件,设置启动的时间,也可以设置关闭的时间 注意,时间为00:00:00 等于没设置,这个时间不在设置范围,其他任何时间都可以。 下载地址: h…

【C++ Primer Plus习题】16.9

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <ctime> #include <v…

驱动---动态模块编译

动态模块编译 ctags 用法 创建文件 ------- ctags -R 一定要在顶层目录下 1&#xff0e; ctags –R * 2. vi –t tag (请把tag替换为您欲查找的变量或函数名) 3&#xff0e; Ctrl ] (跳转到要找的目标) 4&#xff0e; Ctrl T (回跳) 5&#xff0e; set tag/p…

解决使用nvm管理node版本时提示npm下载失败的问题

目录 一、引言 二、解决步骤 1. 访问该网站下载对应版本的npm Release v6.14.18 npm/cli GitHubthe package manager for JavaScript. Contribute to npm/cli development by creating an account on GitHub.https://github.com/npm/cli/releases/tag/v6.14.18 2. 解压到n…

mac使用技巧

mac使用技巧 快捷键 Command-X&#xff1a;剪切所选项并拷贝到剪贴板。Command-C&#xff1a;将所选项拷贝到剪贴板。这同样适用于“访达”中的文件。Command-V&#xff1a;将剪贴板的内容粘贴到当前文稿或应用中。这同样适用于“访达”中的文件。Command-Z&#xff1a;撤销上…

高级算法设计与分析 学习笔记6 B树

B树定义 一个块里面存了1000个数和1001个指针&#xff0c;指针指向的那个块里面的数据大小介于指针旁边的两个数之间 标准定义&#xff1a; B树上的操作 查找B树 创建B树 分割节点 都是选择正中间的那个&#xff0c;以免一直分裂。 插入数字 在插入的路上就会检查节点需不需要…

Ansible——Playbook基本功能???

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1&#xff09;“play”2&#xff09;“task”3&#xff09;“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法&#xff1a;---以及多个---&#xff1f;&#xff1f;使用 include 指令 1. 基本结构2. 数…

搜维尔科技:Haption力反馈遥操作解决方案

硬件设备 多种力反馈设备型号&#xff1a; 1.Haption Virtuose 6D&#xff1a;能在 6 个自由度&#xff08;x、y、z 轴 3 个平移和 3 个旋转&#xff09;上提供精确的力反馈&#xff0c;工作空间相当于一条人体手臂的活动范围&#xff0c;最大力度和旋转扭矩分别高达 35N 和 …

干货:分享6款ai论文写作助手,一键生成原创论文(步骤+工具)

写一篇论文是一个复杂的过程&#xff0c;涉及多个步骤&#xff0c;包括选题、研究、撰写、编辑和校对。AI可以在其中的一些步骤中提供帮助&#xff0c;但最终的论文还是需要人类作者的深入思考和创造性输入。以下是六款值得推荐的AI论文写作助手&#xff0c;其中特别推荐千笔-A…

秃姐学AI系列之:目标检测(物体检测) + 边缘框代码实现 | 锚框 + 代码实现

目录 目标检测 边缘框 目标检测数据集 总结 代码实现 定义在两种表示之间进行转换的函数 定义图像中狗和猫的边界框 将边框在图中画出 锚框 Anchor Box IoU——交并比 赋予锚框标号 使用非极大值抑制&#xff08;NMS&#xff09;输出 总结 代码实现 锚框 IoU——交…

高并发内存池(三):CentralCache与PageCache的实现

目录 CentralCache的实现 主体框架 ​Span 页与页号 WIN32、_WIN32、_W64的区别 条件编译 SpanList 为ThreadCache分配内存结点 补充内容1 补充内容2 具体实现 从PageCache申请非空span 补充内容 具体实现 PageCache的实现 主体框架 关于整体加锁的解释 桶锁…

linux第三课(linux中安装nginx与redis及SpringBoot集成redis)

目录 一.nginx引入 二.关于nginx 1.什么是nginx 2.nginx的特点 3.在nginx中安装nginx 三.关于redis 1.背景引入 2.什么是redis 3.redis的特点 4.在linux下的docker中安装redis 四.redis中的数据结构 (1)String(字符串) (2)Hash (3)list(列表) (5)zset(sorted se…