大型语言模型(LLMs)正在以惊人的速度发展,LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤,今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。
大语言模型的生命周期
在深入了解大型语言模型(LLM)微调之前,了解LLM的生命周期及其运行方式是很重要的。
-
愿景与范围:首先,应该定义项目的愿景。确定你的大型语言模型(LLM)是作为一个更普遍的工具,还是针对特定任务,如命名实体识别。明确的目标可以节省时间和资源。
-
模型选择:选择从头开始训练一个模型或者修改现有的模型。在许多情况下,调整一个已有的模型是高效的,但在某些情况下,可能需要通过一个新模型来进行微调。
-
模型性能和调整:准备好你的模型后,你需要评估其性能。如果效果不佳,尝试提示工程或进一步微调。我们将重点关注这部分。确保模型的输出与人类的偏好一致。
-
评估与迭代:定期使用指标和基准进行评估。在提示工程、微调和LLM评估之间进行迭代,直到达到预期的结果。
-
部署:一旦模型表现达到预期,便可进行部署。在此阶段,优化计算效率和用户体验。
什么是LLM微调
大型语言模型(LLM)微调是指在预训练模型的基础上,进一步使用较小且特定的数据集进行训练,以提升模型在特定任务或领域的能力和性能。微调的目的在于将通用模型转变为专业化模型。它弥合了通用预训练模型与具体应用独特需求之间的差距,确保语言模型更好地符合人类的期望。以OpenAI的GPT-3为例,这是一种设计用于广泛自然语言处理(NLP)任务的先进大型语言模型。假设某家医疗机构希望使用GPT-3帮助医生从文字记录中生成病人报告。虽然GPT-3能够理解和创建一般文本,但它可能未针对复杂的医学术语和特定的医疗术语进行优化。
为了增强其在这一专业领域的表现,该机构将GPT-3在充满医疗报告和病人记录的数据集上进行微调。通过这一过程,模型对医学术语、临床语言的细微差别以及典型报告结构变得更加熟悉。经过微调后,GPT-3具备了辅助医生生成准确且连贯的病人报告的能力,展示了其在特定任务中的适应性。
微调的局限性
微调虽然可以提升模型在特定任务上的性能,但可能会导致模型在其他未微调的任务上性能下降。这是因为微调可能会使模型过度适应特定领域的数据,从而失去一些通用性。
何时使用微调
我们的文章关于大型语言模型,涉及了上下文学习以及零/单/少样本推理等主题。以下是一个简要回顾:
上下文学习是一种通过在提示中提供特定任务示例来改进提示的方法,为大型语言模型提供了完成任务的蓝图。
零样本推理在提示中仅包含您的输入数据而不添加额外的例子。如果零样本推理没有达到预期效果,可以使用“单样本”或“少样本推理”。这些策略涉及在提示中添加一个或多个完成的示例,帮助较小的大型语言模型表现更好。
这些是直接在用户提示中使用的技术,旨在优化模型的输出并更好地符合用户的偏好。问题是它们并不总是有效,特别是对于较小的语言模型来说。
除此之外,你在提示中包含的任何示例都会占用上下文窗口中宝贵的空间,从而减少你用于包含其他有用信息的空间。在这里,微调技术终于登场。与使用大量非结构化文本数据的预训练阶段不同,微调是一个监督学习过程。这意味着你使用一个标记示例的数据集来更新大型语言模型的权重。这些标记示例通常是提示-响应对,从而更好地完成特定任务。
监督微调 (SFT)
监督微调是指使用标注数据来更新预训练语言模型以执行特定任务。这些使用的数据已经事先经过检查。这与未经过数据检查的无监督方法不同。通常,语言模型的初始训练是无监督的,但微调是有监督的。
微调是如何进行的?
让我们深入了解大型语言模型中的微调细节。在准备训练数据时,有许多开源数据集可以提供关于用户行为和偏好的洞察,即使它们不是直接以指令数据的格式存在的。例如,我们可以将产品评论的大型数据集转换为用于微调的指令提示数据集。提示模板库包含许多适用于不同任务和不同数据集的模板。
一旦指令数据集准备就绪,就像标准的监督学习一样,您将数据集划分为训练、验证和测试集。在微调期间,您从训练数据集中选择提示并传递给大型语言模型(LLM),然后生成补全。
在微调阶段,当模型接触到针对目标任务的新标记数据集时,它会计算其预测与实际标签之间的误差或差异。模型随后使用此误差来调整其权重,通常通过梯度下降等优化算法进行。权重调整的幅度和方向取决于梯度,梯度表明每个权重对误差的贡献程度。对误差负责较多的权重会被调整得更多,而对误差负责较少的权重则调整得较少。
在多次迭代(或称为训练轮次)中,模型不断调整其权重,逐步达到能够将误差降到最低的配置。目标是将先前学到的一般知识适应于新数据集中存在的细微差别和特定模式,从而使模型在特定任务上变得更加专业和有效。
在此过程中,模型通过标记数据进行更新。它根据自己的预测与实际答案之间的差异进行变化。这有助于模型学习标记数据中的细节。通过这样做,模型在它被微调的任务上得以改进。
让我们来举个例子来更好地说明这一点:如果你问一个预训练模型“为什么天空是蓝的?”,它可能会回答“因为大气散射阳光的方式。”这个答案简单直接。然而,对于一个科学教育平台的聊天机器人来说,这个答案可能过于简略。根据你的指导原则,它可能需要更多的科学细节或背景。在这种情况下,监督微调就派上用场了。
经过微调后,模型可以对科学问题给出更深入的回答。例如,当被问到“为什么天空是蓝色的?”时,模型可能提供如下更详细的解释:
“天空看起来是蓝色的,是由于一种叫做瑞利散射的现象。阳光进入地球大气层时,由不同颜色组成,每种颜色都有各自的波长。蓝光的波长较短,被大气中的气体和微粒向各个方向散射。这种散射导致直接的阳光看起来是白色的,但天空本身则呈现出蓝色的色调。” 这种丰富的回答既全面又适合用在科学教育平台上。
微调大型语言模型的方法
LLM微调是一种监督学习过程,其中使用标注示例的数据集来更新LLM的权重,从而提高模型针对特定任务的能力。让我们来探讨一些用于微调LLM和LLM Agent的显著方法。
指令微调
提升模型在各种任务上的性能的一种策略是指令微调。这意味着使用示例来训练机器学习模型,这些示例展示了模型应如何响应查询。用于微调整大型语言模型的数据集必须符合你的指令目的。例如,假设你微调模型以提高其总结能力,那么你应该构建一个数据集,其中的示例以“总结”指令开头,后面跟随文本或类似短语。在翻译任务中,你应该包含如“翻译这段文字”这样的指令。这些提示完成对可以让你的模型以新的特定方式“思考”,并执行给定的具体任务。
指令微调(Instruction Fine-Tuning,简称IFT)可以被视为监督式微调(Supervised Fine-Tuning,简称SFT)的一种形式。它通过准备特定的输入和输出对,让模型学习其中的规律,从而提升模型在特定任务上的表现。
完全微调
指令微调(Instruction fine-tuning),即更新模型的所有权重,被称为完全微调(full fine-tuning)。这个过程会产生一个具有更新权重的新版本模型。需要注意的是,与预训练类似,完全微调也需要足够的内存和计算资源来存储和处理在训练过程中更新的所有梯度、优化器和其他组件。
参数高效微调
训练语言模型是一项计算密集型任务。进行完整的大型语言模型(LLM)微调时,不仅需要内存来存储模型,还需要用于训练过程的参数。你的计算机可能能够处理模型权重,但在训练过程中,为优化状态、梯度和前向激活分配内存是一个具有挑战性的任务。简单的硬件无法应对如此大的困难。在这种情况下, PEFT(参数高效微调)是至关重要的。虽然完整的LLM微调会在监督学习过程中更新每一个模型权重,但PEFT方法只更新一小部分参数。这种迁移学习技术选择特定的模型组件并“冻结”其余的参数。结果是需要调整的参数数量比原始模型少得多(在某些情况下,仅为原始权重的15-20%;LoRA可以将可训练参数的数量减少到原来的1万分之一)。这使得内存需求更易于管理。不仅如此,PEFT还可以解决灾难性遗忘的问题。由于它不会改变原有的大型语言模型,模型不会忘记先前学习到的信息。完整的微调会为每个训练的任务生成模型的新版本。每一个模型的大小都与原始模型相同,因此如果对多个任务进行微调,可能会造成昂贵的存储问题。
其他类型的微调
迁移学习:迁移学习是指从在通用大型数据集上学习的模型出发,并在特定任务的数据上进行训练。这些数据集可能包括与该领域相关的标注示例。迁移学习用于数据不足或缺乏时间进行训练的情况下,其主要优势是提供更高的学习率和准确性。你可以使用已经在大量数据上预训练的大型语言模型(LLM),如GPT-3/4和BERT,并根据自己的用例进行定制。
任务特定微调:任务特定微调是一种方法,即在特定任务或领域上使用为该领域设计的数据集对预训练模型进行微调。这种方法比迁移学习需要更多的数据和时间,但可以在特定任务上获得更高的性能。
例如,使用该任务的示例数据集进行翻译。有趣的是,使用相对较少的示例也可以获得良好的结果。通常,只需几百或几千个示例就可以获得良好的性能,而模型在预训练阶段看到的是数十亿条文本。然而,在单一任务上进行微调可能会导致一个潜在的缺点,即灾难性遗忘。
灾难性遗忘发生在完整的微调过程中修改了原始大型语言模型的权重。虽然这在单一微调任务上表现出色,但可能会降低在其他任务上的性能。例如,微调可以提高模型执行某些自然语言处理(NLP)任务(如情感分析)的能力,并导致高质量的完成,但模型可能会忘记如何执行其他任务。在微调前,模型能够正确识别命名实体。
多任务学习:多任务微调是单任务微调的扩展,其中训练数据集包含多个任务的输入和输出示例。在这里,数据集包含指导模型执行各种任务的示例,包括摘要、评论评级、代码翻译和实体识别。通过在这个混合数据集上训练模型,可以提高模型在所有任务上的性能,从而避免灾难性遗忘的问题。经过多次训练迭代,计算出的损失用于更新模型的权重,结果是一个微调后的模型,能够同时在多种不同任务上表现良好。多任务微调模型的一个缺点是需要大量的数据。你可能需要多达5万到10万个示例在你的训练集中。然而,收集这些数据是非常值得的,结果往往是非常有能力且适合在需要多任务良好性能的情况下使用的模型。
顺序微调:顺序微调是指在几个相关任务上依次适应预训练模型。在转移到通用领域后,LLM可以在更具体的子集上进行微调。例如,它可以从一般语言微调到医学语言,然后从医学语言微调到小儿心脏病学。
请注意,还有其他微调示例——自适应、行为和指令、强化微调大型语言模型。这些涵盖了训练语言模型的一些重要具体情况。
微调方法现在也被广泛应用于小型语言模型(SLM),这已成为2024年最大的生成式AI趋势之一。微调小型语言模型实际上更加方便且易于实现,特别是如果你是一家小企业或开发人员,想要提高模型的性能。
检索增强生成(RAG)
检索增强生成(RAG)是一种广为人知的微调替代方法,它结合了自然语言生成和信息检索。RAG 确保语言模型以外部最新的知识来源/相关文档为基础,并提供信息来源。
RAG相比于微调的一个优点是信息管理。传统的微调将数据嵌入到模型的架构中,从而“固化”了知识,导致难以进行修改。而RAG允许训练数据的持续更新,并能够删除或修订数据,确保模型保持最新和准确。
在语言模型的背景下,RAG和微调通常被视为竞争方法。然而,将二者结合使用可以显著提升性能。特别是,可以对RAG系统进行微调,以识别和改进其较弱的部分,帮助它们在特定的大型语言模型任务中表现出色。
为什么需要微调?什么时候需要一个微调模型?
我们知道,Chat GPT和其他语言模型能够回答大量的问题。但问题在于,个人和公司希望拥有自己的大语言模型接口,以便处理他们的私人和专有数据。这是技术领域新热门话题——面向企业的大语言模型。
下面是需要对大语言模型(LLM)进行微调的一些原因:
-
特殊性和相关性:尽管LLM在大量数据上进行了训练,它们可能不了解与特定业务或行业相关的专门术语、细微差别或上下文。微调可以确保模型理解并生成高度相关的业务内容。
-
提高准确性:对于关键的业务功能,错误的容忍度很低。对特定业务数据进行微调可以帮助实现更高的准确性水平,确保模型的输出与预期密切一致。
-
定制化互动:如果您将LLM用于客户互动,例如聊天机器人,微调可以帮助调整响应以符合您品牌的声音、语调和指导原则,从而确保一致且拥有品牌特色的用户体验。
-
数据隐私和安全:通用的LLM可能会基于公开可用的数据生成输出。微调允许企业控制模型接触的数据,确保生成的内容不会无意中泄露敏感信息。
-
应对罕见场景:每个企业都会遇到特定领域中的罕见但重要的场景。一般的LLM可能无法最佳地处理这些情况。微调可以确保有效满足这些特殊情况。
虽然LLM提供了广泛的能力,微调可以使这些能力更加符合企业的独特需求,确保最佳性能和结果。