PEFT documentation

PVeRA:基于概率向量的随机矩阵自适应

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

PVeRA:基于概率向量的随机矩阵自适应

PVeRA 是一种基于 VeRA 的参数高效微调技术,属于基于 LoRA 的适配器家族。它保留了 VeRA 极低的参数预算,同时通过学习潜在适配的分布来提升性能。这使得使用 PVeRA 适配的模型能够在推理时从学习到的分布中采样,从而生成蒙特卡洛置信区间估计。

在保存适配器参数时,可以通过在 PveraConfig 中设置 save_projection=False 来避免存储低秩矩阵。在这种情况下,这些矩阵将根据 projection_prng_key 参数中指定的固定随机种子进行恢复。这可以减小检查点的大小,但我们无法保证在所有设备以及 PyTorch 的所有未来版本上都能实现可复现性。如果您希望确保可复现性,请设置 save_projection=True(这是默认值)。

为了处理不同形状的适配层,PVeRA 会为每个维度使用所需的最大尺寸来初始化共享的 A 和 B 矩阵。在前向传播过程中,给定层的子矩阵 A 和 B 会从这些共享矩阵中切片提取出来,并按照论文中的描述使用。例如,适配形状为 (100, 20) 和 (80, 50) 的两个线性层,将分别创建形状为 (rank, 50) 和 (100, rank) 的 A 和 B 矩阵。然后,为了适配形状为 (100, 20) 的层,将提取形状为 (rank, 20) 和 (100, rank) 的子矩阵 A 和 B。

PVeRA 目前存在以下限制:

  • 仅支持 nn.Linear 层。
  • 潜在表示不易访问,因此无法用于基于 KL 散度的训练。

该论文的摘要如下:

近年来,大型基础模型不断涌现,并在多种任务上推动了性能边界的突破。训练甚至微调此类模型需要海量的数据集和计算资源,而这些资源往往稀缺且昂贵。自适应方法提供了一种计算高效的解决方案,通过允许在少量数据和算力上微调此类模型来应对这些限制。其实现方式是在冻结的骨干网络上附加新的可训练模块,这些模块仅包含一小部分可训练参数,并且仅在新型任务上拟合这些模块。最近,VeRA 适配器被证明在参数高效自适应方面表现出色,它利用了在所有层之间共享的一对冻结的随机低秩矩阵。在本文中,我们提出了 PVeRA,即 VeRA 适配器的概率版本,它以概率方式修改 VeRA 的低秩矩阵。这种修改自然地允许处理输入中的固有歧义,并允许在训练和测试期间采用不同的采样配置。我们在 VTAB-1k 基准上对七个适配器进行了全面评估,结果显示 PVeRA 的表现优于 VeRA 和其他适配器。

基准测试概览

API

PveraConfig

类 peft.PveraConfig

< >

( 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 = Falser: int = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truepvera_dropout: float = 0.0d_initial: float = 0.1fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonesample_at_inference: bool = Falsegenerator_seed: Optional[int] = None )

参数

  • r (int,可选,默认为 256) — PVeRA 参数维度(“rank”)。由于 PVeRA 在层间共享参数,因此使用的参数远少于 LoRA,请在此处选择比 LoRA rank 更高的值。
  • target_modules (Union[List[str], str]) — 要应用 PVeRA 的模块名称。仅支持线性层。如果传入字符串,则执行正则表达式匹配。如果指定为 ‘all-linear’,则选择所有线性/Conv1D 模块。如果未指定,则根据模型架构选择模块。如果架构未知,将引发错误。
  • projection_prng_key (int) — PVeRA PRNG 初始化密钥。用于为新模型初始化 pvera_A 和 pvera_B,或在加载未包含这些投影的 checkpoint 时使用。默认值为 0。
  • save_projection (bool) — 是否将 pvera_A / pvera_B 投影与每层的 lambda_b / lambda_d 权重一起保存在状态字典中。这会增加检查点的大小,但可保证在所有系统配置上重新加载检查点。默认为 True。
  • pvera_dropout (float) — PVeRA 层的 dropout 概率。
  • d_initial (float,可选,默认为 0.1) — 用于初始化 PVeRA 参数时 pvera_lambda_d 向量的初始值。建议使用较小的值(<=0.1)。
  • fan_in_fan_out (bool) — 如果待替换的层以 (fan_in, fan_out) 的形式存储权重,请将此项设置为 True。例如,gpt-2 使用的 Conv1D 以 (fan_in, fan_out) 的形式存储权重,因此应将其设置为 True。
  • bias (str) — PVeRA 的偏置类型。可以是 ‘none’、‘all’ 或 ‘pvera_only’。如果设置为 ‘all’ 或 ‘pvera_only’,对应的偏置将在训练期间更新。请注意,这意味着即使禁用了适配器,模型的输出也不会与未进行适配的基础模型相同。
  • modules_to_save (List[str]) — 除 PVeRA 层外,需要设置为可训练并在最终检查点中保存的模块列表。
  • init_weights (bool) — 是否使用默认初始化方式初始化 PVeRA 层的权重。除非您完全清楚自己在做什么,否则请勿更改此设置。
  • layers_to_transform (Union[List[int],int]) — 要转换的层索引。如果指定了此参数,则会对该列表中指定的层索引应用 PVeRA 转换。如果传入单个整数,则会对该索引处的层应用 PVeRA 转换。
  • layers_pattern (Optional[Union[List[str], str]]) — 层模式名称,仅在 layers_to_transform 不同于 None 时使用。它应指向模型的 nn.ModuleList,该列表通常命名为 'layers' 或 'h'。
  • sample_at_inference (bool,默认为 False) — 是否在推理时从学习到的 PVeRA 分布中进行采样。如果为 False,则使用学习到的均值。
  • generator_seed (int, 默认为 None) — 用于从学习到的分布中采样的生成器的随机种子。

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

论文:https://www.arxiv.org/abs/2512.07703。

PveraModel

类 peft.PveraModel

< >

( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module

参数

  • model (PreTrainedModel) — 要适配的模型。
  • config (PveraConfig) — PVeRA 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 "default"。
  • low_cpu_mem_usage (bool, optional, defaults to False) — 在 meta 设备上创建空的适配器权重。有助于加快加载过程。

返回值

torch.nn.Module

PVeRA 模型。

从预训练的 transformers 模型创建基于概率向量的随机矩阵自适应(PVeRA)模型。

示例:

>>> from transformers import AutoModel
>>> from peft import PveraConfig, get_peft_model

>>> base_model = AutoModel.from_pretrained("facebook/dinov2-base")
>>> config = PveraConfig(r=128, sample_at_inference=False)
>>> model = get_peft_model(base_model, config)

属性:

Update on GitHub