Meta祭出三篇最详尽Llama微调指南,千字长文,0基础小白必备

文章正文
发布时间:2024-08-28 08:32

【新智元导读】微调的所有门道,都在这里了。

开源,就要开的彻彻底底。

这不,Meta一连放出三篇技术文章,从大模型适配方法出发,介绍了:

如何使用特定领域数据微调LLM,如何确定微调适配自己的用例,以及如何管理良好训练数据集的经验法则。

接下来,直接进入正题。

适配大模型

预训练

预训练是指,使用数万亿个token数据,从头开始训练LLM的过程,通常使用自监督算法进行训练。

最常见的情况是,训练通过自回归预测下一个token(也称为因果语言建模)。

预训练通常需要数千个GPU小时(105-107个),并分布在多个GPU上进行。

预训练的输出模型称为「基础模型」。

继续预训练

继续预训练(也称为第二阶段预训练)将使用全新的、未见过的领域数据进一步训练基础模型。

这里,同样使用与初始预训练相同的自监督算法。

通常会涉及所有模型权重,并将一部分原始数据与新数据混合。

微调

微调是以监督方式使用带注释的数据,或使用基于强化学习的技术,来适配预训练语言模型的过程。

与预训练相比,微调有两个主要区别:

- 在包含正确标签/答案/偏好的注释数据集上进行监督训练,而不是自监督训练

- 需要较少的token(数千或数百万,而不是预训练中需要的数十亿或数万亿),其主要目的是提高能力,如指令遵循、人类对齐、任务执行等。

而要了解微调的现状,可以从两个方面入手:参数变化的百分比和微调后新增的能力。

更改的参数百分比

根据更改的参数量,有两类算法:

- 全面微调:顾名思义,这包括更改模型的所有参数,包括在XLMR和BERT(100-300M参数)等小模型上所做的传统微调,以及对Llama 2、GPT3(1B+参数)等大模型上的微调。

- 参数高效微调(PEFT):PEFT算法只微调少量额外参数,或更新预训练参数的子集,通常是总参数的1%-6%,而不是对所有LLM权重进行离线微调。

基础模型新增的能力

微调的目的是为了向预训练的模型添加功能,比如指令遵循、人类对齐等。

聊天微调Llama 2,就是一个具有附加指令遵循和对齐能力的微调模型的例子。

检索增强生成(RAG)

企业还可以通过添加特定领域的知识库来适配LLM,RAG是典型的「搜索驱动的LLM文本生成」。

RAG于2020年推出,它使用动态提示上下文,通过用户问题检索并注入LLM提示,以引导其使用检索到的内容,而不是预训练的知识。

Chat LangChain是由RAG支持的、在Lang Chain文档上流行的Q/A聊天机器人。

上下文学习(ICL)

对于ICL,通过在提示符中放置原型示例来适配LLM。多项研究表明,「举一反三」是有效的。这些示例可以包含不同类型的信息:

- 仅输入和输出文本,也就是少样本学习

- 推理追踪:添加中间推理步骤,可参阅思维链(COT)提示

- 计划和反思追踪:添加信息,教LLM计划和反思其解决问题的策略,可参阅ReACT

选择正确的适配方法

要决定上述哪种方法适合特定应用,你应该考虑各种因素:所追求任务所需的模型能力、训练成本、推理成本、数据集类型等。

下面的流程图总结了一些建议,可以帮助你选择合适的LLM适配方法。

❌ 预训练

预训练是LLM训练的重要组成部分,它使用token预测变量作为损失函数。自监督算法,使得大量数据训练成为可能。

例如,Llama 2接受了2万亿token的训练。这需要大量的计算基础设施:Llama 2 70B需要1,720,320个GPU小时。

因此,对于资源有限的团队,Meta不建议将预训练作为LLM适配的可行方法。

在预训练计算成本很高的情况下,更新预预训练好的模型权重,可能是一种有效的方法,来适配特定任务。

不过,任何更新预训练模型权重的方法,都容易出现一种「灾难性遗忘」的现象。

比如,此前一项研究显示,在医疗领域微调训练后的模型,在遵循指令和常见问答任务上的性能出现下降。

论文地址:https://arxiv.org/pdf/2009.03300

还有很多研究可以佐证,通过预训练获得的通用知识,在后续训练过程中可能会被遗忘。

❌ 继续预训练

