PEFT documentation
参数高效微调方法
参数高效微调方法
PEFT 方法在追求与全量微调相当性能的同时,尽可能少地训练参数。由于可训练参数更少,其表达能力较弱,因此无法保证达到相同的性能。作为交换,您可以使用更少的内存,通常还能减少计算量,并获得诸如在专家适配器之间快速热切换以及减少先前知识遗忘等功能。
为大型模型的训练提供通用建议颇具难度,但对于生成式模型,尤其是语言模型,你可以遵循以下步骤:
- 使用提示(例如在提示中提供少样本示例)来查看模型是否已经具备完成该任务的能力。如果模型解决了你的问题,那就太好了!现在你可以使用基于提示的方法来学习提示,从而节省宝贵的 token。
- 如果基于提示的方法不够用,您可以使用层调优和适配器方法。这些方法通常比基于提示的方法更具表达力,也更接近全量微调。
- 请务必衡量对已学习知识的保留程度,因为每个微调步骤都可能导致遗忘先前学到的知识。
PEFT 方法对比套件旨在提供在选定基准和模型上(大多数)已实现方法的粗略概览。
并非所有 PEFT 方法都同等有效,它们在功能上存在差异:
- 量化:并非所有方法都支持量化基础模型
- 功能:并非所有方法都支持所有功能(例如,多个适配器、混合适配器推理、合并/取消合并)
- 层类型:线性层通常受支持,但并非所有适配器方法都支持嵌入层(对扩展词汇表很重要)或卷积层(对某些图像模型很重要)
- 运行时:PEFT 方法通常会带来运行时开销,但其中一部分可以通过(例如,合并适配器权重)来缓解。
基于提示的方法
Prompting通过在提示词中包含描述特定下游任务甚至展示该任务示例的文本来引导冻结的预训练模型,使其适用于该任务。借助提示词,您可以避免为每个下游任务单独训练一个完整的模型,而是直接复用同一个冻结的预训练模型。这种方式要简单得多,因为您可以使用同一个模型处理多种不同的任务;此外,训练和存储一组较小的提示词参数,比训练模型的所有参数要高效得多。
提示方法分为两类:
- 硬提示(hard prompts)是手工精心设计的文本提示,其输入为离散的 token;其缺点在于,要创建一个优质的提示需要投入大量精力
- soft prompts 是可学习的张量,与输入嵌入拼接在一起,并可以针对特定数据集进行优化;其缺点在于它们不具备人类可读性,因为你并没有将这些“虚拟 token”与真实单词的嵌入进行匹配
PEFT 库支持多种提示方法(p-tuning、prefix tuning、prompt tuning 等),请参阅目录以获取软提示方法的完整列表。 如果您有兴趣将这些方法应用于其他任务和使用场景,请查看我们的 notebook 合集!
对因果语言模型训练的一般流程有一定了解会非常有帮助,能让你更专注于软提示方法。如果你是新手,我们建议先阅读 Transformers 文档中的 因果语言建模 指南。准备好后,回来看看将 PEFT 集成到你的训练中有多简单!
层调优
Layer Tuning 将专门针对某一层类型或某一层特定方面的方法归类在一起,例如 LayerNorm Tuning 仅针对 LayerNorm 层,而 TrainableTokens 仅针对嵌入矩阵中的特定 token。这与基于提示的方法(作用于模型输入)或适配器方法(扩展现有权重)形成对比,后两者通常对层类型的依赖性较低,主要针对线性层或卷积层。
适配器方法
Adapter 方法可以被视为一种向现有模型中添加相对较小的可训练矩阵以实现微调的方式。其目标是引入少量可训练参数,将大模型引导至需要微调的任务方向,从而节省内存或计算等资源。
实现适配器的一种流行方法是插入较小的可训练矩阵,这些矩阵是适配权重布局的低秩分解,从而节省内存。将权重矩阵表示为低秩分解有多种不同的方式,但低秩适配(LoRA)是最常见的方法。PEFT 库支持该公式的几种其他变体——其中一些是 LoRA 的直接变体,记录在 LoRA 下;另一些则差异足够大,可视为独立的方法,例如低秩哈达玛积(LoHa)、低秩克罗内克积(LoKr)以及自适应低秩适配(AdaLoRA)。如果您有兴趣将这些方法应用于语义分割、token 分类等其他任务和使用场景,请查看我们的notebook 合集!
LoRA 是最受欢迎的 PEFT 方法之一,也是刚接触 PEFT 时的良好起点。它最初是为大型语言模型开发的,但由于其高效性和有效性,已成为扩散模型中极为流行的训练方法。
低秩适配器只是众多适配器形式中的一种,PEFT 还实现了许多其他类型的适配器。例如,正交微调方法(OFT、BOFT 等)通过对适配器权重进行正交分解来实现较小的体积。像 MiSS 这样的方法会对矩阵进行分片并共享这些分片,以节省内存。IA3 引入了学习向量,用于重新缩放键、值以及前馈激活值。
Update on GitHub