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模型的发展历程:
-
LLaMA 1系列:2023年2月,Meta发布了LLaMA 1,这是一系列基于Transformer架构的模型,包括7B、13B、30B和65B四个参数量版本。这些模型在超过1T token的语料上进行了预训练,并且在多个基准测试中表现出色,超越了当时具有175B参数的GPT-3模型。LLaMA 1的开源策略使其迅速成为开源社区中受欢迎的大模型之一,促进了基于LLaMA的生态圈的发展。
-
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)等技术,进一步提升了模型性能。
-
LLaMA 3系列:2024年4月,Meta发布了LLaMA 3,包括8B和70B两个参数量版本,并且透露了400B参数量的版本正在训练中。LLaMA 3在技术上实现了全面升级,支持更长的上下文长度,采用了更高效的tokenizer,并且在推理、代码生成和指令跟随等方面展现出卓越的性能。
LLaMA模型的开源策略不仅推动了AI技术的普及和创新,也为广大开发者提供了宝贵的研究资源,加速了AI技术的商业化进程,并促进了多模态、多语言技术的发展。随着技术的不断进步和应用场景的不断拓展,LLaMA模型预计将在更多领域发挥重要作用,为人类社会带来更加智能、便捷的生活体验。
Part2:LLama3的主要特点
LLaMA 3模型作为Meta公司在人工智能领域的最新贡献,具有以下几个主要特点:
-
更大的词汇表和上下文支持:LLaMA 3模型采用了128,256个标记的分词器,相比之前的32,000个标记有显著提升,这使得模型能够更有效地编码文本,无论是输入还是输出,都可能带来更强的多语言处理能力和整体性能提升。此外,模型支持的上下文长度也得到了增加,能够处理更长的序列,这对于理解和生成文本尤为重要。
-
分组查询注意力(Grouped-Query Attention, GQA):LLaMA 3模型采用了分组查询注意力技术,这是一种优化的自注意力机制,可以提高模型处理长距离依赖关系的能力,同时提高推理效率。这对于处理长文本和复杂语言结构非常有帮助。
-
大规模预训练数据:LLaMA 3使用了超过15万亿个Token的庞大数据集进行训练,这是之前模型的数倍。这些数据涵盖了广泛的主题和语言,使得模型在多种任务和领域上都表现出色。
-
多语言能力:LLaMA 3的预训练数据集融入了超过5%的非英语内容,覆盖了超过30种不同的语言,这使得LLaMA 3具备更强的多语言处理能力,能够更好地服务于全球用户。
这些特点使得LLaMA 3在大型语言模型领域中具有显著的地位,并且由于其开源特性,它有望推动AI技术的普及和创新。LLaMA 3模型的发布,不仅在技术上实现了多项创新,更在多个应用场景中展现出强大的性能,预示着开源大模型时代的来临。
Part3:LLama3的网络结构
LLaMA 3模型的网络结构遵循了Transformer架构的设计,这是当前大型语言模型(LLMs)中常用的架构。以下是LLaMA 3模型网络结构的一些关键特点:
-
解码器架构:
- Transformer模型通常由编码器(Encoder)和解码器(Decoder)组成。在LLaMA 3中,使用的是纯解码器架构,这意味着模型专注于生成响应或翻译,而不是同时进行编码和解码。
- 解码器架构特别适合于文本生成任务,因为它能够基于之前的输出继续生成文本,这对于聊天机器人、文本摘要、机器翻译等应用至关重要。
-
自注意力机制:
- 自注意力机制是Transformer的核心,它允许模型在处理每个词元时考虑到整个输入序列,从而捕捉长距离依赖关系。
- 自注意力层通过计算词元之间的注意力权重来工作,这些权重表明在生成响应时应该给予每个词元多少关注。
-
多头注意力:
- 多头注意力机制是自注意力的一个扩展,它将自注意力过程复制多次,每个“头”学习输入数据的不同表示。
- 这增加了模型的容量,使其能够同时学习多种特征和模式,提高了对复杂语言结构的处理能力。
-
前馈网络:
- 前馈网络是Transformer中的另一个关键组件,它对自注意力层的输出进行处理,引入非线性变换。
- 这些网络通常是逐位置的,意味着它们独立地对序列中的每个位置应用相同的操作,这有助于模型学习更复杂的特征。
-
残差连接和层归一化:
- 残差连接允许模型在每个子层(自注意力和前馈网络)的输出中添加输入,这有助于信息在深层网络中的流动,减轻梯度消失的问题。
- 层归一化是在每个子层之后应用的,它对每个样本的特征进行归一化,有助于稳定训练过程并加快收敛速度。
-
分组查询注意力(Grouped-Query Attention, GQA):
- GQA是一种优化技术,它通过将查询(Query)分组来减少自注意力计算的复杂性,从而提高模型的效率。
- 这种方法在处理长序列时特别有用,因为它可以减少计算量和内存需求,同时保持模型性能。
-
位置编码:
- 位置编码是Transformer模型中的一个关键概念,因为模型本身无法直接理解序列中词元的顺序。
- 位置编码向模型提供关于词元在序列中位置的信息,通常通过添加一组正弦和余弦函数来实现,这些函数的频率随位置变化。
这些特点共同构成了LLaMA 3模型的网络结构,使其能够有效地处理和生成自然语言。每个组件都经过精心设计,以确保模型在各种NLP任务中都能表现出色。
RMSNorm
RMSNorm(Root Mean Square Normalization)是一种归一化技术,是 Layer Normalization 的一个变体,它在训练深度神经网络时有助于稳定梯度并加速收敛。以下是 RMSNorm 的一些关键特点和工作原理:
-
归一化过程:
- RMSNorm 对每个特征维度的输入进行归一化,使得它们的均值接近于0,标准差接近于1。这是通过计算输入的均值和根均方(RMS,即标准差的平方根)来实现的。
-
计算方式:
- 对于给定的输入张量 X,RMSNorm 首先计算每个特征维度的均值 μ 和根均方 σ(标准差 μ)。
- 然后,每个特征值会被归一化,其中 x 是输入张量中的元素。
-
可学习参数:
- RMSNorm 通常包含两个可学习参数 γγ 和 ββ,这些参数在训练过程中与归一化的输出相乘和相加,以允许模型学习最佳的缩放和偏移量。
- 最终的归一化输出为:
-
与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通过以下步骤来优化这一过程:
-
分组查询:将查询(queries)分成多个组,每组只与对应的键(keys)和值(values)进行交互。这样可以减少需要计算的点积的数量。
-
点积和注意力权重:在每个组内计算点积和注意力权重,然后应用softmax函数来获得归一化的注意力权重。
-
加权和:使用注意力权重对每个组内的值(values)进行加权和,得到最终的输出。
-
残差连接和层归一化:与标准的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的关键特点包括:
-
旋转矩阵:对于序列中的每个位置,RoPE使用两个旋转矩阵(一个用于每个维度的偶数和奇数位置)来编码位置信息。这些矩阵是基于正弦和余弦函数构建的,它们能够保持相对位置信息,即使在序列很长时也是如此。
-
与词嵌入的结合:RoPE通过将旋转矩阵与词嵌入相乘来整合位置信息,这允许模型在处理每个词时同时考虑其位置和内容。
-
相对位置编码:RoPE能够捕捉序列中单词之间的相对位置关系,这对于理解文本中的句法和语义结构非常重要。
RoPE的数学表达式如下:
对于序列中的每个位置 p,我们定义两个旋转矩阵 和
,其中 i 是维度索引。这些矩阵的元素定义为:
其中 是位置 p 的角度,通常由位置索引和缩放因子决定。
然后,对于每个词嵌入 在位置 t,我们应用RoPE:
这里 是应用RoPE后的位置编码词嵌入,
和
是词嵌入 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
相关文章:
Datawhile 组队学习Tiny-universe Task01
Task01:LLama3模型讲解 仓库链接:GitHub - datawhalechina/tiny-universe: 《大模型白盒子构建指南》:一个全手搓的Tiny-Universe 参考博客:LLaMA的解读与其微调(含LLaMA 2):Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子…...
MCU与SOC的区别
自动驾驶中 MCU 与 SoC 的区别 在自动驾驶系统中,**MCU(微控制单元,Microcontroller Unit)和SoC(系统级芯片,System on Chip)**都是关键的电子元件,但它们在性能、功能和应用领域等…...
51单片机-DS18B20(温度传感器)AT24C02(存储芯片) IIC通信-实验2-温度实时监测(可设置阈值)
作者:王开心 座右铭:刻苦专研,百折不挠,千磨万击还坚韧,任尔东西南北风!干就完了!(可交流技术) 主要利用DS18B20芯片去采集温度,通过采集的温度能够自动保存…...