鉴于灾难性的遗忘,最近的研究表明,继续预训练(CPT)可以导致模型性能的进一步提高,而计算成本只是预训练的一小部分。

对于需要LLM获得新的转换技能的任务,CPT可能是有益的。

有研究报告显示,继续预训练成功地增加了多种语言能力。

但CPT成本极高,需要大量的数据和计算资源。

比如,PYTHIA套件经历了第二阶段的预训练,最终得到了FinPYTHIA-6.9B。该模型专为金融数据设计的,使用240亿token的数据集,进行了18天的继续预训练。

此外,CPT也容易导致灾难性的遗忘。

因此,对于资源有限的团队,Meta同样不建议将继续预训练训作为LLM适配的可行方法。

总而言之,在预训练和持续预训练中,使用自监督算法和未加注释的数据集,微调LLM是资源和成本密集型的,不建议将其作为一种可行的办法。

✅ 全参微调和参数高效微调(PEFT)

与使用未注释的数据集进行预训相比,使用较小的带注释的数据集进行微调,是一种更具成本效益的方法。

而且,微调后模型被证明在法律、医疗或金融等专业领域的广泛的应用中,实现了SOTA。

微调,特别是参数高效微调,只需要预训练/继续预训练所需计算资源的一小部分。

因此,对于资源有限的团队来说,这是一个可行的方法来适配LLM。

✅ 检索增强生成(RAG)

RAG是另一种流行的LLM适配方法。

如果你的应用程序需要从动态知识库(例如QA机器人)中提取,RAG可能是一个很好的解决方案。

RAG的系统的复杂性,主要在于检索引擎的实现。

这种系统的推理成本可能会更高,因为输入提示包含了检索到的文档,而大多数服务提供商采用按token计费的模式。

✅ 上下文学习(ICL)

这是适配LLM最具成本效益的方式。

ICL不需要任何额外的训练数据或计算资源,使其成为一种具有成本效益的方法。然而,与RAG类似,随着推理时处理更多的token,推理的成本和延迟可能会增加。

总之,创建一个基于LLM的系统是迭代的,上面的流程图概述了这一迭代过程,并为LLM适配战略奠定了坚实的基础。

微调还是不微调?

在第二部分中,Meta又谈了谈什么情况下,需要微调。

在大模型兴起之前,微调通常用于参数比较少的模型(100M – 300M)。

而且,最先进领域应用程序,也是使用监督微调(SFT)构建的,即使用自己专业领域和下有任务的注释数据,进一步训练预训练的模型。

然而,随着更大参数模型的出现(>1B),微调的问题变得微妙了起来。

最重要的是,大模型需要更大的资源和商业硬件来进行微调。

下表1列出了三种情况下,微调Llama 2 7B和Llama 2 13B模型的峰值GPU内存使用量。

你可能会注意到,QLoRA等算法使得利用有限资源,对大模型进行微调变得更加容易。

例如,表1显示了Llama 2 7B上三种微调模式(全面微调、LORA和QLoRA)的峰值GPU内存。

在Llama 1中,由于参数高效微调(PEFT)或量化,内存也有类似的减少。

除计算资源外,灾难性遗忘(详见本系列第一部分)也是全参数微调的常见隐患。

PEFT技术旨在通过对少量参数进行训练来解决这些缺陷。

微调可能有益的原型

研究人员将以下场景确定为可从微调中受益的常见用例:

- 语气、风格、形式定制:使用案例可能会寻求反映特定角色或服务特定受众的LLM。

通过使用定制数据集对LLM进行微调,可以塑造聊天机器人的响应,使其更符合受众的特定需求或预期的体验。

另外,研究者可能还希望它能以特定的方式组织输出,例如,JSON、YAML或Markdown格式的输出。

- 提高精度并处理边缘情况:微调可以用于纠正幻觉或错误,这些错误很难通过prompt和上下文学习来纠正。

它还可以增强模型执行新技能或任务的能力,这些技能或任务很难在提示中表达。

这个过程可以帮助纠正模型没有遵循复杂提示的错误,并提高其产生所需输出的可靠性。

以下是两个案例:

- Phi-2对金融数据情绪分析准确率,从34%提高到85%。

- 仅用100个示例,ChatGPT对Reddit评论情绪分析的准确率从48%提高到73%。

通常来说,对于较小的初始精度(<50%),微调是一个巨大的障碍,需要用几百个示例。

