理解和使用语言模型的监督微调(SFT)


大型语言模型 (LLM) 通常分几个阶段进行训练,包括预训练和几个微调阶段。虽然预训练成本高昂(即数十万美元的计算成本),但微调 LLM(或执行上下文学习)的成本却相对较低(即几百美元甚至更少)。鉴于高质量的预训练 LLM(例如MPT 、Falcon或LLAMA-2 )广泛可用且可免费使用(甚至在商业上),我们可以通过针对相关任务微调 LLM 来构建各种强大的应用程序。

在最近的 AI 研究中,LLM 最广泛使用的微调形式之一是监督微调 (SFT)。这种方法会整理一个高质量 LLM 输出数据集,然后使用标准语言建模目标直接对模型进行微调。SFT 使用起来简单/便宜,是一种用于对齐语言模型的有用工具,在开源 LLM 研究社区及其他领域广受欢迎。在本概述中,我们将概述 SFT 背后的想法,研究有关此主题的相关研究,并提供示例,说明从业者如何仅使用几行 Python 代码轻松使用 SFT。

有用的背景信息

为了深入了解 SFT,我们需要对语言模型(以及深度学习)有基本的了解。让我们介绍一些相关的背景信息,并简要回顾一些重要的想法。

AI 基础知识。它涵盖了多种技术和方法,包括机器学习和深度学习。机器学习通过数据和统计方法使计算机能够自主学习和改进,而深度学习则利用神经网络处理复杂模式识别任务。AI 在日常生活中有广泛应用,如语音识别、图像识别、自动驾驶、推荐系统和自然语言处理等。AI 的最终目标是让计算机能够执行需要人类智能才能完成的任务,从而提高效率并解决复杂问题。

语言模型。SFT是一种流行的 LLM 微调技术。因此,我们需要对语言模型有一个基本的了解。以下资源可用于快速了解这些模型的工作原理:

  • Transformer 架构:几乎所有现代语言模型以及许多其他深度学习模型都是基于这种架构的。
  • Decoder-only Transformers :这是大多数生成式 LLM 使用的 Transformer 架构的特定变体。
  • LLM 简史:从GPT的创建到 ChatGPT 的发布,LLM 经历了几个阶段。
  • 下一个标记预测:这个自监督训练目标是几乎所有 LLM 功能的基础,并被 SFT 使用。
  • 语言模型预训练:语言模型是在大量未标记的文本语料库上进行预训练的。
  • 语言模型推理:语言模型可用于通过自回归下一个标记预测来生成连贯的文本序列。

Transformers 库。本概述中的代码依赖于transformers 库,它是目前最强大的深度学习库之一。此外,该库还有大量教程和文档,可作为任何深度学习或 LLM 相关项目的实用学习资源。

训练 LLM。语言模型的训练过程通常分为三个阶段。首先,我们对语言模型进行预训练,这是(迄今为止)计算成本最高的训练步骤。从这里开始,我们执行对齐,通常通过三步框架进行,使用监督微调 (SFT) 和从人类反馈中强化学习 (RLHF)。

上面概述的步骤构成了大多数最先进的 LLM(例如 ChatGPT 或 LLaMA-2 )使用的标准化训练流程。与预训练相比,SFT 和 RLHF 在计算上成本较低,但它们需要管理数据集,无论是高质量的 LLM 输出还是 LLM 输出的人工反馈,这可能很困难且耗时。

有时,在应用 LLM 解决下游任务时,我们必须做更多的事情。具体来说,我们可以通过领域特定微调或上下文学习进一步专门化语言模型。领域特定微调只是进一步训练模型,通常通过语言建模目标,类似于预训练/SFT——使用与下游任务相关的数据,而上下文学习将额外的上下文或示例添加到语言模型的提示中,以用作解决问题的上下文。

什么是对齐?最后,我们在上面的讨论中多次使用了对齐这个术语,理解它很重要。预训练的语言模型通常没什么用。如果我们用这个模型生成输出,结果可能会重复,而且没有太大帮助。为了创建一个更有用的语言模型,我们必须使这个模型与人类用户的愿望保持一致。换句话说,我们的语言模型不是生成最可能的文本序列,而是学习生成用户想要的文本序列。

“对于我们收集的偏好注释,我们关注的是有用性和安全性。有用性是指 Llama 2-Chat 的响应如何很好地满足用户的要求并提供所需的信息;安全性是指 Llama 2-Chat 的响应是否不安全。”

这种对齐是通过上面概述的 SFT 和 RLHF 的三步框架实现的,可用于鼓励 LLM 中的各种行为和属性。通常,训练模型的人会选择一组或几个标准,这些标准在整个对齐过程中都会得到强调。常见的对齐标准包括:提高遵循指令的能力、阻止有害输出、使 LLM 更有帮助等等。例如,LLaMA-2 被对齐为i)有帮助和ii)无害/安全。

什么是 SFT?

