原文:
https://ai.meta.com/blog/adapting-large-language-models-llms/
https://ai.meta.com/blog/when-to-fine-tune-llms-vs-other-techniques/
https://ai.meta.com/blog/how-to-fine-tune-llms-peft-dataset-curation/
这是关于适应开源大语言模型 (LLMs) 的三部分系列博客文章中的第一篇。在本文中,我们将了解适应 LLMs 到领域数据的各种可用方法。
引言
大语言模型 (LLMs) 在众多语言任务和自然语言处理 (NLP) 基准测试中展现了卓越的能力。基于这些"通用"模型的产品用例正在增加。在这篇博客文章中,我们将为希望适应和整合 LLMs 到项目中的小型 AI 产品团队提供指导。让我们从澄清 LLMs 周围的 (通常令人困惑的) 术语开始,然后简要比较可用的不同适应方法,最后推荐一个逐步流程图来确定适合您用例的正确方法。
LLM 适应方法
预训练
预训练是使用数万亿数据 tokens 从头开始训练 LLM 的过程。模型使用自监督算法进行训练。最常见的是,训练通过自回归预测下一个 token 来进行 (又称因果语言建模)。预训练通常需要数千 GPU 小时 (105 – 107 [source1, source2]) 分布在多个 GPU 上。预训练的输出模型被称为 基础模型。
持续预训练
持续预训练 (又称二阶段预训练) 涉及使用新的、未见过的领域数据进一步训练基础模型。使用与初始预训练相同的自监督算法。通常涉及所有模型权重,并将原始数据的一部分与新数据混合。
微调
微调是使用带注释的数据集以监督方式或使用基于强化学习的技术来适应预训练语言模型的过程。与预训练相比,有两个主要区别:
- 在带注释的数据集上进行监督训练—包含正确的标签/答案/偏好—而不是自监督训练
- 需要更少的 tokens (数千或数百万,而不是预训练所需的数十亿或数万亿),主要目的是增强指令遵循、人类对齐、任务表现等能力
理解当前微调格局有两个维度:改变的参数百分比和微调结果添加的新能力。
改变的参数百分比
根据改变的参数数量,有两类算法:
- 完全微调: 顾名思义,这包括改变模型的所有参数,包括对 XLMR 和 BERT (1 – 3 亿参数) 等较小模型的传统微调,以及对 Llama 2、GPT3 (10 亿以上参数) 等大型模型的微调。
- 参数高效微调 (PEFT): 与微调所有 LLM 权重不同,PEFT 算法只微调少量额外参数或更新预训练参数的一个子集,通常是总参数的 1 – 6%。
添加到基础模型的能力
进行微调的目的是为预训练模型添加能力—例如:指令遵循、人类对齐等。对话调优的 Llama 2 是一个具有添加指令遵循和对齐能力的微调模型的 示例。
检索增强生成 (RAG)
企业还可以通过添加特定领域知识库来适应 LLMs。RAG 本质上是"搜索驱动的 LLM 文本生成"。RAG 于 2020 年推出,使用根据用户问题检索并注入 LLM 提示的动态提示上下文,以引导它使用检索到的内容而不是预训练的—可能过时的—知识。Chat LangChain 是一个由 RAG 驱动的 LangChain 文档问答聊天机器人的流行示例。
上下文学习 (ICL)
通过 ICL,我们通过在提示中放置原型示例来适应 LLM。多项研究表明,"通过示例演示"是有效的。这些示例可以包含不同类型的信息:
还存在多种其他修改提示的策略,提示工程指南包含了全面的概述。
选择正确的适配方法
为了决定哪种上述方法适合特定应用,您应该考虑各种因素:所追求任务所需的模型能力、训练成本、推理成本、数据集类型等。下面的流程图总结了我们的建议,以帮助您选择正确的大语言模型(LLM)适配方法。
❌ 预训练
预训练是 LLM 训练的重要部分,使用 token 预测变体作为损失函数。其自监督性质允许在大量数据上进行训练。例如,Llama 2 在 2 万亿 tokens 上进行了训练。这需要大规模的计算基础设施:Llama 2 70B 花费了 1,720,320 GPU 小时。因此,对于资源有限的团队,我们不建议将预训练作为 LLM 适配的可行方法。
由于预训练在计算上prohibitive,更新已经预训练的模型权重可能是一种有效的方法来适配 LLM 以完成特定任务。任何更新预训练模型权重的方法都容易受到灾难性遗忘现象的影响,这是一个用来描述模型忘记先前学习的技能和知识的术语。例如,这项研究显示,在医疗领域进行微调的模型在指令跟随和常见问答任务的性能下降。其他研究也表明,通过预训练获得的一般知识可能在后续训练中被遗忘。例如,这项研究从领域知识、推理和阅读理解的角度提供了一些 LLM 知识遗忘的证据。
❌ 持续预训练
考虑到灾难性遗忘,最近的发展表明,持续预训练 (CPT) 可以以预训练所需计算成本的一小部分进一步提高性能。对于需要 LLM 获得新转换技能的任务,CPT 可能是有益的。例如,据报道,持续预训练在添加多语言能力方面取得了成功。
但 CPT 仍然是一个昂贵的过程,需要大量的数据和计算资源。例如,Pythia 套件经历了第二阶段的预训练,结果创建了 FinPythia-6.9B。这个专门为金融数据设计的模型使用包含 240 亿 tokens 的数据集进行了 18 天的 CPT。此外,CPT 也容易发生灾难性遗忘。因此,对于资源有限的团队,我们不建议将持续预训练作为 LLM 适配的可行方法。
总之,使用自监督算法和未标注数据集来适配 LLM(如在预训练和持续预训练中所做的那样)是资源密集型和成本高昂的,不推荐作为可行的方法。
✅ 全面微调和参数高效微调 (PEFT)
与使用未标注数据集进行预训练相比,使用较小的标注数据集进行微调是一种更具成本效益的方法。通过将预训练模型适配到特定任务,经过微调的模型在广泛的应用和专业领域(如法律、医疗或金融)中都显示出达到了最先进的结果。
微调,特别是参数高效微调 (PEFT),只需要预训练/持续预训练所需计算资源的一小部分。因此,这对于资源有限的团队来说是一种可行的 LLM 适配方法。在本系列的第 3 部分中,我们深入探讨了微调的细节,包括全面微调、PEFT 以及如何进行微调的实用指南。
✅ 检索增强生成 (RAG)
RAG 是另一种流行的 LLM 适配方法。如果您的应用需要从动态知识库中提取信息(例如问答机器人),RAG 可能是一个很好的解决方案。基于 RAG 的系统的复杂性主要在于检索引擎的实现。这种系统的推理成本可能更高,因为提示包括检索到的文档,而且大多数提供商使用按 token 计费的模型。在本系列的第 2 部分中,我们更广泛地讨论了 RAG,并与微调进行了比较。
✅ 上下文学习 (ICL)
这是适配 LLM 最具成本效益的方式。ICL 不需要任何额外的训练数据或计算资源,使其成为一种成本效益高的方法。然而,与 RAG 类似,由于在推理时处理更多的 tokens,推理的成本和延迟可能会增加。
总结
创建基于 LLM 的系统是一个迭代过程。我们建议从简单的方法开始,逐步增加复杂性,直到达到您的目标。上面的流程图概述了这个迭代过程,为您的 LLM 适配策略提供了坚实的基础。
致谢
我们要感谢 Suraj Subramanian 和 Varun Vontimitta 对这篇博文的组织和准备提供的建设性反馈。
第二部分:微调还是不微调
这是关于适应开源大语言模型 (LLMs) 系列博客文章中的第二篇。在这篇文章中,我们将讨论以下问题:"我们什么时候应该微调,什么时候应该考虑其他技术?"
引言
在大语言模型兴起之前,微调常用于较小规模的模型 (1 亿 - 3 亿参数)。最先进的领域应用是使用监督微调 (SFT) 构建的—即使用你自己领域和下游任务的标注数据进一步训练预训练模型。然而,随着更大模型 (> 10 亿参数) 的出现,微调的问题变得更加微妙。最重要的是,大型模型需要更多资源和商业硬件进行微调。下面的表 1 提供了在三种情况下微调 Llama 2 7B 和 Llama 2 13B 模型的峰值 GPU 内存使用情况列表。你可能会注意到,像 QLoRA 这样的算法使得使用有限资源微调大型模型变得更加容易。例如,表 1 显示了在 Llama 2 7B 上三种微调方案 (全量微调、LoRA 和 QLoRA) 的峰值 GPU 内存。类似的内存减少作为参数高效微调 (PEFT) 或量化的结果也在 Llama 1 上 报告 过。除了计算资源外,灾难性遗忘 (有关更多信息,请参阅本系列的 第一部分) 是全参数微调的一个常见陷阱。PEFT 技术旨在通过训练少量参数来解决这些缺点。
表 1: 不同微调方法在 LLama 2 7B 上的内存 (GB) (来源)。QLoRA 使用 4 位 NormalFloat 量化。
可能受益于微调的原型
我们确定了以下场景作为可以从微调中受益的常见用例:
- 语气、风格和格式定制: 用例可能需要一个反映特定人格或服务特定受众的大语言模型。通过使用自定义数据集微调大语言模型,我们可以塑造聊天机器人的回应,使其更紧密地与其受众的特定要求或预期体验保持一致。我们可能还希望以特定方式构建输出—例如,JSON、YAML 或 Markdown 格式的输出。
- 提高准确性和处理边缘情况: 微调可用于纠正通过提示工程和上下文学习难以纠正的幻觉或错误。它还可以增强模型执行新技能或任务的能力,这些任务在提示中难以表达。这个过程可以帮助纠正模型无法遵循复杂提示的失败,并提高其产生所需输出的可靠性。我们提供两个例子:
- Phi-2 在金融数据情感分析上的准确率 从 34% 提高到 85%。
- ChatGPT 在 Reddit 评论情感分析上的准确率 提高了 25 个百分点 (从 48% 提高到 73%),仅使用 100 个示例。
通常,对于较小的初始准确率数字 (< 50%),使用几百个示例进行微调会有很大的提升。
- 解决代表性不足的领域: 尽管大语言模型在大量通用数据上进行了训练,但它们可能并不总是精通每个小众领域的细微行话、术语或特殊性。对于法律、医疗或金融等多样化领域,微调已被证明有助于提高下游任务的准确性。我们提供两个例子:
- 正如这篇 文章 指出的,患者的病历包含高度敏感的数据,这些数据通常不会在公共领域中找到。因此,基于大语言模型的系统用于总结病历需要微调。
- 对于代表性不足的语言,如印度语系语言,使用 PEFT 技术进行微调 在所有任务中都有帮助。
- 成本降低: 微调可以将 Llama 2 70B/GPT-4 等更大模型的技能提炼到 Llama 2 7B 等较小的模型中,在不影响质量的情况下降低成本和延迟。此外,微调减少了对冗长或特定提示 (如提示工程中使用的) 的需求,从而节省 token 并进一步降低成本。例如,这篇文章 展示了如何通过提炼更昂贵的 GPT-4 模型来微调 GPT-3.5 评判器,从而实现成本节省。
- 新任务/能力: 通常,可以通过微调实现新的能力。我们提供三个例子:
- 微调大语言模型以 更好地使用给定检索器的上下文 或完全忽略它
- 微调大语言模型 评判器来评估其他大语言模型,评估指标如真实性、合规性或有用性
- 微调大语言模型以 增加上下文窗口
与其他领域适应技术的比较
微调 vs. 上下文 (少样本) 学习
上下文学习 (ICL) 是提高基于大语言模型系统性能的强大方法。鉴于其简单性,在进行任何微调活动之前应该先尝试 ICL。此外,ICL 实验可以帮助你评估微调是否会提高下游任务的性能。使用 ICL 时的常见考虑因素是:
- 随着需要展示的示例数量增加,推理成本和延迟也会增加。
- 随着示例越来越多,大语言模型 常常会忽略一些。这意味着你可能需要一个基于 RAG 的系统,根据输入找到最相关的示例。
- 大语言模型可能会吐出作为示例提供给它们的知识。这个问题在微调时也存在。
微调 vs. 和 RAG
普遍共识是,当大语言模型的基础性能不令人满意时,你可能会"从 RAG 开始,评估其性能,如果发现不足,就转向微调",或者"RAG 可能具有优势"超过微调 (来源)。然而,我们认为这种范式过于简单化,因为在许多情况下,RAG 不仅不是微调的替代方案,而且更多的是微调的补充方法。根据问题的特征,应该尝试一种或可能两种方法。采用 这篇文章 的框架,以下是一些你可能会问的问题,以确定微调或 RAG (或可能两者都) 是否适合你的问题:
- 你的应用是否需要外部知识?微调通常不适用于注入新知识。
- 你的应用是否需要自定义语气/行为/词汇或风格?对于这些类型的要求,微调通常是正确的方法。
- 你的应用对幻觉的容忍度如何?在抑制虚假和想象性编造至关重要的应用中,RAG 系统提供了内置机制来最小化幻觉。
- 有多少标记的训练数据可用?
- 数据的静态/动态程度如何?如果问题需要访问动态的数据语料库,微调可能不是正确的方法,因为大语言模型的知识很快就会过时。
- 大语言模型应用需要多大的透明度/可解释性?RAG 本质上可以提供参考,这对解释大语言模型输出很有用。
- 成本和复杂性:团队是否有构建搜索系统的专业知识或之前的微调经验?
- 你的应用中的任务有多么多样化?
在大多数情况下,微调和 RAG 的混合解决方案将产生最佳结果—然后问题就变成了同时做这两者的成本、时间和额外的独立收益。参考上述问题来指导你的决策,是否需要 RAG 和/或微调,并通过分析错误来进行内部实验,以了解可能的指标增益。最后,微调的探索确实需要一个强大的数据收集和数据改进策略,我们建议将其作为开始微调的前提条件。
致谢
我们要感谢 Suraj Subramanian 和 Varun Vontimitta 对这篇博文的组织和准备提供的建设性反馈。
第三部分:如何微调:专注于有效的数据集
这是关于适配开源大语言模型 (LLMs) 系列博客的第三篇文章。在本文中,我们将探讨一些关于整理优质训练数据集的经验法则。
引言
微调 LLMs 是艺术和科学的结合,该领域的最佳实践仍在不断涌现。在这篇博文中,我们将重点介绍微调的设计变量,并针对在资源受限的情况下微调模型的最佳实践提供方向性指导。我们建议将以下信息作为制定微调实验策略的起点。
全量微调 vs. 参数高效微调 (PEFT)
全量微调和 PEFT 在 学术 和 实际应用 中都显示出在新领域应用时能提高下游性能。选择其中之一归根结底取决于可用的计算资源 (以 GPU 小时和 GPU 内存计)、目标下游任务以外的任务性能 (学习-遗忘权衡) 以及人工标注成本。
全量微调更容易遭受两个问题:模型崩溃 和 灾难性遗忘。模型崩溃是指模型输出收敛到有限的输出集,原始内容分布的尾部消失。灾难性遗忘,如本系列 第一部分 所讨论的,会导致模型失去其能力。一些早期的实证研究表明,与 PEFT 技术相比,全量微调技术更容易出现上述问题,尽管还需要更多的研究。
PEFT 技术在设计上可以作为微调的自然正则化器。PEFT 通常需要相对较少的计算资源来训练下游模型,并且在数据集规模有限的资源受限场景中更易于使用。在某些情况下,全量微调在特定任务上表现更好,但通常会以遗忘原始模型的某些能力为代价。这种特定下游任务性能与其他任务性能之间的"学习-遗忘"权衡在 这篇论文 中对 LoRA 和全量微调进行了深入比较。
考虑到资源限制,PEFT 技术可能会比全量微调提供更好的性能提升/成本比。如果在资源受限的情况下下游性能至关重要,全量微调将是最有效的。无论哪种情况,关键是要牢记以下主要原则来创建高质量数据集。
数据集整理
在文献中的微调实验中,数据集对于获得微调的好处至关重要。这里的细微之处不仅仅是"更好的质量和更多的示例",您可以明智地投资于数据集收集,以在资源受限的微调实验中提高性能。
数据质量/数量
- 质量至关重要: 我们看到的一般趋势是质量比数量更重要——即拥有一小组高质量数据比拥有大量低质量数据更好。质量的关键原则是一致的标注,没有错误、错误标记的数据、噪声输入/输出,并且与总体相比具有代表性分布。在微调时,LIMA 数据集 的几千个精心策划的示例比 50K 机器生成的 Alpaca 数据集表现更好。OpenAI 微调文档 建议即使是 50 到 100 个示例的数据集也可能产生影响。
- 更难的语言任务需要更多数据: 相对较难的任务,如文本生成和摘要,更难微调,需要比分类和实体提取等简单任务更多的数据。这里的"更难"可能意味着多种情况:输出中的 token 更多,需要更高阶的人类能力,存在多个正确答案。
- 有效的高质量数据收集: 由于数据收集成本高昂,建议使用以下策略来提高样本效率并降低成本
- 观察失败模式:观察先前 ML 能力失败的示例,并添加针对这些失败模式的示例。
- 人机协作:这是一种更便宜的扩展数据标注的方式。我们使用 LLM 自动化生成基础响应,人类标注者可以用更少的时间来标注。
数据多样性
简单来说,如果您用特定类型的响应过度训练模型,即使不是最合适的答案,它也会偏向于给出那种响应。这里的经验法则是尽可能确保训练数据反映模型在现实世界中应该如何表现。
- 重复: 这被 发现 是微调和预训练中模型退化的原因。通过去重实现多样性通常会提高性能指标。
- 输入多样性: 通过释义输入来增加多样性。在 微调 SQLCoder2 时,团队重新表述了伴随 SQL 查询的纯文本,以引入语法和语义多样性。类似地,指令反向翻译 被用于人工编写的文本,通过询问 LLM "这可能是对什么问题的回答?" 来生成问答数据集。
- 数据集多样性: 当为更一般的下游任务微调时——例如,多语言适配——使用多样化的数据集已被证明可以改善模型原始能力的遗忘和新能力学习之间的权衡。针对不同语言如 印地语 和 奥里亚语 的微调模型使用了丰富的特定语言数据集,以及其他指令微调数据集,如 FLAN、Alpaca、Dolly 等,以引入多样性。
- 标准化输出: 移除输出中的空白和其他格式技巧已被证明有帮助。SQLCoder2 从生成的 SQL 中移除空白,让模型专注于学习重要的 SQL 概念,而不是诸如空格和缩进等技巧。如果您希望回答中有特定的语气。"服务台聊天机器人是...",那么为每个示例在数据集中添加这些内容。
基于 LLM 的数据管道
为了整理高质量、多样化的数据集,数据管道经常使用 LLMs 来降低标注成本。以下技术在实践中被观察到:
- 评估: 用高质量数据集训练模型,并使用它来标注您的较大数据集,以筛选出高质量示例。
- 生成: 用高质量示例为 LLMs 提供种子,并提示生成类似的高质量示例。合成数据集最佳实践 正在开始形成。
- 人机协作: 使用 LLMs 生成初始输出集,并让人类通过编辑或选择偏好来提高质量。
调试您的数据集
- 评估您的数据集是否有不良输出: 如果模型在某些方面仍然表现不佳,添加直接向模型展示如何正确处理这些方面的训练示例。如果您的模型存在语法、逻辑或风格问题,检查您的数据是否存在相同的问题。例如,如果模型现在说 "我会为您安排这个会议" (而它不应该这样说),看看现有示例是否教导模型说它可以做一些它实际上不能做的新事情。
- 仔细检查正/负类别的平衡: 如果数据中 60% 的助手回复说 "我无法回答这个问题",但在推理时只有 5% 的回复应该这样说,您可能会得到过多的拒绝。
- 全面性和一致性: 确保您的训练示例包含响应所需的所有信息。如果我们希望模型根据用户的个人特征来赞美用户,而训练示例中包含助手对前面对话中没有出现的特征的赞美,模型可能会学会虚构信息。确保所有训练示例都采用与推理时预期相同的格式。查看训练示例中的一致性。如果多人创建了训练数据,模型性能可能会受到人与人之间一致性水平的限制。例如,在文本提取任务中,如果人们只在 70% 的提取片段上达成一致,模型可能无法做得更好。
结论
微调是大语言模型开发中的一个关键环节,它需要在艺术和科学之间找到微妙的平衡。数据集的质量和策划在微调的成功中起着重要作用,小型微调后的大语言模型在特定任务上往往表现优于更大的模型。一旦决定进行微调, Llama 微调指南 提供了一个坚实的起点。由于微调数据集组合的专有性质,阻碍了最佳实践的分享和开源进展。随着该领域的不断发展,我们预期会出现通用的最佳实践,同时保持微调的创造性和适应性。
致谢
我们要感谢 Suraj Subramanian 和 Varun Vontimitta 对本博客文章的组织和准备所提供的建设性反馈。