- 处理代表性不足的领域:尽管LLM接受了大量通用数据的训练,但它们可能并不总是精通每一个特定领域的细微差别的行话、术语或具体情况。

对于不同的领域,如法律、医疗或金融,微调已被证明有助于提高下游任务的准确性。

以下是两个案例:

- 正如本文中指出的,患者的病历包含高度敏感的数据,这些数据通常不会在公共领域中找到。因此,基于LLM的病历摘要系统需要进行微调。

- 对于印地语等代表性较少的语言,使用PEFT进行微调有助于完成这些语言的所有任务。

- 降低成本:微调可以将较大参数模型(如Llama 2 70B/GPT-4)中的技能,提炼成小模型(如Llama 2 7B)中的技能,从而在不影响质量的情况下降低成本和延迟。

此外,微调减少了对冗长或特定提示的需要,从而节省了象征性成本并进一步降低了成本。

- 新的任务/能力:通常,新的能力可以通过微调来实现。以下是三个案例:

1 微调LLM,以便更好地利用特定检索器的上下文,或完全忽略它

2 微调LLM「法官」,以评估其他LLM的指标,如接地性、合规性或有用性

3 微调LLM以增加上下文窗口

与其他领域适配技术的比较

微调与上文学习(少样本)

上下文学习(ICL)是提高基于LLM的系统性能的有效方法。

使用ICL时的常见注意事项包括:

- 随着需要展示的示例数量的增加,推理的成本和延迟也会增加。

- 随着例子越来越多,LLM忽略一些例子是很常见的。这意味着你可能需要一个基于RAG的系统,根据输入找到最相关的示例。

- LLM可以吐出提供给他们的知识作为例子。这一担忧在微调时也存在。

微调和RAG

普遍的共识是,当LLM基本性能不尽如人意时,可以先从RAG开始,衡量其性能,如果发现不足,再转向微调。

或者说,与微调相比,RAG可能更有优势。

然而,Meta认为这种范式过于简单化,因为在多种情况下,RAG不仅不是微调的替代方案,而且更像是微调的补充方案。

根据问题的特点,应该尝试一种方法,或者两种方法。

根据本文的框架,你可以提出以下问题,以确定微调或 RAG(或两者)是否适用:

- 你的应用程序需要外部知识吗?微调通常对注入新知识没什么帮助

- 你的应用程序是否需要自定义语气/行为/词汇或风格?对于这些类型的需求,微调通常是正确的方法。

- 你的应用程序对幻觉的容忍度如何?在抑制虚假和想象力编造至关重要的应用中,RAG系统提供内置机制,最大限度地减少幻觉。

- 有多少已标记的训练数据可用?

- 数据的静态/动态程度如何?如果问题需要访问动态数据语料库,微调可能不是正确的方法,因为对LLM的知识可能很快就会过时。

- LLM应用程序需要有多透明/可解释?RAG本身可以提供引用,这些引用对于解释LLM输出非常有用。

- 成本和复杂性:团队是否拥有构建搜索系统的专业知识或之前的微调经验?

- 您的应用程序中的任务种类有多少?

在大多数情况下,微调和RAG的混合解决方案,将产生最好的结果,问题就在于两者的成本、时间和额外的独立效益。

最后,微调中的探索,确实需要一个强大的数据收集和数据改进策略,Meta建议将其作为开始微调的前奏。

如何微调?

到了第三部分就步入真正关键的内容——如何去微调,先要关注数据集。

微调LLM可以说,是艺术和科学的结合,最佳做法仍在不断涌现。

在这部分,Meta将重点介绍微调的设计变量,并就资源受限的情况下,微调模型的最佳实践提供方向性指导。

全面微调与参数高效微调

在学术和实际应用中,当应用于新领域时,全面微调和PEFT都显示出下游性能的提升。

选择其中一种方法,可归结为可用计算量(GPU小时数和GPU内存)、目标下游任务以外的任务性能(学习和遗忘权衡)以及人工注释成本。

全面微调更容易出现两个问题:模型崩溃和灾难性遗忘。

一些早期的实证研究表明,与PEFT技术相比,全面微调更容易出现上述问题,但还需要做更多的研究。

PEFT技术本质上,是作为微调的自然正则化器。

PEFT通常需要相对较少的计算资源来训练下游模型,并且在数据集规模有限的资源受限场景下,更易于使用。

在某些情况下,全面微调在特定任务上表现更好,但代价往往是遗忘原始模型的一些能力。