监督微调 (SFT) 是 LLM 对齐过程中的第一步训练,实际上非常简单。首先,我们需要整理一个高质量 LLM 输出的数据集——这些基本上只是 LLM 正确行为的示例。然后,我们直接针对这些示例对模型进行微调。这里,微调的“监督”方面来自于这样一个事实:我们正在收集模型应该模仿的示例数据集。然后,模型在微调过程中学习、复制这些示例的风格。

与下一个标记预测的关系。有趣的是,SFT 与语言模型预训练没有太大区别——预训练和 SFT 都使用下一个标记预测作为其底层训练目标!主要区别在于所使用的数据。在预训练期间,我们使用大量原始文本数据来训练模型。相比之下,SFT 使用高质量 LLM 输出的监督数据集。在每次训练迭代期间,我们都会抽取几个示例,然后使用下一个标记预测目标根据这些数据对模型进行微调。通常,下一个标记预测目标仅应用于每个示例与 LLM 输出相对应的部分(例如,上图中的响应)。

这个是从哪里来的?

三步对齐过程(包括 SFT 和 RLHF )最初由InstructGPT 提出,它是ChatGPT的前身和姊妹模型。由于 InstructGPT 和 ChatGPT 的成功,这个三步框架已经标准化并且非常流行,导致它在各种后续语言模型(例如Sparrow 和LLaMA-2 )中得到使用。通过 SFT 和 RLHF 进行对齐现在在研究和实际应用中都得到了广泛使用。

在 SFT 之前进行微调。尽管 SFT 最近很流行,但语言模型微调早已成为一种流行的方法。例如,GPT 直接针对其评估的每个任务进行微调,而Decoder-only的语言模型(例如BERT)——由于它们不常用于生成任务——几乎只使用微调方法来解决下游任务。此外,一些 LLM 采用了与 SFT 略有不同的微调方法;例如,LaMDA 在各种辅助任务上进行微调,Codex在代码语料库上执行领域特定的微调,即基本上对不同数据进行更多预训练。

值得注意的是,SFT 与通用微调略有不同。通常,对深度学习模型进行微调是为了教会模型如何解决特定任务,但它会使模型变得更加专业化、通用性降低——模型成为了“狭隘专家”。与通用模型相比,该模型可能会更准确地解决经过微调的任务(例如GOAT ),但可能会失去解决其他任务的能力。相比之下,SFT 是对齐语言模型的核心组件,包括通用基础模型。因为我们对模型进行微调以模拟正确的风格或行为,而不是解决特定任务,所以它不会失去其通用解决问题的能力。

SFT 的优点和缺点

SFT 使用起来很简单——训练过程和目标与预训练非常相似。此外,该方法在执行对齐方面非常有效,并且相对于预训练而言,计算成本低廉。单独使用 SFT,即不使用任何 RLHF,在模型的指令遵循能力、正确性、连贯性和整体性能方面具有明显优势。换句话说,SFT 是一种非常有效的提高语言模型质量的技术。但是,我们应该记住它并不完美!以下是我们应该考虑的一些缺点。

创建数据集。SFT的结果在很大程度上取决于我们整理的数据集。如果此数据集包含一组多样化的示例,这些示例可以准确捕获所有相关的对齐标准并描述语言模型的预期输出,那么 SFT 就是一种很好的方法。但是,我们如何保证用于 SFT 的数据集全面捕获了我们想要在对齐过程中鼓励的所有行为?这只能通过仔细的手动检查数据来保证,这i)不可扩展且ii)通常成本高昂。作为替代方案,最近的研究探索了为 SFT 生成数据集的自动化框架,例如,自我指导,但无法保证数据的质量。因此,尽管 SFT 很简单,但需要整理高质量的数据集,这可能很困难。

添加 RLHF 是有益的。即使在为 SFT 整理了高质量的数据集之后,最近的研究表明,执行 RLHF 还可以获得更多好处。换句话说,仅通过 SFT 对语言模型进行微调是不够的。这一发现在最近的LLaMA-2 出版物中尤为明显,它通过 SFT 和 RLHF 执行对齐。对于 SFT,LLaMA-2 使用大量(总共 27,540 个示例)对话会话数据集,这些数据集是手动整理以确保质量和多样性的。尽管为 SFT 使用了大量高质量的数据源,但进一步执行 RLHF 会在有用性和安全性方面带来巨大好处(即 LLaMA-2 的对齐标准)。

此外,作者指出,在执行 SFT 后,语言模型能够生成与人类编写的对话会话质量相似的对话会话。因此,为 SFT 创建更多数据的好处较少,因为我们可以使用模型本身自动为 SFT 生成更多数据。

“我们发现,从生成的 SFT 模型中采样的输出通常与人工注释者手写的 SFT 数据具有竞争力,这表明我们可以重新确定优先级,并将更多的注释工作投入到基于偏好的 RLHF 注释中。”

简而言之,目前研究界的共识似乎是,最佳的对齐方法是i)在中等大小且质量非常高的示例数据集上执行 SFT;ii)将剩余的精力投入到整理人类偏好数据以通过 RLHF 进行微调。

在实践中使用 SFT

