Llama 3.1 技术研究报告-3
四、后训练
我们通过对预训练检查点进⾏多轮后训练,或在预训练检查点的基础上与⼈类反馈(Ouyang等⼈,2022年;Rafailov等⼈,2024年)对⻬模型,以产⽣对⻬的Llama 3模型。每⼀轮后训练包括监督式微调(SFT)和直接偏好优化(DPO;Rafailov等⼈,2024年),这些操作都是在通过⼈⼯注释或合成⽣成的⽰例上进⾏的。我们的后训练建模和数据⽅法分别在第4.1节和第4.2节中描述。我们进⼀步在第4.3节中详细说明了定制数据管理策略,以提⾼推理、编码、事实性、多语⾔、⼯具使⽤、⻓上下⽂和精确指令跟随能⼒。
4.1 建模
我们后训练策略的⽀柱是奖励模型和语⾔模型。我们⾸先使⽤⼈⼯注释的偏好数据,在预训练检查点的基础上训练奖励模型(⻅第4.1.2节)。然后,我们使⽤监督式微调(SFT;⻅第4.1.3节)对预训练检查点进⾏微调,并进⼀步使⽤直接偏好优化(DPO;⻅第4.1.4节)与检查点对⻬。这个过程在图7中进⾏了说明。除⾮另有说明,我们的建模过程适⽤于Llama 3 405B,并且为了⽅便起⻅,我们将Llama 3 405B简称为Llama 3。
4.1.1 聊天对话格式
为了调整⼤型语⾔模型进⾏⼈类-AI交互,我们需要为模型定义⼀个聊天对话协议,以理解⼈类指令并执⾏对话任务。与其前⾝相⽐,Llama 3具有新的能⼒,如⼯具使⽤(第4.3.5节),这可能需要在单个对话回合中⽣成多个消息并将其发送到不同的位置(例如,⽤⼾,ipython)。为⽀持这⼀点,我们设计了⼀种新的多消息聊天协议,使⽤各种特殊的头部和终⽌标记。头部标记⽤于指⽰对话中每条消息的来源和⽬的地。同样,终⽌标记指⽰何时在⼈类和AI之间交替发⾔。
4.1.2 奖励建模
我们在预训练检查点的基础上,训练⼀个涵盖不同能⼒的奖励模型(RM)。训练⽬标与Llama 2相同,只是我们去掉了损失中的边际项,因为我们观察到数据扩展后的改进逐渐减少。按照Llama 2的做法,我们在过滤掉响应相似的样本后,使⽤我们所有的偏好数据进⾏奖励建模。除了标准的偏好对(被选择的,被拒绝的)响应外,注释还为⼀些提⽰创建了第三个“编辑过的响应”,其中从对中选择的响应进⼀步编辑以改进(⻅第4.2.1节)。因此,每个偏好排名样本有两个或三个具有清晰排名的响应(编辑过 > 被选择的 > 被拒绝的)。在训练期间,我们将提⽰和多个响应合并成⼀⾏,响应随机打乱。这是将响应分别放在单独的⾏中并计算分数的标准场景的近似,但在我们的消融研究中,这种⽅法在不损失准确性的情况下提⾼了训练效率。
4.1.3 超监督微调
然后,我们使⽤奖励模型对⼈⼯注释提⽰进⾏拒绝采样,其细节在第4.2节中描述。连同这些拒绝采样的数据和其他数据源(包括合成数据),我们使⽤标准的交叉熵损失对预训练的语⾔模型进⾏微调(同时在提⽰标记上掩盖损失)。关于数据混合的更多细节可以在第4.2节找到。我们称这个阶段为监督式微调(SFT;Wei等⼈,2022a;Sanh等⼈,2022;Wang等⼈,2022b),即使许多训练⽬标是模型⽣成的。我们最⼤的模型在8.5K到9K步的过程中以1e-5的学习率进⾏微调。我们发现这些超参数设置在不同的回合和数据混合中表现良好。
4.1.4 直接偏好优化
我们进⼀步使⽤直接偏好优化(DPO;Rafailov等⼈,2024年)对SFT模型进⾏训练,以符合⼈类偏好对⻬。在训练中,我们主要使⽤前⼀轮对⻬中表现最好的模型收集的最新⼀批偏好数据。因此,我们的训练数据更好地符合每轮优化中的策略模型的分布。我们还探索了如PPO(Schulman等⼈,2017)等策略算法,但发现DPO对于⼤规模模型需要的计算量更少,并且表现更好,尤其是在像IFEval(Zhou等⼈,2023)这样的指令跟随基准上。对于Llama 3,我们使⽤1e-5的学习率,并将β超参数设置为0.1。此外,我们对DPO应⽤了以下算法修改:
- 在DPO损失中屏蔽格式标记:我们从损失中的被选择和被拒绝的响应中屏蔽特殊格式标记,包括头部和终⽌标记(⻅第4.1.1节),以稳定DPO训练。我们观察到,让这些标记对损失做出贡献可能导 致不期望的模型⾏为,例如尾部重复或突然⽣成终⽌标记。我们假设这是由于DPO损失的对⽐性质 ⸺在被选择和被拒绝的响应中存在共同标记导致学习⽬标冲突,因为模型需要同时增加和减少这 些标记的可能性。
- 通过NLL损失进⾏正则化:我们添加了⼀个额外的负对数似然(NLL)损失项,对被选择的序列进⾏缩放,缩放系数为0.2,类似于Pang等⼈(2024年)。这有助于通过保持⽣成所需的格式和防⽌被选择响应的对数概率降低来进⼀步稳定DPO训练(Pang等⼈,2024年;Pal等⼈,2024年)。
4.1.5 模型平均
最后,在每个RM、SFT或DPO阶段,我们对使⽤不同版本的数据或超参数的实验获得的模型进⾏平均(Izmailov等⼈,2019年;Wortsman等⼈,2022年;Li等⼈,2022年)。
4.1.6 迭代轮次
遵循Llama 2的做法,我们通过六个轮次应⽤上述⽅法。在每个周期中,我们收集新的偏好注释和SFT数据,从最新的模型中采样合成数据。
4.2 后训练数据
后训练数据的组成对语⾔模型的有⽤性和⾏为起着⾄关重要的作⽤。在本节中,我们讨论了我们的⼈⼯注释程序和偏好数据收集(第4.2.1节),我们的SFT数据的组成(第4.2.2节),以及数据质量控制和清洗的⽅法(第4.2.3节)。
4.2.1 偏好数据
我们的偏好数据注释过程与Llama 2类似。我们在每个轮次后部署多个模型进⾏注释,并为每个⽤⼾提⽰采样两个不同模型的两个响应。这些模型可以⽤不同的数据混合和对⻬配⽅进⾏训练,允许不同的能⼒强度(例如,编码专业知识)和增加数据多样性。我们要求注释者根据他们对被选择响应相对于被拒绝响应的偏好程度,将其偏好强度分为四个等级:明显更好、更好、略好或勉强更好。我们还在偏好排名后加⼊编辑步骤,⿎励注释者进⼀步完善⾸选响应。注释者可以直接编辑所选响应,或提⽰模型⽤反馈来细化⾃⼰的响应。因此,我们的部分偏好数据有三个排名的响应(编辑过 > 被选择的 > 被拒绝的)。
在表6中,我们报告了我们⽤于Llama 3训练的偏好注释的统计数据。通⽤英语涵盖了多个⼦类别,如基于知识的问答或精确指令跟随,这些不在特定能⼒的范围之内。与Llama 2相⽐,我们观察到提⽰和响应的平均⻓度有所增加,这表明我们正在训练Llama 3处理更复杂的任务。此外,我们实施了质量分析和⼈⼯评估流程,以严格评估收集的数据,允许我们完善我们的提⽰并为注释者提供系统、可⾏的反馈。例如,随着Llama 3在每个轮次后改进,我们相应地增加提⽰的复杂性,以针对模型滞后的领域。
在每个后训练轮次中,我们使⽤当时可⽤的所有偏好数据进⾏奖励建模,⽽仅使⽤各种能⼒的最新批次进⾏DPO训练。对于奖励建模和DPO,我们都使⽤被标记为被选择响应明显更好或⽐被拒绝的对应物更好的样本进⾏训练,并丢弃响应相似的样本。
4.2.2 SFT数据
我们的微调数据主要由以下来源组成:
- 来⾃我们⼈⼯注释收集的提⽰,以及拒绝采样的响应
- 针对特定能⼒的⽬标合成数据(⻅第4.3节的更多细节)
- 少量⼈⼯策划的数据(⻅第4.3节的更多细节)
随着我们后训练轮次的进展,我们开发了更强的Llama 3变体,我们⽤它们来收集覆盖⼴泛复杂能⼒的⼤型数据集。在本节中,我们讨论了拒绝采样过程的细节和我们最终SFT数据混合的总体组成。
拒绝采样。在拒绝采样(RS)期间,对于⼈⼯注释期间收集的每个提⽰(第4.2.1节),我们从最新的聊天模型策略中采样K(通常在10到30之间)个输出(通常是最好的性能检查点来⾃上⼀次后训练迭代,或特定能⼒的最好性能检查点),并使⽤我们的奖励模型选择最佳候选,与Bai等⼈(2022)⼀致。在后训练的后期轮次中,我们引⼊系统提⽰,以引导RS响应符合不同能⼒所需的期望语调、⻛格或格式。
为了提⾼拒绝采样的效率,我们采⽤了PagedAttention(Kwon等⼈,2023)。PagedAttention通过动态键值缓存分配增强了内存效率。它通过根据当前缓存容量动态安排请求,⽀持任意输出⻓度。不幸的是,当内存不⾜时,这带来了交换的⻛险。为了消除这种交换开销,我们定义了最⼤输出⻓度,并仅在有⾜够的内存来适应该⻓度的输出时执⾏请求。PagedAttention还使我们能够跨所有相应的输出共享提⽰的键值缓存⻚⾯。这些共同导致了拒绝采样期间吞吐量的2倍以上提⾼。
整体数据组成。表7显⽰了我们“有⽤性”混合的每个⼴泛类别的数据统计。虽然SFT和偏好数据包含重叠的领域,但它们被不同地策划,产⽣了不同的计数统计数据。在第4.2.3节中,我们描述了对我们的数据样本进⾏主题、复杂性和质量分类的技术。在每个后训练轮次中,我们仔细调整这些轴上的整体数据混合,以在⼴泛的基准上调整性能。我们的最终数据混合在⼀些⾼质量资源上多次循环,并对其他资源进⾏下采样。
4.2.3 数据处理和质量控制
鉴于我们的⼤部分训练数据是模型⽣成的,因此需要仔细清洗和质量控制。
数据清洗。在早期轮次中,我们观察到数据中存在⼀些不良模式,例如过度使⽤表情符号或感叹号。
因此,我们实施了⼀系列基于规则的数据移除和修改策略,以过滤或清洗有问题的数据。例如,为了缓解过于道歉的语⽓问题,我们识别出过度使⽤的短语(如“I’m sorry”或“I apologize”),并仔细平衡我们数据集中这类样本的⽐例。
- 数据修剪。我们还应⽤了⼀系列基于模型的技术来移除低质量的训练样本并提⾼整体模型性能
- 主题分类:我们⾸先将Llama 3 8B微调为主题分类器,并在所有数据上进⾏推理,将其分类为粗略的桶(“数学推理”)和细粒度的桶(“⼏何和三⻆学”)。
- 质量评分:我们同时使⽤奖励模型和基于Llama的信号为每个样本获得质量分数。对于基于RM的分数,我们认为RM分数在前四分之⼀的数据为⾼质量。对于基于Llama的分数,我们提⽰Llama 3检查点在三点量表上对⼀般英语数据(准确性、指令跟随和语调/呈现)进⾏评分,并对编码数据(错误识别和⽤⼾意图)进⾏两点量表评分,并将获得最⾼分数的样本视为⾼质量。RM和基于Llama的分数有很⾼的不⼀致率,我们发现结合这些信号在我们的内部测试集上产⽣了最佳的召回率。最终,我们选择被RM或基于Llama的过滤器标记为⾼质量的⽰例。
- 难度评分:因为我们也对优先考虑对模型更复杂的⽰例感兴趣,我们使⽤两种难度度量来评分数据:Instag(Lu等⼈,2023)和基于Llama的评分。对于Instag,我们提⽰Llama
3 70B对SFT提⽰进⾏意图标记,更多的意图意味着更复杂。我们还提⽰Llama 3在三点量表上测量对话的难度(Liu等⼈,2024c)。 - 语义去重:最后,我们执⾏语义去重(Abbas等⼈,2023;Liu等⼈,2024c)。我们⾸先使⽤RoBERTa(Liu等⼈,2019b)对完整对话进⾏聚类,并在每个聚类内按质量分数×难度分数排序。然后我们通过迭代所有排序的⽰例,并只保留与迄今为⽌聚类中看到的⽰例的最⼤余弦相似度⼩于阈值的⽰例,进⾏贪婪选择。
4.3 能力
我们特别强调为特定能⼒如代码(第4.3.1节)、多语⾔(第4.3.2节)、数学和推理(第4.3.3节)、⻓上下⽂(第4.3.4节)、⼯具使⽤(第4.3.5节)、事实性(第4.3.6节)和可控性(第4.3.7节)提⾼性能所做的努⼒。
4.3.1 代码
⾃Copilot和Codex(Chen等⼈,2021年)发布以来,⽤于代码的⼤型语⾔模型(LLMs)受到了显著关注。开发者现在⼴泛使⽤这些模型⽣成代码⽚段、调试、⾃动化任务和提⾼代码质量。对于Llama 3,我们针对以下⾼优先级的编程语⾔改进和评估代码⽣成、⽂档编写、调试和审查能⼒:Python、Java、Javascript、C/C++、Typescript、Rust、PHP、HTML/CSS、SQL、bash/shell。在这⾥,我们介绍了通过训练代码专家、为SFT⽣成合成数据、通过系统提⽰引导改进格式以及创建质量过滤器从我们的训练数据中移除不良样本来改进这些编码能⼒的⼯作。
专家训练。我们训练了⼀个代码专家,我们⽤它在后续轮次的后训练中收集⾼质量的⼈⼯注释代码。这是通过分⽀主预训练运⾏并在⼤部分(>85%)代码数据的1T标记混合上继续预训练来实现的。继续在特定领域的数据上进⾏预训练已被证明对提⾼特定领域的表现是有效的(Gururangan等⼈,2020年)。我们遵循与CodeLlama(Rozière等⼈,2023年)类似的配⽅。在训练的最后⼏千步中,我们执⾏⻓上下⽂微调(LCFT),以将专家的上下⽂⻓度扩展到16K标记的⾼质量存储库级代码数据混合上。最后,我们遵循第4.1节中描述的类似的后训练建模配⽅来对⻬此模型,只是SFT和DPO数据混合主要针对代码。这个模型也⽤于拒绝采样(第4.2.2节)的编码提⽰。
合成数据⽣成。在开发过程中,我们确定了代码⽣成中的关键问题,包括难以遵循指令、代码语法错误、代码⽣成不正确以及修复错误的困难。尽管理论上密集的⼈⼯注释可以解决这些问题,合成数据⽣成提供了⼀种成本更低、规模更⼤且不受注释者专业⽔平限制的补充⽅法。因此,我们使⽤Llama 3和代码专家⽣成了⼤量合成SFT对话。
我们描述了⽣成合成代码数据的三种⾼层⽅法。总共,我们⽣成了超过2.7M个在SFT期间使⽤的合成
⽰例。
1.合成数据⽣成:执⾏反馈。8B和70B模型在由更⼤、更有能⼒模型⽣成的数据上训练时显⽰出显著的性能提升。然⽽,我们的初步实验揭⽰,使⽤Llama 3 405B⾃⼰⽣成的数据进⾏训练并没有帮助(甚⾄可能降低性能)。为解决这个限制,我们引⼊执⾏反馈作为真实性的来源,使模型能够从错误中学习并保持在正确的轨道上。特别是,我们使⽤以下流程⽣成了⼤约⼀百万合成编码对话的⼤型数据集:
-
问题描述⽣成:⾸先,我们⽣成了⼀个涵盖⼴泛话题的编程问题描述的⼤量集合,包括那些在⻓尾分布中的话题。为实现这种多样性,我们从各种来源采样随机代码⽚段,并提⽰模型⽣成受这些⽰例启发的编程问题。这使我们能够涉及⼴泛的主题,并创建⼀套全⾯的问题描述(Wei等⼈,2024年)。
-
解决⽅案⽣成:然后,我们提⽰Llama 3⽤给定的编程语⾔解决每个问题。我们观察到,在提⽰中添加通⽤的良好编程规则可以提⾼⽣成的解决⽅案质量。此外,我们发现要求模型在注释中解释其思维过程是有帮助的。
-
正确性分析:⽣成解决⽅案后,认识到其正确性并⾮保证是⾄关重要的,将不正确的解决⽅案包含在微调数据集中可能会损害模型的质量。虽然我们不能完全确保正确性,但我们开发了近似⽅法。为实现此⽬的,我们提取⽣成解决⽅案的源代码,并应⽤了静态和动态分析技术的组合来测试其正确性,包括:
- 静态分析:我们将所有⽣成的代码通过解析器和linter运⾏,以确保语法正确性,捕捉诸如语法错误、使⽤未初始化变量或未导⼊函数、代码⻛格问题、类型错误等错误。
- 单元测试⽣成和执⾏:对于每个问题和解决⽅案,我们提⽰模型⽣成单元测试,在容器化环境中与解决⽅案⼀起执⾏,捕捉运⾏时执⾏错误和⼀些语义错误。
-
错误反馈和迭代⾃我修正:当解决⽅案在任何步骤失败时,我们提⽰模型进⾏修正。提⽰包括原始问题描述、错误的解决⽅案以及来⾃解析器/linter/测试器(stdout、stderr和返回代码)的反馈。在单元测试执⾏失败后,模型可以修复代码以通过现有测试,或修改其单元测试以适应⽣成的代码。只有通过所有检查的对话才包含在最终数据集中,⽤于监督式微调(SFT)。值得注意的是,我们观察到⼤约20%的解决⽅案最初是不正确的,但⾃我修正了,表明模型从执⾏反馈中学到了东西并提⾼了其性能。
-
微调和迭代改进:微调过程在多轮中进⾏,每⼀轮都建⽴在前⼀轮的基础上。每⼀轮之后,模型都会得到改进,为下⼀轮⽣成更⾼质量的合成数据。这种迭代过程允许逐步改进和增强模型的性能。
2.合成数据⽣成:编程语⾔翻译。我们观察到主要编程语⾔(例如,Python/C++)和较少使⽤的编程语⾔(例如,Typescript/PHP)之间的性能差距。这并不令⼈惊讶,因为我们为较少使⽤的编程语⾔的训练数据较少。为缓解这⼀点,我们通过将常⻅编程语⾔的数据翻译成较少使⽤的语⾔来补充现有数据(类似于Chen等⼈(2023年)在推理背景下的做法)。这是通过提⽰Llama 3并通过语法解析、编译和执⾏来确保质量来实现的。图8展⽰了从Python翻译成PHP的合成PHP代码的⽰例。这显著提⾼了较少使⽤语⾔的性能,如MultiPL-E(Cassano等⼈,2023年)基准测试所⽰。
3.合成数据⽣成:回译。为了提⾼某些编码能⼒(例如,⽂档编写、解释),在执⾏反馈对于确定质量不够有信息量的情况下,我们采⽤⼀种替代的多步骤⽅法。使⽤这⼀程序,我们⽣成了⼤约120万个与代码解释、⽣成、⽂档编写和调试相关的合成对话。从我们的预训练数据中,以多种语⾔编写的代码⽚段开始:
- ⽣成:我们提⽰Llama 3⽣成代表我们⽬标能⼒的数据(例如,我们为代码⽚段添加注释和docstrings,或者我们要求模型解释⼀段代码)。
- 回译:然后我们提⽰模型将合成⽣成的数据“回译”到原始代码(例如,我们提⽰模型仅从其⽂档⽣成代码,或者我们要求模型仅从其解释⽣成代码)。
- 筛选:使⽤原始代码作为参考,我们提⽰Llama 3确定输出的质量(例如,我们问模型回译的代码对原始代码的忠实度如何)。然后我们使⽤在SFT中具有最⾼⾃我验证分数的⽣成⽰例。
在拒绝抽样过程中的系统提⽰导向。在拒绝抽样过程中,我们使⽤特定于代码的系统提⽰来提⾼代码可读性、⽂档完整性和具体性。回想,在第7节中,这些数据⽤于微调语⾔模型。图9显⽰了系统提⽰如何帮助提⾼⽣成的代码质量的⼀个⽰例⸺它添加了必要的注释,使⽤了更信息丰富的变量名,节省了内存等。
使⽤执⾏和模型作为裁判信号过滤训练数据。如第4.2.3节所述,我们偶尔会在我们的拒绝抽样数据中遇到质量问题,例如包含错误的代码块。在我们的拒绝抽样数据中检测这些问题并不像在合成代码数据中那样直接,因为拒绝抽样的响应通常包含⾃然语⾔和代码的混合,其中代码可能并不总是预期可执⾏的。(例如,⽤⼾提⽰可能明确要求伪代码或仅对⼀个⾮常⼩的可执⾏程序⽚段进⾏编辑。)为了解决这个问题,我们采⽤了“模型作为裁判”的⽅法,其中早期版本的Llama 3根据两个标准评估并分配⼀个⼆进制(0/1)分数:代码正确性和代码⻛格。我们只保留那些获得2分满分的样本。最初,这种严格的过滤导致了下游基准性能的回归,主要是因为它不成⽐例地移除了具有挑战性提⽰的⽰例。为了抵消这⼀点,我们有策略地修订了⼀些被归类为最具挑战性的编码数据的响应,直到它们满⾜基于Llama的“模型作为裁判”的标准。通过完善这些具有挑战性的问题,编码数据在质量和难度之间实现了平衡,从⽽实现了最佳的下游性能。
4.3.2 多语⾔能⼒
我们描述了我们如何提⾼Llama 3的多语⾔能⼒,包括训练⼀个专家,专⻔针对⼤量多语⾔数据进⾏训练,为德语、法语、意⼤利语、葡萄⽛语、印地语、西班⽛语和泰语来源和⽣成⾼质量的多语⾔指令调整数据,并解决多语⾔语⾔导向的具体挑战,以提⾼我们模型的整体性能。
专家训练。我们的Llama 3预训练数据混合包含的英语标记⽐⾮英语标记多得多。为了收集⾮英语语⾔的更⾼质量⼈类注释,我们通过分⽀预训练运⾏并继续在包含90%多语⾔标记的数据混合上进⾏预训练,来训练⼀个多语⾔专家。然后我们按照第4.1节对这位专家进⾏后训练。这个专家模型随后被⽤来收集⾮英语语⾔的更⾼质量注释,直到预训练完全完成。
多语⾔数据收集。我们的多语⾔SFT数据主要来源于以下描述的来源。总体分布是2.4%⼈类注释,44.2%来⾃其他NLP任务的数据,18.8%拒绝抽样数据,和34.6%翻译推理数据。
- ⼈类注释:我们从语⾔学家和⺟语者那⾥收集⾼质量的、⼿动注释的数据。这些注释主要由代表现实世界⽤例的开放式提⽰组成。
- 来⾃其他NLP任务的数据:为了进⼀步增强,我们使⽤其他任务的多语⾔训练数据,并将其改写成对话格式。例如,我们使⽤来⾃exams-qa(Hardalov等⼈,2020年)和Conic10k(Wu等⼈,2023年)的数据。为了提⾼语⾔对⻬,我们还使⽤GlobalVoices(Prokopidis等⼈,2016年)和Wikimedia(Tiedemann,2012年)的平⾏⽂本。我们使⽤基于LID的过滤和Blaser2.0(Seamless Communication等⼈,2023年)来移除低质量数据。对于平⾏⽂本数据,我们不是直接使⽤双语对,⽽是应⽤了⼀种受Wei等⼈(2022a)启发的多语⾔模板,以更好地模拟翻译和语⾔学习场景中的真实⽣活对话。
- 拒绝抽样数据:我们在⼈类注释提⽰上应⽤拒绝抽样,以⽣成⽤于微调的⾼质量样本,与英语数据的过程相⽐,修改很少:
‒ ⽣成:我们在后训练的早期轮次中探索了随机选择温度超参数的范围0.2−1,以实现多样化⽣成。⾼温下,多语⾔提⽰的响应可能具有创造性和启发性,但也容易不必要的或不⾃然的代码转换。在后训练的最后⼀轮,我们使⽤恒定值0.6来平衡权衡。此外,我们使⽤专⻔的系统提⽰来改善响应格式、结构和⼀般可读性。
‒ 选择:在基于奖励模型的选择之前,我们实施了多语⾔特定的检查,以确保提⽰和响应之间的⾼语⾔匹配率(例如,罗⻢化的印地语提⽰不应期望以印地语天城⽂脚本响应)。
- 翻译数据:我们尽量避免使⽤机器翻译数据来微调模型,以防⽌翻译体(Bizzoni等⼈,2020年;Muennighoff等⼈,2023年)或可能的名称偏⻅(Wang等⼈,2022a)、性别偏⻅(Savoldi等⼈,2021年)或⽂化偏⻅(Ji等⼈,2023年)。此外,我们的⽬标是防⽌模型只接触到根植于英语⽂化背景的任务,这可能⽆法代表我们旨在捕捉的语⾔和⽂化多样性。我们对此做了⼀个例外,并将我们的合成定量推理数据(⻅第4.3.3节详情)翻译,以提⾼⾮英语语⾔中的定量推理性能。由于这些数学问题的语⾔简单性,翻译样本的质量问题很少或没有。我们观察到,通过添加这些翻译数据,在MGSM(Shi等⼈,2022年)上取得了强劲的增⻓。
4.3.3 数学与推理
我们将推理定义为执⾏多步骤计算并得出正确最终答案的能⼒。⼏个挑战指导了我们训练模型在数学推理⽅⾯出类拔萃的⽅法:
-
缺乏提⽰:随着问题的复杂性增加,⽤于监督式微调(SFT)的有效提⽰或问题数量减少。这种稀缺性使得为教授模型各种数学技能⽽创建多样化和具有代表性的培训数据集变得困难(Yu等⼈,2023;Yue等⼈,2023;Luo等⼈,2023;Mitra等⼈,2024;Shao等⼈,2024;Yue等⼈,2024b)。
-
缺乏真实的思考链:有效的推理需要逐步解决⽅案以促进推理过程(Wei等⼈,2022c)。然⽽,通常缺少真实的思考链,这对于指导模型如何逐步分解问题并得出最终答案⾄关重要(Zelikman等⼈,2022)。
-
中间步骤不正确:当使⽤模型⽣成的思考链时,中间步骤可能并不总是正确的(Cobbe等⼈,2021;Uesato等⼈,2022;Lightman等⼈,2023;Wang等⼈,2023a)。这种不准确性可能导致最终答案不正确,需要解决。
-
教会模型使⽤外部⼯具:增强模型以使⽤外部⼯具,如代码解释器,允许它们通过交错代码和⽂本进⾏推理(Gao等⼈,2023;Chen等⼈,2022;Gou等⼈,2023)。这种能⼒可以显著提⾼它们的解决问题能⼒。
-
训练与推理之间的差异:训练期间模型的微调⽅式与推理期间的使⽤⽅式之间通常存在差异。在推理期间,微调模型可能与⼈类或其他模型交互,要求它使⽤反馈改进其推理。确保训练与真实世界使⽤之间的⼀致性对于维持推理性能⾄关重要。
为了应对这些挑战,我们应⽤了以下⽅法:
- 解决提⽰不⾜的问题:我们从数学背景中获取相关的预训练数据,并将其转换为问答格式,然后可⽤于监督式微调。此外,我们确定模型表现不佳的数学技能,并积极从⼈类那⾥获取提⽰,教授模型这些技能。为了促进这⼀过程,我们创建了⼀个数学技能分类(Didolkar等⼈,2024)并要求⼈类相应地提供相关的提⽰/问题。
- ⽤逐步推理痕迹扩充训练数据:我们使⽤Llama
3为⼀组提⽰⽣成逐步解决⽅案。对于每个提⽰,模型产⽣不同数量的⽣成。然后根据正确答案过滤这些⽣成(Li等⼈,2024a)。我们还进⾏⾃我验证,使⽤Llama
3验证特定的逐步解决⽅案是否适⽤于给定问题。这⼀过程通过消除模型未产⽣有效推理痕迹的实例,提⾼了微调数据的质量。 - 过滤错误的推理痕迹:我们训练结果和逐步奖励模型(Lightman等⼈,2023;Wang等⼈,2023a)来过滤训练数据,其中中间推理步骤不正确。这些奖励模型⽤于消除带有⽆效逐步推理的数据,确保微调的⾼质量数据。对于更具挑战性的提⽰,我们使⽤带有学习到的逐步奖励模型的蒙特卡洛树搜索(MCTS)来⽣成有效的推理痕迹,进⼀步提⾼了收集⾼质量推理数据的能⼒(Xie等⼈,2024)。
- 交错代码和⽂本推理:我们提⽰Llama 3通过⽂本推理和相关Python代码的组合来解决推理问题(Gou等⼈,2023)。代码执⾏被⽤作反馈信号,以消除推理链⽆效的情况,确保推理过程的正确性。
- 从反馈和错误中学习:为了模拟⼈类反馈,我们利⽤错误的⽣成(即导致错误推理痕迹的⽣成)并通过提⽰Llama 3产⽣正确的⽣成来进⾏错误纠正(An等⼈,2023b;Welleck等⼈,2022;Madaan等⼈,2024a)。使⽤错误尝试的反馈并纠正它们的迭代过程有助于提⾼模型准确推理并从错误中学习的能⼒。
4.3.4 ⻓⽂本环境
在最后的预训练阶段,我们将Llama 3的上下⽂⻓度从8K令牌扩展到128K令牌(⻅第3.4节以获取更多
详细信息)。类似于预训练,我们发现在微调期间,我们必须仔细调整配⽅,以平衡短⽂本和⻓⽂本
环境的能⼒。
SFT和合成数据⽣成。简单地应⽤我们现有的仅使⽤短⽂本环境数据的SFT配⽅,导致⻓⽂本环境能⼒的显著退化,这突显了在SFT数据混合中纳⼊⻓⽂本环境数据的必要性。然⽽,在实践中,由于阅读冗⻓上下⽂的繁琐和耗时,让⼈类注释这样的⽰例在很⼤程度上是不切实际的,因此我们主要依赖合成数据来填补这⼀空⽩。我们使⽤早期版本的Llama 3基于关键的⻓⽂本环境⽤例⽣成合成数据:(可能是多轮)问答、⻓⽂档摘要和对代码库的推理,并在下⽂中更详细地描述它们。
- 问答:我们从预训练混合中精⼼策划⼀组⻓⽂档。我们将这些⽂档分割成8K令牌的块,并提⽰早期版本的Llama 3模型基于随机选择的块⽣成QA对。在训练期间,整个⽂档被⽤作上下⽂。
- 摘要:我们通过⾸先使⽤我们最强的Llama 3; 8K上下⽂模型对8K输⼊⻓度的块进⾏摘要,然后对摘要进⾏摘要,来应⽤⻓⽂本环境⽂档的分层摘要。在训练期间,我们提供完整⽂档,并提⽰模型在保留所有重要细节的同时摘要⽂档。我们还基于⽂档摘要⽣成QA对,并⽤需要对整个⻓⽂档有全局理解的问题提⽰模型。
- 长文本环境代码推理:我们解析Python⽂件以识别import语句并确定它们的依赖关系。从这⾥,我们选择最常依赖的⽂件,特别是⾄少被其他五个⽂件引⽤的⽂件。我们从存储库中移除其中⼀个关键⽂件,并提⽰模型识别依赖于缺失⽂件的⽂件,并⽣成必要的缺失代码。 我们根据序列⻓度(16K、32K、64K和128K)进⼀步对这些合成⽣成的样本进⾏分类,以便更细粒度地针对输⼊⻓度进⾏定位。通过仔细的消融,我们观察到将0.1%的合成⽣成的⻓⽂本环境数据与原始短⽂本环境数据混合使⽤,可以在短⽂本环境和⻓⽂本环境基准测试中优化性能。 DPO。我们观察到,只要SFT模型适合⻓⽂本环境任务,仅使⽤短⽂本环境训练数据在DPO中就不会对⻓⽂本环境性能产⽣负⾯影响。我们怀疑这是由于我们的DPO配⽅⽐SFT有更少的优化步骤。鉴于这⼀发现,我们在⻓⽂本环境SFT检查点之上保持标准的短⽂本环境DPO配⽅。
4.3.5 ⼯具使用
教会⼤型语⾔模型(LLMs)使⽤⼯具,如搜索引擎或代码解释器,极⼤地扩展了它们能够解决的任务范围,将它们从纯聊天模型转变为更通⽤的助⼿(Nakano等⼈,2021;Thoppilan等⼈,2022;Parisi等⼈,2022;Gao等⼈,2023;Mialon等⼈,2023a;Schick等⼈,2024)。我们训练Llama 3与以下⼯具进⾏交互:
- 搜索引擎。Llama 3被训练使⽤Brave Search7来回答超出其知识截⽌⽇期的近期事件问题,或需要从⽹络检索特定信息的问题。
- Python解释器。Llama 3可以⽣成并执⾏代码以执⾏复杂计算,读取⽤⼾上传的⽂件,并基于这些⽂件执⾏任务,如问答、摘要、数据分析或可视化。
- 数学计算引擎。Llama 3可以使⽤Wolfram Alpha API8更准确地解决数学、科学问题,或从Wolfram的数据库检索准确信息。⽣成的模型能够在聊天设置中使⽤这些⼯具来解决⽤⼾的查询,包括多轮对话。如果查询需要多次⼯具调⽤,模型可以编写逐步计划,按顺序调⽤⼯具,并在每次⼯具调⽤后进⾏推理。
我们还提⾼了Llama 3的零样本⼯具使⽤能⼒⸺在上下⽂中,可能是未⻅过的潜在⼯具定义和⽤⼾查询,我们训练模型⽣成正确的⼯具调⽤。
实现。我们实现我们的核⼼⼯具为具有不同⽅法的Python对象。零样本⼯具可以作为具有描述、⽂档(即,如何使⽤它们的⽰例)的Python函数实现,模型只需要函数的签名和⽂档字符串作为上下⽂来⽣成适当的调⽤。我们还将函数定义和调⽤转换为JSON格式,例如,⽤于Web API调⽤。所有⼯具调⽤都由Python解释器执⾏,该解释器必须在Llama 3系统提⽰中启⽤。核⼼⼯具可以在系统提⽰中单独启⽤或禁⽤。
数据收集。与Schick等⼈(2024)不同,我们依赖⼈类注释和偏好来教会Llama 3使⽤⼯具。与通常在Llama 3中使⽤的后训练管道有两个主要区别:
-
对于⼯具,对话通常包含不⽌⼀条助⼿消息(例如,调⽤⼯具和推理⼯具输出)。因此,我们在消息级别进⾏注释以收集细致的反馈:注释者在两个具有相同上下⽂的助⼿消息之间提供偏好,或者,如果两者都包含主要问题,则编辑其中⼀条消息。选择或编辑的消息随后被添加到上下⽂中,对话继续。这为助⼿调⽤⼯具的能⼒和对⼯具输出进⾏推理提供了⼈类反馈。注释者不能对⼯具输出进⾏排名或编辑。
-
我们不执⾏拒绝抽样,因为我们在我们的⼯具基准测试中没有观察到增益。为了加速注释过程,我们⾸先通过在先前Llama 3检查点上微调合成⽣成的数据来引导基本⼯具使⽤能⼒。因此,注释者需要进⾏的编辑较少。同样,随着Llama 3在开发过程中逐渐改进,我们逐渐复杂化我们的⼈类注释协议:我们从单轮⼯具使⽤注释开始,然后转移到对话中的⼯具使⽤,最后注释多步⼯具使⽤和数据分析。
⼯具数据集。为了创建⼯具使⽤应⽤的数据,我们采⽤以下程序:
- 单步⼯具使⽤:我们⾸先通过少量样本⽣成合成⽤⼾提⽰,这些提⽰在构建时就需要调⽤我们的核⼼⼯具之⼀(例如,超出我们知识截⽌⽇期的问题)。然后,仍然依赖少量样本⽣成,我们为这些提⽰⽣成适当的⼯具调⽤,执⾏它们,并将输出添加到模型的上下⽂中。最后,我们再次提⽰模型根据⼯具的输出⽣成对⽤⼾查询的最终答案。我们最终得到以下形式的轨迹:系统提⽰、⽤⼾提⽰、⼯具调⽤、⼯具输出、最终答案。我们还筛选了这个数据集的⼤约30%,以移除⽆法执⾏的⼯具调⽤或其他格式问题。
- 多步⼯具使⽤:我们遵循类似的协议,⾸先⽣成合成数据以教授模型基本的多步⼯具使⽤能⼒。为此,我们⾸先提⽰Llama 3⽣成⾄少需要两次⼯具调⽤的⽤⼾提⽰,这些可以是来⾃我们核⼼集合的相同或不同的⼯具。然后,基于这些提⽰,我们少量样本提⽰Llama 3⽣成⼀个解决⽅案,该⽅案由交错的推理步骤和⼯具调⽤组成,类似于ReAct(Yao等⼈,2022)。⻅图10,展⽰Llama 3执⾏涉及多步⼯具使⽤的任务的⽰例。
- 文件上传:我们注释以下文件类型:.txt、.docx、.pdf、.pptx、.xlsx、.csv、.tsv、.py、.json、.jsonl、
.html、.xml。我们的提⽰基于提供的⽂件,并要求概述⽂件内容、查找和修复错误、优化代码⽚段、执⾏数据分析或可视化。⻅图11,展⽰Llama 3执⾏涉及⽂件上传的任务的⽰例。 在对这个合成数据进⾏微调后,我们在多种具有挑战性的场景中收集⼈类注释,包括多轮交互、超过三个步骤的⼯具使⽤,以及⼯具调⽤没有得到满意答案的情况。我们⽤不同的系统提⽰增强我们的合 成数据,以教会模型仅在激活时使⽤⼯具。为了训练模型避免对简单查询调⽤⼯具,我们还添加了来⾃简单数学或问答数据集(Berant等⼈,2013;Koncel-Kedziorski等⼈,2016;Joshi等⼈,2017;Amini等⼈,2019)的查询及其响应,但没有使⽤⼯具,但在系统提⽰中激活了⼯具。
零样本⼯具使⽤数据。我们通过在⼤量多样的部分合成数据集(函数定义、⽤⼾查询、相应的调⽤)上微调,提⾼Llama 3的零样本⼯具使⽤能⼒(也称为函数调⽤)。我们在⼀组未⻅过的⼯具上评估我们的模型。
• 单⼀、嵌套和并⾏函数调⽤:调⽤可以是简单的,嵌套的,即我们把⼀个函数调⽤作为另⼀个函数
的参数传递,或者是并⾏的,即模型返回⼀系列独⽴的函数调⽤。⽣成多样化的函数、查询和真实
情况可能具有挑战性(Mekala等⼈,2024),我们依靠挖掘Stack(Kocetkov等⼈,2022)来使
我们的合成⽤⼾查询基于真实函数。更具体地说,我们提取函数调⽤及其定义,进⾏清理和筛选,
例如缺失⽂档字符串或不可执⾏的函数,并使⽤Llama 3⽣成与函数调⽤相对应的⾃然语⾔查询。
• 多轮函数调⽤:我们还为带有函数调⽤的多轮对话⽣成合成数据,遵循Li等⼈(2023b)提出的协
议。我们使⽤多个代理⽣成领域、API、⽤⼾查询、API调⽤和响应,同时确保⽣成的数据涵盖多样
化的领域和现实的API。所有代理都是以不同⽅式提⽰的Llama 3的变体,根据它们的⻆⾊进⾏协
作,并以逐步的⽅式进⾏。
4.3.6 事实性
幻觉对于⼤型语⾔模型来说仍然是⼀个主要挑战。模型往往过于⾃信,即使在它们知之甚少的领域也是如此。尽管存在这些不⾜,它们仍常被⽤作知识库,这可能导致诸如错误信息传播这样的⻛险结果。虽然我们认识到事实性可以超越幻觉,但在这⾥我们采取了以幻觉为先的⽅法。
我们遵循的原则是,后训练应该使模型与“知道⾃⼰知道什么”对⻬,⽽不是增加知识(Gekhman等⼈,2024;Mielke等⼈,2020)。我们的主要⽅法涉及⽣成数据,使模型⽣成与预训练数据中存在的事实数据⼦集对⻬。为了实现这⼀点,我们开发了⼀种利⽤Llama 3上下⽂能⼒的知识探测技术。这个数据⽣成过程包括以下步骤:
- 从预训练数据中提取数据⽚段。
- 通过提⽰Llama 3⽣成关于这些⽚段(上下⽂)的事实性问题。
- 从Llama 3获取问题的回答样本。
- 使⽤原始上下⽂作为参考,以Llama 3为裁判,对⽣成的正确性进⾏评分。
- 使⽤Llama 3为裁判,对⽣成的信息性进⾏评分。
- 对于在⽣成中⼀贯信息丰富但不正确的回答,使⽤Llama 3⽣成拒绝回答。
我们使⽤从知识探测⽣成的数据⿎励模型只回答它所知道的问题,并拒绝回答它不确定的问题。此外,预训练数据并不总是事实⼀致或正确的。因此,我们还收集了有限的标记事实性数据,这些数据涉及存在事实⽭盾或错误陈述的敏感话题。
4.3.7 可引导性
可引导性是将模型的⾏为和结果引导⾄满⾜开发者和⽤⼾规范的能⼒。由于Llama 3是⼀个通⽤的基础模型,它应该是最容易引导⾄不同的下游⽤例的。对于Llama 3,我们专注于通过系统提⽰和⾃然语⾔指令增强其可引导性,特别是在回答⻓度、格式、语⽓和⻆⾊/个性⽅⾯。
数据收集。我们通过要求注释者为Llama 3设计不同的系统提⽰,在通⽤英语类别内收集可引导性偏好样本。然后,注释者与模型进⾏对话,评估它们在对话过程中遵循系统提⽰中定义的指令的⼀致性。
我们在下⾯展⽰了⼀个⽤于增强可引导性的定制系统提⽰⽰例:
- 你是⼀个乐于助⼈且开朗的AI聊天机器⼈,充当忙碌家庭的饮⻝计划助⼿。这个家庭由2位成年 ⼈、3位⻘少年和2位学龄前⼉童组成。每次计划两到三天,并使⽤剩余的⻝物或额外的⻝材为第⼆天的计划。⽤⼾会告诉你他们想要两天还是三天的计划。如果他们没有说,假设是三天。每个计划应包括早餐、午餐、⼩吃和晚餐。询问⽤⼾是否批准计划或需要调整。在他们批准后,提供⼀份考虑到家庭规模的购物清单。始终牢记家庭的喜好,如果有些东西他们不喜欢,就提供替代品。如果⽤⼾没有灵感,就问问他们本周最想去哪⾥度假,然后根据那个地⽅的⽂化建议餐点。周末的餐点可以更复杂。⼯作⽇的餐点应该是快速且容易的。对于早餐和午餐,优选像⻨⽚、带预先煮熟的培根的英国松饼和其他快速且容易的⻝物。这个家庭很忙。确保询问他们是否有像咖啡或能量饮料这样的必需品和最喜欢的东西,这样他们就不会忘记购买。记得要考虑到预算,除⾮是特殊场合。
建模。在我们收集了偏好数据后,我们利⽤这些数据在奖励建模、拒绝抽样、SFT和DPO中,以增强Llama 3的可引导性。