【NLP】一文带你了解LLAMA(羊驼)系列

机器学习初学者

共 9015字,需浏览 19分钟

 · 2024-04-16

作者丨曼城周杰伦    来源丨深蓝AI    编辑丨极市平台

导读

 

本文会重点介绍LLAMA系列的改进点,希望大家通过这一篇文章,能快速地了解LLAMA系列的改进工作。

前言:

自从OpenAI推出Chat GPT系列后,也标志着自然语言处理技术的一个重要里程碑--大模型LLM(Large Language Model)的爆火,虽然OpenAI也提供了上传文档并微调的功能,但是成本始终还是太高,不适合贫民窟玩家。

所以在开源社区里大模型百花齐放,而在这些开源模型里热度最高且在其基础上有着无数fine-tune的模型当属由Meta公司推出的LLAMA(Large Language Model Meta AI)系列了,作为decoder-only结构的代表作,不仅仅是基底的LLAMA系列模型,其finetune后的模型包括Alpaca、Vicuna、Koala 以及luotuo 等,都有着领域自适应性且都有着不错的性能。

本文会重点介绍LLAMA系列的改进点,希望大家通过这一篇文章,能快速地了解LLAMA系列的改进工作。©️【深蓝AI】原创

文章地址:https://arxiv.org/pdf/2302.13971.pdf

项目地址:https://github.com/meta-llama/llama

改进1:高质量数据集

如图1所示 LLaMa 预训练数据大约包含 1.4T tokens,对于绝大部分的训练数据来说,若要保证其高质量的核心思想主要有三个:

①筛选低质量数据

②数据去重

③数据多样性

下面是这1.4T数据详细的分布情况:

●English CommonCrawl【67%】:对五个CommonCrawl数据集进行预处理,时间跨度为2017年到2020年,使用CCNet流水线。该过程在行级别进行数据去重,使用fastText线性分类器进行语言识别,以删除非英语页面,并使用n-gram语言模型过滤低质量内容。此外,还训练了一个线性模型,用于将页面分类为Wikipedia中的引用页面与随机抽样页面,并丢弃未被分类为引用的页面。

●C4【15%】:C4的预处理还包括去重和语言识别步骤,其与CCNet的主要区别在于质量过滤,这主要依赖于标点符号的存在或网页中的词语和句子数量等启发式方法。

●Github【4.5%】:使用 Google BigQuery 上可用的公共 GitHub 数据集。只保留了在 Apache、BSD 和 MIT 许可下发布的项目。此外,使用基于行长度或字母、数字的字符比例的启发式方法过滤低质量文件,并使用正则表达式删除了诸如头文件之类的样板文件。最后,对生成的数据集进行了文件级别的去重,使用完全匹配的方法。

●Wikipedia【4.5%】:添加了截至2022年6月至8月的 Wikipedia 数据,涵盖20种语言。处理数据以去除超链接、评论和其他格式样板。

●Gutenberg and Books3【4.5%】:添加了两个书的数据集,分别是Gutenberg以及ThePile(训练 LLM 的常用公开数据集)中的Book3部分。处理数据时执行重复数据删除,删除内容重叠超过90%的书籍。

●ArXiv【2.5%】:处理了arXiv Latex文件,以添加科学数据到数据集中。移除了第一节之前的所有内容,以及参考文献。还移除了.tex文件中的注释,并且内联展开了用户编写的定义和宏,以增加论文之间的一致性。

●Stack Exchange【2%】:作者添加了Stack Exchange,这是一个涵盖各种领域的高质量问题和答案网站,范围从计算机科学到化学。作者从28个最大的网站保留数据,从文本中删除HTML标签并按分数对答案进行排序。

▲图1|LLaMa1预训练数据分布表©️【深蓝AI】

改进2:Pre-normalization 预归一化

我们都知道transformer结构会对每一层的输出进行归一化layer norm,而为了提高训练的稳定性,作者受到GPT3的启发,对每个transformer层的输入使用RMS Norm(Root Mean Square layer normalization)进行归一化。与常规使用的layer Norm相比,RMS Norm的主要区别在于layer Norn去掉了减去均值以及偏置

