RLHF and alternatives: SFT

RLHF 及替代方案:SFT

2023 年 8 月 16 日

Argilla, MantisNLP

本博客最初发布在 Medium 上,是与 MantisNLP 合作的成果。请在此处查看本博客系列的下一部分:这里

简介

近年来,自然语言处理 (NLP) 领域取得了显著进步,这主要得益于 GPT-3.5 等大型语言模型的发展。这些模型能够生成连贯且上下文相关的文本,彻底改变了各种应用,从聊天机器人和虚拟助手到内容生成和翻译。然而,尽管这些模型具有令人印象深刻的功能,但它们通常缺乏精确性,表现出偏差,并且难以进行细致的理解。 这就是监督微调 (SFT) 和人类反馈强化学习 (RLHF) 发挥作用的地方。

然而,RLHF “……是一个复杂且通常不稳定的过程,首先拟合一个反映人类偏好的奖励模型,然后使用强化学习微调大型无监督 LM,以最大化此估计奖励,同时又不会离原始模型太远。[1]

在本文中,Mantis NLPArgilla 团队共同努力,展示 RLHF 的替代方案,更具体地说是直接偏好优化 (DPO) 和事后链,包括在 Argilla 的注释平台上动手准备人类偏好数据 (PD),以及使用 Transformers Reinforcement Learning (trl) 库使用 DPO 微调大型语言模型 (LLM)。

监督微调 (SFT)

大型语言模型通常在海量文本数据上进行预训练,使其能够学习语言的统计规律。但是,它们不具备关于特定领域的特定知识,也不表现出对上下文的全面理解。为了弥合这一差距,采用了微调,即在特定领域或特定任务的数据集上训练模型。微调使模型能够获得专门的知识并调整其行为以更好地服务于特定应用,使其更加有用和可靠。

监督微调 (SFT) 是一种更集中的方法,它涉及在标记数据集上训练模型,该数据集直接将输入映射到所需的输出。SFT,包括指令调优,教会模型根据人类定义的内容做出响应。

为了阐明差异,让我们举一个例子。假设我们正在创建一个会话代理来解决客户关于您的软件的支持疑问。假设您使用基础大型语言模型,例如 Falcon-7B,而您将生成的模型将是它的微调版本。

Falcon 可以生成高质量的文本,但它可能与您正在寻找的风格或特异性不符,因为它经过预训练以预测序列中的下一个标记,而不是基于特定任务(模拟您的客户支持团队如何回答的机器人)来预测标记。

这是一个输入示例

你能写一封电子邮件,回答 HTTP 错误 500 是什么意思吗?

对此,Falcon(40B 版本)回答

HTTP 错误 500 通常表示内部服务器错误。 这可能是由许多问题引起的,例如服务器代码或配置问题、内存或 CPU 使用率不足,或者与服务器上运行的其他进程冲突。 要解决此问题,您可以尝试重新启动服务器或查看服务器日志以获取有关特定错误消息的更多信息。

从内容角度来看,响应是正确的,但它不符合客户支持消息的要求,客户支持消息通常

  • 听起来更有礼貌;
  • 具有清晰的格式;
  • 专注于提供解决问题的说明;
  • 包含有关问题仍然存在时该怎么办的信息。

因此,该提示的更正响应应该是类似于

尊敬的客户:

感谢您联系我们的客户支持团队,咨询您遇到的 HTTP 错误 500。我们理解这可能造成的挫败感,我们将在此协助您解决此问题。

HTTP 错误 500 通常表示内部服务器错误。 此错误可能是由多种因素引起的,包括服务器代码或配置问题、内存或 CPU 使用率不足,或者与服务器上运行的其他进程冲突。

为了帮助您解决此问题,我们建议以下步骤

  1. 重新启动服务器:…
  2. 查看服务器日志:…

如果在执行这些步骤后问题仍然存在,请向我们提供您可能遇到的任何其他详细信息或错误消息。 这些信息将极大地帮助我们进一步调查问题并找到合适的解决方案。

再次,对于由此可能造成的任何不便,我们深感抱歉。 我们的专业支持团队致力于及时为您解决此事。 如果您有任何其他问题或疑虑,请随时与我们联系。 我们随时为您提供帮助。

感谢您的耐心与合作。

此致,客户支持代表

为了使您的 LLM 生成符合您的风格和内容准则的文本,您需要使用监督微调对其进行微调。

基于指令的监督微调 (SFT)

要在 LLM 上执行 SFT,您需要数据。 更具体地说,如果您想微调聊天机器人以成功回答用户请求,您需要指令数据。 有许多开源数据集(其中大多数具有非商业许可证!)是基于指令的,您可以使用。 此 GitHub 存储库 列出了一些数据集

数据集链接 数据集 类型 语言 大小 描述
GPT-4all 数据集 GPT-4all 英语 40 万条条目 OIG、P3 和 Stackoverflow 的一些子集的组合。 涵盖一般 QA、自定义创意问题等主题。
RedPajama-Data-1T RedPajama PT 主要为英语 1.2 万亿个 tokens

5TB

完全开放的预训练数据集遵循 LLaMA 的方法。
OASST1 OpenAssistant 对,对话 多语言

(英语、西班牙语等)

