总结
Llama3的模型依旧是用的是传统的dense Transformer架构,与Llama2和Llama在架构上没有本质的区别,只是在训练数据量和参数规模上有了很大的提升。
Abstract
Llama3是一组原生支持多语言、编码、推理和工具使用的语言模型。最大的模型是一个密集的 Transformer,具有 405B 参数和高达 128K 标记的上下文窗口。Llama 3 在大量任务上提供与 GPT-4 等领先语言模型相当的质量。
1 Introduction
现代基础模型的开发由两个阶段组成:
- pre-training阶段:损失函数就是常规的预测下一个词的方法在大规模数据进行训练的过程
- post-training阶段:微调模型使其能follow指令,对齐用户的偏好,并且改善特定能力,比如代码 或者推理能力。
作者认为开发高质量的基础模型有三个关键杠杆:data、scale和managing complexity。
- Data:在大约15T多语言tokens的语料库上预训练 Llama 3,而 Llama 2 仅有1.8T。
- Scale:模型变大了,有405B个可训练的参数。
- Managing complexity:选择了标准的dense Transformer架构,做了一点小改动,没有使用混合专家模型MOE;在后训练阶段基于SFT、 rejection sampling (RS), 和DPO进行。这些都是比较简单的,没有选择复杂算法,因为比较不稳定且难以拓展。
3 Pre-Training
语言模型预训练涉及:(1)大规模训练语料库的筛选和过滤,(2)开发模型架构和相应的scaling law以确定模型大小,(3)开发大规模高效预训练的技术,以及(4)开发预训练流程。
3.1 Pre-Training Data
3.1.1 Web Data Curation
PII and safety filtering。移除含有大量PII内容的数据,以及对安全标准有害的域名和已知包含成人内容的域名。
Text extraction and cleaning.处理非截断 Web 文档的原始 HTML 内容,以提取高质量的多样化文本,构建了一个自定义解析器。特别处理包含数学和代码内容的 HTML 页面,以保留该内容的结构。如果数学公式是图片,就把html的 alt 属性文本抽取出来,因为数学内容通常表示为预渲染图像,其中数学也在 alt 属性中提供。我们通过实验评估不同的清洁配置。我们发现,与纯文本相比,Markdown 对主要在 Web 数据上训练的模型的性能有害,因此我们删除了所有 Markdown 标记。
实际上,LLM的输出一般都是md格式的,理论上来说训练数据加上markdown格式才是合理的。针对html一种常见的做法就是直接把html格式直接转成md格式。
De-duplication.
- URL-level de-duplication.保留与每个 URL 对应的页面的最新版本。
- Document-level de-duplication.使用global minhash的方法去除相似文档。
- Line-level de-duplication.行级去重就是拿出30M的数据,计算出如果一行文字连续出现6次就删除掉。
Heuristic filtering(启发式过滤).来删除其他低质量文档、异常值和重复次数过多的文档
- 使用duplicated n-gram coverage ratio删除由重复内容(例如日志记录或错误消息)组成的行
- 使用脏话计数,来过滤成人网站等。
- 计算token的distribution Kullback-Leibler divergence的距离,如果和其他的文档相比很奇怪,就需要删除。
Model-based quality filtering.应用各种基于模型的质量分类器来子选择高质量的tokens。例如使用fasttext, Roberta
Code and reasoning data.提取代码和数学相关网页。由于代码和数学的token分布与自然语言的token分布有很大不同,因此这些管道实现了特定于领域的 HTML 提取、自定义文本功能和用于过滤的启发式方法。
Multilingual data.从可能包含 PII 或不安全内容的网站中删除数据,具体方法和上面对于英语的过滤方法类似
- 基于 fasttext 的语言识别模型将文档分类为 176 种语言。
- 在每种语言的数据中执行文档级和行级重复数据删除。
- 应用特定于语言的启发式方法和基于模型的过滤器来删除低质量的文档。
还使用基于 Llama 2 的多语言分类器对多语言文档进行质量排名,以确保优先考虑高质量的内容
3.1.2 Determining the Data Mix
为了获得高质量的语言模型,必须仔细确定不同数据源在预训练数据组合中的比例。主要工具是知识分类和scaling law experiments。
Knowledge classification. 对网络数据中包含的信息类型进行分类,以更有效地确定数据组合。我们使用此分类器对网络上代表性过高的数据类别进行下采样,例如艺术和娱乐。
Scaling laws for data mix.在不同的数据组合上训练几个小型模型,重复此过程多次,以选择数据组合候选者。在这个候选数据组合上训练一个更大的模型,并在几个关键基准上评估该模型的性能。
数据组合摘要。我们的最终数据组合包含大约 50% 的常识、25% 的数学和推理、17% 的代码和 8% 的多语言。
3.1.3 Annealing Data(退火数据)
对少量高质量代码和数学数据进行退火可以提高预训练模型在关键基准上的性能。
使用退火来评估数据质量。我们发现退火使我们能够判断特定领域的小数据集的价值。我们通过将 50% 训练的 Llama 3 8B 模型在 40B 标记上的学习率线性退火到 0 来衡量此类数据集的价值。在这些实验中,我们将 30% 的权重分配给新数据集,将剩余的 70% 权重分配给默认数据组合。使用退火来评估新数据源比对每个小数据集执行缩放定律实验更有效。
3.2 Model Architecture
Llama 3 使用标准的dense Transformer 架构(dense Transformer即传统的attention is all you need 论文里的架构)。在模型架构方面,它与 Llama 和 Llama 2 没有明显偏差;Llama3效果提升主要得益于数据质量和多样性的提高以及培训规模的扩大。
相对于Llama2的小改动点在如下:
- 使用分grouped query attention(GQA) 的 8 个键值头,以提高推理速度并减小解码过程中键值缓存的大小。
- 我们使用注意力掩码来防止同一序列中不同文档之间的自注意力(例如序列长度8k, 文档1有5k,文档2有3k拼接在一起, 文档2计算attention score只关注文档2的部分,文档1部分置为0)。发现这种变化在标准预训练中的影响有限,但发现它在非常长的序列上继续预训练中很重要。
- 128K的词汇表大小,其中100k来自 tiktoken3 tokenizer, 28K的token是用以更好地支持非英语语言。与 Llama 2 分词器相比,新分词器将英语数据样本的压缩率从每个token 3.17 个字符提高到 3.94 个字符。这使模型能够“读取”更多文本,以进行相同数量的训练计算。我们还发现,添加来自选定非英语语言的 28K tokens可以提高压缩比和下游性能,而不会影响英语的tokenization
-
位置编码:RoPE 基本频率超参数增加到 500,000。这使我们能够更好地支持更长的上下文;该值对高达 32,768 的上下文长度有效。
3个Llama3模型结构大小如下图所示 :
Llama3模型参数
3.2.1 Scaling Laws
现在大模型的常用方法,用小模型来拟合出大模型的精度。
作者在给定预训练计算预算的情况下开发了Scaling Laws以确定我们的旗舰模型的最佳模型大小。除了确定最佳模型大小外,由于几个问题,一个主要挑战是预测旗舰模型在下游基准任务上的性能:(1)现有的Scaling Laws predict only next-token prediction loss,而不是特定的基准测试性能。(2)Scaling Laws可能嘈杂且不可靠,因为它们是基于在小计算预算下进行的预训练运行开发的,在大模型上可能不是那么准确。
为了解决这些问题,实施了一种两阶段方法来开发scaling laws以准确预测下游基downstream benchmark performance:
- 我们首先在计算最优模型对下游任务上的负对数似然与训练 FLOP 之间建立相关性。(FLOPS(Floating Point Operations per Second)指 每秒浮点运算次数,可以理解为评估计算速度的单位)
- 接下来,我们将下游任务的负对数似然与任务精度相关联,利用缩scaling law模型和用更高计算 FLOP 训练的旧模型(指Llama2)。
这种方法使我们能够在给定特定数量训练FLOPs的情况下计算最优模型的预测下游任务性能。
scaling law实验。具体来说,我们通过使用 6 × 1018 FLOP 到 1022 FLOP 之间的计算预算预训练模型来构建scaling law。在每个计算预算下,我们预训练大小在 40M 到 16B 参数之间的模型,并在每个计算预算下使用模型大小的子集。在这些训练运行中,我们使用余弦学习率计划,并对 2,000 个训练步骤进行线性预热。根据模型的大小,峰值学习率设置为 2 × 10−4 和 4 × 10−4 之间。我们将余弦衰减设置为峰值的 0.1。每个步骤的权重衰减设置为该步骤学习率的 0.1 倍。我们对每个计算规模使用固定的批量大小,范围在 250K 到 4M 之间。
简单来说就是通过小模型的算力大小和验证集的loss,拟合一条曲线,然后根据曲线,在给定的算力下,计算出对应的模型大小,或者训练数据的大小,即为scaling law实验。
一个重要的观察结果是,随着计算预算的增加,IsoFLOPs 曲线在最小值附近变得更平坦。
预测下游任务的性能。我们使用生成的计算最优模型来预测旗舰 Llama 3 模型在基准数据集上的性能。首先,我们将基准测试中正确答案的(归一化)负对数似然与训练 FLOPs 线性关联。接下来,我们使用scaling law模型和 Llama 2 模型在对数似然和准确性之间建立 S 形关系,这些模型是使用 Llama 2 数据混合和分词器训练的。我们在图 4 中显示了该实验在 ARC Challenge 基准测试上的结果)。我们发现这种两步scaling law预测(推断超过四个数量级)非常准确:它只是稍微低估了旗舰 Llama 3 模型的最终性能。
3.3 Infrastructure, Scaling, and Efficiency
主要是硬件和基础设施,不进行阐述
3.4 Training Recipe(训练丹方)
用于预训练 Llama 3 405B 的配方包括三个主要阶段:(1) 初始预训练,(2) 长上下文预训练和 (3) 退火。下面分别描述这三个阶段。我们使用类似的配方来预训练 8B 和 70B 模型
3.4.1 Initial Pre-Training
使用AdamW进行预训练
- 学习率:最大学习率是8e-5,使用线性warm up执行8000步,学习率从0线性增加到了8e-5,然后使用余弦学习率计划在 1,200,000 步中衰减为 8e-7。
- batch size:在训练早期使用较低的批量大小来提高训练稳定性,随后增加批量大小以提高效率。具体来说,1) 在训练252M tokens之前:使用 4M tokens 的初始批量大小和长度为 4,096 的序列; 2) 在训练2.87T tokens之前:将这些值加倍为 8M 序列的 8,192 个 token 的批量大小; 3) 在训练2.87T tokens之后,批量大小再次翻倍至 16M, 序列长度仍然是8192。
调整数据组合。我们在训练过程中对预训练数据组合进行了多次调整,以提高模型在特定下游任务上的性能。特别是,1)我们在预训练期间增加了非英语数据的百分比,以提高 Llama 3 的多语言性能。2)我们还对数学数据进行上采样以提高模型的数学推理性能,3) 我们在预训练的后期阶段添加了更多最新的网络数据以推进模型的知识截止,4)我们对后来被确定为质量较低的预训练数据的子集进行了下采样
3.4.2 Long Context Pre-Training
在预训练的最后阶段,我们对长序列进行训练,以支持多达 128K tokens的上下文窗口。我们不会更早地对长序列进行训练,因为自注意力层中的计算在序列长度上呈二次方增长。我们以增量增加支持的上下文长度,进行预训练,直到模型成功适应增加的上下文长度。我们通过测量 (1) 模型在短上下文评估(MMLU评测集)中的表现是否已完全恢复,以及 (2) 模型完美地解决了该长度的“大海捞针”任务来评估成功的适应。在 Llama 3 405B 预训练中,分六个阶段逐渐增加上下文长度,从最初的 8K 上下文窗口开始,到最终的 128K 上下文窗口结束。这个长上下文预训练阶段是使用大约 800B 训练tokens执行的。
3.4.3 Annealing
在对最后的40M token 进行预训练时,我们将学习率从8e-7线性退火为 0,保持 128K token 的上下文长度。在这个退火阶段,我们还调整了数据组合,以对非常高质量的数据源进行上采样。最后,计算退火过程中模型检查点的平均值以生成最终的预训练模型。