定制你的AI助手:大型语言模型适配方法详解
这是一个由三部分组成的系列博客文章中的第一篇,主题是关于如何适配开源大型语言模型(LLMs)。在这篇文章中,我们将探讨适配LLMs到特定领域数据的各种方法。
- 在第2部分,我们将讨论如何确定微调是否适合你的使用场景。
- 在第3部分,我们将探讨一些整理优质训练数据集的经验法则。
引言
大型语言模型(LLMs)在大量语言任务和自然语言处理(NLP)基准测试中展现出了卓越的能力。基于这些"通用"模型的产品应用正在兴起。在这篇博客文章中,我们将为希望适配和整合LLMs到自己项目中的小型AI产品团队提供指导。让我们首先澄清LLMs相关的(常常令人困惑的)术语,然后简要比较可用的不同适配方法,最后推荐一个step-by-step流程图来为你的使用场景识别正确的方法。
LLM适配方法
预训练
预训练是使用数万亿数据token从头开始训练LLM的过程。模型使用自监督算法进行训练。最常见的是通过自回归地预测下一个token来进行训练(也称为因果语言建模)。预训练通常需要数千个GPU小时(10^5 – 10^7 [来源1, 来源2])分布在多个GPU上。预训练输出的模型被称为基础模型。
持续预训练
持续预训练(又称二阶段预训练)涉及使用新的、未见过的领域数据进一步训练基础模型。使用与初始预训练相同的自监督算法。通常涉及所有模型权重,并将一部分原始数据与新数据混合。
微调
微调是使用带注释的数据集以监督方式或使用基于强化学习的技术来适配预训练语言模型的过程。与预训练相比有两个主要区别:
- 在带注释的数据集上进行监督训练——包含正确的标签/答案/偏好——而不是自监督训练
- 需要更少的token(数千或数百万,而不是预训练所需的数十亿或数万亿),其主要目的是增强指令跟随、人类对齐、任务表现等能力
理解当前微调领域有两个维度:改变的参数百分比和微调结果增加的新能力。
改变的参数百分比
根据改变的参数数量,有两类算法:
- 全量微调:顾名思义,这包括改变模型的所有参数,包括在较小模型(如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。多项研究表明"通过示例演示"是有效的。这些示例可以包含不同类型的信息:
- 仅输入和输出文本——即少样本学习
- 推理痕迹:添加中间推理步骤;参见思维链(CoT)提示
- 计划和反思痕迹:添加教导LLM进行计划和反思其问题解决策略的信息;参见ReACT
还存在多种其他修改提示的策略,Prompt Engineering Guide包含了全面的概述。
选择正确的适配方法
为了决定哪些上述方法适合特定应用,你应该考虑各种因素:所追求任务所需的模型能力、训练成本、推理成本、数据集类型等。下面的流程图总结了我们的建议,以帮助你选择正确的LLM适配方法。
❌ 预训练
预训练是LLM训练的重要部分,使用token预测变体作为损失函数。其自监督性质允许在大量数据上进行训练。例如,Llama 2在2万亿个token上进行了训练。这需要大规模的计算基础设施:Llama 2 70B花费了1,720,320 GPU小时。因此,对于资源有限的团队,我们不建议将预训练作为LLM适配的可行方法。
由于预训练在计算上是禁止的,更新已经预训练的模型权重可能是适配LLM以完成特定任务的有效方法。任何更新预训练模型权重的方法都容易遭受灾难性遗忘现象,这是一个术语,指模型忘记先前学习的技能和知识。例如,这项研究显示了一个在医疗领域微调的模型在指令遵循和常见QA任务方面的性能如何下降。其他研究也表明,通过预训练获得的一般知识可能在后续训练中被遗忘。例如,这项研究从领域知识、推理和阅读理解的角度提供了一些LLMs知识遗忘的证据。
❌ 持续预训练
考虑到灾难性遗忘,最近的发展表明,持续预训练(CPT)可以以预训练所需计算成本的一小部分进一步提高性能。对于需要LLM获得新转换技能的任务,CPT可能是有益的。例如,据报道,持续预训练在添加多语言能力方面取得了成功。
但CPT仍然是一个昂贵的过程,需要大量的数据和计算资源。例如,Pythia套件经历了第二阶段的预训练,结果创建了FinPythia-6.9B。这个专门为金融数据设计的模型进行了18天的CPT,使用了一个包含240亿个token的数据集。此外,CPT也容易发生灾难性遗忘。因此,对于资源有限的团队,我们不建议将持续预训练作为LLM适配的可行方法。
总之,使用自监督算法和未注释数据集来适配LLM(如在预训练和持续预训练中所做的那样)是资源和成本密集型的,不推荐作为可行的方法。
✅ 全量微调和参数高效微调(PEFT)
与使用未注释数据集进行预训练相比,使用小型注释数据集进行微调是一种更具成本效益的方法。通过将预训练模型适配到特定任务,微调模型已被证明在广泛的应用和专业领域(如法律、医疗或金融)中达到最先进的结果。
微调,特别是参数高效微调(PEFT),只需要预训练/持续预训练所需计算资源的一小部分。因此,这对于资源有限的团队来说是一种可行的LLM适配方法。在本系列的第3部分,我们深入探讨微调细节,包括全量微调、PEFT,以及如何进行微调的实用指南。
✅ 检索增强生成(RAG)
RAG是另一种流行的LLM适配方法。如果你的应用需要从动态知识库中提取信息(例如QA机器人),RAG可能是一个很好的解决方案。RAG系统的复杂性主要在于检索引擎的实现。这种系统的推理成本可能更高,因为提示包括检索到的文档,而且大多数提供商使用按token计费的模型。在本系列的第2部分,我们更广泛地讨论RAG,并与微调进行比较。
✅ 上下文学习(ICL)
这是适配LLMs最具成本效益的方式。ICL不需要任何额外的训练数据或计算资源,使其成为一种成本效益高的方法。然而,与RAG类似,由于在推理时处理更多的token,推理的成本和延迟可能会增加。
总结
创建基于LLM的系统是一个迭代过程。我们建议从简单的方法开始,逐步增加复杂性,直到达成目标。上面的流程图概述了这个迭代过程,为你的LLM适配策略提供了坚实的基础。