现在我们了解了 SFT 的概念,让我们来探讨一下这个概念如何在实际和研究应用中使用。我们将看一个如何在 Python 中执行 SFT 的示例。

实施 SFT

如前所述,SFT 的实现与语言模型预训练非常相似。在底层,任何 SFT 的实现都将使用下一个标记预测(也称为标准语言建模)目标,我们已经对此进行了广泛的了解。在实践中,我们可以用来使用 SFT 训练 LLM 的最佳工具之一是Transformer 强化学习 (TRL) Python 库,它包含 SFT 的实现,可用于仅用几行代码微调现有语言模型。

执行 SFT。TRL建立在HuggingFace 变换器库之上,可以使用上面显示的代码通过 SFT 训练语言模型(在本例中为 Meta 的OPT 模型)。这个简单的例子演示了通过 SFT 训练模型是多么容易!由于简单性,通过 SFT 对模型进行微调在开源 LLM 研究社区中非常受欢迎。快速访问Open LLM 排行榜将向我们展示一系列有趣的示例。使用 SFT 对预训练的 LLM 进行微调是目前最简单、最有效的开源 LLM 训练方法之一。

除了 SFT 的基本定义之外,我们可能还想使用一些有用的(更高级的)技术,例如仅对模型响应应用监督(而不是完整的对话或示例),使用共享提示模板扩充所有响应示例,甚至采用参数高效微调 (PEFT)方法(例如LoRA )。有趣的是,TRL 定义的 SFTTrainer 类具有足够的适应性和可扩展性,可以处理这些情况。

SFT 在人工智能研究中的用例

鉴于 SFT 是对齐过程的标准组成部分,它已在 AI 文献中得到深入探讨。我们将概述几篇提供关于 SFT 的宝贵见解的出版物。与往常一样,下面列出的出版物并不详尽。

InstructGPT。大多数语言模型使用的三部分对齐过程(包括 SFT 和 RLHF )最早由InstructGPT 使用,尽管它之前已在 [21] 中用于文本摘要模型。该出版物为许多最近的 LLM 进步奠定了基础,并包含了许多关于对齐过程的宝贵见解。与 OpenAI 提出的最新模型不同,InstructGPT 的训练过程和架构的细节在出版物中完全公开。

模仿模型。在LLaMA发布后开源语言模型的激增中,SFT 在模仿学习环境中得到了广泛应用。也就是说,我们可以:

  1. 从开源基础模型开始。
  2. 从专有语言模型(例如 ChatGPT 或 GPT-4)收集对话会话的数据集。
  3. 在生成的数据集上训练模型(使用 SFT)。

这些模型(例如Alpaca 、Koala和Vicuna )训练成本低且表现良好,凸显了使用 SFT 仅需相对较少的计算即可获得令人印象深刻的结果。尽管后来发现早期的模仿模型与专有模型相比表现不佳,但最近在更大的模仿数据集上训练的变体(例如Orca )表现良好。将 SFT 与模仿学习相结合是一种获得不错的 LLM 的廉价而简单的方法。

LIMA。模仿学习的研究表明,使用专有语言模型为 SFT 生成大型数据集是一种有用的方法。相比之下,平行研究探索了是否可以通过较小、精心策划的数据集实现对齐。在LIMA中,作者为 SFT 策划了一个只有 1K 个示例的数据集,生成的模型与顶级开源和专有 LLM 相当具有竞争力。在这种情况下,成功的关键是手动检查数据以确保质量和多样性,这比用于 SFT 的数据集的原始大小更重要。这些结果得到了 LLaMA-2 的证实,作者发现具有高质量和多样性标准的中等大小的数据集可以为 SFT 产生最佳结果。

开源对齐。直到最近提出 LLaMA-2 之前(甚至之后),开源 LLM 主要使用 SFT 对齐,RLHF 最少(如果有的话)。例如,MPT 模型的几个变体以及Falcon和LLaMA的 Instruct 版本都是使用 SFT 在各种不同的数据集上创建的(其中许多数据集是在 HuggingFace 上公开的)。此外,如果我们快速浏览一下Open LLM 排行榜,我们会发现各种顶级模型都是流行基础模型(例如 LLaMA-2 或 Falcon)的版本,这些模型已通过 SFT 对不同数据的混合进行了微调。这方面的著名例子包括Platypus 、WizardLM 、Airoboros 、Guanaco等。

结束语

在本概述中,我们了解了 SFT、如何在实践中使用 SFT,以及当前研究中对 SFT 的了解。SFT 是 AI 从业者的强大工具,因为它可用于以数据高效的方式将语言模型与某些人类定义的目标对齐。虽然可以通过 RLHF 获得更多好处,但 SFT 使用简单(即非常类似于预训练)、计算成本低且高效。这些特性使得 SFT 在开源 LLM 研究社区中得到广泛采用,其中各种新模型几乎每天都会进行训练(使用 SFT)并发布。只要有高质量的基础模型(例如 LLaMA-2),我们就可以通过 SFT 高效轻松地微调这些模型,以处理各种不同的用例。