PEFT 文档

FourierFT: 离散傅里叶变换微调

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

FourierFT: 离散傅里叶变换微调

FourierFT 是一种参数高效微调技术,它利用离散傅里叶变换来压缩模型的可调权重。这种方法在 GLUE 基准测试和常见的 ViT 分类任务中,使用更少的参数就超越了 LoRA。

FourierFT 目前有以下限制:

  • 仅支持 `nn.Linear` 层。
  • 不支持量化层。

如果这些限制不适用于您的用例,请考虑使用其他方法。

论文摘要如下:

低秩自适应 (LoRA) 最近在基础模型微调领域引起了广泛关注。它通过引入低秩矩阵 A 和 B 来表示权重变化(即 Delta W = BA),从而有效减少了可训练参数的数量。尽管 LoRA 取得了进展,但在处理大量定制化适配或更大的基础模型时,它仍面临存储挑战。在这项工作中,我们旨在通过利用傅里叶变换强大的表达能力来进一步压缩可训练参数。具体来说,我们引入了 FourierFT,它将 Delta W 视为空域中的一个矩阵,并只学习其一小部分频谱系数。通过训练得到的频谱系数,我们实现逆离散傅里叶变换来恢复 Delta W。从经验上看,我们的 FourierFT 方法在各种任务(包括自然语言理解、自然语言生成、指令微调和图像分类)中,以更少的参数表现出与 LoRA 相当或更好的性能。例如,在 LLaMA2-7B 模型上进行指令微调时,FourierFT 仅用 0.064M 可训练参数就超越了 LoRA 的 33.5M。

FourierFTConfig

class peft.FourierFTConfig

< >

( task_type: typing.Union[str, peft.utils.peft_types.TaskType, NoneType] = None peft_type: typing.Union[str, peft.utils.peft_types.PeftType, NoneType] = None auto_mapping: typing.Optional[dict] = None base_model_name_or_path: typing.Optional[str] = None revision: typing.Optional[str] = None inference_mode: bool = False n_frequency: int = 1000 scaling: float = 150.0 random_loc_seed: Optional[int] = 777 fan_in_fan_out: bool = False target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None n_frequency_pattern: Optional[dict] = <factory> init_weights: bool = False )