Vue2接入高德地图API实现搜索定位和点击获取经纬度及地址功能
目录 一、申请密钥 二、安装element-ui 三、安装高德地图依赖 四、完整代码 五、运行截图 一、申请密钥 登录高德开放平台,点击我的应用,先添加新应用,然后再添加Key。 如图所示填写对应的信息,系统就会自动生成。 二、安装…...

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

高效财税自动化软件如何提升企业财务工作的效率与准确性
在当今企业运营中,财务管理发挥着核心作用。它不仅涉及企业正常运转和市场决策,还是推动企业向高质量发展迈进的关键动力。面对激烈的市场竞争与科技革新的双重挑战,财务管理亟需进行持续的转型与提升,为企业高质量发展目标的实现…...
Leetcode 3286. Find a Safe Walk Through a Grid
Leetcode 3286. Find a Safe Walk Through a Grid 1. 解题思路2. 代码实现 题目链接:3286. Find a Safe Walk Through a Grid 1. 解题思路 这一题的话思路上就是一个宽度优先遍历,我们按照health进行排序进行宽度优先遍历,看看在health被消…...

shell脚本语法
shell脚本的变量 系统变量 系统变量是操作系统用来存储配置信息的变量,它们可以控制操作系统的行为和程序的运行环境。系统变量的种类和内容取决于操作系统的类型和版本。以下是一些常见的系统变量类别和它们可能包含的内容: 环境变量:这些…...