β的部分。RMS Norm的作者认为这种模式在简化了Layer Norm 的计算,可以再减少约7%∼64%的计算时间,相关公式如下:

改进3:SwiGLU 激活函数

收到PaLM启发,LLaMa使用SwiGLU激活函数替换ReLU以提高性能,维度从变成了。SwiGLU是2019年提出的新的激活函数,相比于其他激活函数,它结合了SWISH和GLU两种者的特点。从原始论文中提出如图2其性能与GEGLU坎肩,都可以取得log-perplexity的最优值,相关公式如下:

←左右滑动查看完整公式→

▲图2|不同激活函数的log-perplexity性能©️【深蓝AI】

改进4:Rotary Embeddings 旋转位编码【GPTNeo】

受到GPTNeo启发,RoPE旋转位置编码的核心思想是“通过绝对位置编码的方式实现相对位置编码”,这一构思具备了绝对位置编码的方便性,同时可以表示不同token之间的相对位置关系。如图3是RoPE旋转位置编码的机理图解,不同于原始Transformers中将pos embedding和token embedding进行相加,RoPE是将位置编码和query(或key)进行相乘得出。

具体来说,在对序列进行位置编码时和标准Transformer不同,LlaMa 的位置编码在每个Attention层中分别对Q K 进行RoPE位置编码,而不是在Transformer Block之前进行一次位置编码,也就是说每次计算Attention时都分别要对Q和K做位置编码。

▲图3|RoPE机理图解©️【深蓝AI】

小结1

LLAMA1系列是LLAMA推出的第一个系列,其一经推出就影响了整个开源界。其一共推出了4个不同参数大小的模型分别是: 7B、13B、33B & 65B,并且其证明了在大部分的任务上,LLaMA-13B强于GPT-3(175B)。LLaMA-65B的性能,可以和最好的LM相媲美,如Chinchilla-70B和PaLM-540B。其性能的亮点充分地证明了高质量数据的重要性,而不是一股脑地叠加网络深度以及参数量。

在LLaMA1之前,大厂们的主要方向还是去堆积网络深度和层数,但是LLaMA给我们灌输的核心理念: 在给定的计算预算下,最佳性能并不是由最大的模型实现的,而是由更多数据训练的较小模型实现的。重点是训练一系列语言模型,以在各种推理预算下实现最佳性能,通过使用更多token进行训练,而不是通常使用的数量。LLaMA目标在于: 通过在超大规模的数据上训练,给出一系列可能最好performance的LLM。这同时也为之后LLaMa2的推出埋下了伏笔。

论文地址: https://arxiv.org/abs/2307.09288

项目地址: https://github.com/meta-llama/llama

LLaMa2只推出了3个不同大小的权重模型:7B,13B以及70B的版本。但是Meta AI 在LLaMa1中实践得到的经验后继续用在了LLaMa2上,LLaMa2的网络结构如图4,整体如同LLaMa1也是decoder-only based的transformer结构,整体由32个block构成,可以看出其整体结构基本与LLaMa1相似,比如说:

●在LLaMa1的基础上,继续增加了40%的预训练数据。主要是清理了一些隐私数据和知识增强从而提高数据质量;
●继续在每个block输入层中使用RMSNorm;
●继续使用RoPE位置编码。

▲图4|LLaMa2网络结构©️【深蓝AI】

除了沿用LLaMa1中的一些改进,LLaMa2自身也做了一些改进。由于上文已经着重介绍了LLaMa的改进,所以对于重复部分这里就不再复述了,下面会着重介绍LLaMa2自身的改进。

改进1:Grouped-query attention

▲图5|自回归模型输出方式©️【深蓝AI】

介绍GQA之前,需要先给大家铺垫一下自回归模型的输出方式和KV cache的基本概念。如图5,展示的是典型的decoder-only自回归模型的输出方式,所谓自回归模型就是利用自己输出的结果再作为输入再去输出(虽然拗口但意思正是如此)。

