在2024年4月,Meta公司宣布了其开源的大型语言模型Llama 3的正式亮相,该模型包括8亿和70亿参数的版本。此外,Meta还透露了正在开发中的400亿参数版本Llama-3的进展。
与Llama-2相比,Llama-3在功能上实现了显著的扩展,支持处理长达8000个字符的文本输入,并采用了一个编码效率更高的分词器,其词汇表的规模达到了128,000个词条。
在数据预处理方面,Llama-3的预训练数据集规模达到了15万亿个token,这是Llama-2的两倍多。
在性能上,Llama-3实现了显著的突破,在同等规模的大型模型中表现卓越。
此外,Llama-3在推理、编程代码生成以及指令执行等方面也进行了大幅度的优化,使得模型更加易于控制和应用。
当前,业界广泛采用的大型语言模型大多基于Transformer架构,这是一种依赖于多层自注意力(Self-attention)机制的神经网络模型。
Transformer模型最初由两个主要组件构成:编码器(Encoder)和解码器(Decoder),这两个组件既可以协同工作,也可以单独应用于不同的任务。
举例来说,基于编码器构建的
BERT
模型
和基于解码器构建的
GPT
模型
就
是两个
典型的例子。
Llama模型在架构上与GPT相似,它同样采用了以解码器为核心的设计。在原始的Transformer解码器架构之上,进行了以下几项关键的改进:
-
为了提升模型训练的稳定性,Llama
3采用了RMSNorm作为前置的层归一化技术。
-
在提升模型性能方面,Llama
3选择了SwiGLU作为其激活函数,以增强模型的表达能力。
-
为了更有效地处理长序列数据,Llama
3引入了RoPE作为其位置编码机制。
-
同时,为了在效率和性能之间取得平衡,Llama 3的部分版本采用了分组查询注意力机制(Grouped-Query
Attention, GQA)。
具体实现流程如下:输入的token序列首先通过词嵌入矩阵转换为词向量序列。接着,这些词向量序列作为初始的隐藏状态,依次通过L层解码器层处理,并在每一层后应用RMSNorm进行归一化,最终的归一化隐藏状态将作为模型的输出。
在解码器的每一层中,隐藏状态首先经过RMSNorm归一化,然后输入到自注意力模块。自注意力模块的输出与归一化前的隐藏状态进行残差相加。随后,新的隐藏状态再次进行RMSNorm归一化,并送入前馈网络层。前馈网络层的输出同样执行残差相加操作,形成该解码器层的最终输出。
Llama模型根据不同的隐藏层规模和层数,衍生出了多个变体。接下来,我们将详细探讨每个变体的具体特点和差异。
Llama-1 模型架构,详见MODEL_CARD:
https://github.com/meta-llama/llama/blob/main/MODEL_CARD.md
为了优化数据编码过程,Llama-1采用了BPE(Byte Pair Encoding)算法进行文本分词,该算法通过sentencepiece库实现。
特别地,Llama-1在处理数字时,会将它们拆分为独立的数字单元,而对于无法识别的UTF-8字符,则采用字节级别的分解作为备选策略。该模型的词汇表容量被设定为32,000个词条。
Llama-2 模型架构,详见MODEL_CARD(同上)
Llama-2在模型架构和分词器方面与Llama-1保持一致。然而,与Llama-1相比,Llama-2在上下文长度上做了扩展,将其提升至4000个token。
此外,Llama-2在其34亿和70亿参数的版本中引入了分组查询注意力机制(Grouped-Query
Attention, GQA),以提升模型性能。
Llama-3 模型架构,详见MODEL_CARD:
https://github.com/meta-llama/llama3/blob/main/MODEL_CARD.md
相较于Llama 2,Llama-3在分词器的选用上做出了调整,从sentencepiece切换到了tiktoken,这一变更与GPT-4的实践相一致。
此外,词汇表的规模也从32,000扩展至128,000个词条。为了增强模型的运算效率,Llama-3在8亿和70亿参数的版本中都应用了分组查询注意力机制(Grouped-Query Attention, GQA)。
同时,模型的上下文处理能力也得到了增强,上下文长度提升至8,000个token。
本节将对每个版本的训练数据进行简要介绍,包括数据来源、规模和处理方式。
Llama-1模型通过利用大量未标注的数据集进行了自监督学习的训练。
这些用于预训练的数据集来源于多个不同的渠道,并且所有数据均为公开可获取。具体各个数据源的贡献量以及它们在预训练中被采用的采样比例如下表所示:
-
CommonCrawl:
Llama-1在预处理阶段,针对2017年至2020年期间的五个CommonCrawl数据集进行了细致的处理。该过程首先在行级别执行了去重操作,随后利用fastText构建的线性分类器来识别和排除非英语页面。
为了进一步提升数据质量,Llama-1还采用了n-gram语言模型来筛选掉那些低质量的内容。此外,Llama-1还特别训练了一个线性模型,用以区分维基百科中作为参考来源的页面和通过随机抽样得到的页面。在这一分类过程中,那些未被模型判定为参考来源的页面会被排除在训练数据集之外。
-
在进行的探索性实验中,Llama-1模型发现,采用多样化的预处理方法来处理CommonCrawl数据集能够显著提高模型性能。基于这一发现,Llama-1的训练数据集也纳入了公开可获取的C4数据集。
C4数据集的预处理同样包括了去重和语言识别的步骤。与CommonCrawl数据集(CCNet)的主要差异在于质量过滤环节,C4数据集的质量过滤主要依赖于一些启发式规则,这些规则包括但不限于标点符号的有无以及网页中单词和句子的数量等。
通过这种综合的预处理策略,Llama-1模型能够从多样化的数据源中提取出高质量的信息,从而为模型的训练提供更加丰富和可靠的数据支持。
-
Llama-1模型利用了在Google BigQuery平台上公开可用的GitHub数据集进行训练。在数据的筛选过程中,Llama-1特别关注了在Apache、BSD和MIT等开放源代码许可证下发布的项目,确保了数据的合法性和可用性。
为了进一步提升数据质量,Llama-1采取了基于文件行长度或字母数字字符比例的启发式规则,用以识别并排除那些质量不高的文件。此外,Llama-1还运用正则表达式技术,去除文档中的模板化内容,如页眉、页脚等,以减少噪声并提高数据的实用性。
在完成了上述预处理步骤后,Llama-1进一步在文件级别执行了去重操作,确保数据集中不包含任何内容完全相同的重复文件,从而保证了训练数据的唯一性和多样性。
-
Llama-1在其训练数据中纳入了2022年6月至8月期间的维基百科内容,这些内容覆盖了使用拉丁字母和西里尔字母的20种不同语言。在数据预处理阶段,Llama-1执行了一系列操作以净化数据,包括去除超链接、用户评论以及所有其他格式化的模板文本。
通过这些步骤,Llama-1旨在从维基百科中提取出纯净的文本信息,从而为模型提供高质量的语言学习材料,同时减少不必要的噪声和干扰,优化模型的训练效果。
Llama-1的训练数据集整合了两个丰富的书籍语料库:首先是Gutenberg项目,它收录了众多公共领域的文学作品;其次是ThePile的Books3部分,这是一个公开可用的、专为训练大型语言模型而设计的数据集。在整合这些书籍数据时,Llama-1采取了书籍级别的去重措施,排除了内容相似度超过90%的重复书籍。
这一做法能够确保训练数据集中的多样性和独特性,避免因内容过度重复而导致模型训练效率降低,同时也有助于提升模型对语言多样性的理解和生成能力。通过精心筛选和预处理,Llama-1能够从这些书籍语料库中获得广泛而高质量的文本信息,为模型的训练打下坚实基础。
Llama-1对ArXiv的LaTeX文件进行了专门的处理,目的是将更多的科学内容融入到其训练数据集中。在这一过程中,Llama-1特别去除了文档中每一节之前的所有内容,以及文末的参考文献部分,从而集中获取文章的核心科学论述。
此外,Llama-1还对.tex文件中的注释进行了清理,以减少非正文信息的干扰。为了提高不同论文之间的文本一致性,Llama-1对用户定义的宏和命令进行了内联扩展,即将这些自定义的LaTeX命令替换为它们的实际文本内容。
通过这些细致的处理步骤,Llama-1旨在提炼出ArXiv文档中的科学文本,同时确保数据集中的科学信息准确、一致,并且尽可能地减少无关内容的干扰,从而为模型提供一个更加精准和专业的科学文本训练环境。
Llama-1的训练数据集中融入了Stack Exchange的数据转储,这是一个包含多个领域,从计算机科学到化学等,提供高质量问答内容的综合性平台。在整合这些数据时,Llama-1特别选取了其中28个规模最大的网站的数据进行纳入。
为了提高数据的质量,Llama-1对文本内容进行了清洗,去除了HTML标签等非文本元素,确保了文本数据的纯净性。同时,Llama-1还依据答案的得分进行了排序,优先选择了得分最高到最低的答案,以此来筛选出社区认为最有价值的信息。
通过这种综合的训练策略,
Llama-1
能够充分挖掘不同数据源的潜力,同时平衡训练效率和模型性能,最终达到优化模型泛化能力的目的。
Llama-2在进行预训练时,使用了来自多个公开资源的2万亿个数据token。此外,Llama-2-Chat在该项目特制的2540对提示-响应数据上执行了进一步的微调,展现出了超越体积更大但质量较低的第三方数据集的性能。
为了促进AI的对齐,Llama-2采用了人类反馈强化学习(RLHF),结合了包含1,418,091个Meta样本和七个较小数据集的集合。在这些Meta样本中,对话的平均深度为3.9轮,而Anthropic Helpful和Anthropic Harmless数据集的对话平均深度为3.0轮,其他五个数据集,包括OpenAI Summarize和StackExchange,平均对话深度为1.0轮。微调所用的数据集既包括公开可用的指令数据集,也包括超过一百万个新增的人工标注样本。
在Llama-2的预训练阶段,对数据安全性进行了细致的考量。
通过深入分析预训练数据,Llama-2增强了数据处理的透明度,并识别出了潜在的问题源头,例如可能存在的偏见。为此,Llama-2实施了多项措施,包括遵守Meta公司的隐私和法律审查流程,并排除了已知含有大量个人信息的网站数据。同时,为了保持模型在各种任务中的广泛适用性,避免因过度清洗数据而导致的某些人群的意外排除,Llama-2并未对数据集进行额外的过滤。利用相关工具和数据集,Llama-2对语言的代表性和潜在的有害内容进行了分析,这有助于理解预训练数据的特性,为模型的安全调整提供了依据。这一系列的措施确保了Llama-2在安全性方面的周全考虑,并在模型部署前进行了必要的安全优化。
尽管Llama-2的预训练主要集中在英语数据上,但实验结果显示,该模型对其他语言也展现出了一定的掌握能力。
然而,由于用于非英语语言的预训练数据相对有限,这种掌握能力仍有其局限性(详见下图)。因此,Llama-2在处理非英语语言时的性能可能不够稳定,建议在使用时保持谨慎(模型的多语言能力有限,可能部分原因是词汇表规模较小导致的)。
预训练数据截至到2022年9月,但某些调整数据较新,直到2023年7月。
我们将继续努力微调模型,以提高在其他语言环境下的适用性,并在未来发布更新版本,以解决这一问题。
Llama-3在继承Llama-2的基础上,不仅显著扩展了词汇表的规模,还增强了对多语言训练资料的整合。这一改进实现了Llama-2在技术文档中所承诺的目标,并在目前公开的多语言任务评估中,实现了性能的显著提升。
为了提升Llama-3的训练效果,研究团队精心策划了预训练语料库的构建,既注重数据的广覆盖,也重视数据的高质量。Llama-3的训练数据量实现了显著的扩展,从Llama-2的2万亿个token增加到了15万亿个token,增幅达到了8倍。特别是,代码相关数据的量增加了4倍,这一扩充显著增强了模型在编程和逻辑推理方面的能力。
Llama-3推出了三种不同规模的模型:小型版拥有8亿参数,性能略超过Mistral 7亿参数和Gemma 7亿参数的模型;中型版则包含70亿参数,其性能预期位于ChatGPT 3.5和GPT 4之间;而大型版则达到了400亿参数,目前仍在积极训练中,目标是打造一个支持多模态和多语言的模型,预计性能将与GPT
4或GPT 4V相媲美。
值得注意的是,Llama-3并未采用MOE(专家混合)架构,这种架构虽然有助于降低训练和推理的成本,但在性能上通常无法与同等规模的密集模型竞争。随着模型规模的增加,如何有效降低推理成本成为了一个亟待解决的问题。
此外,Llama-3的训练数据集涵盖了大量的编程语言token和超过5%的非英语token,这些数据来自超过30种不同的语言。这样的多样性不仅提升了模型处理英语内容的效率,也极大增强了其处理多语言内容的能力,显示出Llama-3在全球多语言应用场景中的广泛适用性和强大潜力。
为了保证训练数据的质量,Meta公司开发了一系列数据清洗流程,包括启发式过滤、NSFW(不适合工作场所)内容过滤、语义重复数据删除技术,以及用于评估数据质量的文本分类器。这些工具的有效性得到了之前Llama模型的实践验证,尤其是在筛选高质量数据方面。
同时,Meta通过广泛的实验,评估并确定了在最终预训练数据集中混合不同来源数据的最佳方法,确保Llama-3能够在多种应用场景下,如日常生活、STEM(科学、技术、工程和数学)领域、编程和历史知识等方面,均能展现出卓越的性能。
本节将对每个版本的训练方法进行简要介绍,包括预训练、有监督微调和基于人类反馈的强化学习。
Llama-1模型是一个基础的自监督学习模型,它没有经过任何形式的特定任务微调。
通过分析未标记数据,模型预测输入数据的特定部分,自动掌握数据的内在结构。
Llama-1
模型在技术报告中详细阐述了其训练配置。
采用
AdamW
优化器,这是
Adam
优化器的改进版,更优地处理权重衰减,增强训练稳定性。
参数影响:
β1
和
β2
的选择对训练的收敛性和稳定性至关重要。
学习率调度:余弦学习率调度技术,通过逐步降低学习率,有助于实现更佳的模型收敛。
权重衰减与梯度裁剪:实施
0.1
的权重衰减和
1.0
的梯度裁剪,是防止过拟合和保证数值稳定性的常规做法。
预热步骤:作为训练初期的策略,预热步骤有助于稳定训练动态。
学习率与批量大小调整:根据模型大小调整学习率和批量大小,可以优化资源分配,提升模型效率和性能。
Llama-1也展示了一系列针对大规模语言模型训练进行的优化措施,
主要包括:
xformers库应用:利用xformers库中的causal
multi-head attention实现,通过避免存储注意力权重和计算被屏蔽的key/query分数,减少内存使用和计算时间。
手动实现反向传播:代替自动微分系统,手动实现反向传播函数,提升训练速度。
模型与序列并行:通过模型和序列的并行化,以及优化
GPU
间通信,进一步提高训练效率。
参数庞大的模型:这些优化特别适用于训练具有大量参数的模型,如
650
亿参数的模型,显著缩短训练时间,提高运算效率。
高性能计算领域:优化技术体现了在高性能计算领域对资源管理和效率优化的深入考量。
推动模型发展:对于推动大规模语言模型的发展具有关键性的意义。
Llama-2
模型在
Llama-1
基础上进一步发展的模型。
Llama-2-Chat
模型基于
Llama-2
进行微调的版本,与
GPT-4
不同,保持了固定的
4k
上下文长度。
自回归损失函数:在微调
Llama-2
和
Llama-2-Chat
时采用,模型在预测下一个
token
时会考虑所有先前的
token
。
用户输入提示处理:在训练中,将用户输入提示的
token
损失设置为零,使模型专注于生成回复而非这些特定
token
。
预训练阶段:使用公开数据对
Llama-2
进行预训练。
有监督微调:基于预训练模型,通过有监督学习创建
Llama-2-Chat
的初始版。
强化学习方法:采用基于人类反馈的
RLHF
方法,包括拒绝采样和近端策略优化(
PPO
)。
奖励模型更新:在
RLHF
阶段,人类偏好数据并行迭代,以保持奖励模型的持续更新。
Llama-3
:预训练模型,与
Llama-2
相似,进一步发展而来。
Llama-3-Instruct
:基于
Llama-3
的微调版本,专为指令遵循设计。
Llama-3
通过扩展法则有效利用预训练数据,预测模型性能,选择最优数据组合。
Chinchilla
法则:根据
DeepMind
提出的法则,
8B
模型的最优训练数据量约为
200B token
。
性能提升:实验显示,即使数据量增加两个数量级,模型性能仍在提升,
15T token
训练后,
8B
和
70B
参数模型性能持续对数线性增长。
并行策略:为了训练最大的
Llama-3
模型,采用了数据并行、模型并行和流水并行。
计算效率:在
16K GPU
上训练时,实现了每个
GPU
超过
400 TFLOPS
的计算利用率。
训练堆栈:
Meta
开发了新训练堆栈,自动检测和维护错误,提高硬件可靠性。
存储系统:开发了新的可扩展存储系统,减少检查点和回滚开销,有效训练时间超过
95%
。
这些改进使
Llama-3
的训练效率比
Llama-2
提高了约三倍。
微调方法:
Meta
在微调阶段进行了创新,结合了
SFT
、拒绝采样、
PPO
和
DPO
。
复杂任务优化:综合方法提升了模型在复杂推理和编码任务中的表现,特别是在逻辑推理问题中选择最合适答案的能力。
Meta官方数据显示,Llama-2在众多基准测试中都优于Llama-1和其他开源语言模型。