TCP 拥塞控制:一场网络数据的交通故事
从前有条“高速公路”,我们叫它互联网,而这条公路上的车辆,则是数据包。你可以把 TCP(传输控制协议)想象成一位交通警察,负责管理这些车辆的行驶速度,以防止交通堵塞——也就是网络拥塞。 第一…...

(黑马点评) 五、探店达人系列功能实现
5.1 发布和查看探店笔记 5.1.1 发布探店笔记 这块代码黑马已经完成了,在发布探店笔记界面,有两块内容是需要上传的。一是笔记内容,二是笔记配图。其中笔记配图部分黑马使用的是上传到本地前端服务器上面的。我我觉得可以将图片文件发布在阿里…...
SQLiteDatabase insert or replace数据不生效
在Android开发中,如果您在SQLite数据库中更新了数据,但重启应用后更新的数据不再生效,那么可能的原因有: 更新操作没有正确执行,可能是由于SQL语句错误或者数据库没有正确打开。 更新操作在事务中没有被正确提交。 更…...
基于Python实现一个浪漫烟花秀
为了实现一个类似烟花秀的效果,我们可以通过复杂的粒子系统来模拟烟花的升起、绽放和下落效果。以下是一个示例,旨在创建更为动态和逼真的烟花秀效果。 示例代码 这个代码示例将使用 matplotlib 和 numpy,并实现更丰富的视觉效果࿱…...

电气自动化入门03:安全用电
视频链接:2.1 电工知识:触电原因与防触电措施_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW/?p4&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电流对人体的危害 电击:电流通过人体。 电伤:电流热效应…...

【深度学习】(2)--PyTorch框架认识
文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader(数据加载器)4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…...

前端面试记录
js 1. 函数式编程 将计算过程视为一系列的函数调用,函数的输出完全由输入决定,不依赖于或改变程序的状态,使得函数式编程的代码更加可预测和易于理解。 函数式编程的三个核心概念:纯函数、高阶函数和柯里化。 高阶函数:函数可以作为参数传…...

裁员了,很严重,大家做好准备吧!
最近刷到这样一个故事: 一个网友在大厂当牛马接近10年,部门优秀员工,业绩一直很稳,没想到,今年公司引进AI降本增效,开始大幅裁员,有些部门一夜之间被连锅端! 上个月果然轮到他了&a…...
uniapp组件uni-datetime-picker选择年月后在ios上日期不显示
uniapp组件uni-datetime-picker选择年月后在ios上日期不显示 操作步骤: ios 选择年月 预期结果: 日期变为选择年月的日期 实际结果: 日期不显示 bug描述: uni-datetime-picker 2.2.22 ios点击年月选择后日期不显示 解决方案 …...
01_快速入门
读取数据 import pandas as pd# df pd.read_excel(https://xxxx/xxx//xx.xslx) # 读取网络数据 # df pd.read_excel(rd:\data\xx.xslx) # 读取本地文件 # 如果是csv文件,用read_csv()函数 df pd.read_csv(seaborn/iris.csv)查看数据 df.head() # 前5条记录 d…...

数据结构之分文件编译学生管理
list.h #ifndef LIST_H_ #define LIST_H_ #define MAX 30 typedef struct {int id;//学号char name[20];//姓名char major[20];//专业int age;//年龄 }student,*Pstudent;typedef struct {student data[MAX];//储存学生信息的数组int len;//统计学生个数 }list,*Plist;Plist c…...

TypeScript入门 (二)控制语句
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文主要讲解TypeScript中控制语句的部分;希望通过我的知识点总结,能够帮助你更好地…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...