2024年大语言模型的微调
在上一篇博客中了解了LLM的由来以及基本流程,其中会涉及到几个概念:Prompt Engineering、model、dataset、 vector-database、training、fine-tune、 library等。鉴于本人是小白,后面将引用几篇典型的文章来熟悉这些概念,并尝试将其串联起来。
本文来自Fine-tuning large language models (LLMs) in 2024
注:(下文将统一使用"微调"指代fine-tune,使用"数据集"指代dataset)
一个LLM的生命周期包含多个步骤,下面将讨论这个周期中最活跃、最密集的部分之一 -- fine-tuning(微调)过程。
LLM的生命周期
下面展示了LLM的生命周期:
- 愿景和范围:首先需要定义项目的愿景,你想让你的LLM作为一个更加通用的工具还是以处理特定任务为目标,如命名实体识别(识别文本中具有特定意义的命名实体)。
- 模型选择:选择从头训练一个模型还是修改一个已有的模型。在大多数场景下,采用一个已有的模型更高效,但有些情况则需要对新模型实施微调。
- 模型的表现和调节:在准备好模型后,需要对其表现进行评估。如果不满足要求,可以采用prompt engineering或进一步微调,从而保证模型的输出和人们的预期保持一致。
- 评估&迭代:定期使用指标和基准进行评估,并在prompt engineering、微调和评估之间进行迭代,直到达到期望的结果。
- 部署:一旦模型符合预期,就可以进行部署。在这个阶段优化计算效率和用户体验。
什么是LLM微调?
LLM微调是采用预训练的模型,然后通过使用更小的专有数据集进行训练来完善其能力并提升处理特定任务或领域的表现的过程。微调包括调节通用模型并将其调节为特定模型,它是连接通用预训练模型和特定应用的特定需求之间的桥梁,从而保证大语言模型能够接近人类的预期。想象一下OpenAI的GPT-3,这是一款先进的大型语言模型,专为通用的自然语言处理(NLP)任务而设计的。假设一个医疗保健组织想使用GPT-3来帮助医生从病例生成病人报告,GPT-3可以理解并创建一般的文本,但它可能无法处理错综复杂的医学术语和特定的医疗术语。
为了提高它在该专业角色的表现,组织会使用一个含医疗报告和病历记录的数据集来微调GPT-3。通过微调,模型可以更加了解医学术语,临床语言的细微差别以及典型的报告结构。之后,GPT-3就可以帮助医生生成准确、连贯的患者报告。
听起来好像模型越大越好,但任何事情都是有代价的。下面将讨论更多的细节。
什么时候使用微调
我们关于大型语言模型的文章涉及到了一些话题,比如上下文学习和零/一/少样本推理。以下是一个简单回顾:
上下文学习:是一种通过在提示提供特定任务示例来改进提示的方法,为LLM提供了它需要完成的任务蓝图。
零样本推理:在没有额外示例的情况下将输入数据合并到提示中。如果零样本推理没有产生所需的结果,则可以使用"单样本"或"少样本推理"。这些方法涉及在提示中添加一个或多个完整的示例来改善规模较小的LLM的表项。
还有其他方式可以直接通过用户提示来优化模型输出,以便更好地匹配用户的偏好。但这些方式并不总是有效(特别对于较小的LLM)。
除此之外,提示中包含的任何示例都会占用上下文窗口的宝贵空间,为此,你不得不减低空间来添加额外的有用信息,此时就需要微调。与使用大量非结构化文本数据的预训练阶段不同,微调是一个有监督的学习过程,这意味着你需要使用一个含标记示例的数据集来更新LLM的权重。这些标记示例通常是提示-响应对,以便更好地完成特定任务。
监督微调(Supervised fine-tuning-SFT)
监督微调意味着使用标记数据来更新一个预训练的语言模型,用于处理特定的任务。与非监督方式(无需对数据进行检查)不同,这些数据已经预先进行了检查。通常,语言模型的初始化训练 采用的是非监督 方式,而微调 则使用的是监督方式。
如何进行微调?
下面详细介绍LLMs的微调。首先需要准备训练数据,有很多开源数据集提供了有关用户行为和偏好的数据(即使它们没有直接格式化为指导数据)。例如,我们可以使用Amazon的产品评论作为数据集,并将其转换为用于微调的指导提示数据集。提供模板库包含很多用于不同任务和不同数据集的模版。
一旦准备好了指导数据集,就可以进行标准的监督学习。你可以将数据集分为训练和验证两部分。在微调过程中,你需要从训练数据集中选择提示,并将其传入LLM,最后由LLM生成结果。
在微调阶段,当模型接触到一个针对目标任务的(新标记的)数据集时,它会计算其预测值与实际标签之间的误差或差异。然后模型会使用该误差来调整其权重(通常会使用一种优化算法,如梯度下降法)。权重调整的大小和方向取决于梯度的大小和方向,梯度指示了每个权重对误差的贡献程度。对误差贡献更大的权重会进行更大的调整,而对误差贡献较小的权重则进行较小的调整。
在数据集的多次迭代(或周期)中,模型持续调整其权重,逐渐接近一个可以最小化误差的配置。这个过程的目的是对先前学到的通用知识进行调整,以适应新数据集中的细微差别和特定模式,从而使模型在目标任务中的表现更加专业高效。
该过程使用标记数据对模型进行了更新(根据输出结果和实际结果之间的差异进行了变更),从而提升了模型在该任务中的表现。
举例说明上述过程:如果你询问一个预训练的模型"为什么天空是蓝色的?",它可能会回答,"因为大气散射了阳光",这个回答简单直接。但对于一个用于科学教育平台的聊天机器人来说,这个回答过于简单。它需要更多的科学细节或上下文指导。此时可以使用监督微调。
通过微调,模型可以对科学问题给出更深度的回答。此时当你询问"为什么天空是蓝色的?",模型会给出更细节的解释:
"天空之所以呈现蓝色,是由于一种称为瑞利散射的现象。当阳光进入地球大气层时,它由不同的颜色组成,每种颜色都有自己的波长。蓝光具有较短的波长,在大气中的气体和颗粒物的作用下向所有方向散射。这种散射使得直射阳光呈现白色,而天空则呈现蓝色"。该解释提供了对这一现象的全面理解,非常适合用于科学教育平台。
微调方法
LLM的微调是一个监督学习的过程,你需要使用一个包含标记示例的数据集来更新LLM的权重,以此来提升该模型处理特殊任务的能力。下面介绍几种值得注意的微调方法。
指导微调(Instruction fine-tuning)
一种在多种任务中提升模型表现的策略叫指导微调。它是一种使用示例来训练机器学习模型的方法,这些示例展示了模型应该如何响应查询。
用于微调大语言模型的数据集必须服务于指导的目的。例如,假设你需要通过微调一个模型来提升其总结能力,在这种情况下,你应该建立一个数据集,数据集中包含以"summarize"为开头的示例,后跟文本或类似短语。这些提示-完成对(prompt-completion,即示例中的请求和响应)可以让你的模型以一种新的专业方式进行"思考",并为特定任务提供服务。
这种方式其实就是给模型提供一些用于某种场景的请求-响应的例子,增强其在某种场景下能力。
完全微调(full fine-tuning)
在指导微调中,当所有的模型权重被更新后,此时称之为完全微调。微调的结果为更新权重后的新版本模型。需要注意的是,和预训练类似,完全微调需要足够的内存和计算预算来保存和处理所有的梯度、优化器和在训练期间更新的其他组件。
参数效率微调(PEFT)
语言模型训练是一个计算密集的工作。为了对一个LLM执行完全微调,你不仅需要内存来保存模型,还需要保存训练过程中所需的参数。你的电脑可能可以处理模型权重,但在训练过程中为优化状态、梯度和前向激活(forward activations,指在训练过程中,模型通过输入数据进行前向传播时所产生的中间结果)分配内存仍然是一项具有挑战性的任务。完全微调LLM会在监督学习过程中更新每个模型的权重,而PEFT方法只会更新一部分参数。这种迁移学习技术会选择特定的模型组件,并将其他参数"冻结",在训练过程中,只会跟新和微调选定的组件,其他参数则保持不变。通过这种方式可以使用远小于原始模型的参数(某些场景下,只需要15%~20%的原始权重,LoRA可以将训练的参数数目减少10,000倍)进行训练,这样可以使内存需求更易于管理。此外,PEFT还可以处理灾难性遗忘(catastrophic forgetting)问题,由于它不会触及原始的LLM,因此该模型也就不会忘记先前学到的信息。完整微调会为每个训练的任务提供一个新版本模型,这些新模型和原始模型一样大,因此如果你需要为多个任务进行微调的话,看会导致存储成本问题。
其他类型的微调
迁移学习:迁移学习采用通用模型,然后使用大量与特定任务相关的数据集进行训练。该数据集可能包括与该领域有关的标记示例。迁移学习通常用在缺少足够数据或缺少时间来训练数据的场景。这种方式的主要优势是它在训练后提供了更高的学习率和准确性。你可以采用现有的已经使用大量数据训练的LLMs,如GPT3/4以及BERT,然后将其定制为自己的使用场景。
特定任务的微调 :特定任务微调是一种使用预训练的模型,并针对特定任务或领域进行微调的方式。相比迁移学习,该方式需要更多的数据和时间,但在特定任务上可以获得更好的表现。
例如,使用一个专门针对翻译任务的数据集进行训练,即使只有相对较少的示例,也可以取得良好的结果。相比于模型预训练阶段的数十亿条文本,通常只需要几百或几千条示例就可以得到表现良好的结果。但单任务微调可能会导致一个潜在问题,称之为灾难性遗忘。
灾难性遗忘的发生是因为完全微调的过程修改了原始LLM的权重,虽然它提升了在特定任务上的表现,但降低了在其他任务上的表现。例如,尽管微调可以提高模型在某些NLP任务(如情感分析)上的能力,并产生高质量的结果,但模型可能会忘记如何执行其他任务(例如该模型在微调之前可以正确识别命名实体)。
多任务学习:多任务微调是单任务微调的扩展,此时训练数据集包含多个任务的示例输入和输出。这里的数据集包含了可以指导模型处理多种任务的示例,如概括、评论评分、代码转换或实体识别等。你可以使用这种混合数据集来训练模型,这样可以同时提升模型处理多种任务的表现,避免灾难性遗忘问题。在训练多个训练周期中,通过计算示例之间的损失来更新模型的权重,从而得到一个经过微调,且能够同时在多个任务上表现出色的模型。多任务微调模型的一个缺点是它需要大量数据。在一个训练集中,你可能需要50~100,000个实例。该模型非常适合需要经常处理多个任务的场景。
顺序微调 :顺序微调是指在几个相关任务上依次调整预训练模型的过程。在针对通用领域完成初始化训练后,LLM可能会在更具体的子集上进行微调。例如,它可以从一般语言微调到医学语言,然后再从医学语言微调到小儿心脏病学。
注意,还有其他一些微调的例子,例如自适应微调、行为微调、指导、强化微调等针对大型语言模型的微调方法。这些方法涵盖了训练语言模型时的一些重要特定场景。
检索增强生成(Retrieval augmented generation-RAG)
RAG是一种知名的微调替代方式,它结合了自然语言生成和信息检索,RAG可以确保语言模型能够与外部的最新知识源/相关文档建立联系,并提供相关来源。这种技术弥合了通用模型所拥有的广泛知识和对精确、最新信息以及丰富上下文的需求之间的差距。因此,RAG是一种可以适用于事实可能随时间的推移而演变的情况下的重要技术。最新的AI产品Grok就使用了RAG技术来保证其信息的新鲜和时效性。
RAG优于微调的一点是信息管理。传统的微调将数据嵌入了模型架构中,基本上是"硬写入"的知识,可以防止被轻易篡改。而RAG允许持续更新训练数据,并允许移除/修改数据,从而保证模型的时效性和准确性。
在大语言模型的上下文中,RAG和微调通常被认为是相互竞争的方法,但二者的结合可以显著提升模型的表现。在将微调应用到RAG系统一文中就通过将二者结合来确定和改进模型中较弱的组件。
RAG和微调的对比如下:
微调最佳实践
明确定义任务
定义任务是微调大语言模型的基础步骤。一个明确的任务定义可以提供焦点和方向,确保将模型的通用能力用于实现特定的目标,并可以为性能评估设定清晰的基准。
选择并使用合适的预训练模型
选择用于微调LLM的预训练模型非常重要,由于预训练模型吸收了从大量数据中获得的知识,因此可以确保模型不需要从零学习。这种方式具备计算的高效性并节省了时间成本。此外,预训练还可以捕捉到一般语言理解能力,可以让微调聚焦于特定领域的细微差别,通常能够在特定任务中获得更好的模型表现。
尽管预训练模型提供了一个强大的起点,但模型架构的选择也非常重要,包括使用先进的策略,如专家混合(Mixture of Experts,MoE)和标记混合(Mixture of Tokens,MoT)来更有效地定制模型。这些策略可显著影响模型处理特定任务和处理语言数据的方式。
设置超参数
超参数在模型训练过程中扮演者一个重要角色。学习率、批量大小、周期数量、权重衰减和其他参数是需要调整的关键超参数。
评估模型表现
一旦完成微调,就需要使用测试数据集来评估模型表现,以此来对模型在未见数据上的表现进行公正评估。如果模型仍有改进的潜力,还可以考虑通过迭代方式对其进行优化。
为什么你的业务需要微调模型?
我们知道Chat GPT和其他语言模型可以回答大范围的问题,但个体和公司可能期望他们的LLM接口能够处理私有和专有数据。这是科技界的热门话题------面向企业的大型语言模型。
下面是为何需要LLM微调的几个原因:
- 具体性和相关性:虽然LLMs使用大量数据进行了训练,但它们可能不熟悉与特定业务或行业相关的特定术语、细微差别或上下文。微调可以保证模型理解并生成与业务高度相关的内容。
- 提升准确性:对于关键业务功能,误差幅度很小。微调业务特定的数据可以达到更高的准确度,保证模型的输出和预期一致。
- 自定义交互:如果你将LLMs用于客户交互,微调可以帮助定制回复,让其与品牌的声音、语调和准则相匹配,确保一致的品牌用户体验。
- 数据隐私和安全:通用LLMs可能会根据外部可用数据生成结果。微调可以让业务控制模型可以暴露的数据,确保生成的内容不会不经意间泄露敏感信息。
- 解决罕见情况:每个业务都会在其特定的领域碰到极少但重要的场景。通用LLM可能无法很好地处理这些场景。微调可以确保高效处理这些边缘场景。
微调还是不微调?
有时候,微调并不是最佳的选择。下面是来自OpenAIDevDay的一张图片,展示微调内部Slack的140K消息后的模型结果。
User: "Write a 500 word blog post on prompt engineering"
Assistant: "Sure, I shall work on that in the morning"
User: "Write it now"
Assistant: "ok"
纯属逆向调整😄
总结
LLM的微调已经成为满足企业LLM需求、提升运营流程中不可或缺的工具。虽然LLM的基础训练提供了对语言的广泛理解,但通过微调过程,我们可以将这些模型塑造成能够理解特定领域话题并提供更精确结果的专业工具。通过针对特定任务、行业或数据集来对LLM进行训练,我们正在推动这些模型所能实现的边界,并确保它们在不断变化的数字领域中维持其相关性和价值。展望未来,对LLM的持续探索和创新以及正确的微调方法工具将无疑为更智能、更高效、更具上下文感知能力的人工智能系统铺平道路。
拓展
- 权重(Weights):权重是定义是定义模型中不同layer之间的连接强度的数值。在LLM的背景下,权重主要用于注意力机制(attention mechanism)和组成模型架构的前馈神经网络中,它们会在训练过程中进行调整,以优化模型生成相关和连贯文本的能力。