简单来说就是,我们用过LLaMa或者gpt这种自回归模型的时候都知道它输出好像都是一个一个字往外面蹦,并不是一次性生成了所有答案。这里其实就能看出其输出的机理,如下图,当我输入一二三四五给模型作为输入的时候,它第一次会多生成一个字,然后再多输出的一个字的结果。重新作为输入继续给模型得到第二次输出,依次类推……直到模型得到这种特殊符号就会停止输出。

In  \[1\]: \{prompt:"一二三四五,"\}  
Out \[1\]: 一二三四五,上  
   
In  \[2\]: 一二三四五,上  
Out \[2\]: 一二三四五,上山  
   
In  \[3\]: 一二三四五,上山  
Out \[3\]: 一二三四五,上山打  
   
In  \[4\]: 一二三四五,上山打  
Out \[4\]: 一二三四五,上山打老  
   
In  \[5\]: 一二三四五,上山打老  
Out \[5\]: 一二三四五,上山打老虎  
   
   
In  \[6\]:  一二三四五,上山打老虎  
Out \[6\]:  一二三四五,上山打老虎\<eos>  

重复上面的过程不难发现,虽然答案只生成了5个字却经过了6次循环,比如说最早的prompt就重复了6次相同的矩阵计算,所以没必要再对之前的token进行Attention计算,这样就能节省大部分算力。

KV Cache便是为了解决上述问题:通过将每次计算的K和V缓存下来,之后新的序列进来时只需要从KV Cache中读取之前的KV值即可,就不需要再去重复计算之前的KV了。

▲图6|MHA&GQA&MQA机理©️【深蓝AI】

KV cache方法虽然理论上能行得通,但是在实际应用中大量的数据缓存与硬件的通信能力有着极高的压力。所以GQA(grouped-query attention)算法便从软件方面进行优化了。如图6,下面是三种自注意力机制的的对比,其中GQA是LLaMa2的机制,而MQA是LLaMa1的计算机制。那么为什么会从原始的NHA转换到MQA再转到GQA呢?

原始的MHA(Multi-Head Attention)中,QKV三部分有相同数量的头且一一对应。每次做Attention,head1的QKV就做好自己运算就可以,输出时各个头加起来即可。而MQA(Multi-query Attention)则是,让Q仍然保持原来的头数,但KV只有一个,相当于所有的Q头共享一组K和V头,所以叫做Multi-Query了。实验发现一般能提高30%-40%的计算性能,但是性能精度会有所降低。而GQA通过分组一定头数共享一组KV,从而达到性能和计算中的一个trade-off,这样既不像MQA一样降低很多精度,也可以相比于NHA提高速度。

改进2:SiLu 激活函数

相比于SwiGLU函数,这里用了更加简单的SiLU函数(笔者认为此处应该是对比了SwiGLU性能差别不大,如有疑惑欢迎指出),相关公式如下:

小结2:

LLaMa系列是Meta公司开源的最强模型,尤其是llama2在推出的当时70B的模型基本吊打所有开源模型,荣登开源模型榜首的位置。两代llama2模型有着相同的地方,也有着许多改进点值得后续继续研究:

●高质量数据集的重要性(广而精)
●RoPE提供了相对位置编码的解决方法
●GQA替代NHA以及MQA从而达到性能与速度的trade-off
●NMSNorm以及SiLu激活函数的改进

LLaMA系列模型以其高质量、可扩展性和灵活性,在NLP领域取得了显著的进展。通过不断地技术创新和优化,LLaMA模型在各种任务上展现了卓越的性能,成为了大型语言模型研究和应用的重要里程碑。随着模型参数规模的不断扩大和训练技术的不断进步,LLaMA系列模型将继续在自然语言处理领域发挥重要作用。

参考资料:

【1】https://www.zhihu.com/tardis/zm/art/648774481?source_id=1005

【2】https://blog.csdn.net/victor_manches/article/details/137017314?spm=1001.2014.3001.5502

【3】https://zhuanlan.zhihu.com/p/649756898

【4】https://zhuanlan.zhihu.com/p/651248009

【5】https://zhuanlan.zhihu.com/p/647130255

   
         
            
               
                     
                        
往期精彩回顾




  • 交流群

欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961



浏览 129
10点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
10点赞
评论
收藏
分享

手机扫一扫分享

举报