前言
大型语言模型(LLMs)的训练通常分为多个阶段,包括预训练和后续的微调阶段。虽然预训练成本高昂(通常需要数百万美元的计算资源),但相比之下,微调一个LLM或通过上下文学习进行适配的成本要低得多,仅需几百美元甚至更少。
随着高质量的预训练模型(如 MPT、Falcon 或 LLAMA-2)的广泛可用,并且许多可以免费甚至商业化使用,我们能够通过在特定任务上微调这些模型,快速构建功能强大的应用。这种方法不仅经济高效,还显著降低了开发复杂AI系统的门槛。
在人工智能研究的最新进展中,监督微调(SFT)已成为大型语言模型(LLMs)最广泛应用的微调方法之一。SFT 的核心是利用一个高质量的数据集(通常是 LLM 输出的精挑细选内容),通过标准语言建模目标对模型进行微调。这种方法以其简单性和低成本著称,作为校准语言模型的有效工具,迅速在开源LLM研究社区以及更广泛的应用领域中流行开来。
在本文中,我们将详细阐述SFT的基本理念,探讨其在研究中的应用实例,并为实践者提供使用 SFT 的简易教程。无论你是新手还是经验丰富的开发者,仅需几行 Python 代码,你就可以快速上手,充分释放SFT的潜力!
为了深入理解 SFT,我们需要对语言模型(以及深度学习)有一个基础的了解。让我们回顾一些相关的背景信息,并简要重温一些重要的观点。
语言模型。SFT 是一种流行的微调技术,对于LLMs来说。因此,我们需要对语言模型有一个基本的了解。以下资源可以帮助您快速了解这些模型的工作原理:
Transformer 库。本概述中的代码依赖于 Transformer 库,这是最强大的深度学习库之一。此外,该库拥有大量教程和文档,为任何深度学习或LLM-相关项目提供了实用的学习资源。
训练 LLMs. 语言模型的训练过程通常分为三个阶段;见上文。首先,我们预训练语言模型,这是训练过程中计算量最大的步骤。从这里开始,我们进行对齐,通常通过以下三步框架(见下文)进行监督微调(SFT)和基于人类反馈的强化学习(RLHF)。
上述步骤构成了用于大多数最先进LLMs(例如 ChatGPT 或 LLaMA-2 [3])的标准训练流程。与预训练相比,SFT 和 RLHF 在计算上更为经济,但它们需要整理一个数据集——要么是高质量的LLM输出,要么是对LLM输出的人类反馈——这可能很困难且耗时。
有时在应用LLM解决下游任务时,我们可能需要做更多的工作。特别是,如果需要,我们可以通过领域特定的微调或在上下文中学习进一步专门化语言模型;见下文。
领域特定的微调简单地对模型进行进一步训练——通常通过语言建模目标,类似于预训练/SFT——在相关于下游任务的数据上,而在上下文中学习则将额外的上下文或示例添加到语言模型的提示中,用作解决问题的上下文。
什么是对齐?最后,在上述讨论中我们多次使用的一个重要术语是:对齐。预训练的语言模型通常没有太大用处。如果我们用这个模型生成输出,结果可能会重复且不太有帮助。为了创建一个更有用的语言模型,我们必须将这个模型与人类用户的期望对齐。换句话说,我们的语言模型不是生成最可能的文本序列,而是学习生成用户期望的文本序列。
这种协调是通过上述 SFT 和 RLHF 的三步框架完成的,可用于鼓励LLM内的各种行为和属性。通常,训练模型的人会选择一组在整个对齐过程中强调的一个或几个标准。常见的调整标准包括:提高指令遵循能力、阻止有害输出、使LLM更有帮助等等。例如,LLaMA-2[5] 被认为是i)有帮助和ii)无害/安全;见上文。
监督微调(SFT)是LLMs对齐过程中的第一个训练步骤,实际上非常简单。首先,我们需要整理一个高质量的LLM输出数据集——这些基本上只是LLM正确运行的例子;见下文。
然后,我们直接根据这些示例对模型进行微调。在这里,微调的“监督”方面来自于这样一个事实:我们正在收集模型应该模拟的示例数据集。然后,模型在微调期间学习复制这些示例的样式 。
与下一个标记预测的关系。有趣的是,SFT 与语言模型预训练没有太大区别——预训练和 SFT 都使用下一个 token 预测作为其基本训练目标!主要区别在于所使用的数据。在预训练过程中,我们使用大量原始文本数据来训练模型。
相比之下,SFT 使用高质量LLM输出的监督数据集。在每次训练迭代期间,我们都会对几个示例进行采样,然后使用下一个标记预测目标在此数据上微调模型。通常,下一个标记预测目标仅应用于每个示例中与LLM输出相对应的部分(例如上图中的响应)。
三步对齐过程(包括 SFT 和 RLHF)最初由InstructGPT[2]提出(尽管之前在 [21] 中针对摘要模型进行了探索),它是ChatGPT的前身和姐妹模型。由于InstructGPT和ChatGPT的成功,这个三步框架已经变得标准化并且相当流行,导致其在多种后续语言模型中使用(例如Sparrow[4]和LLaMA-2[6])。通过 SFT 和 RLHF 进行比对现在在研究和实际应用中大量使用。
SFT 之前进行微调。尽管 SFT 最近很流行,但语言模型微调长期以来一直是一种流行的方法。例如,GPT[7] 直接在评估它的每个任务上进行微调(见下文),以及仅编码器的语言模型(例如BERT[8])——因为它们并不常见——用于生成任务——几乎专门使用微调方法来解决下游任务。
此外,一些LLMs采取了与 SFT 略有不同的微调方法;例如,LaMDA[9] 对各种辅助任务进行微调,而Codex[10] 在代码语料库上执行特定领域的微调(即基本上对不同数据进行更多预训练)。
值得注意的是,SFT 与一般的微调略有不同。通常,对深度学习模型进行微调是为了教会模型如何解决特定任务,但这使得模型更加专业化,不那么通用——模型变成了“狭隘专家”。
与通用模型(例如,参见GOAT[11])相比,该模型可能会更准确地解决对其进行微调的任务,但它可能会失去解决其他任务的能力。相比之下,SFT 是对齐语言模型(包括通用基础模型)的核心组件。因为我们正在微调模型以模拟正确的风格或行为,而不是解决特定任务,所以它不会失去其通用问题解决能力。
SFT 使用简单——训练过程和目标与预训练非常相似。另外,该方法在执行对齐方面非常有效,并且相对于预训练而言,计算成本低廉(即便宜100X,甚至更多)。
如上图所示,单独使用 SFT(即不使用任何 RLHF)在模型的指令跟踪能力、正确性、一致性和整体性能方面具有明显的优势3。换句话说,SFT 是一种提高语言模型质量的高效技术。但是,我们应该记住,它并不完美!以下是我们应该考虑的一些缺点。
创建数据集。SFT 的结果在很大程度上取决于我们管理的数据集。如果该数据集包含一组不同的示例,可以准确捕获所有相关的对齐标准并表征语言模型的预期输出,那么 SFT 是一种很好的方法。
然而,我们如何保证用于 SFT 的数据集全面捕获我们在对齐过程中想要鼓励的所有行为?这只能通过仔细的手动检查数据来保证,这i)不可扩展,并且ii)通常很昂贵。
作为替代方案,最近的研究探索了为 SFT 生成数据集的自动化框架(例如,自我指导[12];见上文),但无法保证数据的质量。因此,SFT 尽管很简单,但需要管理高质量的数据集,而这可能很困难。
添加 RLHF 是有益的。即使在为 SFT 策划了高质量的数据集之后,最近的研究表明,通过执行 RLHF 可以获得进一步的好处。换句话说,仅通过 SFT 微调语言模型是不够的。
这一发现在最近的LLaMA-2 [5] 出版物中尤为明显,该出版物通过 SFT 和 RLHF 进行对齐;见上文。对于 SFT,LLaMA-2 使用大量(总共 27,540 个示例)对话会话数据集,这些数据集是手动策划的,以确保质量和多样性。尽管 SFT 使用了大量高质量的数据源,但进一步执行 RLHF 在有用性和安全性方面产生了巨大的好处(即 LLaMA-2 的对齐标准);见下文。
此外,作者指出,执行 SFT 后,语言模型能够生成与人类编写的对话质量相似的对话会话。因此,为 SFT 创建更多数据带来的好处较少,因为我们可以使用模型本身自动为 SFT 生成更多数据。
简而言之,研究界目前的共识似乎是,对齐的最佳方法是i)在中等大小的高质量示例数据集上执行 SFT,以及ii)投入剩余的精力来整理人类偏好数据以实现精细化。 -通过 RLHF 进行调整。
现在我们了解了 SFT 的概念,让我们探讨一下这个概念如何在实际和研究应用中使用。首先,我们将看一个如何在 Python 中执行 SFT 的示例。然后,我们将概述最近发表的几篇关于 SFT 主题的论文。
如前所述,SFT 的实现与语言模型预训练非常相似。在幕后,SFT 的任何实现都将使用我们已经广泛了解的下一个标记预测(也称为标准语言建模)目标。在实践中,我们可以使用 SFT 训练LLM的最佳工具之一是Transformer Reinforcement Learning (TRL)
Python 库,它包含 SFT 的实现,可用于微调现有的语言模型,只需使用几行代码。
执行 SFT。TRL 构建在HuggingFace 转换器库之上,可以使用上面显示的代码通过 SFT训练语言模型(在本例中为 Meta 的OPT 模型)。
这个简单的例子展示了通过 SFT 训练模型是多么容易!由于简单性,通过 SFT 微调模型在开源LLM研究社区中非常受欢迎。快速访问Open LLM排行榜将向我们展示一系列有趣的例子。使用 SFT 微调预训练的LLM是目前训练开源LLMs最简单、最有效的方法之一。
除了 SFT 的基本定义之外,我们可能还想使用一些有用的(并且更先进的)技术,例如仅对模型响应应用监督(而不是完整的对话或示例),通过共享来增强所有响应示例提示模板,甚至采用参数有效微调(PEFT)方法(例如LoRA[13])。
有趣的是,TRL 定义的 SFTTrainer 类具有足够的适应性和可扩展性,足以处理每种情况。有关实施的更多详细信息,请参阅下面的链接。
在本概述中,我们了解了 SFT、它如何在实践中使用以及当前研究中对其的了解。 SFT 对于人工智能从业者来说是一个强大的工具,因为它可用于以数据有效的方式将语言模型与某些人类定义的目标保持一致。
虽然通过 RLHF 可以获得更多好处,但 SFT 使用简单(即与预训练非常相似)、计算成本低且高效。这些特性使得 SFT 在开源LLM研究社区中得到广泛采用,几乎每天都会训练(使用 SFT)并发布各种新模型。
如果能够访问高质量的基础模型(例如 LLaMA-2),我们可以通过 SFT 高效、轻松地微调这些模型,以处理各种不同的用例。