目录
[4. 后训练](#4. 后训练)
[4.1 建模](#4.1 建模)
[4.1.1 聊天对话格式](#4.1.1 聊天对话格式)
[4.1.2 奖励建模](#4.1.2 奖励建模)
[4.1.3 监督微调(Supervised Finetuning)](#4.1.3 监督微调(Supervised Finetuning))
[4.1.4 直接偏好优化(Direct Preference Optimization)](#4.1.4 直接偏好优化(Direct Preference Optimization))
[4.1.5 模型平均(Model Averaging)](#4.1.5 模型平均(Model Averaging))
[4.1.6 迭代训练轮次(Iterative Rounds)](#4.1.6 迭代训练轮次(Iterative Rounds))
[4.2 后训练数据(Post-training Data)](#4.2 后训练数据(Post-training Data))
[4.2.1 偏好数据(Preference Data)](#4.2.1 偏好数据(Preference Data))
[4.2.2 SFT 数据(监督微调数据)](#4.2.2 SFT 数据(监督微调数据))
[4.2.3 数据处理与质量控制(Data Processing and Quality Control)](#4.2.3 数据处理与质量控制(Data Processing and Quality Control))
[数据清理(Data Cleaning)](#数据清理(Data Cleaning))
[数据剪枝(Data Pruning)](#数据剪枝(Data Pruning))
[4.3 特殊能力(Capabilities)](#4.3 特殊能力(Capabilities))
[4.3.1 代码能力(Code)](#4.3.1 代码能力(Code))
[专家训练(Expert Training)](#专家训练(Expert Training))
[合成数据生成(Synthetic Data Generation)](#合成数据生成(Synthetic Data Generation))
[合成数据生成:执行反馈(Execution Feedback)](#合成数据生成:执行反馈(Execution Feedback))
[合成数据生成:编程语言翻译(Programming Language Translation)](#合成数据生成:编程语言翻译(Programming Language Translation))
[系统提示引导(System Prompt Steering)在拒绝采样中的应用](#系统提示引导(System Prompt Steering)在拒绝采样中的应用)
[4.3.2 多语言能力(Multilinguality)](#4.3.2 多语言能力(Multilinguality))
[专家模型训练(Expert Training)](#专家模型训练(Expert Training))
[多语言数据收集(Multilingual Data Collection)](#多语言数据收集(Multilingual Data Collection))
[4.3.3 数学与推理能力(Math and Reasoning)](#4.3.3 数学与推理能力(Math and Reasoning))
[4.3.4 长上下文(Long Context)](#4.3.4 长上下文(Long Context))
[SFT 和合成数据生成](#SFT 和合成数据生成)
[4.3.5 工具使用(Tool Use)](#4.3.5 工具使用(Tool Use))
[4.3.6 准确性(Factuality)](#4.3.6 准确性(Factuality))
[4.3.7 可控性(Steerability)](#4.3.7 可控性(Steerability))
4. 后训练
通过后训练(post-training)来对Llama 3模型进行优化,使其更好地对齐人类的需求和反馈。具体步骤如下:
-
后训练过程:Llama 3模型的对齐是通过多个后训练阶段完成的,这些阶段在预训练模型的基础上应用,每一轮后训练都包含两部分:监督微调(SFT)和直接偏好优化(DPO)。
-
监督微调( SFT ):监督微调是通过使用标注好的数据对预训练的模型进行调整,让模型能更好地理解特定任务或指令。
-
直接偏好优化(DPO):在监督微调后,使用直接偏好优化进一步调整模型的行为。这个过程通过优化模型生成的文本,使其更符合人类偏好,可以根据人类反馈或生成的合成数据进行调整。
-
数据来源:后训练的数据来源可以是人工标注的数据,也可以是通过合成生成的数据。这些数据在训练过程中起到至关重要的作用,帮助模型进行更精确的优化。
-
定制数据策划策略:文中提到将进一步在第4.3节中详细描述一些定制化的数据策划策略,目的是在多个领域提高模型的表现,包括推理能力、编程能力、事实准确性、多语言支持、工具使用、长上下文处理以及精确执行指令等。
4.1 建模
我们后训练策略的核心是奖励模型和语言模型。我们首先在预训练的检查点上,使用人类标注的偏好数据(见第4.1.2节)训练一个奖励模型。然后,我们通过监督微调(SFT;见第4.1.3节)进一步微调预训练的检查点,并使用直接偏好优化(DPO;见第4.1.4节)进一步调整这些检查点。这个过程如图7所示。除非另有说明,我们的建模过程适用于Llama 3 405B,为了简便起见,我们将其称为Llama 3。
图表解读
收集提示(Collected Prompts)
-
后训练流程从提示(prompts)的收集开始,这些提示可以是问题、任务说明或需要模型生成输出的输入。
-
K Generations per Prompt:对于每个提示,模型会生成多个回答(K个回答),这些生成的答案作为初步的数据来源。
奖励模型训练(Reward Model Training)
-
**奖励模型(Reward Model)**的目标是对模型生成的回答进行评估,以帮助筛选出更符合人类偏好的回答。
-
数据来源:奖励模型的训练数据来自"配对标注和按能力分类的二进制偏好数据"(Pairwise Annotated and Specialized Per-Capability Binary Preference Data)。这些数据是人类标注的,表明两个回答中哪个更好。
-
奖励模型完成训练后,可以对生成的回答打分,为后续的采样和筛选提供依据。
拒绝采样(Rejection Sampling)
-
目的:通过奖励模型对生成的回答进行筛选,从多个候选回答中挑选出质量较高的回答。
-
筛选后的优质回答被用来生成监督微调数据( SFT Data),这些数据用于下一步的监督微调。
监督微调( SFT , Supervised Finetuning)
-
筛选出的SFT数据被用来训练监督微调模型(SFT Model),其目的是让模型能够更好地理解和生成符合任务需求的回答。
-
这里还强调了按能力分类的微调数据(Specialized Per-Capability SFT Data),这是针对特定任务能力(例如推理、语言生成、多语言支持等)设计的专门数据集,用以提升模型在这些领域的表现。
直接偏好优化(DPO, Direct Preference Optimization )
-
SFT 模型 经过训练后,会进一步通过DPO训练来优化模型输出,使其更符合人类的偏好。
-
DPO的作用:直接根据偏好数据调整模型的行为,不仅考虑模型生成内容的正确性,还注重输出的自然性和用户体验。
最终DPO模型和循环优化
-
经过DPO训练后的模型会成为最终DPO模型(Final DPO Model)。
-
如果需要进一步优化,这个最终模型会作为下一轮训练的起点("Best models from previous rounds"),通过重复这个流程,逐步提升模型性能。
4.1.1 聊天对话格式
为了调优大型语言模型(LLM)以实现人机交互,我们需要定义一种聊天对话协议,以帮助模型理解人类指令并执行对话任务。与前代模型相比,Llama 3 增强了如工具使用(第 4.3.5 节)等新功能,这可能需要生成多个消息并在单个对话回合中将它们发送到不同的地方(例如,用户,ipython)。为了支持这一点,我们设计了一种新的多消息聊天协议,使用各种特殊的头部和结束符号。头部符号用于指示对话中每条消息的源和目的地。同样,结束符号表示何时该轮到人类和 AI 交替发言。
协议设计:
-
为了支持这种复杂的操作,研究者设计了一种新的"多消息协议"。这种协议通过使用特定的"符号"来区分不同的信息流和对话的阶段。
-
头部符号:告诉模型消息是从哪里来,要发到哪里(比如从AI发给用户,或者从AI发给代码执行环境)。
-
结束符号:告诉模型什么时候该轮到人类说话,什么时候该AI发言。
-
为什么需要这个协议:
- Llama 3能够做更多事情,比如调动工具、获取外部信息等,这样就需要在一次对话中处理多个消息。通过这个协议,AI可以知道如何处理这些消息,确保对话有序并且流畅。
4.1.2 奖励建模
- 奖励模型(Reward Model)是什么?
奖励模型(RM)是用来帮助AI模型判断哪些回答是好的,哪些是差的,并根据这些判断来调整模型的行为。在训练AI时,我们希望它能生成更优的回答,而奖励模型就是让AI通过反馈(比如"这个回答好,那个回答差")来学习如何做出更好的选择。
- 训练过程的简化
-
传统的做法是通过偏好对(preference pairs)来训练模型。一个偏好对包含两个响应,一个是"好的"(选择的回答),另一个是"差的"(被拒绝的回答)。训练时,模型会通过比较这两个回答,来学习如何选择更好的回答。
-
编辑后的响应:除了"选择的"和"被拒绝的"回答外,还可能有一个额外的"编辑后的"回答。这是对"选择的"回答进行进一步改进得到的。这样,模型就有了三种回答:
-
编辑后的响应(最好)
-
选择的响应(较好)
-
被拒绝的响应(差)
-
- 举个例子:
假设我们正在训练一个AI助手,它需要生成一个关于"天气"问题的回答。
假设的对话示例:
用户提问:"今天的天气怎么样?"
AI模型给出了三个不同的回答:
编辑后的回答(最好): "今天的天气晴,气温在25℃左右,适合外出活动。根据气象预报,全天不会有降雨。"
选择的回答(较好): "今天晴,气温约25℃,适合外出活动。"
被拒绝的回答(差): "今天天气很差,气温25℃左右,适合在家待着。"
训练过程:
在训练时,模型会用这些数据来训练它如何区分不同的回答质量。具体来说:
-
偏好对:首先,模型会把"选择的回答"和"被拒绝的回答"进行比较,训练模型识别哪个更好(即哪个是正确的或更合适的回答)。
-
编辑后的回答:然后,模型还会比较"编辑后的回答"和"选择的回答",进一步理解什么样的回答是最理想的。
- 去除边际项的原因
在过去的训练过程中,可能会使用一种叫做边际项(margin term)的技术,目的是让模型在判断哪个回答更好时有一个明确的得分差距。但实验发现,当数据量变大时,这种方法的效果逐渐减弱,甚至没有什么改进,反而增加了训练的复杂度。
因此,去除边际项后,模型变得更加灵活,它不再需要强制区分"好"与"差"之间的得分差距,而是通过数据本身来学习怎样区分不同的回答。这样,模型可以更高效地进行训练。
- 如何训练模型?
-
他们把每个提示 (比如"今天的天气怎么样?")和多个响应 (即上述的三种回答)合并成一行数据,随机打乱顺序进行训练。
-
这种做法的目的是让模型能够更高效地学习,而不是按传统方法把每个回答放在单独的行中进行训练。
- 总结:
-
奖励模型是用来帮助AI学习哪些回答是好的,哪些是差的。
-
在训练中,AI会通过对比多个回答(包括编辑后的、选择的和被拒绝的)来提高选择的准确性。
-
去掉边际项是为了提高训练效率,因为随着数据规模增大,边际项的效果逐渐减弱。
-
训练时,随机打乱回答顺序,让模型更加高效地学习。
4.1.3 监督微调(Supervised Finetuning)
奖励模型和拒绝采样:
-
奖励模型是一个用来评估和选择模型输出质量的工具。我们希望从一组模型生成的输出中选择最好的部分。
-
拒绝采样 (Rejection Sampling)是用来从多个生成的回答中筛选出较好的那些。具体做法是根据奖励模型对输出的评价,丢弃评分较低的回答,只保留评分高的那些。
举个例子:
- 假设我们让模型生成3个回答:"今天是晴天"、"今天有点阴天"、"今天下雨"。然后,我们让奖励模型评估这些回答的质量,可能发现"今天下雨"不太符合实际情况,所以我们就丢弃这个回答,只保留另外两个作为训练数据。
数据源 的混合:
-
除了通过拒绝采样得到的高质量样本,训练数据还会包括其他来源的数据。这里提到的合成数据指的是通过一些自动化方法生成的训练数据,可能并非人工标注,但能够补充模型的训练过程。
-
数据混合意味着我们将这些不同来源的数据放在一起使用,以提高训练效果。
使用 交叉熵 损失进行训练:
- 交叉熵 损失 是评估模型预测结果的标准方式。它用来衡量模型生成的回答与实际目标之间的差异。在这阶段,模型的目标是预测一个目标token (即最终生成的答案部分),而提示token(例如用户的提问)不需要被计算在内。
监督微调:
-
监督微调(SFT)指的是在预训练模型的基础上,用新数据对模型进行训练,从而让模型更加适应某个特定任务。
-
这里提到的"即使很多训练目标是由模型生成的"意味着,即使数据的标签部分(例如正确的答案)是由模型生成的,训练仍然可以进行。
超参数 设置:
-
训练过程中的"超参数 "是一些控制模型训练的参数,比如学习率和训练步数。这里提到的学习率为10^-5,意味着每次更新模型参数时的幅度比较小,帮助模型平稳地调整。
-
训练步数指的是模型训练的次数,这里提到的是8,500到9,000步。在每一步中,模型会逐步优化。
4.1.4 直接偏好优化(Direct Preference Optimization)
我们进一步通过直接偏好优化 (DPO,Rafailov等,2024)对我们的SFT模型进行训练,以实现与人类偏好的对齐。在训练过程中,我们主要使用从之前对齐轮次中表现最好的模型收集到的最新一批偏好数据 。因此,我们的训练数据更符合在每一轮中优化的策略模型的分布。我们还尝试过像PPO(Schulman等,2017)这样的在线策略算法,但发现DPO在大规模模型上需要更少的计算资源,并且在指令 跟随基准测试(如IFEval,Zhou等,2023)上表现更好。
对于Llama 3,我们使用学习率为10^-5,并将β超参数设置为0.1。此外,我们对DPO进行了以下算法修改:
-
在DPO损失中屏蔽格式化token :我们在损失计算中屏蔽了选择的和被拒绝的回答中的特殊格式化token(包括头部token和终止token,见4.1.1节),以稳定DPO训练。我们观察到,如果这些token参与损失计算,可能会导致模型出现不希望的行为,比如重复生成尾部内容或突然生成终止token。我们推测这是由于DPO损失的对比性质------在选择的和被拒绝的回答中都有相同的token,导致了冲突的学习目标,因为模型需要同时增加和减少这些token的可能性。
-
使用NLL损失进行 正则化 :我们在选择的序列上加入了一个额外的负对数似然(NLL)损失项,其缩放系数为0.2,类似于Pang等(2024)的做法。这有助于进一步稳定DPO训练,通过保持生成的格式化要求,并防止选择的回答的对数概率下降(Pang等,2024;Pal等,2024)。
4.1.5 模型平均(Model Averaging)
最后,我们将通过不同版本的数据或超参数在每个RM、SFT或DPO阶段获得的模型进行平均(Izmailov et al., 2019; Wortsman et al., 2022; Li et al., 2022)。
这个表格(Table 6)展示了 Llama 3 的人类偏好数据 的统计信息。这些数据是通过人类标注员与模型进行多轮对话时收集的,旨在帮助模型在不同任务(如通用语言、代码、推理等)上进行更好的对齐优化。
4.1.6 迭代训练轮次(Iterative Rounds)
和 Llama 2 的方法类似,我们将上述方法应用到六个迭代训练轮次中。在每一轮中,我们会收集新的偏好标注(preference annotations)和监督微调(SFT)数据,并从最新的模型中抽样生成的合成数据(synthetic data)。
这段话描述了 Llama 3 的训练流程 是一个迭代的过程,通过多轮次(循环)的训练,不断优化模型的性能。以下是更具体的解释:
每一轮的主要步骤:
在每一轮训练中,以下几个关键步骤会重复进行:
-
收集新的人类偏好标注(Preference Annotations):
-
人类标注员与模型交互,对模型的回答进行评价。
-
例如,标注员会给出回答的偏好排序(哪个回答更好)或直接指出"选择的"和"被拒绝的"回答。
-
-
收集新的监督微调( SFT )数据:
-
SFT 数据是带标签的数据,通常由人类标注员生成或标注,用于让模型更好地完成任务。
-
每一轮会根据模型的表现调整数据集,确保模型的能力逐渐接近人类期望。
-
-
使用最新模型生成 合成数据 ( Synthetic Data ):
-
合成数据是通过当前模型生成的。例如,最新的模型可以生成一些高质量的回答,这些生成的回答可以作为额外的训练数据。
-
意义:通过模型自己生成的数据,可以补充真实标注数据,尤其是在数据量较少的场景下。
-
-
模型优化:
-
使用新的偏好数据、SFT数据和合成数据进一步优化模型。
-
在这一轮优化后,模型性能得到提升,并为下一轮的训练提供更强大的基础。
-
为什么使用多轮次训练?
多轮训练的好处在于:
-
逐步改进模型:每一轮都会用更高质量的数据进行训练,使模型逐渐改善。
-
第一轮:模型可能还比较"粗糙",但通过人类的标注和偏好指导,模型会开始生成更符合期望的内容。
-
后续轮次:随着人类标注的反馈积累和模型能力的提升,生成的数据质量越来越高,模型表现也会越来越好。
-
-
高效利用数据:每一轮都会引入新的数据,同时使用上一轮模型生成的高质量数据,避免模型过度依赖初始数据。
-
动态调整模型能力:每一轮训练可以根据模型的不足之处调整数据和训练目标,例如为弱项任务(如推理、多语言)补充更多数据。
总结这个过程:
-
多轮次迭代训练是一个逐步优化的过程。
-
每一轮都会收集:
-
偏好标注数据(人类选择或排序的结果)。
-
监督微调数据(明确的输入-输出对)。
-
合成数据(模型生成的内容)。
-
-
每一轮都会利用上一轮的成果(例如更好的模型、更高质量的数据)来进一步优化。
-
经过多轮次(这里是六轮)的迭代后,模型的能力会更加稳定且强大。
4.2 后训练数据(Post-training Data)
后训练数据的组成对语言模型的实用性和行为有着关键影响。在本节中,我们将讨论人类标注程序和偏好数据的收集(4.2.1节)、SFT(监督微调)数据的组成(4.2.2节),以及数据质量控制和清理的方法(4.2.3节)。
4.2.1 偏好数据(Preference Data)
偏好数据的收集与标注过程:
-
如何采样:
-
每次训练后,从多个模型中选取两个回答进行比较,这些模型可能基于不同数据或方法训练,从而具备不同能力。
-
这种方法增加了数据的多样性,比如一个模型在代码能力上强,而另一个在通用语言能力上强。
-
-
标注过程:
编辑步骤:
-
标注员会评估两个回答中哪个更好,并根据偏好程度分为四个等级:
-
明显更好:差距非常明显。
-
更好:有一定差距。
-
稍微更好:差距较小。
-
几乎一样好:两者质量几乎相同。
-
-
在标注员选择了"更好的回答"后,他们还需要对其进行优化:
-
直接编辑:标注员可以修改回答,使其更自然或更准确。
-
提示模型改进:标注员给出反馈(比如"需要更清晰地说明气温"),让模型重新生成更好的回答。
-
-
最终的数据结构:
- 有些数据不仅包含"选择的"和"被拒绝的"回答,还会包含"编辑后的回答"。这样每个数据样本可能有三种排序:编辑后的 > 选择的 > 被拒绝的。
-
数据统计与趋势:
-
任务复杂性提升:
- 与 Llama 2 相比,Llama 3 的提示(Prompt)和回答(Response)长度更长,表明模型的任务复杂度增加了。例如,可能不仅是简单的问题回答,而是涉及更复杂的逻辑推理或跨语言生成。
-
通用英语数据的范围更广:
- 通用英语任务不仅仅是单一的对话,还包括知识问答、精准指令执行等,覆盖了广泛的实际应用场景。
数据的 质量控制 :
-
数据收集完成后会进行质量分析,确保数据可靠:
-
改进提示:通过分析标注数据和模型表现,逐步调整用户提示的复杂性。
-
人类评估:标注员对数据质量进行人工评估,确保最终数据的高质量。
-
偏好数据的用途:
-
奖励建模(Reward Modeling):
- 所有偏好数据都用于训练奖励模型,奖励模型可以评估生成回答的好坏。
-
DPO 训练(Direct Preference Optimization ):
- 只使用最新一批高质量数据用于 DPO 优化,因为 DPO 直接调整模型参数,侧重当前的任务对齐。
-
丢弃"相似"的回答:
- 对于"选择的回答"和"被拒绝的回答"质量差不多的样本会被丢弃,因为它们不能提供有效的训练信号(模型无法学到清晰的偏好)。
总结:
-
偏好数据收集流程:
-
比较两个模型回答,让人类标注员评估哪一个更好。
-
标注结果分为四个等级,还加入编辑步骤进一步优化选择的回答。
-
-
数据使用方法:
-
偏好数据用于奖励建模,帮助模型更好地评估回答质量。
-
最新的高质量数据用于 DPO 训练,直接优化模型输出。
-
-
目标:
- 通过多轮迭代不断改进数据质量和模型能力,使得 Llama 3 能够在更复杂的任务上表现出色。
4.2.2 SFT 数据(监督微调数据)
我们的微调数据主要由以下来源组成:
-
来自人类标注数据的提示和通过拒绝采样得到的回答。
-
针对特定能力生成的 合成数据(详情见 4.3 节)。
-
少量人工精挑细选的数据(详情见 4.3 节)。
随着后训练轮次的推进,我们开发了更强大的 Llama 3 版本,并利用这些版本收集更大规模的数据集,涵盖了广泛的复杂能力。在本节中,我们讨论了拒绝采样程序的细节以及我们最终 SFT 数据混合的整体组成。
拒绝采样( RS ):
-
采样过程:
-
模型根据一个提示生成 K个回答。
-
使用奖励模型从中挑选最佳回答作为候选数据。
-
-
引导回答:
- 在后期训练中引入系统提示,规范回答的语气、格式和风格。
效率优化(PagedAttention):
-
动态分配键值缓存,确保内存使用高效。
-
共享缓存页面,避免重复存储。
-
通过优化,拒绝采样的吞吐量提高了超过 2 倍。
数据混合(Data Composition):
-
SFT 数据: 用于直接微调模型(明确输入-输出对)。
-
偏好数据: 用于奖励建模和生成优化(对比选择最优回答)。
-
数据分类: 按主题、复杂性和质量分类,高质量数据优先使用,低质量数据降采样。
表格解读
Dataset( 数据类型 ):
这是 SFT 数据中不同类别的任务类型。具体包括:
-
General English:通用英语任务,比如一般的问答或对话。
-
Code:代码相关任务,比如代码生成、代码解释。
-
Multilingual:多语言任务,比如不同语言之间的翻译或生成。
-
Exam-like:类似考试问题的任务,比如解答复杂的逻辑推理问题或选择题。
-
Reasoning and tools:涉及逻辑推理和工具使用的问题,比如数学推理或工具操作指令。
-
Long context:具有非常长上下文的任务,比如需要处理数万 token 的长篇输入。
% of examples(样本比例):
-
每种任务类型在整个 SFT 数据集中所占的比例。
-
通用英语 (General English) 占比最高,为 52.66%,说明模型的训练数据更多集中在一般对话任务上。
-
代码任务 (Code) 占比为 14.89%,是第二大的任务类型。
-
长上下文任务 (Long context) 占比最小,仅为 0.11%,表明这种任务较少。
Avg. # turns(对话轮次平均值):
-
每种任务类型的平均对话轮数(每次任务中,用户和模型交替说话的次数)。
-
通用英语 的对话轮次最多,平均为 6.3,因为普通对话通常包含多个往返的互动。
-
代码任务 和 多语言任务 的对话轮次较低,分别为 2.7,因为这些任务通常是一次性生成一个答案或翻译。
-
长上下文任务 的对话轮次也较高,为 6.7,因为处理复杂上下文时可能需要多轮次互动。
Avg. # tokens(总平均 token 数):
-
每种任务的输入(上下文)和输出(回答)中,所有 token 的平均总数。
-
长上下文任务 的平均 token 数远高于其他任务,为 38,135.6,这是因为这种任务需要处理非常长的上下文。
-
其他任务中,通用英语(974.0 )和代码任务(753.3 )的总 token 数相对较多,而类似考试任务(297.8)的 token 数较少。
Avg. # tokens in context(上下文的平均 token 数):
-
输入上下文部分的平均 token 数。
-
长上下文任务 的上下文平均长度最高,为 37,395.2,显然是为处理长文本专门设计的。
-
通用英语 和 代码任务 的上下文也相对较长,分别为 656.7 和 378.8。
-
类似考试任务 和 多语言任务 的上下文较短,因为这些任务通常需要处理较小的输入。
Avg. # tokens in final response(回答的平均 token 数):
-
模型生成的最终回答的平均 token 数。
-
长上下文任务 的回答 token 数最多,为 740.5,说明即使是长上下文输入,其回答也需要生成较长的内容。
-
代码任务 的回答长度次高,为 374.5,可能是因为生成代码需要较多行输出。
-
类似考试任务 和 多语言任务 的回答相对较短,分别为 173.4 和 289.7。
4.2.3 数据处理与质量控制(Data Processing and Quality Control)
由于我们的大部分训练数据是由模型生成的,因此需要进行仔细的清理和质量控制。
数据清理(Data Cleaning)
在早期的训练轮次中,我们观察到数据中存在一些不理想的模式,例如:
- 过度使用表情符号(emojis)或感叹号(exclamation points)。
为了解决这些问题,我们实施了一系列基于规则的数据移除和修改策略,用来过滤或清理存在问题的数据。例如:
- 针对过度使用"抱歉语气"的问题(如频繁使用"I'm sorry"或"I apologize"),我们会识别这些过度使用的短语,并谨慎调整数据集中此类样本的比例,以保持平衡。
数据 剪枝 (Data Pruning )
方法 1:主题分类
-
使用一个微调过的 Llama 3 8B 模型,将数据按照主题进行分类:
-
粗粒度分类: 比如"数学推理"这样的广泛主题。
-
细粒度分类: 比如"几何和三角"这样具体的子主题。
-
方法 2:质量评分(Quality Scoring)
这是评估样本质量的核心步骤,分为两种方法:
-
奖励模型评分(RM-based scoring):
-
奖励模型会为每个数据样本打分。
-
我们只保留在 最高四分位数 的数据,这些被认为是最优质的样本。
-
-
Llama-based 评分:
-
使用 Llama 3 对样本进行打分,评分标准根据任务类型不同:
-
通用英语任务: 按 准确性 、指令 跟随性 和 语气/表达 三个方面打分,分数为 1~3。
-
代码任务: 按 错误识别 和 用户意图满足 两个方面打分,分数为 1~2。
-
-
获得最高分的样本被视为高质量数据。
-
-
综合评分:
-
虽然奖励模型和 Llama 评分方法常有分歧,但我们结合两种评分信号,以确保召回更多高质量样本。
-
最终保留规则: 样本只要被 任意一种方法 标记为高质量,即可保留。
-
方法 3:难度评分(Difficulty Scoring)
为了让模型学习更复杂的任务,数据会根据难度评分进行筛选:
-
Instag 方法:
- 使用 Llama 3 70B 模型分析每个提示的意图数量。意图数量越多,任务复杂性越高。
-
Llama-based 难度评分:
- 使用三分制对对话难度评分,分数越高表示任务越复杂。
目的:
- 通过难度评分筛选出对模型来说更具挑战性的样本,让模型能学到更复杂的能力。
方法 4:语义去重(Semantic Deduplication)
重复样本会降低训练效率,因此需要去重。具体步骤如下:
-
对话 聚类 :
- 使用 RoBERTa 模型对完整对话进行聚类,将语义相似的对话分到一组。
-
按优先级排序:
- 在每个聚类内,根据样本的 质量评分 × 难度评分 排序,优先考虑高质量、高难度的样本。
-
贪婪选择:
- 遍历排序后的样本,只保留与已选样本的 余弦相似度 小于某个阈值的样本,确保去掉相似的样本。
4.3 特殊能力(Capabilities)
我们特别强调了对以下能力进行改进的努力,包括代码生成(4.3.1节)、多语言能力(4.3.2节)、数学与推理(4.3.3节)、长上下文处理(4.3.4节)、工具使用(4.3.5节)、事实准确性(4.3.6节)、以及可控性(4.3.7节)。
4.3.1 代码能力(Code)
自从 Copilot 和 Codex(Chen 等,2021)发布以来,大语言模型在代码领域引起了广泛关注。开发者们已经普遍使用这些模型来生成代码片段、调试代码、自动化任务以及提升代码质量。对于 Llama 3,我们的目标是改进和评估其在以下高优先级编程语言中的能力,包括:Python、Java、Javascript、C/C++、Typescript、Rust、PHP、HTML/CSS、SQL、bash/shell。我们通过训练代码专家(code expert)、生成用于监督微调(SFT)的合成数据、使用系统提示优化代码格式、以及创建质量过滤器来移除训练数据中的低质量样本,从而改进这些代码能力。
专家训练(Expert Training)
核心目标:
通过训练一个专门的 代码专家模型 来提升模型在代码生成领域的能力,并在后续的训练轮次中为模型提供高质量的代码标注数据。
具体方法:
-
数据量:
- 使用一个包含 1万亿 token 的混合数据 进行训练,其中 85% 是代码数据,确保模型对代码模式有更深入的学习。
-
长上下文处理(16K tokens):
-
在最后的微调阶段,扩展上下文长度至 16K tokens,让模型可以处理更长的代码或项目级别任务。
-
例子:
- 处理整个代码文件或多模块代码的生成和分析。
-
-
后训练步骤:
- 使用 SFT (监督微调) 和 DPO(直接偏好优化) 数据对齐模型,但这些数据主要来自代码任务。
-
拒绝采样:
- 代码专家模型还被用于 筛选最佳代码输出,从而提升代码相关任务的生成质量。
合成数据生成(Synthetic Data Generation)
为什么需要 合成数据 ?
-
人工标注成本高: 人类标注代码需要高水平的专业知识,成本很高且效率低。
-
合成数据 更具规模性: 使用模型生成数据可以覆盖更多场景,降低成本。
如何生成 合成数据 ?
-
发现问题:
-
在实际开发中,发现模型存在以下问题:
-
无法跟随复杂指令。
-
生成的代码包含语法错误。
-
输出结果不符合需求。
-
对代码错误(bugs)修复能力不足。
-
-
-
合成数据 解决问题:
-
使用 Llama 3 和代码专家模型 生成大量 SFT 对话数据,用于微调模型。
-
通过设计特定的指令和数据生成策略,让模型在训练中逐步改善这些问题。
-
-
数据规模:
- 生成了超过 270万条合成样本,涵盖了广泛的代码任务。
合成数据生成:执行反馈(Execution Feedback)
8B 和 70B 模型在使用更强大的模型生成的数据进行训练时显示出显著的性能提升。然而,初步实验表明,当 Llama 3 405B 使用自己生成的数据进行训练时,这种方法并不能提高性能,甚至可能降低模型性能。为了克服这一局限性,我们引入了 执行反馈(execution feedback) 作为事实来源,帮助模型从错误中学习并保持正确轨道。具体来说,我们通过以下流程生成了一个约 100万条合成代码对话的数据集:
问题描述生成(Problem Description Generation):
-
我们首先生成了大量的编程问题描述,这些问题涵盖了广泛的主题,包括长尾分布中的罕见主题。
-
实现方法: 我们从各种来源随机采样代码片段,并提示模型生成受到这些代码片段启发的编程问题,从而构建出多样化且全面的编程问题集合(Wei 等,2024)。
解决方案生成(Solution Generation):
-
接着,我们提示 Llama 3 用指定的编程语言解决这些问题。
-
优化方法: 在提示中加入通用的良好编程规则,提高生成解决方案的质量。此外,要求模型用注释解释其思路也被证明是有效的。
正确性分析(Correctness Analysis):
生成的解决方案并不保证正确性,包含错误的代码可能会影响微调数据集的质量。因此,我们开发了一些方法来近似测试代码的正确性,包括:
-
静态分析(Static Analysis): 将生成的代码通过解析器和代码分析器(linter),以确保语法正确性,捕捉语法错误、未初始化变量、未导入函数、代码风格问题、类型错误等。
-
单元测试生成与执行(Unit Test Generation and Execution): 针对每个问题和解决方案,提示模型生成单元测试,并在容器化环境中执行这些测试,从而捕捉运行时错误和某些语义错误。
错误反馈与自我修正(Error Feedback and Iterative Self-Correction):
-
当某个解决方案在任一步骤中失败时,我们会提示模型进行修改。提示中包括原始问题描述、错误解决方案,以及解析器/代码分析器/测试的反馈(如标准输出、标准错误输出、返回代码)。
-
模型的选择: 如果单元测试失败,模型可以选择修改代码以通过测试,或者修改测试以适配生成的代码。
-
最终数据集: 只有通过所有检查的对话才会被包含到最终的数据集中,用于监督微调(SFT)。
-
观察结果: 我们发现约 20% 的初始解决方案存在错误,但通过执行反馈实现了自我修正,表明模型从反馈中学习并提升了性能。
微调与迭代改进(Fine-tuning and Iterative Improvement):
-
微调过程分为多轮,每轮基于上一轮的结果。每轮训练后,模型生成更高质量的合成数据,用于下一轮训练。
-
效果: 这种迭代过程实现了模型性能的渐进优化。
合成数据生成:编程语言翻译(Programming Language Translation)
我们观察到主要编程语言(如 Python、C++)与较少使用的语言(如 Typescript、PHP)之间存在性能差距。这不足为奇,因为对于不常见的编程语言,我们的训练数据较少。为了解决这个问题,我们通过将常见语言的数据翻译为较少使用的语言来补充现有数据。这种方法类似于 Chen 等(2023)在推理领域中的做法。具体步骤:
-
翻译: 我们提示 Llama 3 将常见编程语言(如 Python)的代码翻译为较少使用的语言(如 PHP)。
-
质量控制 : 我们通过语法解析、编译和执行来确保翻译代码的质量。
-
结果: 这种方法显著提升了较少使用语言的性能,尤其是在 MultiPL-E(Cassano 等,2023) 基准测试中。
合成数据生成:反向翻译(Backtranslation)
对于某些代码能力(如文档生成、代码解释),执行反馈对评估质量的帮助有限。为此,我们使用一种多步骤的替代方法生成数据。这种方法生成了约 120万条与代码解释、生成、文档、调试相关的合成对话。具体步骤如下:
生成(Generate):
-
从预训练数据中的多种语言代码片段开始,我们提示 Llama 3 生成目标能力相关的数据,例如:
-
为代码片段添加注释和文档字符串(docstrings)。
-
要求模型解释一段代码。
-
反向翻译(Backtranslate):
-
我们提示模型将合成的生成数据反向翻译为原始代码,例如:
-
根据文档字符串重新生成代码。
-
根据代码解释重新生成代码。
-
过滤( Filter ):
-
使用原始代码作为参考,提示 Llama 3 评估生成结果的质量,例如:
- 检查反向翻译的代码与原始代码的一致性。
-
我们只保留自验证得分最高的示例用于 SFT。
系统提示引导(System Prompt Steering)在拒绝采样中的应用
总结
-
执行反馈: 强调从错误中学习,通过反馈和自我修正生成高质量数据。
-
编程语言翻译: 补充较少使用语言的数据,缩小语言性能差距。
-
反向翻译: 通过一致性验证,提升代码文档和解释能力。
系统提示引导(System Prompt Steering)在拒绝采样中的应用
在拒绝采样(Rejection Sampling)过程中,我们使用了针对代码的特定系统提示(system prompts),以改善代码的可读性、文档完整性、细致性和具体性。如第7节所述,这些数据最终用于对语言模型进行微调(finetune)。图9 展示了一个示例,说明系统提示如何提升生成代码的质量,比如:
-
增加必要的注释;
-
使用更有意义的变量名;
-
节省内存。
通过执行反馈和"模型判断"信号过滤 训练数据
拒绝采样中的数据问题
-
拒绝采样生成的代码质量不一,部分数据可能包含:
-
语法错误(Syntax Errors):如括号不匹配。
-
风格问题(Style Issues):变量命名不规范。
-
无法执行的代码:某些情况下,用户可能只需要伪代码或部分代码片段,这使得检测这些数据中的错误变得更加困难。
-
"模型判断(Model-as-Judge)" 方法
为解决数据质量问题,我们采用了"模型判断"的方法:
-
评估标准:
-
代码正确性: 代码是否可以正常运行。
-
代码风格: 是否符合良好的编程风格(如变量名是否清晰,是否有必要注释)。
-
-
评分机制:
-
每个标准的分数是 0 或 1。
-
满分为 2 分,只有满分样本才会被保留。
-
筛选过程中遇到的问题
-
初期,严格筛选规则导致大幅移除了包含高难度提示的数据。这些高难度提示通常对模型能力提升有重要作用。
-
结果:模型在某些下游任务中的表现下降。
如何优化?
-
针对性修改数据: 对部分最具挑战性的提示和答案进行调整,使其既符合"模型判断"标准,又能保留这些高难度任务的价值。
-
平衡质量与难度:
-
通过优化这些挑战性问题,确保数据集不仅具有高质量的代码示例,还涵盖了多种复杂任务。
-
效果: 数据质量和任务难度之间达到了平衡,最终提升了模型在下游任务中的表现。
-
4.3.2 多语言能力(Multilinguality)
我们描述了如何提升 Llama 3 的多语言能力,包括:
-
训练一个专门使用大量多语言数据的专家模型;
-
为德语、法语、意大利语、葡萄牙语、印地语、西班牙语和泰语生成高质量的多语言指令微调数据;
-
解决多语言语言引导中的特定挑战,以全面提升模型的表现。
专家模型训练(Expert Training)
Llama 3 的预训练数据中,英文 token 数量显著多于非英文 token。为了在非英文语言中收集更高质量的人类标注数据,我们通过以下方法训练了一个多语言专家模型:
-
分支训练 :在主预训练的基础上分支,继续在一个由 90%多语言 token 数据 组成的混合数据上进行预训练。
-
后训练(Post-training):完成预训练后,参考 4.1 节的流程对专家模型进行后训练。
-
用途:该专家模型被用于非英文语言中收集更高质量的标注数据,直至预训练完全完成。
多语言数据收集(Multilingual Data Collection)
我们的多语言监督微调(SFT)数据主要来自以下来源。其总体分布如下:
-
2.4% 人工标注;
-
44.2% 来自其他 自然语言处理 任务的数据;
-
18.8% 拒绝采样数据;
-
34.6% 翻译推理数据。
人工标注(Human Annotations)
-
我们从语言学家和母语人士处收集了高质量的人工标注数据。
-
数据内容:主要是开放式提示,代表现实世界中的用例。
来自其他 NLP 任务的数据(Data from Other NLP Tasks)
-
为了扩充数据量,我们使用了来自其他任务的多语言训练数据,并将其重写为对话格式。
-
示例:
-
使用 exams-qa(Hardalov 等,2020) 和 Conic10k(Wu 等,2023) 中的数据。
-
使用来自 GlobalVoices(Prokopidis 等,2016) 和 Wikimedia(Tiedemann,2012) 的平行文本(Parallel Texts)。
-
-
数据质量提升:
-
使用 LID(语言检测)过滤和 Blaser2.0 去除低质量数据。
-
对平行文本数据,我们没有直接使用双语对,而是采用一个多语言模板(Wei 等,2022a),更好地模拟翻译和语言学习场景中的实际对话。
-
拒绝采样数据(Rejection Sampled Data)
- 在人类标注的提示上应用拒绝采样,生成高质量的样本用于微调。与英文数据相比,多语言数据在拒绝采样过程中有以下区别:
-
生成过程(Generation):
ps:
温度超参数是语言模型生成内容时的一个控制参数,它决定了生成内容的多样性和创造性。
-
在后训练早期,我们随机从 0.2 到 1 的温度超参数范围中选择一个温度值,生成多样化的回答:
- 高温度:生成更具创意和启发性的回答,但可能会导致不必要或不自然的代码切换(code-switching)。
-
在后训练的最后一轮中,我们使用一个固定值 0.6 来平衡多样性和稳定性。
-
使用专门的系统提示优化回答的格式、结构和可读性。
-
温度高(例如 0.8 - 1.0):
-
模型的输出会更加随机化,生成内容可能更有创意和多样性。
-
但是,随机性过高可能导致生成的内容不够精准,或者出现一些不自然的现象(比如多语言混杂、不相关的回答)。
-
-
温度低(例如 0.2 - 0.4):
-
模型的输出会更集中在高概率的答案上,生成的内容更稳定、更可靠。
-
但是,温度太低可能会让生成内容变得过于单一、缺乏多样性。
-
-
-
选择过程(Selection):
-
在使用奖励模型选择之前,我们实施了多语言特定的检查,确保提示与回答的语言匹配率较高。
-
示例:
- 如果提示是罗马化的印地语,回答不能用印地文天城文脚本书写。
-
翻译数据(Translated Data)
我们避免使用机器翻译数据进行微调,以防止翻译腔(translationese)、名字偏见(name bias)、性别偏见(gender bias)或文化偏见(cultural bias)。
目标:避免模型仅暴露于基于英语文化背景的任务,以便更好地代表我们希望捕捉的语言和文化多样性。
例外:
-
我们对合成的定量推理数据(见 4.3.3 节)进行了翻译,用于提高非英文语言中的定量推理表现。
-
由于数学问题的语言相对简单,这些翻译样本几乎没有质量问题。
-
效果: 添加翻译数据后,在 MGSM(Shi 等,2022)基准测试中获得了显著提升。
4.3.3 数学与推理能力(Math and Reasoning)
我们将推理定义为执行多步计算并得出正确最终答案的能力。以下几个挑战指导了我们训练在数学推理方面表现优异模型的方法:
面临的挑战:
-
缺少有效的提示(Prompts):
- 随着问题复杂度的增加,用于监督微调(SFT)的有效提示或问题数量减少。这种稀缺性使得创建多样化且具有代表性的训练数据集变得困难,无法很好地教模型各种数学技能(Yu 等,2023;Yue 等,2023;Luo 等,2023;Mitra 等,2024;Shao 等,2024;Yue 等,2024b)。
-
缺少真实的思维链(Ground Truth Chain of Thought):
- 有效的推理需要一步步的解决方案来引导推理过程(Wei 等,2022c)。然而,真实的思维链通常不足,这对指导模型如何逐步分解问题并得出最终答案至关重要(Zelikman 等,2022)。
-
错误的中间步骤:
- 使用模型生成的思维链时,中间步骤可能不正确(Cobbe 等,2021;Uesato 等,2022;Lightman 等,2023;Wang 等,2023a)。这些错误会导致最终答案不正确,需要加以解决。
-
教会模型使用外部工具:
- 提高模型利用外部工具(如代码解释器)的能力,使其能够通过代码和文本交替进行推理(Gao 等,2023;Chen 等,2022;Gou 等,2023)。这种能力可以显著增强模型解决问题的能力。
-
训练与推理之间的差异:
- 模型在训练期间的微调方式与实际推理中的使用方式可能存在差异。在推理过程中,微调后的模型可能需要与人类或其他模型交互,并利用反馈提高推理能力。确保训练和实际使用的一致性对于保持推理性能至关重要。
解决方法:
-
解决提示短缺问题:
-
我们从数学上下文中获取相关的预训练数据,并将其转换为问答格式,以用于监督微调。
-
我们还识别出模型表现较差的数学技能领域,并主动从人类处收集相关提示,以教授模型这些技能。
-
为了更好地完成这一过程,我们创建了一个数学技能分类体系(Didolkar 等,2024),并要求人类根据该分类体系提供相关的提示或问题。
-
-
通过逐步推理轨迹增强 训练数据 :
-
我们使用 Llama 3 为一组提示生成逐步解决方案(step-by-step solutions)。
-
对于每个提示,模型会生成多个可能的回答,然后根据正确答案对生成结果进行筛选(Li 等,2024a)。
-
我们还进行了自验证(self-verification),即用 Llama 3 验证某个逐步推理解决方案是否适用于给定问题。通过这种方法,我们剔除了无效的推理轨迹,从而提高了微调数据的质量。
-
-
过滤错误的推理轨迹:
-
我们训练了基于结果和逐步推理的奖励模型(Lightman 等,2023;Wang 等,2023a),用于过滤那些中间推理步骤错误的训练数据。
-
对于更具挑战性的提示,我们使用 蒙特卡罗树搜索(Monte Carlo Tree Search, MCTS) 和奖励模型生成有效的推理轨迹,从而进一步增强高质量推理数据的收集(Xie 等,2024)。
-
-
交替使用代码和文本进行推理:
-
我们提示 Llama 3 通过文本推理与 Python 代码相结合的方式解决问题(Gou 等,2023)。
-
使用代码执行作为反馈信号,剔除推理链无效的情况,从而确保推理过程的正确性。
-
-
从反馈和错误中学习:
-
为模拟人类反馈,我们利用错误生成的推理轨迹(即导致错误答案的生成),并提示 Llama 3 对其进行错误修正(An 等,2023b;Welleck 等,2022;Madaan 等,2024a)。
-
通过从错误尝试中迭代性地生成反馈和改进,提升了模型准确推理和从错误中学习的能力。
-
4.3.4 长上下文(Long Context)
在 Llama 3 的最终预训练阶段,我们将模型的上下文长度从 8K tokens 扩展到了 128K tokens(详见第 3.4 节)。类似于预训练过程,我们发现,在微调(finetuning)阶段,必须仔细调整配方(recipe),以平衡短上下文和长上下文的能力。
SFT 和 合成数据 生成
-
问题: 仅使用短上下文数据的现有 SFT 配方会导致模型的长上下文能力较预训练阶段显著退化。这表明,在 SFT 数据中加入长上下文数据是必要的。
-
现实问题: 获取人类标注的长上下文示例是不切实际的,因为阅读冗长的上下文既繁琐又耗时。
-
解决方法: 我们主要依赖**合成数据(synthetic data)**来填补这一空白。我们使用早期版本的 Llama 3,根据以下关键长上下文应用场景生成合成数据:
-
(可能是多轮的)问答任务;
-
长文档的摘要任务;
-
对代码库的推理任务。
-
具体合成任务
-
问答任务(Question Answering):
-
数据生成:
-
从预训练数据中精心挑选长文档,并将这些文档分割为 8K token 的片段。
-
使用 Llama 3 的早期版本针对随机选择的片段生成问答对(QA pairs)。
-
-
训练方式:
- 在训练时,将整个文档用作上下文,以支持长上下文任务。
-
-
摘要任务(Summarization):
-
层次化摘要(Hierarchical Summarization):
-
首先,使用支持 8K 上下文的最强版本 Llama 3 对长文档的每个 8K 片段生成摘要。
-
然后,将这些片段摘要进行再次摘要,生成全局文档摘要。
-
-
训练方式:
-
在训练时提供完整文档,并提示模型在保留所有重要细节的同时生成摘要。
-
同时基于这些文档摘要生成 QA 对,并提示模型回答需要对整个长文档有全局理解的问题。
-
-
-
长上下文代码推理任务(Long Context Code Reasoning):
-
数据生成:
-
解析 Python 文件,识别导入语句(import statements)及其依赖关系。
-
从代码库中选择被至少 5 个其他文件引用的最常用文件。
-
从代码库中移除这些关键文件之一,并提示模型:
-
识别哪些文件依赖于缺失文件;
-
生成缺失的代码。
-
-
-
-
长度分类:
- 对这些合成数据进行分类,按序列长度分为 16K、32K、64K 和 128K,以更精细地针对不同输入长度进行训练。
混合数据的效果
-
优化结果:
- 通过严格的实验对比,我们发现将 0.1% 的合成长上下文数据 与原有短上下文数据混合,可以在短上下文和长上下文基准测试中实现最佳性能。
DPO 微调(Direct Preference Optimization )
-
观察:
-
如果 SFT 模型在长上下文任务中表现良好,仅使用短上下文训练数据的 DPO 并不会对长上下文性能产生负面影响。
-
我们推测这是因为 DPO 的优化步骤比 SFT 要少。
-
-
解决方法:
- 因此,在长上下文 SFT 检查点的基础上,我们仍然使用标准的短上下文 DPO 配方进行优化。
4.3.5 工具使用(Tool Use)
教会大型语言模型(LLMs)使用工具(如搜索引擎或代码解释器)极大地扩展了它们可解决的任务范围,将模型从纯对话模型转变为更通用的助手(Nakano 等,2021;Thoppilan 等,2022;Parisi 等,2022;Gao 等,2023;Mialon 等,2023a;Schick 等,2024)。我们训练 Llama 3 以便能与以下工具交互:
-
搜索引擎 : Llama 3 被训练使用 Brave Search 来回答超出其知识截止日期范围的问题,或需要从网络检索特定信息的问题。
-
Python 解释器 : Llama 3 可以生成并执行代码来完成复杂计算、读取用户上传的文件,并基于这些文件解决任务,例如问答、摘要、数据分析或数据可视化。
-
数学计算引擎: Llama 3 可以使用 Wolfram Alpha API 更准确地解决数学和科学问题,或从 Wolfram 数据库中检索准确信息。
结果: 最终的模型可以在对话设置中使用这些工具解决用户的查询,包括多轮对话场景。如果一个查询需要调用多个工具,模型可以编写一个逐步计划,依次调用工具,并在每次调用后进行推理。
我们还改进了 Llama 3 的零样本工具使用能力:在给定上下文中,即使工具定义是新的或未知的,模型也可以生成正确的工具调用。
实现细节
-
工具实现: 我们将核心工具实现为带有不同方法的 Python 对象。零样本工具可以实现为 Python 函数,并附带描述、文档(例如使用它们的示例),模型只需要函数的签名和文档字符串作为上下文即可生成适当的调用。
-
我们还将函数定义和调用转换为 JSON 格式,例如用于网络 API 调用。
-
所有工具调用由 Python 解释器执行,Python 解释器必须在 Llama 3 的系统提示中启用。
-
核心工具可以单独在系统提示中启用或禁用。
-
-
数据收集: 与 Schick 等(2024)不同,我们依赖人类标注和偏好来教会 Llama 3 使用工具。与 Llama 3 的标准后训练流程相比,工具的训练有以下两点不同:
-
对于工具使用,对话通常包含多个助手消息(例如调用工具并对工具输出进行推理)。因此,我们在消息级别进行标注以收集细粒度的反馈:标注者对具有相同上下文的两个助手消息提供偏好,或者如果两个都有重大问题,则编辑其中一个消息。选择的或编辑的消息会添加到上下文中,然后对话继续进行。这为助手调用工具的能力以及对工具输出进行推理的能力提供了人类反馈。
-
我们没有进行拒绝采样,因为在工具基准测试中没有观察到性能提升。
-
-
加速标注过程: 我们通过使用从 Llama 3 早期检查点生成的合成数据进行微调,启动了基本的工具使用能力,从而减少了标注者需要进行的编辑量。随着 Llama 3 的逐步改进,我们逐渐复杂化人类标注协议:从单轮工具使用标注开始,逐步扩展到对话中的工具使用,最后扩展到多步工具使用和数据分析标注。
工具数据集
-
单步工具使用: 我们通过以下程序创建合成数据:
-
使用少样本生成法(few-shot generation)生成需要调用核心工具的用户提示(例如超出知识截止日期范围的问题)。
-
同样通过少样本生成法生成适当的工具调用,执行工具调用,并将输出添加到模型的上下文中。
-
最后,基于工具输出再次提示模型生成用户查询的最终答案。
-
最终的对话轨迹包括:系统提示、用户提示、工具调用、工具输出、最终答案。我们还过滤了大约 30% 的数据,去除了无法执行的工具调用或其他格式问题。
-
-
多步工具使用:
-
使用类似的流程,首先生成需要至少两个工具调用(可以是相同工具或不同工具)的用户提示。
-
然后,基于这些提示,我们通过少样本提示生成一个包含交替推理步骤和工具调用的解决方案,类似于 ReAct 方法(Yao 等,2022)。
-
-
文件上传:
-
我们为以下文件类型进行标注:.txt, .docx, .pdf, .pptx, .xlsx, .csv, .tsv, .py, .json, .jsonl, .html, .xml。
-
提示基于提供的文件内容,任务包括:
-
总结文件内容;
-
查找并修复错误;
-
优化代码;
-
执行数据分析或可视化。
-
-
微调后,我们在多样且具有挑战性的场景中收集人类标注,包括多轮交互、超过三步的工具使用以及工具调用未能产生令人满意答案的实例。
零样本工具使用数据
-
单步、嵌套和 并行 函数调用:
-
调用可以是简单的,也可以是嵌套调用(即将一个函数调用作为另一个函数的参数),或者并行调用(即模型返回独立函数调用的列表)。
-
数据生成过程:我们挖掘 Stack 数据库(Kocetkov 等,2022),提取函数调用及其定义,清理和过滤数据(如缺少文档字符串或无法执行的函数),并用 Llama 3 生成与函数调用对应的自然语言查询。
-
-
多轮函数调用:
-
我们为多轮对话生成合成数据,协议类似于 Li 等(2023b)提出的方法。
-
具体流程:使用多个代理(agents)生成领域、API、用户查询、API 调用和响应,同时确保生成的数据涵盖多样化领域和现实 API。所有代理都是不同版本的 Llama 3,根据其角色以不同方式提示,并以逐步的方式协作。
-
模型可以在没有见过工具定义的情况下,根据上下文理解工具的用途并生成正确调用:
-
单步调用:简单问题直接调用工具。
-
嵌套调用:将一个工具调用的结果作为另一个调用的输入。
-
多轮调用:在多轮对话中结合工具调用解决复杂问题。
4.3.6 准确性(Factuality)
幻觉(Hallucinations) 仍然是大型语言模型的主要挑战之一。模型在某些领域即使缺乏知识,也倾向于对自己的回答过于自信。这种短板使得模型常被当作知识库使用,从而可能导致传播错误信息的风险。尽管准确性不只局限于解决幻觉问题,但我们在这里采用了以幻觉为核心的改进方法。
我们遵循这样一个原则:后训练(Post-training)应该让模型能够"知道自己知道什么",而不是直接增加知识(Gekhman 等,2024;Mielke 等,2020)。 我们的主要方法是通过生成数据,将模型的生成与预训练数据中已存在的部分事实数据对齐。为实现这一目标,我们开发了一种**知识探测(knowledge probing)**技术,利用 Llama 3 的上下文能力来生成训练数据。具体步骤如下:
-
从预训练数据中提取一段数据片段(snippet)。
-
用 Llama 3 提示生成基于该片段的事实性问题(context-based question)。
-
让 Llama 3 回答这些问题,并采样多种回答(generations)。
-
使用原始上下文作为参考,并用 Llama 3 作为评判工具,给生成的回答打分,判断其正确性。
-
再次使用 Llama 3 作为评判工具,给生成的回答打分,判断其信息量(informativeness)。
-
如果生成的回答在多次尝试中表现为"内容丰富但错误",则生成拒绝回答(refusal)的内容。
我们利用知识探测生成的数据,鼓励模型只回答它有知识的问题,并拒绝回答它不确定的问题。 此外,由于预训练数据并不总是事实一致或正确的,我们还收集了一小部分带标注的准确性数据(factuality data),专门针对敏感话题,这些话题中事实性矛盾或错误陈述较为常见。
Llama 3 的事实性优化主要通过知识探测技术实现:
-
通过知识探测生成数据: 提升模型在已知范围内提供正确答案的能力。
-
教会模型拒绝回答: 学会明确拒绝自己没有足够信息的问题。
-
解决敏感话题的不一致问题: 用手动标注的数据提高模型在敏感领域的表现。
4.3.7 可控性(Steerability)
可控性 是指模型能够按照开发者和用户的要求进行操作和输出的能力。作为一个通用的基础模型,Llama 3 应该具备高度的可控性,以便轻松适应不同的下游应用场景。针对 Llama 3,我们通过系统提示(system prompt)和自然语言指令,重点提升其在以下方面的可控性:
-
响应长度(response length);
-
格式(format);
-
语气(tone);
-
角色/人设(character/persona)。
数据收集(Data Collection)
-
我们在通用英语领域(general English category)收集了用于可控性的偏好数据。
-
具体过程:
-
标注者设计不同的系统提示(system prompts),这些提示用于控制 Llama 3 的输出行为。
-
标注者与模型进行对话,评估模型在对话过程中是否能持续遵守系统提示中定义的 指令。
-
-
示例:
- 一个用于增强可控性的系统提示可能会包含这样的指令: "请用正式的语气回答,回答长度限制在 100 字以内。"
建模(Modeling)
-
收集偏好数据后,我们利用这些数据进行以下操作,提升 Llama 3 的可控性:
-
奖励建模(Reward Modeling): 通过奖励模型训练,鼓励模型生成符合可控性要求的回答。
-
拒绝采样(Rejection Sampling): 剔除不符合系统提示要求的模型生成内容。
-
监督微调( SFT ): 用符合可控性要求的数据对模型进行微调。
-
直接偏好优化( DPO ): 进一步优化模型,使其更能满足可控性指令
-