BOFT
正交蝶形(BOFT)是一种通用方法,专为微调基础模型而设计。它通过借鉴库利-图基快速傅里叶变换,提高了微调范例——正交微调(OFT)的参数效率,对微调不同基础模型(包括大型视觉转换器、大型语言模型和文本到图像扩散模型)显示出良好的结果。
论文摘要如下
大型基础模型无处不在,但从头开始训练它们成本高昂。因此,将这些强大的模型有效地适应下游任务变得越来越重要。在本文中,我们研究了一种原则性的微调范例——正交微调 (OFT)——以用于下游任务适应。尽管展示出良好的泛化性,但 OFT 由于正交矩阵的高维性,仍然使用了相当多的可训练参数。为了解决这个问题,我们首先从信息传输的角度考察 OFT,然后识别出一些关键的条件,以实现更好的参数效率。受 Cooley-Tukey 快速傅里叶变换算法如何实现高效信息传输的启发,我们使用蝴蝶结构提出了一个高效的正交参数化。我们将此参数化应用于 OFT,创建了一种新颖的参数高效微调方法,称为正交蝴蝶 (BOFT)。通过将 OFT 作为特例归纳,BOFT 引入了泛化的正交微调框架。最后,我们对大型视觉 Transformer、大型语言模型和文本到图像扩散模型如何适应视觉和语言中的各种下游任务进行了广泛的实证研究。.
BOFTConfig
class peft.BOFTConfig
< 源代码 >(peft_type: 联合 = 无 auto_mapping: 可选 = 无 base_model_name_or_path: 可选 = 无 revision: 可选 = 无 task_type: 联合 = 无 inference_mode: 布尔 = 否 boft_block_size: int = 4 boft_block_num: int = 0 boft_n_butterfly_factor: int = 1 target_modules: 联合 = 无 boft_dropout: 浮动 = 0.0 fan_in_fan_out: 布尔 = 否 bias: 字符串 = '无' modules_to_save: 可选 = 无 init_weights: 布尔 = 是 layers_to_transform: 联合 = 无 layers_pattern: 可选 = 无 )
参数
- boft_block_size (
int
) — 不同层之间 BOFT 块大小。 - boft_block_num (
int
) — 每个注入层中 BOFT 块数量。 - boft_dropout (
float
) — BOFT 层的乘法 dropout 概率。 - fan_in_fan_out (
bool
) — 将此设置为 True,如果要替换的层存储像 (fan_in, fan_out) 的权重。例如,gpt-2 使用Conv1D
来存储像 (fan_in, fan_out) 这样的权重,因此应将其设置为True
。 - bias (
str
) — BOFT 的偏差类型。可以是“无”、“全部”或“仅 BOFT”。如果是“全部”或“仅 BOFT”,则相应的偏差将在训练期间更新。请注意,这意味着,即使禁用适配器,模型也不会产生与基础模型在没有适配的情况下相同的输出。 - modules_to_save (
List[str]
) —除 BOFT 层之外的模块列表,这些模块将设置为可训练并在最终检查点中保存。 - layers_to_transform (
Union[List[int],int]
) —要转换的层索引,如果指定此参数,它将对在此列表中指定的层索引应用 BOFT 转换。如果传递单个整数,它将在该索引处的层上应用 BOFT 转换。
BOFTModel
类 peft.BOFTModel
< 源 >( model config adapter_name low_cpu_mem_usage: bool = False ) → torch.nn.Module
从预训练的 Transformers 模型创建 BOFT 和 OFT 模型。论文:https://arxiv.org/abs/2311.06243 https://arxiv.org/abs/2306.07280
示例
>>> import transformers >>> from transformers import AutoModelForSeq2SeqLM, BOFTConfig >>> from peft import
BOFTConfig, get_peft_model
>>> config = BOFTConfig( ... boft_block_size=8, ... boft_n_butterfly_factor=1, ... 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)
属性:
- model ([transformers.PreTrainedModel]) — 要适配的模型。
- peft_config ([BOFTConfig]):BOFT 模型的配置。
删除现有的适配器。
merge_and_unload
< 源代码 > ( progressbar: 否 = False safe_merge: 否 = False adapter_names: 可选 = None )
卸载所有 boft 模块,且不合并,即可让基础模型恢复原状。