PEFT documentation
WaveFT:小波微调
WaveFT:小波微调
WaveFT 是一种新颖的参数高效微调(PEFT)方法,它在残差矩阵的小波域中引入稀疏更新。与受限于离散低秩选择的 LoRA 不同,WaveFT 通过直接在变换空间中学习一组稀疏系数,实现了对可训练参数数量的细粒度控制。随后,这些系数通过逆离散小波变换(IDWT)映射回权重域,从而生成高秩更新,且不会带来推理开销。
WaveFT 目前存在以下限制:
- 仅支持
nn.Linear层。
该论文的摘要如下:
高效适配大型基础模型至关重要,尤其是在计算和内存预算紧张的情况下。参数高效微调(PEFT)方法(如 LoRA)在少参数场景下的粒度和有效性有限。我们提出了 Wavelet Fine-Tuning (WaveFT),这是一种新颖的 PEFT 方法,它在残差矩阵的小波域中学习高度稀疏的更新。WaveFT 允许对可训练参数进行精确控制,提供细粒度的容量调整,并在极低的参数数量下表现出色,其参数数量可能远低于 LoRA 的最小值——非常适合极致的参数高效场景。在以 Stable Diffusion XL 为基线的个性化文本到图像生成任务上进行评估,WaveFT 显著优于 LoRA 和其他 PEFT 方法,尤其是在低参数数量下;实现了更优的主体保真度、提示词对齐度和图像多样性。
基准测试概览
API
WaveFTConfig
类 peft.WaveFTConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falsen_frequency: int = 2592scaling: float = 25.0wavelet_family: str = 'db1'use_idwt: bool = Truerandom_loc_seed: int = 777fan_in_fan_out: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonen_frequency_pattern: Optional[dict] = <factory>proportional_parameters: bool = Falseinit_weights: bool = True )
参数
- n_frequency (
int) — 离散小波变换 (DWT) 的可学习小波系数数量。‘n_frequency’ 是一个大于 0 且小于或等于原始权重矩阵中元素总数 (d_out * d_in) 的整数。该参数直接控制每个适配层中可训练参数的数量。较高的 ‘n_frequency’ 通常能带来更好的性能,但也会增加 GPU 内存占用,对训练速度的影响较小。 - scaling (
float) — 应用于重构的 delta W 矩阵的缩放因子。这是一个至关重要的超参数,类似于 LoRA 中的lora_alpha。可以在超参数搜索过程中对其进行调整。我们用于 SDXL 个性化训练的默认值为 25。 - wavelet_family (
str) — 用于 DWT 和逆 DWT (IDWT) 的小波族(例如 ‘db1’、‘sym2’、‘coif1’)。默认为 ‘db1’(Haar 小波)。不同的小波族具有不同的滤波器长度,这会显著影响训练时间 - use_idwt (
bool) — 设置为 False 以实现高效适配。是否使用逆离散小波变换(IDWT)从学习得到的小波系数重建 delta 权重。如果为True(默认值),则应用 IDWT。如果为False,则直接使用学习到的系数来构建稀疏 delta 权重矩阵,这种方式速度更快,但在 SDXL 个性化任务中表现较差。 - random_loc_seed (
int) — 用于确定n_frequency个可学习小波系数在完整小波系数矩阵中随机位置的种子。 - target_modules (
Union[list[str],str]) — 模块名称列表或用于标识要通过 WaveFT 进行适配的模块的正则表达式。例如,['q_proj', 'v_proj']或'.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'。目前,仅支持线性 层 (torch.nn.Linear)。 - exclude_modules (
Optional[Union[List[str], str]]) — 要从 WaveFT 适配中排除的模块名称列表或正则表达式。 - fan_in_fan_out (
bool) — 如果待替换层的权重以(fan_in, fan_out)格式存储,则将其设置为True。默认值为False。 - bias (
str) — WaveFT 的偏置类型。可以是 ‘none’、‘all’ 或 ‘waveft_only’。(‘fourier_only’ 可能是拼写错误,如果它表示仅对适配参数添加偏置,则已更正为 ‘waveft_only’)如果为 ‘waveft_only’,则仅向 WaveFT 组件添加偏置。如果为 ‘all’,则向基础组件和 WaveFT 组件均添加偏置。如果为 ‘none’,则不添加新的偏置。 - modules_to_save (
list[str]) — 除 WaveFT 层外,还应标记为可训练并在最终检查点中保存的模块列表。对于序列或标记分类任务中随机初始化且需要训练的层(例如分类器)非常有用。 - layers_to_transform (
Union[list[int],int]) — 要转换的特定层索引。如果提供,PEFT 将只适配这些索引处的层。如果给定单个整数,则只转换该层。 - layers_pattern (
Optional[Union[List[str], str]]) — 层名称的模式,当指定了layers_to_transform且层模式不标准(例如不是 ‘layers’ 或 ‘h’)时使用。此参数应指向模型中的nn.ModuleList属性。 - n_frequency_pattern (
dict) — 一个字典,将层名称(或正则表达式)映射到特定的n_frequency值,以覆盖全局的n_frequency。示例:{"model.decoder.layers.0.encoder_attn.k_proj": 1000}。 - init_weights (
bool) — 可学习小波系数(频谱)的初始化策略。如果为True(默认值), 系数将初始化为零。如果为False,系数将从一个由小因子缩放的标准正态分布中初始化。 - proportional_parameters (
bool) — 如果为True,则n_frequency会根据每层的input_dim * output_dim按比例分配。默认值为False。注意:此选项旨在实验性地确保全面性,以便研究人员能够复现论文结果,而非出于实用目的,因为尚未发现任何有益的场景。
这是用于存储 WaveFTModel 配置的类。它用于定义基于小波的微调(WaveFT)的参数,这是一种利用小波变换的稀疏性来实现预训练模型参数高效微调的方法。
WaveFTModel
类 peft.WaveFTModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )