Llama网络结构介绍

news2024/11/24 10:55:30

LLaMA现在已经是开源社区里炙手可热的模型了,但是原文中仅仅介绍了其和标准Transformer的差别,并没有一个全局的模型介绍。因此打算写篇文章,争取让读者不参考任何其他资料把LLaMA的模型搞懂。

结构

如图所示为LLaMA的示意图,由Attention和MLP层堆叠而成
在这里插入图片描述
LLaMA模型主要由Attention和MLP层堆叠而成,具有以下特点:
1、前置的RMSNorm:RMSNorm是一种归一化技术,用于稳定模型的训练过程,提高模型的收敛速度。
2、Q、K上的RoPE旋转式位置编码:位置编码用于捕捉序列中的位置信息,RoPE旋转式位置编码能够有效地处理长序列,提高模型的性能。
3、Causal mask:该机制保证每个位置只能看到前面的tokens,确保了模型的自回归性质。
4、使用了Group Query Attention:通过使用分组查询注意力(GQA),LLaMA能够在保持性能的同时,降低模型的计算复杂度,提高推理速度。
5、MLP表达式:down(up(x) * SILU(gate(x))),其中down, up, gate都是线性层
LLaMA各个不同大小的结构设置如下表所示。其中最大的65B的LLaMA用了2048张80GB的A100,batch size为4百万,训练一次需要21天。

Group Query Attention(V2 only)

自回归模型生成回答时,需要前面生成的KV缓存起来,来加速计算。多头注意力机制(MHA)需要的缓存量很大,Multi-Query Attention指出多个头之间可以共享KV对。Group Query Attention没有像MQA一样极端,将query分组,组内共享KV,效果接近MHA,速度上与MQA可比较。p.s. 这个技术falcon已经用上了,当时falcon说自己用的是multi query attention,因为当group=1时,GQA和MQA是等价的。falcon支持设置不同的G。
在这里插入图片描述

RMSNorm

这是在BERT、GPT等模型中广泛使用的LayerNorm:
在这里插入图片描述
RMSNorm(root mean square)发现LayerNorm的中心偏移没什么用(减去均值等操作)。将其去掉之后,效果几乎不变,但是速度提升了40%。最终公式为:
在这里插入图片描述
注意除了没有减均值,加偏置以外,分母上求的RMS而不是方差。

LLaMA在 Attention Layer和MLP的输入上使用了RMSNorm,相比在输出上使用,训练会更加稳定。

SwiGLU

LLaMA没有使用ReLU,而是使用了SwiGLU,有时也被称为SiLU。公式为:
,效果类似平滑版的ReLU:
在这里插入图片描述

RoPE

LLaMA使用了Rotary Position Embedding。对于Q的第m个位置向量q,通过以下方法注入位置编码:
在这里插入图片描述

class LlamaRotaryEmbedding(torch.nn.Module):
    def __init__(self, dim, max_position_embeddings=2048, base=10000):
        super().__init__()
        theta = 1.0 / (base ** (torch.arange(0, dim, 2) / dim))
        t = torch.arange(max_position_mbeddings)
        freqs = torch.einsum("i,j->ij", t, theta)

        emb = torch.cat((freqs, freqs), dim=-1)
        self.register_buffer("cos_cached", emb.cos())
        self.register_buffer("sin_cached", emb.sin())

    def forward(self, seq_len=None):
        return self.cos_cached[:, :, :seq_len, ...], self.sin_cached[:, :, :seq_len, ...]

# 在LlamaAttention通过以下命令调用:
cos, sin = self.rotary_emb(seq_len=kv_seq_len)

以下代码将q沿着最后一个维度劈成两半,将后一半乘-1,然后连接在第一半之前,就得到了上式第三项。

# 在接下来的apply_rotary_pos_emb函数里调用

def rotate_half(x):
    x1 = x[..., : x.shape[-1] // 2]
    x2 = x[..., x.shape[-1] // 2 :]
    return torch.cat((-x2, x1), dim=-1)

最后通过以下代码得到结合了位置编码的Q,K(K和Q使用同样的方式进行位置编码)。

def apply_rotary_pos_emb(q, k, cos, sin, position_ids):
    q_embed = (q * cos[position_ids]) + (rotate_half(q) * sin[position_ids])
    k_embed = (k * cos[position_ids]) + (rotate_half(k) * sin[position_ids])
    return q_embed, k_embed

# 在LlamaAttention中通过以下命令调用:
query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)

绝对位置编码的优点是计算速度快等,缺点是拓展长度比较麻烦,且绝对位置并没有什么实际意义。而相对位置编码对学习token之间的关系很有意义,比如距离的很远的两个token之间的关联大概率很小,使用相对位置编码往往能够获得更好的效果。此外拓展长度也更容易,因为不论context size多长,只需关注最长距离以内的输入即可。相对位置编码的缺点是没有绝对位置编码计算速度快。

当我们计算Attention时,RoPE可以变成相对位置编码。
在这里插入图片描述
从上面这个公式可以看出,q和k的attention依赖相对距离m-n。因此RoPE为q、k注入的绝对位置编码,计算得到的attention,却变成了相对位置编码。妙的很,我这里为了不参考其他文章就很容易搞懂LLaMA的结构,简化了很多东西,推荐大家看一看RoPE原作者苏剑林的博客了解更多信息。

本文只关注LLaMA缺失的模型结构方面的介绍,对于文章的翻译可以参考其他的文章,
例如:靳伟,LLaMA大模型是如何炼成的,
其他参考文章:https://zhuanlan.zhihu.com/p/636784644
原文:https://arxiv.org/pdf/2302.13971.pdf。
文中参考的代码是huggingface的transformers库实现的版本,并不是Meta官方的代码。
备注说明:受笔者水平限制,如果哪里讲的不对,或者不够清晰易懂,欢迎在评论区与我交流。

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

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

相关文章

解决ax = Axes3D(fig2)pycharm画3d图空白不显示问题

明明代码运行正确,却总是显示不出来 绘制出来的也是空白 改一下代码就好了 ax Axes3D(fig2) #原来代码 ax fig2.add_axes(Axes3D(fig2)) #改后代码 修改过后就可以显示了

【Jenkins】持续集成与交付 (三):有关报错解决(Jenkins (2.387.3) or higher required)

【Jenkins】持续集成与交付 (三):有关报错解决Jenkins (2.387.3) or higher required 一、Jenkins主页报错二、安装Jenkins插件报错三、解决过程(解压替换jenkins.war)四、重新访问登录💖The Begin💖点点关注,收藏不迷路💖 一、Jenkins主页报错 New version of J…

【nodejs状态库mobx之computed规则】

The above example nicely demonstrates the benefits of a computed value, it acts as a caching point. Even though we change the amount, and this will trigger the total to recompute, it won’t trigger the autorun, as total will detect its output hasn’t been …

一分钟了解期权合约转仓交易的流程

期权合约转仓交易的流程 期权合约转仓交易是指在期权交易过程中,交易者平掉手中现有的仓位,并选择更高或更低的行权价格,进行买入或卖出开仓的交易方法。转仓交易具有多个优势,包括降低风险、锁定利润、提高资金使用效率以及增加…

关于Github默认分支main和master以及如何在git init时指定默认分支

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

内置对象部分

一,内置对象 二,math对象 不是构造函数,不需要new来调用,而是直接使用里面的属性和方法即可 1.随机方法random 返回一个随机的小数 [0,1) 2.日起格式化 返回的月份会小一,记得加一 周一返回1&#xff…

什么是储能电站的一次设备与二次设备?

随着国家政策导向和扶持,储能电站的建设,在各地均稳步推进,储能电站的设备主要分一次设备和二次设备两种,下面分别介绍这两方面内容: 储能电站一次设备 一次设备是储能电站的电路基础设施,包含变压器、主…

提升你的C编程技能:使用cURL下载Kwai视频

概述 本文将介绍如何利用C语言以及cURL库来实现Kwai视频的下载。cURL作为一个功能强大的网络传输工具,能够在C语言环境下轻松地实现数据的传输。我们还将探讨如何运用代理IP技术,提升爬虫的匿名性和效率,以适应Kwai视频平台的发展趋势。 正…

代码随想录算法训练营day40

题目:343. 整数拆分、96.不同的二叉搜索树 参考链接:代码随想录 343. 整数拆分 思路:五部曲来走。dp数组,dp[i]用于记录拆i得到的最大乘积和,我们要求的也就是dp[n];递推公式,我们想拆分i&am…

简单把玩下SpringAI

Hello大家好,今天写一些不烧脑的文章,我们来体验一下Spring的新框架Spring AI,只是简单玩玩不深入😏 Spring AI 简介 Spring AI是为了简化人工智能相关应用程序的开发Spring AI的诞生,灵感来自于LangChain等项目 Oll…

江苏开放大学2024年春《会计基础 050266》第二次任务:第二次过程性考核参考答案

电大搜题 多的用不完的题库,支持文字、图片搜题,包含国家开放大学、广东开放大学、超星等等多个平台题库,考试作业必备神器。 公众号 答案:更多答案,请关注【电大搜题】微信公众号 答案:更多答案&#…

Windows常见问题(技巧)总结

目录 问题Windows中更改快捷方式图标windows 中网速很慢,如何解决?因为Authenticated Users从其父系继承承权限,你无法删除此对象.Windows下的照片软件在哪个文件夹下?如何批量更改文件名?Windows 电脑pagefile.sys是什么文件,可以删除吗?U盘中打开文件时提示&a…

平衡小车的控制算法--结合自动控制原理学习

单纯的去看自控原理,很多概念有点抽象,最好找些应用去理解相关的概念,就找了实验室的一个平衡小车作为应用,不过主要根据小车去跑matlab去验证一些控制算法。结合台湾国立交通大学林沛群的自控线上课的总结 一、自控原理重要概念 …

Liunx下用C语言模拟实现 —— 封装文件操作接口

一、前提 本篇博客将循序渐进的模拟实现C语言中,简单版的对FILE和一些简单的文件操作接口的实现,在上一篇文件操作原理篇我们知道,实际的实现就是对系统接口的封装,为了巩固和练习之前学到的概念,我们也来简单的实现对…

经典的免费wordpress模板

这款经典的免费WordPress模板以鲜艳的红色为主调,充满了活力与热情。设计简洁而现代,适合各种类型的项目网站。模板采用响应式设计,确保在不同设备和屏幕尺寸上都能呈现出完美的视觉效果。 红色象征着激情、活力和自信,这款模板…

【Python系列】受保护属性

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Redis分布式锁手动实现

Redis分布式锁手动实现 java中锁机制 在 Java 中,锁是用来同步并发访问共享资源的机制。它确保了在一个时间点,只有一个线程可以执行某个代码块或方法,从而防止了数据的不一致和竞态条件。Java 提供了多种锁机制,包括内置锁&…

springBoot集成seata实现分布式事务

背景 日常开发离不开分布式系统,自然避免不了分布式事务问题,seata 是一款阿里开源的主流分布式事务解决方案,但实际工作引入seata感觉有点重,本人之前在商业银行做开发对数据一致性要求很高,但很少团队使用。几年前曾…

PDF加密了无法编辑?解密方法来了!

一下午都在捣鼓各种格式问题,首先是需要合并几个 PDF,然而有一个文件加密了无法操作,碰到加密不能编辑就很头痛,终于让我找到一个可行的方法了, 首先就这个加密文件右键选择打开方式-Google Chrome>>打开>>…

K8s: 公有镜像中心和私有镜像中心的搭建

公有镜像中心的搭建和使用 1 )在 官方docker镜像中心推送 在 hub.docker.com 上注册账号 (国内一般访问不了,原因不多说) 找到 Create Repository 按钮就行仓库的创建 这样就在官方创建了一个仓库,比如地址为: xx/y-y xx 是我的账户名y-y 是…