发布日期:2024 年 3 月 15 日
撰稿人:Dave Bergmann
微调可被视为更广泛的迁移学习技术的一部分:即利用现有模型已经学到的知识作为学习新任务的起点的实践。
微调背后的直觉是,从本质上讲,磨练一个预训练基础模型的能力要比从头开始训练一个新模型更容易,也更省钱,因为后者已经获得了与当前任务相关的广泛知识。对于具有数百万甚至数十亿个参数的深度学习模型尤其如此,例如在自然语言处理 (NLP) 领域崭露头角的大型语言模型 (LLM) 或复杂的卷积神经网络 (CNN) 和视觉转换器 (ViT)(用于计算机视觉任务,例如图像分类、对象检测或图像分割等)。
通过迁移学习利用先前的模型训练,微调可以减少获得适合特定用例和业务需求的大型模型所需的昂贵计算能力和标记数据量。例如,微调可用于简单地调整预训练 LLM 的对话语气或预训练图像生成模型的插图样式;它还可用于使用专有数据或领域特定的专业知识来补充模型原始训练数据集中的学习。
因此,微调在机器学习模型的实际应用中发挥着重要作用,有助于实现复杂模型的访问和定制的民主化。
本电子书介绍了组织如何从容自信地将生成式 AI 和机器学习整合到业务中,以获得显著的竞争优势。
注册获取基础模型的相关指南
虽然微调表面上是模型训练中使用的一种技术,但它与传统上所谓的“训练”截然不同。为了消除歧义,数据科学家在这种情况下通常将后者称为预训练。
在训练开始时(或者,在这种情况下为预训练),模型还没有“学习”任何东西。训练从模型参数的随机初始化开始,模型参数是应用于神经网络中每个节点上发生的数学运算的不同权重和偏差。
训练分两个阶段迭代进行:在前向传递中,模型对训练数据集中的一批样本输入进行预测,损失函数测量模型对每个输入的预测与“正确”答案(或标准答案)之间的差异(或损失);在反向传播期间,使用优化算法(通常是梯度下降)来调整整个网络的模型权重,以减少损失。对模型权重的这些调整就是模型“学习”的方式。该过程在多个训练周期中重复,直到模型被视为已得到充分训练。
传统的监督学习通常用于预训练计算机视觉任务(如图像分类、对象检测或图像分割)的模型,它使用标记数据:标签(或注释)提供可能答案的范围和每个样本的标准答案输出。
LLM 通常通过自监督学习 (SSL) 进行预训练,其中模型通过旨在从未标记数据的固有结构中推导出标准答案的假托任务进行学习。这些假托任务传授对下游任务有用的知识。它们通常采用以下两种方法之一:
自我预测:屏蔽原始输入的某些部分,让模型对其进行重建。这是 LLM 的主要训练模式。
对比学习:训练模型学习相关输入的相似嵌入和不相关输入的不同嵌入。这在为少样本或零样本学习而设计的计算机视觉模型(如对比语言-图像预训练 (CLIP))中得到了广泛应用。
因此,SSL 允许在训练中使用海量数据集,而不必注释数百万或数十亿个数据点。这节省了大量的劳动力,但仍然需要大量的计算资源。
相反,微调需要进一步训练模型的技术,该模型的权重已经通过先前的训练进行了更新。使用基础模型的先前知识作为起点,通过在任务特定的较小数据集上进行训练来对模型进行微调。
虽然从理论上讲,任务特定的数据集可以用于初始训练,但在小数据集上从头开始训练一个大型模型可能会存在过度拟合的风险:模型可能会在训练示例中学习到良好的表现,但对新数据的泛化能力却很差。这将使模型不适合给定任务,也违背了模型训练的初衷。
因此,微调可以兼具两全其美的优势:利用对大量数据进行预训练所获得的广泛知识和稳定性,并磨练模型对更详细、更具体概念的理解。鉴于开源基础模型的能力日益增强,我们往往可以享受到这些优势,而无需任何预训练的财务、计算或后勤负担。
微调使用预训练模型的权重作为起点,在较小的示例数据集上进行进一步训练,这些示例数据集更直接地反映了模型将用于的特定任务和用例。它通常需要监督学习,但也可能涉及强化学习、自监督学习或半监督学习。
用于微调的数据集传达了特定的领域知识、风格、任务或用例,而预训练模型正是针对这些领域知识、风格、任务或用例进行微调。例如:
对于针对通用语言进行预训练的 LLM,可能会使用包含相关编程请求和每个请求的相应代码片段的新数据集进行微调以进行编码。
用于识别某些鸟类物种的图像分类模型可以通过额外标记训练样本来学习新物种。
LLM 可以通过对代表特定写作风格的样本文本进行自监督学习来模仿该风格。
半监督学习是机器学习的一部分,它包含标记和未标记数据,当场景需要监督学习但合适的标记示例稀缺时,它具有优势。半监督微调在计算机视觉1 和 NLP2 任务中都产生了良好的结果,并有助于减轻获取足够数量的标记数据的负担。
微调可用于更新整个网络的权重,但出于实际原因,情况并非总是如此。目前有多种微调方法可供选择,通常称为参数高效微调 (PEFT),这些方法只更新选定的一部分模型参数。本节稍后将探讨的 PEFT 方法可以减少计算需求并减少灾难性遗忘(微调导致模型核心知识丢失或不稳定的现象),通常不会对性能造成重大损害。
鉴于微调技术种类繁多,每种技术都存在许多固有的变量,要实现理想的模型性能,通常需要多次迭代训练策略和设置,调整数据集和超参数,如批量大小、学习率和正则化项,直到达到令人满意的结果(根据与您的用例最相关的指标)。
从概念上讲,最直接的微调方法是简单地更新整个神经网络。这种简单的方法本质上类似于预训练过程:全面微调和预训练流程之间的唯一根本区别是所使用的数据集和模型参数的初始状态。
为了避免微调过程中的不稳定变化,某些超参数(影响学习过程但本身不是可学习参数的模型属性)可能会在预训练期间相对于其规范进行调整:例如,较小的学习率(这会降低每次更新模型权重的幅度)不太可能导致灾难性遗忘。
全面微调,就像它的预训练过程一样,对计算要求非常高。对于具有数亿甚至数十亿个参数的现代深度学习模型来说,它通常成本过高且不切实际。
参数高效微调 (PEFT) 包含一系列方法来减少需要更新的可训练参数的数量,以便有效地使大型预训练模型适应特定的下游应用程序。这样,PEFT 就能大大减少产生有效微调模型所需的计算资源和内存存储。PEFT 方法通常被证明比全面微调方法更稳定,特别是对于 NLP 用例。3
部分微调
部分微调方法也称为选择性微调,旨在通过仅更新对相关下游任务的模型性能最关键的选定部分的预训练参数来减少计算需求。其余参数被“冻结”,确保不会被改变。
最直观的部分微调方法是仅更新神经网络的外层。在大多数模型架构中,模型的内层(最接近输入层)仅捕获广泛的通用特征:例如,在用于图像分类的 CNN 中,早期层通常可识别边缘和纹理;每个后续层都会逐渐识别更精细的特征,直到在最外层预测最终分类。一般来说,新任务(模型正在进行微调)与原始任务越相似,预训练内层权重对相关的新任务就越有用,因此需要更新的层数就越少。)
其他部分微调方法包括仅更新模型的全层偏差项(而不是节点特定的权重)4 以及仅更新整个模型中选定的部分权重的“稀疏”微调方法。5
添加型微调
添加型方法不是对预训练模型的现有参数进行微调,而是向模型添加额外的参数或层,冻结现有的预训练权重,并仅训练那些新组件。这种方法可确保原始预训练权重保持不变,从而有助于保持模型的稳定性。
虽然这可能会增加训练时间,但由于需要存储的梯度和优化状态要少得多,因此大大降低了内存需求:根据 Lialin 等人的研究,训练一个模型的所有参数所需的 GPU 内存是仅训练模型权重所需的 12-20 倍。6通过对冻结模型权重进行量化,可以进一步节省内存:降低用于表示模型参数的精度,概念上类似于降低音频文件的比特率。
添加型方法的一个子分支是提示调整。从概念上讲,它类似于提示工程,后者指的是定制“硬提示”(即人类用自然语言编写的提示)以引导模型实现所需输出,例如通过指定特定语气或提供有助于少样本学习的示例。提示调整引入了 AI 撰写的软提示:可学习的向量嵌入,与用户的硬提示相串联。提示调整不是重新训练模型,而是需要冻结模型权重,转而训练软提示本身。快速高效的提示调整使模型能够更轻松地在特定任务之间切换,但是在可解释性方面有所权衡。
适配器
添加型微调方法中的另一个方法是注入适配器模块(添加到神经网络中的任务特定的新层)并训练这些适配器模块,而不是微调任何预训练模型权重(被冻结)。最初的论文对 BERT 屏蔽语言模型的结果进行了测评,根据测评结果,适配器获得了与全面微调相当的性能,而训练的参数数量仅为 3.6%。7
重新参数化
基于重新参数化的方法(如低秩适应 (LoRA))利用高维矩阵的低秩转换(如 Transformer 模型中预训练模型权重的大量矩阵)。这些低秩表示省略了无关紧要的高维信息,以捕获模型权重的底层低维结构,从而大幅减少可训练参数的数量。这可以大大加快微调速度,并减少存储模型更新所需的内存。
LoRA 避免直接优化模型权重矩阵,而是优化模型权重(或增量权重)的更新矩阵,并将其插入模型中。权重更新矩阵反过来又可以用两个更小(即低秩)的矩阵来表示,从而大幅减少需要更新的参数数量,这反过来又可以大大加快微调的速度,并减少存储模型更新所需的内存。预训练模型权重本身保持冻结。
LoRA 的另一个好处是,由于正在优化和存储的不是新的模型权重,而是原始预训练权重和微调权重之间的差异(或增量),因此可以根据需要“交换”不同的任务特定的 LoRA,以使预训练模型(其实际参数保持不变)适应给定用例。
已经开发了各种 LoRA 衍生物,例如 QLoRA,它通过在 LoRA 之前量化 Transformer 模型来进一步降低计算复杂性。
微调是 LLM 开发周期的重要组成部分,它允许基本基础模型的原始语言功能适应各种用例,从聊天机器人到编码,再到其他创意和技术领域。
LLM 使用自监督学习对大量未标记数据语料库进行预训练。OpenAI 的 GPT、Google 的 Gemini 或 Meta 的 Llama 模型等自回归语言模型经过训练,可以简单地预测序列中的下一个单词,直到完成。在预训练中,为模型提供从训练数据中抽取的样本句子的开头,并重复执行预测序列中下一个单词的任务,直到样本结束。对于每个预测,原始样本句子的实际下一个单词都是标准答案。
虽然这种预训练可以产生强大的文本生成功能,但并不能真正理解用户的意图。从根本上讲,自回归 LLM 实际上并不回答提示;它们只是将文本附加到提示中。如果没有提示工程形式的非常具体的指导,预训练 LLM(尚未经过微调)只是以语法连贯的方式预测由提示启动的给定序列中的下一个单词。如果系统提示“teach me how to make a resumé”,LLM 可能会回答“using Microsoft Word”。这是完成句子的有效方法,但与用户的目标不符。该模型可能已经从其预训练语料库中包含的相关内容中收集了大量关于简历写作的知识,但如果不进行微调,这些知识可能无法访问。
因此,微调过程不仅对于根据您的或您的企业的独特风格和用例定制基础模型起着至关重要的作用,而且对于使它们完全适合实际使用也是如此。
指令调整是监督微调 (SFT) 的一部分,通常用于微调 LLM 以供聊天机器人使用,它使 LLM 能够生成更直接满足用户需求的响应:换句话说,更好地遵循指令。标记示例遵循格式(提示,响应),其中提示示例包括面向指令的任务,例如“translate the following sentence from English to Spanish”或“classify the following sentence as Positive or Negative”,标记示例演示如何响应代表各种用例的提示,例如问答、总结或翻译。在更新模型权重以最大程度地减少模型输出和标记样本之间的损失时,LLM 学会以更有用的方式将文本附加到提示中,并更好地遵循一般的说明。
继续前面的提示示例“teach me how to write a resumé”,用于 SFT 的数据集可以包含许多(提示、响应)对,表明响应以“teach me how to”开头的提示的理想方式是提供分步建议,而不仅仅是完成句子。
虽然指令调整可以教给模型一些具体、直接的行为,比如如何组织响应,但通过标记示例来教给模型一些抽象的人类品质,比如乐于助人、事实准确性、幽默感或同理心,可能非常费力和困难。
为了更好地使模型输出与理想的人类行为保持一致,尤其是对于聊天机器人等对话用例,SFT 可以辅之以强化学习,更具体地说,基于人类反馈的强化学习 (RLHF)。RLHF 也称为基于人类偏好的强化学习,有助于通过离散示例对复杂、定义不清或难以指定的品质进行微调模型。
以喜剧为例:要用 SFT 教一个模型变得“有趣”,不仅需要花费成本和劳动力来编写(或获取)足够多的笑话来构成可学习模式,而且还要求给定数据科学家认为有趣的内容与用户群认为有趣的内容相一致。RLHF 本质上提供一种数学众包的替代方案:提示 LLM 生成笑话并让人类测试人员评估其质量。这些评分可用于训练奖励模型,以预测将获得积极反馈的笑话类型,反过来,该奖励模型可用于通过强化学习来训练 LLM。
更实际地说,RLHF 旨在解决 LLM 存在的挑战,例如幻觉、反映训练数据中固有的社会偏见或处理粗鲁或对抗性的用户输入。
微调可用于多种目的,从定制到补充模型的核心知识,再到将模型扩展到全新的任务和领域。
定制风格:可以对模型进行微调,以反映品牌所需的风格,从实施复杂的行为模式和独特的插图风格,到简单的修改,如每次交流都以礼貌的问候开始。
专业化:可以针对特定任务磨练 LLM 的一般语言能力。例如,Meta 的 Llama 2 模型作为基础模型、聊天机器人调整变体 (Llama-2-chat) 和代码调整变体 (Code Llama) 发布。
增加领域特定的知识:虽然 LLM 在海量数据的语料库上进行预先训练,但它们并非无所不知。使用额外的训练样本来补充基本模型的知识在法律、金融或医疗环境中尤为重要,这通常需要使用在预训练中可能没有得到充分体现的专业、深奥的词汇。
少样本学习:对于已经具备很强通用知识的模型,通常可以利用相对较少的示例进行微调,使其适用于更具体的分类文本。
解决边缘情况:您可能希望您的模型以特定方式处理预训练中不太可能涉及的某些情况。根据此类情况的标注示例对模型进行微调,是确保适当处理此类情况的有效方法。
整合专有数据:您的公司可能拥有自己的专有数据管道,与您的特定用例高度相关。微调可以将这些知识整合到模型中,而无需从头开始训练。
所有链接均为 ibm.com 外部链接
1 “大型自监督模型是强大的半监督学习者”,arXiv,2020 年 10 月 26 日
2 “CSS-LM:用于预训练语言模型的半监督微调的对比框架”,arXiv,2021 年 3 月 2 日
3 “论参数高效微调的有效性”,arXiv,2022 年 11 月 28 日
4 “BitFit:针对基于 Transformer 的掩码语言模型的简单参数高效微调”,arXiv,2021 年 6 月 18 日(最后更新日期:2022 年 9 月 5 日)
5 “将稀疏微调扩展到大型语言模型”,arXiv,2024 年 2 月 2 日
6 “缩小规模到扩大规模:参数高效微调指南”,arXiv,2023 年 3 月 28 日
7 “用于 NLP 的参数高效迁移学习”,arXiv,2019 年 6 月 13 日