前言
LLaMA系列算法是Meta公司发布的开源大模型。近期Meta公司又发布了LLaMA 3.1系列的模型,在这一系列模型中参数量最大的高达405B,上下文窗口多达128K个token。同时对模型进行了广泛的实证评估,发现在很多任务中,LLaMA 3的质量可以与GPT-4等模型相媲美。
技术报告原始论文链接 The Llama 3 Herd of Models
引言
模型的开发主要可以分为两个阶段:(1)训练前阶段,在这一阶段,利用下一个单词预测或者字幕等简单任务对模型进行大规模训练;(2)训练后阶段,在这一阶段中,对模型进行调整,使其遵循指令、符合人类偏好并提高特定能力(如编码和推理)。
LLaMA3是一个语言模型群,原生支持多语言性、编码、推理和工具使用。其中最大的模型是一个密集型Transformer架构,具有405B的参数量,上下文窗口多达128K个token,模型群的相关内容可以参照下图。
在开发高质量的模型时通常由三个关键的点:数据,规模和复杂性管理。在LLaMA3的开发过程中对上述三方面进行了如下的优化:
数据:与之前的LLaMA对比,改进了用于前训练和后训练的数据的数量和质量。为预训练数据开发了更细致的预处理和整理管道,为后训练数据开发了更严格的质量保证和过滤方法。在预训练阶段采用了15T以上的多语言词库的语料库,而LLaMA2仅采用了1.8T的词库。
规模:旗舰语言模型在预训练时使用了 3.8 × 1 0 25 3.8×10^{25} 3.8×1025FLOPS,是最大版本LLaMA2的50倍。在15.6T文本标记上预训练了一个拥有405B可训练参数的旗舰模型。如基础模型的缩放规律所预期的那样,旗舰模型比使用相同程序训练的较小模型要好。在后期会使用旗舰模型来提高较小模型的质量。
复杂性管理:所做的设计选择旨在最大限度地提高模型开发过程的扩展能力。在LLaMA3的训练过程中使用了标准的密集变形模型架构并稍作调整,而不是专家混合模型,以最大限度地提高训练的稳定性。同时采用了基于监督微调(SFT)、拒绝采样(RS)和直接偏好优化(DPO)的相对简单的后训练程序,而不是更复杂的强化学习算法,后者往往稳定性较差且难以扩展。
总体概述
LLaMA 3的开发过程分为两个阶段:
- 语言模型预训练。将一个大型多语言文本语料库转换为离散的标记,然后在由此产生的数据上预训练一个大型语言模型,以执行下一个标记的预测。在训练过程中使用了8K标记的上下文窗口,在15.6Ttoken上预训练了一个拥有405B参数的模型。在标准预训练之后,还会继续进行预训练,将支持的上下文窗口增加到128k tokens。
- 语言模型后训练。预训练后的语言模型对语言有丰富的理解,但还不能按照期望的方式来执行指令或行为。在这一阶段将分几轮根据人类的反馈微调模型,每一轮都包括在指令微调数据基础上进行监督微调(SFT)。在训练后阶段,还整合了工具使用等新功能,并观察到在编码和推理等其他方面的显著改进。
同时还采用组合的方式为LLaMA3添加了图像、视频和语音功能:
- 多模态编码器预训练。为图像和语音分别训练编码器。首先在大量的图像-文本上训练图像编码器。这可以让模型了解视觉内容和自然语言描述之间的关系。语音编码器采用自监督方式进行训练,这种方法会屏蔽掉语音输入的部分内容,并尝试通过离散标记表示法重建屏蔽掉的部分内容。因此,该模型可以学习语音信号的的结构。
- 视觉适配器训练。会训练一个适配器,将预先训练好的图像编码器集成到预先训练好的语言模型中。适配器由一系列交叉注意层组成,可将图像编码器表征输入语言模型。适配器根据文本-图像对进行训练。这就使图像表征与语言表征保持一致。在适配器训练过程中,会更新图像编码器的参数,但有意不更新语言模型参数。在图像适配器的基础上,我们还在成对的视频-文本数据上训练视频适配器,这使模型能够汇总各帧的信息。
- 语音适配器训练。最后,通过一个适配器将语音编码器集成到模型中,该适配器可将语音编码转换为标记表示,然后直接输入经过微调的语言模型。适配器和编码器的参数在有监督的微调阶段共同更新,以实现高质量的语音理解。在语音适配器训练过程中,不会改变语言模型。同时还集成了文本到语音系统。
预训练
语言模型预训练包括:(1)大规模训练预料的整理和筛选;(2)模型结构的开发和确定模型大小的相应比例法则;(3)大规模高效预训练技术的开发;(4)预训练配方的开发。
预训练数据
从包含2023年底之前知识的各种数据源中创建了用于语言模型预训练的数据集。对每个数据源采用了多种去重方法和数据清理机制,以获得高质量的token,同时删除了包含大量个人身份信息和有成人内容的域。
由于使用的大部分数据来自网络,因此需要对相应的数据进行清理。首先从可能包含不安全内容或大量个人信息的网站,根据各种Meta安全标准被列为有害的域以及已知包含成人内容的域中删除数据。为了提取高质量的多样化文本,构建了自定义的解析器,用于提取HTML内容,并优化模板去除和内容召回的精度。开发了启发式方法来去除额外的低质量文档、异常值和重复过多的文档;还尝试应用各种基于模型的质量分类器来分选高质量的token;同时建立了特定领域的管道来提取代码和数学相关网页。
要获得高质量的语言模型,仔细确定不同数据源在预训练数据混合中的比例也非常重要,通过知识分类和规模定律实验以后最终确定的数据混合大致包含50%一般知识token,25%的数学和推理token,17%的代码token以及8%的多语言token。
通过实验以后发现在小量的高质量大麦和数学数据上进行退火可以提高预训练模型在关键基准上的性能。因此使用在选定领域上采用高质量数据的数据混合进行退火。不在退火数据中包含常用基准的任何训练集,这使得能够评估LLaMA3的真实少次学习能力和领域外泛化能力。同时在GSM8k和MATH训练集上评估了退火的有效性后发现,退火将预训练的LLaMA3 8B模型在GSM8k和MATH验证集上的性能分别提高了24.0%和6.4%。
模型架构
LLaMA 3使用了标准的密集型Transformer架构,与LLaMA和LLaMA 2在模型架构方面没有显著的差异;模型性能的提升主要是由于数据质量和多样性的提高以及训练规模的增加。
但是与Llama 3相比,还是做了一些小的修改:
- 使用分组查询注意力和8个键值头来提高推理速度,并在解码过程中减少键值缓存的大小;
- 使用注意力掩码来防止同一序列中的不同文档之间的自注意力。这种改变在标准预训练期间的影响有限,但在继续对非常长的序列进行预训练时发现它很重要;
- 使用一个包含128K个token的词汇表。对应的token词汇表结合了来自tiktoken分词器的100K个token和额外增加的28K个token,以更好地支持非英语语言。与Llama 2分词器相比,新的分词器将样本英语数据的压缩率从3.17提高到3.94个字符每个token。这使得模型在相同的训练计算量下能够“阅读”更多的文本。还发现,增加来自选定非英语语言的28K个token在不影响英语分词的情况下,提高了压缩比和下游性能;
- 增加了RoPE基础频率超参数到500000,这样能够更好的支持更长的上下文。
Llama 3 405B使用了一个具有126层、16384个token表示维度和128个注意力头的架构,具体的结构参照下图。
模型定律
制定了规模定律来确定旗舰模型的最佳大小,考虑到预训练计算的预算。除了确定最佳模型大小之外,另一个主要挑战是预测旗舰模型在下游基准任务上的性能,由于下面几个问题:(1)现有的规模定律通常只预测下一个标记预测损失,而不是特定的基准性能。(2)规模定律可能会有噪声并且不可靠,因为它们是基于小计算预算进行的雨荨来拿运行开发的。
为了应付这些挑战,实施了两阶段的方法来制定能够预测下游基准性能的规模定律:
- 首先建立计算最优模型在下游任务上的负对数似然与训练FLOPS之间的相关性;
- 接下来将下游任务上的负对数似然与任务准确性相关联,利用规模定律模型和用更高计算FLOPS训练的旧模型。在这一步中,特别利用了LLama 2系列模型。
基础设施、扩展性和效率
在模型训练时将Llama 3的训练迁移到了Meta的生产集群上,405B的模型在高达16K的H100 GPU上进行训练,每个GPU运行在700W TDP下,配备80GB的HBM3。每个服务器配备有八个GPU和两个CPU。Meta的通用分布式文件系统用于为Llama 3预训练构建存储网络,提供了7500个配备SSD的服务器上的240PB的存储空间,并支持2TB/s的可持续吞吐量和7TB/s的峰值吞吐量。
为了扩展最大模型的训练,采用了4D并行性——结合四种不同类型的并行方法来切分模型。这种方法可以有效的在多个GPU之间分配计算资源,并确保每个GPU的参数模型参数、优化器状态、梯度和激活能够适应其HBM,在下图中展示了4D并行性的实现。它结合了张量并行性(TP)、流水线并行性(PP)、上下文并行性(CP)和数据并行性(DP)。
训练配方
用于预训练LLaMA 3 405B的配方主要包括三个主要的阶段:(1)初始预训练;(2)长上下文预训练;(3)退火
-
初始预训练
使用余弦学习率对Llama 3 405B进行预训练,峰值学习率为 8 × 1 0 − 5 8×10^{-5} 8×10−5,线性预热8000步,然后在1200000个训练步骤中衰减到 8 × 1 0 − 7 8×10^{-7} 8×10−7。在训练初期使用较小的批量大小以提高训练稳定性,并最后增加它以提高效率。具体来说,最初的批量大小为4M个token,序列长度为4096,然后在预训练了252M个token后,将这些值添加到8M个token,序列长度为8192。在预训练了2.87T个token后再次将批量大小增加到16M。在训练过程中发现这种训练方法非常稳定:观察到的损失峰值很少,并且不需要干预来纠正模型训练发散。
-
长上下文训练
在预训练的最后阶段,对长序列进行训练,以支持高达128K个token的上下文窗口。之所以没有提前对长序列进行训练,是因为自注意力层的计算在序列长度上呈二次方增长。通过逐步增加支持的上下文长度,直到模型成功适应增加的上下文长度。通过测量模型在短文本上下文评估上的性能是否完全恢复,以及模型是否能够完美解决长达那个长度的“针尖上的针”任务来评估成功的适用。
-
退火
在最后40M个token的预训练中,将学习率线性退火至0,同时保持上下文长度为128K个token。在这个退火阶段还调整了数据混合,以增加对极高质量数据源的采样。最后,在退火期间,计算了模型检查点的平均值,以产生最终的预训练模型。
后训练
建模
通过对预训练检查点进行多轮后训练,或在预训练检查点的基础上与人类反馈对齐模型,以产生对齐的Llama 3模型。每一轮后训练包括监督式微调(SFT)和直接偏好优化(DPO),这些操作都是在通过人工注释或生成的实例上进行的。
在预训练检查点的基础上,训练一个涵盖不同能力的奖励模型。训练目标与Llama 2相同,只是去掉了损失中的边际项,因为在实验过程中观察到数据扩展后的改进逐渐减少。然后使用奖励模型对人工注释提示进行拒绝采样。连同这些拒绝采样掉的数据和其他数据源(包括合成数据),使用标准的交叉熵损失对预训练的语言模型进行微调,这个阶段称为监督式微调(SFT)。
进一步使用直接偏好优化(DPO)对SFT模型进行训练,以符合人类偏好对齐。在训练中,主要使用前一轮对齐中表现最好的模型收集的最新一批偏好数据,因此训练数据更好地符合每轮优化中的策略模型的分布。同时还探索了如PPO等策略算法,但发现DPO对于大规模模型需要的计算量更少,并且表现更好。在使用过程中对DPO应用了以下算法修改:
- 在DPO损失中屏蔽格式标记:从损失中的被选择和被拒绝的响应中屏蔽特殊格式标记,包括头部和终止标记,以稳定DPO训练。同时观察到,让这些模型对损失做出贡献可能导致不期望的模型行为,例如尾部重复或突然生成终止标记。假设这是由于DPO损失的对比性质——在被选择和被拒绝的响应中存在共同标记导致学习目标冲突,因为模型需要同时增加和减少这些标记的可能性。
- 通过NLL损失进行正则化:添加了一个额外的负对数似然(NLL)损失项,对被选择的序列进行缩放,缩放系数为0.2。这有助于通过保持生成所需的格式和防止被选择相应的对数概率降低进一步稳定的DPO训练。
后训练数据
偏好数据:在每个轮次后部署多个模型进行注释,并为每个用户提示采样两个不同模型的两个不同响应。这些模型可以用不同的数据混合和对齐配方进行训练,允许不同的能力强度和增加数据多样性。要求注释者根据他们对被选择相应相对于被拒绝相应的偏好程度,将其偏好强度分为四个等级:明显更好、更好、略好或勉强更好。还在偏好排名后加入编辑步骤,鼓励注释者进一步完善首选响应。注释者可以直接编辑所选相应,活泼提示模型用反馈来细化自己的响应。同时,还是试了质量分析和人工评估流程,以严格评估收集的数据,允许完善对应的提示并为注释者提供系统、可行的反馈。
在每个后训练轮次钟,使用当时可用的所有偏好数据进行奖励建模,而仅使用各种能力的最新批次进行DPO训练。对于奖励建模和DPO,都是用被标记为被选择相应明显更好或被拒绝的对应物更好的样本进行训练,并丢弃响应相似的样本。
SFT数据:微调数据主要由以下来源组成:
- 来自人工注释收集的提示,以及拒绝采样的响应;
- 针对特定能力的目标合成数据
- 少量人工策划的数据
在拒绝采样(RS)期间,对于人工注释期间收集的每个提示,从最新的聊天模型策略中采样K个输出,并使用奖励模型选择最佳候选。在后训练的后期轮次钟,引入了系统提示,以引导RS响应符合不同能力所需的期望语调、风格或格式。为了提高拒绝采样的效率,采用了PagedAttention。PagedAttention通过动态键值缓存分配增强了内存小了,通过根据当前缓存容量动态安排请求,支持任意输入长度。但是当内存不足时会带来交换的风险。为了消除这种交换开销,定义了最大输出长度并仅在有足够内存来适应该长度的输出时执行请求。PagedAttention还使我们能够跨所有相应的输出共享提示的键值缓存页面,这些共同导致了拒绝采样期间吞吐量的2倍以上提高。