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는 LoRA 기반 어댑터 계열의 VeRA를 기반으로 한 매개변수 효율적 파인튜닝 기법입니다. 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 다이버전스를 사용하여 학습하는 데에는 잠재 표현에 쉽게 접근할 수 없습니다.

해당 논문의 초록은 다음과 같습니다:

최근 몇 년간 대규모 파운데이션 모델이 등장하여 다양한 작업의 성능 한계를 확장하고 있습니다. 이러한 모델을 학습하거나 심지어 파인튜닝하는 데는 방대한 데이터셋과 계산 자원이 필요하며, 이는 종종 희소하고 비용이 높습니다. 적응 방법은 이러한 모델이 소량의 데이터와 계산 자원으로 파인튜닝될 수 있도록 하여 이러한 한계를 해결하는 계산 효율적인 솔루션을 제공합니다. 이는 학습 가능한 매개변수의 일부만 가진 동결된 백본에 새로운 학습 가능한 모듈을 추가하고, 새로운 작업에 대해 이 모듈만 적합(fitting)하도록 함으로써 달성됩니다. 최근 VeRA 어댑터는 모든 레이어에 걸쳐 공유되는 동결된 무작위 저랭크 행렬 쌍을 활용하여 매개변수 효율적 적응에서 뛰어난 성능을 보인 것으로 입증되었습니다. 본 논문에서는 VeRA 어댑터의 확률적 버전인 PVeRA를 제안하며, 이는 VeRA의 저랭크 행렬을 확률적 방식으로 수정합니다. 이러한 수정은 입력의 내재적 모호성을 처리할 수 있게 하고, 학습 및 테스트 중에 다른 샘플링 구성을 허용합니다. VTAB-1k 벤치마크와 7개의 어댑터를 대상으로 포괄적인 평가가 수행되었으며, 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를 초기화하는 데 사용됩니다. 기본값은 0입니다.
  • save_projection (bool) — state dict에 레이어별 lambda_b / lambda_d 가중치와 함께 pvera_A / pvera_B 투영을 저장할지 여부입니다. 체크포인트 크기가 증가하지만, 모든 시스템 구성에서 체크포인트를 다시 로드할 수 있음을 보장합니다. 기본값은 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는 가중치를 (fan_in, fan_out) 형태로 저장하는 Conv1D를 사용하므로 이 값을 True로 설정해야 합니다.
  • bias (str) — Bias type for PVeRA. Can be ‘none’, ‘all’ or ‘pvera_only’. If ‘all’ or ‘pvera_only’, the corresponding biases will be updated during training. Be aware that this means that, even when disabling the adapters, the model will not produce the same output as the base model would have without adaptation.
  • 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

class 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, 기본값 False) — 메타 디바이스에 빈 어댑터 가중치를 생성합니다. 로딩 프로세스를 가속하는 데 유용합니다.

반환값

torch.nn.Module

PVeRA 모델.

pretrained transformers model에서 Probabilistic Vector-based Random Matrix Adaptation (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