参数

  • n_frequency (int) — 离散傅里叶变换中可学习的频率数量。“n_frequency”是一个大于 0 且小于等于 d^2 的整数(假设权重 W 的维度为 d x d)。此外,它也是更新每个 delta W 权重所需的可训练参数数量。“n_frequency”会影响 PEFT 的性能和效率。具体来说,它对训练速度影响不大,但其值越高,通常会导致更大的 GPU 显存成本和更好的准确性。在相同的 `target_modules` 下,LoRA 的参数数量是 FourierFT 的 (2*d*r/n_frequency) 倍。以下关于“n_frequency”的设置示例可供用户参考。对于 RoBERTa-large 模型的 NLU 任务,采用“n_frequency”:1000 几乎可以达到与 LoRA 中“r”:8 相似的结果。此时,LoRA 的参数数量大约是 FourierFT 的 16 倍。对于 Vit-large 模型的图像分类任务,采用“n_frequency”:3000 几乎可以达到与 LoRA 中“r”:16 相似的结果,其中 LoRA 的参数数量大约是 FourierFT 的 11 倍。
  • scaling (float) — delta W 矩阵的缩放值。这是一个重要的超参数,用于缩放,类似于 LoRA 方法中的“lora_alpha”参数。“scaling”可以在超参数搜索过程中确定。但是,如果用户想跳过此过程,可以参考以下场景中的设置。对于所有 NLU (GLUE) 任务,RoBERTa-base 和 RoBERTa-large 模型均可将此参数设置为 100.0 或 150.0。对于所有指令微调任务,LLaMA 家族模型均可将此参数设置为 300.0。对于所有图像分类任务,ViT-base 和 ViT-large 模型均可将此参数设置为 300.0。
  • random_loc_seed (int) — 用于频率随机位置(即频谱条目矩阵)的种子。
  • target_modules (Union[list[str],str]) — 要替换为 FourierFT 的模块名称列表或模块名称的正则表达式。例如,['q', 'v'] 或 '.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'。仅支持线性层。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。当传递字符串时,将进行正则表达式匹配。当传递字符串列表时,将进行精确匹配或检查模块名称是否以任何传递的字符串结尾。
  • fan_in_fan_out (bool) — 如果要替换的层存储权重的形式为 (fan_in, fan_out),则设置为 True。
  • bias (str) — FourierFT 的偏置类型。可以是 'none'、'all' 或 'fourier_only'。
  • modules_to_save (list[str]) — 除了 FourierFT 层之外,需要设置为可训练并在最终检查点中保存的模块列表。例如,在序列分类或词元分类任务中,最后一层 `classifier/score` 是随机初始化的,因此需要设置为可训练并保存。
  • layers_to_transform (Union[list[int],int]) — 要转换的层索引,如果指定此参数,PEFT 将仅转换此列表中指定的层索引。如果传递单个整数,PEFT 将仅转换该索引处的层。
  • layers_pattern (Optional[Union[List[str], str]]) — 层的模式名称,仅在 `layers_to_transform` 不为 None 且层模式不在常见层模式中时使用。这应该针对模型的 `nn.ModuleList`,通常称为 `'layers'` 或 `'h'`。
  • n_frequency_pattern (dict) — 从层名称或正则表达式到 n_frequency 的映射,这些 n_frequency 与指定的默认值不同。例如,`{model.decoder.layers.0.encoder_attn.k_proj: 1000}`。
  • init_weights (bool) — 傅里叶权重的初始化。如果频谱初始化为标准正态分布,则设置为 False。如果频谱初始化为零,则设置为 True。

这是用于存储 FourierFTModel 配置的配置类。

FourierFTModel

class peft.FourierFTModel

< >

( model peft_config: Union[PeftConfig, dict[str, PeftConfig]] adapter_name: str low_cpu_mem_usage: bool = False state_dict: Optional[dict[str, torch.Tensor]] = None ) torch.nn.Module

参数

  • model (torch.nn.Module) — 要进行适配的模型。
  • config (FourierFTConfig) — FourierFT 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 `"default"`。
  • low_cpu_mem_usage (bool, optional, 默认为 False) — 在元设备上创建空的适配器权重。有助于加快加载过程。

返回

torch.nn.Module

FourierFT 模型。

从预训练的 transformers 模型创建 FourierFT 模型。

该方法在 https://huggingface.co/papers/2405.03003 中有详细描述。

属性:

  • model (PreTrainedModel) — 需要被适配的模型。
  • peft_config (FourierFTConfig): Fourier 模型的配置。

delete_adapter

< >

( adapter_name: str )

参数

  • adapter_name (str) — 要删除的适配器名称。

删除一个现有的适配器。

disable_adapter_layers

< >

( )

禁用所有适配器。

禁用所有适配器后,模型输出对应于基础模型的输出。

enable_adapter_layers

< >

( )

启用所有适配器。

如果您之前禁用了所有适配器并希望重新启用它们,请调用此函数。

merge_and_unload

< >

( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )

参数

  • progressbar (bool) — 是否显示指示卸载和合并过程的进度条
  • safe_merge (bool) — 是否激活安全合并检查,以检查适配器权重中是否存在任何潜在的 NaN
  • adapter_names (List[str], optional) — 应合并的适配器名称列表。如果为 None,则将合并所有活动的适配器。默认为 `None`。

此方法将傅里叶层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要此操作。

set_adapter

< >

( adapter_name: str | list[str] )

参数

  • adapter_name (str or list[str]) — 要激活的适配器名称。

设置活动的适配器。

unload

< >

( )

通过移除所有傅里叶模块而不合并,恢复基础模型。这会返回原始的基础模型。

< > 在 GitHub 上更新