这篇博客最初是与 MantisNLP 合作,在 Medium 上发布的博客系列的一部分。请查看本博客系列的前一部分 此处。在这里,我们分析了对预训练的 LLM 进行监督微调所需的工作,以及指令数据对于这一步骤的重要性。
基于人类反馈的强化学习
不幸的是,仅靠 SFT 通常不足以改进大型语言模型以满足特定要求。
有了它,您可以弥补预训练 LLM 中可能缺乏的信息,改变风格、结构,并教会模型对不同的输出做出不同的回答。
然而,对于一个问题,总会有多种回答方式。最先进的对话模型,如 ChatGPT,传统上需要一个额外的步骤,称为基于人类反馈的强化学习 (RLHF)。
强化学习是一种范式,其中智能体通过接收来自环境的反馈来学习做出决策。在语言模型的上下文中,这种反馈由人工审核员提供,他们评估和评价模型的响应。通过利用人类的专业知识和判断,强化学习促进了模型性能的迭代改进,并微调其响应。
基于人类反馈的强化学习过程涉及几个重要的步骤
- 定义指南是为了保证在决定什么是好的答案,什么是不好的答案时,有唯一的标准。
- 应该训练一个 奖励模型 (RM),它将根据准确性、相关性和对指南的遵守程度来评估每个响应。
- 为了训练 RM,选择一些提示并发送给人工审核员。我们称之为 偏好数据 (PD)
- 然后,审核员与模型交互,手动评估和评价相应的输出。
- 收集到的反馈,以评分或排名的形式,用于训练 RM。
- 在 RM 训练完成后,我们可以训练一个 策略优化器,这是一个必需的组件,它将指导 LLM 的微调。
- 我们使用策略优化来微调 LLM。
- 这种迭代反馈循环允许模型逐步从人类指导中学习,并相应地改进其行为。
偏好数据
此时的主要要求是拥有偏好数据 (PD)。偏好数据是针对一个提示的一系列选项/替代方案的集合,可以发送给一组注释员和/或主题 matter 专家 (SME),以便他们根据一些注释指南,将这些选项从最好到最差进行评分。
已经使用了几种方法来创建偏好数据。
- 对于选择最佳提示,您可以预定义一组提示,预定义一个模板并动态生成一些提示,和/或将这些提示与来自数据库的随机提示相结合,例如。
- 对于选择答案,您可以将提示发送到模型的特定版本(您最后微调的版本)或不同的检查点。决定您要对多少个答案进行排名:您可以使用 2 个答案,并使用最佳-最差的二元排名方案,或者让您的注释员从 1 到 5 进行排名,例如。
- 始终首先定义不同排名级别的注释指南,以最大限度地减少个人解释并标准化答案。
您还可以使用一些数据集,您可以在 这个 GitHub 存储库 中找到它们
数据集链接 | 类型 | 大小 | 描述 |
OpenAI WebGPT 比较 | 问答 | 2 万 | 2 万个比较,其中每个示例包含一个问题、一对模型答案以及每个人工评分的答案的偏好分数。用于训练 OpenAI WebGPT 奖励模型的 RLHF 数据集。 |
OpenAI 摘要 | 摘要 | 6.4 万 | 6.4 万个文本摘要示例,包括人工编写的响应和人工评分的模型响应。OpenAI Learning to Summarize from Human Feedback 论文中使用的 RLHF 数据集。 |
OpenAssistant 对话数据集 (OASST1) | 对话 | 46.1 万 | 一个人工生成、人工注释的助手风格对话语料库,包含 35 种语言的 16.1 万条消息,注释了 46.1 万个质量评级,最终形成了 1 万多个完全注释的对话树 |
斯坦福人类偏好数据集 (SHP) | 问答 指令 |
38.5 万 | 38.5 万个关于 18 个领域中对问题/指令的响应的集体人类偏好,用于训练 RLHF 奖励模型和 NLG 评估模型。 |
Reddit ELI5 | 问答 | 27 万 | 从 3 个问答子版块收集的 27 万个问题、答案和分数示例 |
人类 ChatGPT 比较语料库 (HC3) | 问答 | 6 万 |
|
这就是 OpenAI 摘要偏好数据 的样子(再次使用 Hugging Face Dataset viewer):给定 1 个提示(左侧,一篇关于文章的摘要任务),您有 N 个答案(右侧,摘要),并带有排名/分数(在这种情况下,有几个轴/指标,如准确性、覆盖率等,最终的聚合指标称为“overall”)
在收集了提示和答案的数据集(偏好数据 - PD)之后,您就可以将它们发送给您的注释员进行审核。
让我们看看如何使用 Argilla 的数据注释平台轻松地进行 PD 的数据收集和监督过程。
使用 Argilla 的偏好数据
如上所述,偏好数据意味着将输出从最好到最差进行排名。Argilla 在 1.12.0 版本中引入了 RankingQuestion
到 FeedbackDataset
中,可以用于这种排名。
快速回顾一下,Argilla 中的 FeedbackDataset
需要字段列表和问题列表,以便注释员可以为这些问题提供答案。在这种情况下,要对如上所述的数据集中的答案进行排名,我们需要以下内容
TextField
用于定义提示和为这些提示生成的答案。RankingQuestion
用于要求注释员根据预定义的注释指南,将给定提示的响应从最好到最差进行排名。
转换为代码,它看起来像这样
在 Argilla 中运行上述代码,将在 Argilla UI 中生成以下数据集,准备好让注释员开始对一系列提示的答案进行排名,以便稍后收集起来,以训练/微调基于偏好数据的强化学习模型。
排名级别数
偏好数据可以包含多个要从 0 到 N 排序的备选项。ChatGPT 使用了从 A 到 D 排序的 4 个备选项(见下图)。然而,简化的方法,如直接偏好优化,只需要对已选择 vs 已拒绝进行二元分类。这样,您可以设置 Argilla 仅显示两个响应(Response-1 和 Reponse-2),并将最佳的选为已选择,将最不喜欢的选为已拒绝。
查看关于如何使用 Argilla 准备您的 RLHF 数据,然后使用 Hugging Face trl
[3] 库训练 RLHF 模型的详细信息,请参阅这篇 Argilla 的帖子 [2],关于 LLM 微调。
用于微调的指令数据 vs 用于强化学习的偏好数据
到目前为止,我们已经看到我们需要 2 个数据集来使我们的基于 LLM 的聊天机器人工作:用于微调的指令数据和用于强化学习的偏好数据。让我们澄清一下两者之间的区别
- 指令数据用于微调步骤,由提示和预期答案组成,旨在改进或纠正 LLM 基于提示生成文本的方式。您甚至可能希望训练模型生成一种新型内容,例如,广告文案、SEO 内容、报告等 - 而模型可能没有经过训练来做到这一点!这就是指令数据发挥作用的地方,它由包含1 个提示和 1 个为其生成的示例的行组成。
- 偏好数据用于训练策略(见下一节)。基本上,在这里您不再教模型编写特定的电子邮件或报告或任何您需要的内容。您正在训练一个策略模型,以使模型能够区分,给定 N 个对一个提示可接受的答案,哪些答案比其他答案更好。通常,偏好数据是一个提示和对该提示的 N 个答案的集合,然后由一组注释员或主题 matter 专家进行排名。
这就是 ChatGPT 对其的描述
现在让我们来谈谈如何使用偏好数据来训练策略,以优化答案的质量,同时考虑到提供的排名。
奖励模型和策略优化器
RLHF 为自定义 LLM 的训练过程增加了很多复杂性。总结一下我们上面描述的内容。这张图总结了您需要做的一切
总而言之,它需要以下工件
- 注释指南,用于定义什么是好的答案或不好的答案。
- 偏好数据:为人工标注员选择提示。为评估者生成输出。
- 一个 奖励模型 (RM);
- 一个 策略,使用来自 RM 的数据进行优化;
显然,这个过程在人力和计算资源方面都非常复杂和昂贵。但是,有一些替代方案将模型的微调 (SFT) 与奖励建模相结合,大大简化了该过程。让我们来谈谈它们。
想了解更多?
这是专门讨论 RLHF 替代方案的系列博客文章的第二篇。该系列的第一篇文章可以在 此处 找到。请查看本博客系列的下一部分 此处。
Argilla 和 Mantis NLP 团队很乐意帮助您解答关于使用监督微调、强化学习或直接偏好优化训练 LLM 的准备步骤的任何问题。
Argilla 的 LLM 数据平台目前支持所有数据管理步骤,Mantis NLP 提供整个过程的端到端支持。