Datawhile 组队学习Tiny-universe Task01

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 = dimself.eps = epsself.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 / rmsreturn 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_headsself.group_size = group_sizeself.head_dim = dim // num_headsself.scale = self.head_dim ** -0.5self.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.shapegroups = 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.scaleattn_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 = dimself.max_seq_len = max_seq_lenself.inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2).float() / dim))def forward(self, x):seq_len, batch_size, _ = x.shapepositions = 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_termsx2 = -x[..., ::2] * sin_terms + x[..., 1::2] * cos_termsx_new = torch.stack((x1, x2), dim=-1).reshape(seq_len, batch_size, self.dim)return x_new

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

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

相关文章

前端框架对比和选择

​ 大家好,我是程序员小羊! 前言: 前端框架选择是前端开发中的关键决策,因为它影响项目的开发效率、维护成本和可扩展性。当前,最流行的前端框架主要包括 React、Vue 和 Angular。它们各有优劣,适用于不同…

msvcp140.dll丢失如何解决?msvcp140.dll丢失的多种解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行,给用户带来很大的困扰。那么,当我们遇到msvcp140.dll丢失的情况时,应该如何解决呢&a…

【HTTP】HTTP报文格式和抓包

文章目录 HTTP 是什么HTTP 报文格式抓包工具抓包工具的原理抓包结果请求响应 IP,数据链路层,DNS… 都是理论为主,TCP/UDP 虽然有一些时间,但课堂内容不多 HTTP 理论和实践同样重要,未来作为 web 开发程序猿&#xff0…

机房监控运维工作的全面优化:以监控易一体化运维软件为助力

在当今高度信息化的社会,数据中心的运维工作显得尤为重要。为了确保机房环境的稳定、服务器和存储设备的正常运行、操作系统和数据库的持续高效,以及中间件服务的可靠性,运维团队需要执行一系列精细化的管理和操作。本文将以监控易一体化运维…

扩展------SpringBoot的自动装配机制+自定义一个Starter

SpringBoot的自动装配机制 SpringBoot提供给我们只要将框架的依赖包引入pom文件中,就可以帮助我们自动配置好,我们开箱即用,非常方便,底层原理是如何的呢? 首先自动装配依赖于EnableAutoConfiguration注解。 往下走&a…

PCIe扫盲(九)

系列文章目录 PCIe扫盲(一) PCIe扫盲(二) PCIe扫盲(三) PCIe扫盲(四) PCIe扫盲(五) PCIe扫盲(六) PCIe扫盲(七&#xff09…

测试栏杆天线和金属圆管天线的差异

今天用网分测试了大约800mm的拉杆天线和800mm的金属圆管的s11的差异。 拉杆的最粗部分10mm,最细部分6mm。圆管的直径为均匀26mm。 两者的谐振频率在60Mhz左右。(这也说明了谐振频率只要由长度决定) 拉杆天线的swr 圆管的swr 注:上图因为网…

六个神级AI绘画技巧,让你的作品瞬间高级感爆棚!

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 在艺术的世界里,AI绘画正成为一…

网络原理(4)——网络层(IP)、数据链路层

1. IP 协议 基本概念: 主机:配有 IP 地址,但是不进行路由控制的设备 路由器:即配有 IP 地址,又能进行路由控制 节点:主机和路由器的统称 IP 协议报头格式 1) 4 位版本:实际上只有两个取值&…

扣子智能体实战-快速生成公众号爆款标题的智能体

文章目录 一,创建一个智能体二,创建工作流1,开始结点增加一个theme变量2,新增一个大模型节点3,新增一个代码结点4,发布工作流5, 工作流概览 三,增加开场白 如果是做公众号&#xff0…

Linux线程基础

🌎 Linux线程 文章目录: Linux线程 线程概念       线程的理解 再谈地址空间 线程控制       线程等待       线程资源共享       线程退出       线程异常       线程分离       理解线程tid 线程切换 线程…

重修设计模式-设计原则

重修设计模式-设计原则 设计原则 设计原则是软件编码时所遵循的规则,旨在帮助开发者创建出既满足功能需求又易于维护、可扩展且美观的设计,理解设计原则可以提升代码质量、减少错误以及促进团队协作,但对设计原则的理解要灵活,不…

佩戴舒适且适合学生党的蓝牙耳机?分享开放式耳机排行榜前十名

对于追求佩戴舒适的学生党来说,高性价比的开放式耳机是一个不错的选择。因为这类耳机不仅提供了良好的通风性,还减少了长时间佩戴带来的闷热感。而且开放式耳机也通常具有轻巧的设计,能够减轻了耳朵的压力。而且,还需要考虑到学生…

CO82-工單號碼段配置

可以通過CO82查看工單號碼段。 配置工單號碼段: 1、首先配置一個號碼段。 2、將工單類型分配給號碼段。 此時工單類型ZP01號碼段即為41W000000-41W999999 3、可以點擊概覽按鈕,查看概覽。 可以看到不同號碼段下的所有工單類型。 *然後在前台就可以對Z…

怎么测开关电源效率?电源效率标准是多少?

在追求电子产品高性能与低功耗的今天,开关电源的效率成为了衡量其性能的一项重要指标。提高开关电源的效率,对于保障电子设备的稳定性和延长使用寿命具有重要意义。今天将为大家介绍开关电源效率的测试方法以及在不同负载条件下电源的效率标准。 一、开关…

「Netmarble 小镇」活动来了:踏上穿越标志性世界的旅程!

欢迎来到 Netmarble 小镇!本次活动从 9 月 13 日持续到 10 月 11 日,是你们体验 Netmarble 著名游戏世界最精彩内容的入口。在为期一个月的庆祝活动中,你们将体验到独家内容、惊险刺激的挑战和全新人物化身的发布! 探索 Netmarble…

高校宿舍电费管理怎么实现

1引言 在大学的象牙塔里,宿舍不仅是学子们休憩的港湾,更是青春记忆的重要载体。然而,随着科技的发展与生活习惯的改变,宿舍内的电器设备日益增多,电费管理成为了一个不可忽视的问题。本文将从高校宿舍电费管理的现状出…

【AI小项目6】QLoRA针对资源受限设备上的大模型微调和文本分类任务的推理

目录 一、项目简介概述时间主要工作和收获技术栈数据集结果参考 二、训练阶段的完整代码什么是 QLoRA 微调?注意 安装库导入包配置定义一个Config类配置训练参数配置Lora 初始化分词器和模型数据预处理计算模型评估指标交叉验证划分数据集举例: 创建Trai…

mycat双主高可用架构部署-ER表

MySQL5.7服务器IP是192.168.31.209及192.168.31.210 vi /usr/local/mycat/conf/schema.xml <?xml version"1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat"http://io.mycat/"><schema n…

Java通信协议—TCP协议上传文件(完整详解,附有案例+代码)

TCP协议上传文件 文章目录 TCP协议上传文件1.需求2.代码实现 1.需求 客户端&#xff1a;将本地文件上传到服务器。接收服务器的反馈。 服务器&#xff1a;接收客户端上传的文件&#xff0c;上传完毕之后给出反馈。 2.代码实现 public class Server {public static void main(…