这是关于采用开源大型语言模型 (LLM) 的系列博文中的第三篇。在这篇文章中,我们探讨了一些整理良好训练数据集的经验法则。
介绍
微调 LLM 是一门艺术与科学的结合,该领域的最佳实践仍在不断涌现。在这篇博文中,我们将重点介绍微调的设计变量,并就我们迄今为止看到的在资源受限的情况下微调模型的最佳实践提供方向性指导。我们建议使用以下信息作为制定微调实验策略的起点。
完全微调与参数高效微调(PEFT)
完全微调和 PEFT 在应用于学术和实际环境中的新领域时都表现出下游性能的提升。选择其中一种归结为可用的计算量(以 GPU 小时和 GPU 内存为单位)、除目标下游任务之外的任务上的性能(学习-遗忘权衡)和人工注释成本。
完全微调更容易出现两个问题:模型崩溃和灾难性遗忘。模型崩溃是指模型输出收敛到一组有限的输出,而原始内容分布的尾部消失。正如本系列第 1 部分所讨论的,灾难性遗忘会导致模型失去其能力。一些早期的实证研究表明,与 PEFT 技术相比,完全微调技术更容易出现上述问题,但还需要进行更多研究。
PEFT 技术在设计上充当了微调的自然正则化器。PEFT 通常需要相对较少的计算来训练下游模型,并且对于资源受限且数据集大小有限的场景来说更容易实现。在某些情况下,完全微调在特定的目标任务上表现出更好的性能,通常以忘记原始模型的一些功能为代价。本文在 LoRA 和完全微调的比较中深入探讨了特定下游任务性能与其他任务性能之间的这种“学习-遗忘”权衡。
鉴于资源限制,与完全微调相比,PEFT 技术可能会提供更好的性能提升/成本比。如果下游性能在资源限制的情况下至关重要,则完全微调将是最有效的。无论哪种情况,关键都是要创建高质量的数据集,同时牢记以下关键原则。
数据集管理
在文献中的微调实验中,数据集对于获得微调的好处至关重要。除了“更好的质量和更多的示例”之外,还有更多细微差别,您可以明智地投资数据集收集,以提高资源受限的微调实验的性能。
数据质量/数量
- 质量至关重要:我们看到的一个普遍趋势是质量比数量更重要——也就是说,最好拥有一小组高质量的数据,而不是一大组低质量的数据。质量的关键原则是一致的注释、没有错误、没有错误标记的数据、没有嘈杂的输入/输出,以及与总体相比具有代表性的分布。在微调时,LIMA 数据集的几千个精选示例比 50K 机器生成的 Alpaca 数据集具有更好的性能。OpenAI微调文档表明,即使是 50 到 100 个示例的数据集也可能产生影响。
- 更复杂的语言任务需要更多数据:文本生成和摘要等相对复杂的任务更难微调,需要的数据比分类和实体提取等简单任务更多。这里的“更复杂”可以表示多种意思:输出中有更多的标记、需要更高阶的人类能力、多个正确答案。
- 有效、高质量的数据收集:由于数据收集是昂贵,建议使用以下策略来提高样品效率并降低成本
- 观察故障模式:观察先前的 ML 功能失败的示例,并添加针对这些故障模式的示例。
- 人为参与:这是扩展数据标记的一种更便宜的方法。我们使用 LLM 自动化来生成基本响应,人工注释者可以使用该响应在更短的时间内进行标记。
数据多样性
简单来说,如果你用特定类型的响应过度训练模型,即使这不是最合适的答案,它也会倾向于给出该响应。这里的经验法则是尽可能确保训练数据反映模型在现实世界中的行为方式。
- 重复:这已被发现是导致微调和预训练中模型性能下降的原因。通过去重实现多样性通常可以提高性能指标。
- 输入的多样性:解释输入以实现多样性。在对 SQLCoder2 进行微调时,团队重新措辞了 SQL 查询附带的纯文本,以引入句法和语义多样性。同样,指令回译也已用于人类书面文本,通过询问法学硕士“这可以回答哪些问题?”来生成问答数据集。
- 数据集的多样性:在针对更通用的下游任务(例如多语言适应)进行微调时,使用多样化的数据集已被证明可以改善学习-遗忘权衡,即遗忘模型的原始能力和学习新功能。针对印地语和奥迪亚语等不同语言的微调模型已使用丰富的语言特定数据集和其他指令微调数据集(例如FLAN、Alpaca、Dolly 等)来引入多样性。
- 标准化输出:事实证明,从输出中删除空格和其他格式花招会有所帮助。SQLCoder2从生成的 SQL 中删除空格,让模型专注于学习重要的 SQL 概念,而不是诸如空格和缩进之类的花招。如果你想在回答中采用特定的语气。“帮助台聊天机器人是……”,然后将它们添加到每个示例的数据集中
基于 LLM 的数据管道
为了整理高质量的多样化数据集,数据管道通常使用 LLM 来降低注释成本。目前观察到以下技术:
- 评估:使用高质量数据集训练模型,并使用它来注释大型数据集以筛选出高质量示例。
- 生成:用高质量示例为 LLM 播种,并促使生成类似的高质量示例。合成数据集最佳实践开始实现。
- 人为参与:使用 LLM 生成一组初始输出,并通过编辑或选择偏好来使用人类来提高质量。
调试数据集
- 评估数据集是否存在不良输出:如果模型在某些方面仍然表现不佳,请添加训练示例,直接向模型展示如何正确执行这些方面。如果您的模型存在语法、逻辑或风格问题,请检查您的数据是否存在任何相同的问题。例如,如果模型现在说“我会为您安排这次会议”(但实际上不应该),请查看现有示例是否教会模型说它可以做它无法做到的新事情。
- 仔细检查正/负类别的平衡:如果数据中 60% 的助手回答说“我无法回答这个问题”,但在推理时只有 5% 的回答应该这样说,那么您可能会收到过多的拒绝。
- 详尽性和一致性:确保您的训练示例包含响应所需的所有信息。如果我们希望模型根据用户的个人特征来称赞用户,而训练示例包括助手对前一次对话中未发现的特征的称赞,则模型可能会学会产生幻觉信息。确保您的所有训练示例都采用相同的格式,以符合推理的预期。查看训练示例中的一致性和一致性。如果多个人创建了训练数据,则模型性能可能会受到人们之间的一致性和一致性水平的限制。例如,在文本提取任务中,如果人们仅同意 70% 的提取片段,则模型可能无法做得更好。
结论
微调是 LLM 开发的一个重要方面,需要在艺术和科学之间取得微妙的平衡。数据集的质量和管理对微调的成功起着重要作用,小型微调的 LLM 在特定任务上的表现通常优于大型模型。一旦做出微调的决定,Llama 微调指南将提供一个坚实的起点。微调数据集组合的专有性质阻碍了最佳实践和开源进步的共享。随着该领域的不断发展,我们预计会出现通用的最佳实践,同时保持微调的创造性和适应性。
致谢
我们要感谢 Suraj Subramanian 和 Varun Vontimitta 对这篇博文的组织和准备提出的建设性反馈。