PEFT 文档

正交微调 (OFT 和 BOFT)

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

正交微调 (OFT 和 BOFT)

本概念指南简要概述了 OFTBOFT,这是一种参数高效的微调技术,它利用正交矩阵来乘法转换预训练的权重矩阵。

为了实现高效的微调,OFT 使用正交变换来表示权重更新。正交变换通过乘以预训练权重矩阵的正交矩阵来参数化。这些新矩阵可以被训练以适应新数据,同时保持总体变化数量较低。原始权重矩阵保持冻结状态,不再进行任何进一步的调整。为了产生最终结果,原始权重和调整后的权重被一起相乘。

正交蝴蝶 (BOFT) 通过蝴蝶分解推广了 OFT,并进一步提高了其参数效率和微调灵活性。简而言之,OFT 可以被视为 BOFT 的一个特例。与使用加性低秩权重更新的 LoRA 不同,BOFT 使用乘性正交权重更新。比较如下所示。

与 LoRA 相比,BOFT 具有一些优势

  • BOFT 提出了一种简单而通用的方法,用于将预训练模型微调到下游任务,从而更好地保留预训练知识并提高参数效率。
  • 通过正交性,BOFT 引入了结构约束,即在微调期间保持 超球面能量 不变。这可以有效地减少对预训练知识的遗忘。
  • BOFT 使用蝴蝶分解来有效地参数化正交矩阵,从而产生紧凑而富有表现力的学习空间(即,假设类)。
  • BOFT 中的稀疏矩阵分解带来了额外的归纳偏置,这有利于泛化。

原则上,BOFT 可以应用于神经网络中权重矩阵的任何子集,以减少可训练参数的数量。给定注入 BOFT 参数的目标层,可训练参数的数量可以根据权重矩阵的大小来确定。

将 OFT/BOFT 权重合并到基础模型中

与 LoRA 类似,OFT/BOFT 学习到的权重可以使用 merge_and_unload() 函数集成到预训练的权重矩阵中。此函数将适配器权重与基础模型合并,这使您可以有效地将新合并的模型用作独立模型。

这样做是可行的,因为在训练期间,正交权重矩阵(上图中的 R)和预训练的权重矩阵是分开的。但是一旦训练完成,这些权重实际上可以合并(相乘)成一个新的等效权重矩阵。

OFT / BOFT 的实用工具

PEFT 中通用的 OFT / BOFT 参数

与其他 PEFT 支持的方法一样,要使用 OFT 或 BOFT 微调模型,您需要:

  1. 实例化一个基础模型。
  2. 创建一个配置 (OFTConfigBOFTConfig),您可以在其中定义 OFT/BOFT 特定的参数。
  3. 使用 get_peft_model() 包装基础模型以获得可训练的 PeftModel
  4. 像平常训练基础模型一样训练 PeftModel

BOFT 特定的参数

BOFTConfig 允许您通过以下参数控制 OFT/BOFT 如何应用于基础模型:

  • boft_block_size:跨不同层的 BOFT 矩阵块大小,以 int 表示。较小的块大小会导致更稀疏的更新矩阵,可训练参数更少。注意,请选择 boft_block_size,使其可被大多数层的输入维度 (in_features) 整除,例如,4、8、16。此外,请仅指定 boft_block_sizeboft_block_num 中的一个,但不要同时指定或都留为 0,因为 boft_block_size x boft_block_num 必须等于层的输入维度。
  • boft_block_num:跨不同层的 BOFT 矩阵块的数量,以 int 表示。较少的块会导致更稀疏的更新矩阵,可训练参数更少。注意,请选择 boft_block_num,使其可被大多数层的输入维度 (in_features) 整除,例如,4、8、16。此外,请仅指定 boft_block_sizeboft_block_num 中的一个,但不要同时指定或都留为 0,因为 boft_block_size x boft_block_num 必须等于层的输入维度。
  • boft_n_butterfly_factor:蝴蝶因子的数量。注意,对于 boft_n_butterfly_factor=1,BOFT 与 vanilla OFT 相同;对于 boft_n_butterfly_factor=2,OFT 的有效块大小变为两倍大,块的数量变为一半。
  • bias:指定是否应训练 bias 参数。可以是 "none""all""boft_only"
  • boft_dropout:指定乘性 dropout 的概率。
  • target_modules:要注入 OFT/BOFT 矩阵的模块(例如,注意力块)。
  • modules_to_save:除了 OFT/BOFT 矩阵之外,要设置为可训练并在最终检查点中保存的模块列表。这些通常包括为微调任务随机初始化的模型的自定义头部。

BOFT 用法示例

有关 BOFT 方法在各种下游任务中的应用的示例,请参阅以下指南:

查看以下关于如何使用 BOFT 微调模型的逐步指南:

对于图像分类任务,可以按如下方式初始化 DinoV2 模型的 BOFT 配置:

import transformers
from transformers import AutoModelForSeq2SeqLM, BOFTConfig
from peft import BOFTConfig, get_peft_model

config = BOFTConfig(
    boft_block_size=4,
    boft_n_butterfly_factor=2,
    target_modules=["query", "value", "key", "output.dense", "mlp.fc1", "mlp.fc2"],
    boft_dropout=0.1,
    bias="boft_only",
    modules_to_save=["classifier"],
)

model = transformers.Dinov2ForImageClassification.from_pretrained(
    "facebook/dinov2-large",
    num_labels=100,
)

boft_model = get_peft_model(model, config)
< > 在 GitHub 上更新