66,497 个对话树 一个大型的、人工编写的、人工注释的高质量对话数据集。 旨在使 LLM 生成更自然的响应。
databricks-dolly-15k Dolly2.0 英语 1.5 万+ 条条目 人类编写的提示和响应数据集,具有开放域问答、头脑风暴、摘要等任务。
AlpacaDataCleaned 一些 Alpaca/LLaMA 类模型 英语 / Alpaca、GPT_LLM 和 GPTeacher 的清理版本。
GPT-4-LLM 数据集 一些 Alpaca 类模型 对,

RLHF

英语,

中文

英语和中文分别有 5.2 万条条目

9 千条条目非自然指令

不是 GPT-4 使用的数据集!! 它是由 GPT-4 和其他一些 LLM 生成的,用于更好地进行对和 RLHF。 它包括指令数据以及 RLHF 风格的比较数据。
GPTeacher / 英语 2 万条条目 一个数据集,包含 GPT-4 生成的目标,并包含与 Alpaca 数据集相同的许多种子任务,并添加了一些新任务,例如角色扮演。
Alpaca 数据 Alpaca, ChatGLM-fine-tune-LoRA, Koala 对话,

英语 5.2 万条条目

21.4MB

一个由 text-davinci-003 生成的数据集,旨在提高语言模型遵循人类指令的能力。

这就是 GPT4all 微调数据集 在 Hugging Face Datasets Viewer 中的样子。 它非常简单:它由一系列提示(第一列)和预期答案/响应(第二列)组成,用于微调模型答案。

尽管这些数据集可以用作起点,但它们可能不适合您的特定用例。 如果您想要具有您自己的格式的答案(如上一节中包含的答案),您将需要创建自己的数据集。 如果您没有合适的工具,数据收集和审查机制可能会非常复杂。

Argilla 的注释平台似乎是一个不错的选择,因为它已经具有为微调过程和人类反馈强化学习的偏好数据以及您将在本文中找到的其余替代方案管理数据的选项。

此外,您可以查看 Mantis NLP 关于监督微调的教程,以更详细地了解使用 trl 库进行监督微调。

Example of a snippet from a fine-tuning notebook using Hugging Face trl

使用 Argilla 基于指令的监督微调 (SFT)

由于大多数这些数据集都具有非商业许可证,并且虽然我们可以将它们用于非商业用途的微调,但我们可以使用 Argilla 来创建和管理我们自己的指令遵循数据集。

我们甚至可以使用现有 LLM 合成生成数据集作为起点,正如斯坦福大学对 Alpaca 所做的那样(参考 https://hugging-face.cn/datasets/tatsu-lab/alpaca),他们使用 OpenAI 的 text-davinci-003 来收集一系列提示的响应。 但是,在执行此操作之前,请务必先查看服务条款 - 如果不是用于研究,OpenAI TOS(例如)明确禁止“使用来自服务的输出开发与 OpenAI 竞争的模型;” (2.c.iii)。

无论我们是合成生成数据集还是从头开始创建数据集,Argilla 都可以用于编辑给定指令的现有补全(如果有),或者只是要求注释者为其提供响应/补全。

从 Argilla 1.8.0 开始,引入了 FeedbackDataset,允许用户创建数据集以专门收集 LLM 的反馈,从而为数据集字段定义引入了更大的灵活性,并允许对同一记录进行多个不同的注释。

在本例中,我们将重点关注指令遵循数据集,但您可以在 https://argilla.com.cn/blog/argilla-for-llms 中找到有关最新 Argilla 更新和 FeedbackDataset 的更多信息。

要为指令遵循创建 FeedbackDataset,我们应该定义数据集中将存在的字段,以及我们希望注释者回答的问题,以便在微调之前收集他们的反馈。 因此,在本例中,我们需要

  • 输入的 TextField
  • TextQuestion,要求注释者提供完整响应或响应编辑(如果有)。 如果有任何现有建议,这些将附带现有建议,以帮助注释者进行注释过程。

最后,我们应该写下注释指南,注释者需要这些指南来了解他们应该提供什么样式的响应、礼貌程度等,如上所述。

翻译成代码,它看起来像这样

How to prepare data for fine-tunning using Argilla

在 Argilla 中运行上述代码将在 Argilla UI 中生成以下数据集,准备好让注释者开始提供或编辑现有响应(如果有),以便稍后收集这些响应来微调我们自己的指令遵循 LLM。

Argilla’s UI, generated from the code above

一旦整个数据集被注释,或者一旦我们对注释感到满意(您可以在我们的 分布式工作负载博客文章 中找到一些提示),我们就可以从 Argilla 下载 FeedbackDataset,并将其格式化为我们想要稍后用于指令遵循的监督微调的格式。

在博客文章为所有人带来 LLM 微调和 RLHF [2] 中,我们更详细地描述了如何使用 Argilla 进行监督微调。

想了解更多?

这是致力于 RLHF 替代方案的一系列博客文章的第一篇。 本系列的第二篇文章可以在 此处 找到。

Argilla 和 Mantis NLP 团队很乐意帮助您解答关于使用监督微调、强化学习或直接偏好优化训练 LLM 的准备步骤的任何问题。

Argilla 的 LLM 数据平台目前支持所有数据管理步骤,Mantis NLP 提供整个过程的端到端支持。