在资源受限的情况下,PEFT可能会比全面微调提供更好的性能提升/成本比。

如果在资源受限的情况下,下游性能至关重要,那么全面微调将是最有效的。

无论在哪种情况下,关键是要牢记以下几个关键原则来创建高质量的数据集。

数据集管理

在各种文献的微调实验中,数据集对于获得微调的好处至关重要。

除了「更好的质量和更多的示例」之外,还有更多的细微差别,你可以明智地投资数据集收集,以在资源受限的微调实验中提高性能。

数据质量/数量

- 质量是最重要的:一个大趋势是质量比数量更重要。也就是说,拥有一小部分高质量的数据,比拥有一大批低质量的数据更好。

质量的关键原则是一致的注释,没有错误、没有错误标签的数据、有噪音的输入/输出,以及与总体相比具有代表性的分布。

在微调时,几千个精选的LIMA数据集示例,比50K机器生成的Llama数据集具有更好的性能。

OpenAI微调文档表明,即使是50-100个示例的数据集也可能产生影响。

- 更困难的语言任务需要更多数据:相对困难的任务,如文本生成和摘要,更难微调,比起更容易的任务,如分类和实体提取,需要更多数据。

「更难」可以指多个:输出中有更多的token,需要更高级别的人类能力,多个正确答案。

- 有效的高质量数据收集:由于数据收集成本较高,建议使用以下策略来获得更高的样本效率和成本

1 观察失效模式:观察先前机器学习能力失败的例子,并添加针对这些失效模式的样例。

2 人机协作:这是一种更经济的数据标注扩展方式。可以使用LLM自动生成基础回答,人类标注者可以基于此更快地进行标注。

数据多样性

简单来说,如果你用特定类型的回应过度训练模型,它会倾向于给出那种回应,即使不是最合适的答案。

这里的经验法则是,尽可能确保训练数据反映模型在现实世界中应该如何表现。

- 重复:无论是在微调还是预训练中,这都被发现是导致模型性能下降的原因。通过去重实现多样性,往往会提高性能指标。

- 输入多样性:通过改述来增加输入的多样性。

- 数据集多样性:当为更通用的下游任务微调时(例如,多语言适配),使用多样化的数据集已被证明,可以改善模型在遗忘原始能力和学习新能力之间的权衡。

- 标准化输出:移除输出中的空白和其他格式技巧被证明是有帮助的。如果你想要回答中有特定的语气,比如「服务台聊天机器人是...」,那么就为每个例子在数据集中添加这些内容。

基于LLM的数据管道

为了整理高质量、多样化的数据集,数据管道经常使用大语言模型来降低标注成本。

以下是实践中观察到的技术:

- 评估:用高质量数据集训练一个模型,然后用它来标注较大数据集,以筛选出高质量的样例。

- 生成:用高质量示例来引导大模型,并通过提示生成类似的高质量样例。合成数据集的最佳实践正在逐渐形成。

- 人机协作:使用大模型生成初始输出集,然后由人类通过编辑或选择偏好来提高质量。

调试数据集

- 评估数据集中的不良输出:如果模型在某些方面仍然表现不佳,添加直接向模型展示如何正确处理这些方面的训练示例。

如果你的模型存在语法、逻辑或风格问题,检查数据是否存在相同的问题。

例如,如果模型现在说「我会为你安排这个会议」(实际上它不应该这样做),看看现有的例子是否教导模型说它可以做一些它实际上不能做的新事情。

- 仔细检查正面/负面类别的平衡:如果数据中60%的助手回应说「我无法回答这个问题」,但在推理时只有5%的回应应该这样说,你可能会得到过多的拒绝回应。

- 全面性和一致性:确保你的训练示例包含回应所需的所有信息。

如果希望模型基于用户的个人特征来赞美用户,而训练示例中包含了助手对前面对话中没有出现的特征的赞美,模型可能会学会虚构信息。

确保所有的训练示例,都采用与推理时预期相同的格式,查看训练示例中的一致性和协调性。

总而言之,微调是大模型开发中的一个关键方面,需要在艺术和科学之间取得微妙的平衡。

数据集的质量和筛选,对微调的成功起着重要作用。

经过微调的小型LLM在特定任务上,往往表现优于更大的模型。

一旦决定进行微调,Llama微调指南提供了一个良好的起点。

参考资料:

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/

https://ai.meta.com/blog/adapting-large-language-models-llms/