PEFT documentation
PVeRA:基于概率向量的随机矩阵自适应
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
< 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 = 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 配置的类。
PveraModel
类 peft.PveraModel
< source >( 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 toFalse) — 在 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)属性:
- model (PreTrainedModel) — 要适配的模型。
- peft_config (PveraConfig): PVeRA 模型的配置。