PEFT documentation

TinyLoRA: 13개의 파라미터로 추론을 학습

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

TinyLoRA: 13개의 파라미터로 추론을 학습

TinyLoRA는 동결된 가중치의 SVD 분해를 사용하고 고정된 무작위 텐서를 통해 매우 작은 학습 가능 벡터를 투영하는 LoRA-XS 접근법을 기반으로 한 극도로 매개변수 효율적인 미세 조정 기법입니다. GRPO와 같은 강화 학습(RL) 훈련 방법과 결합하면, TinyLoRA는 학습 가능한 매개변수가 1~13개에 불과한 경우에도 경쟁력 있는 성능을 달성할 수 있습니다.

TinyLoRA의 핵심 혁신은 학습 가능한 저랭크 행렬 R을 고정된 무작위 투영 행렬의 가중 합으로 대체하는 것입니다: R = Σᵢ vᵢ Pᵢ. 여기서 v ∈ R^u는 차원이 u인 매우 작은 학습 가능 벡터이고, Pᵢ는 고정된 무작위 행렬입니다. 이를 통해 학습 가능한 매개변수의 수를 크게 줄이면서도 경쟁력 있는 성능을 유지할 수 있습니다.

TinyLoRA는 weight_tying 파라미터를 통해 가중치 공유를 지원합니다. 이 파라미터는 0.0과 1.0 사이의 비율로, 동일한 학습 가능 벡터 v를 공유하는 모듈의 수를 제어합니다. weight_tying=0.0(기본값)은 공유가 없음을 의미하며, weight_tying=1.0은 모든 대상 모듈에 대한 완전한 공유를 의미합니다. 이를 통해 모델 전체에 대해 u개의 학습 가능 파라미터로 구성된 단일 벡터만으로 극한의 파라미터 효율성을 달성할 수 있습니다.

어댑터 파라미터를 저장할 때 TinyLoraConfig에서 save_projection=False를 설정하여 무작위 투영 행렬을 저장하지 않을 수 있습니다. 이 경우, projection_seed 인자의 고정된 무작위 시드를 기반으로 해당 행렬이 복원됩니다. 이를 통해 체크포인트의 크기를 줄일 수 있지만, 모든 장치 및 PyTorch의 모든 향후 버전에서 재현성을 보장할 수 없습니다. 재현성을 보장하려면 save_projection=True를 설정하세요(기본값).

TinyLoRA에는 현재 다음과 같은 제약 사항이 있습니다:

  • nn.Linear, nn.Embedding, transformers.pytorch_utils.Conv1D 레이어만 지원됩니다.

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

최근 연구에 따르면, 언어 모델은 종종 강화 학습을 통해 추론을 학습할 수 있습니다. 일부 연구에서는 추론을 위한 저랭크 파라미터화를 학습하지만, 기존 LoRA는 모델 차원보다 작게 확장할 수 없습니다. 우리는 추론 학습에 랭크=1 LoRA조차도 필요한지 의문을 제기하며, 저랭크 어댑터를 1개의 파라미터까지 축소할 수 있는 방법인 TinyLoRA를 제안합니다. 새로운 파라미터화 내에서, 우리는 Qwen2.5의 8B 파라미터 크기를 bf16에서 학습된 파라미터 13개(총 26바이트)만으로 GSM8K에서 91%의 정확도로 학습할 수 있었습니다. 이러한 경향은 일반적으로 성립합니다. AIME, AMC, MATH500과 같은 더 어려운 학습-추론 벤치마크 일련에서, 우리는 1000배 적은 파라미터를 학습하면서도 성능 향상의 90%를 회복할 수 있었습니다. 주목할 점은, 이러한 강력한 성능은 RL로만 달성할 수 있다는 것입니다. SFT로 학습된 모델은 동일한 성능에 도달하려면 100~1000배 더 큰 업데이트가 필요합니다.

벤치마크 개요

API

TinyLoraConfig

클래스 peft.TinyLoraConfig

< >

( 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 = 2u: int = 64weight_tying: float = 0.0projection_seed: int = 42save_projection: bool = Trueinit_v_bound: float = 0.02target_modules: Optional[Union[list[str], str]] = Nonetinylora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: Union[bool, str] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

매개변수

  • r (int, 선택 사항, 기본값 2) — 동결된 U, Sigma, V 분해에 사용할 SVD 랭크입니다. 논문에서는 r=2를 권장합니다.
  • u (int, 선택 사항, 기본값 64) — 그룹당 학습 가능한 벡터 차원입니다. 이는 적응의 표현력을 제어합니다. 극도의 매개변수 효율성을 위해 1~13까지 낮출 수 있습니다.
  • weight_tying (float, 선택 사항, 기본값 0.0) — 대상 모듈 간 가중치 공유 정도를 0.0과 1.0 사이의 비율로 나타냅니다. 동일한 학습 가능 벡터 v를 공유하는 모듈의 수를 제어합니다. 0.0은 공유가 없음을 의미하며(각 모듈이 자체 v를 가짐), 1.0은 완전한 공유를 의미합니다(모든 모듈이 하나의 v를 공유). 그 사이의 값은 부분적인 공유를 제공합니다.
  • projection_seed (int, 선택 사항, 기본값 42) — 고정 투영 행렬 P 생성에 사용되는 랜덤 시드입니다.
  • save_projection (bool, 선택 사항, 기본값 True) — state dict에 projection 텐서 P를 저장할지 여부입니다. False인 경우 로드 시 seed에서 다시 생성됩니다.
  • init_v_bound (float, 선택 사항, 기본값 0.02) — 학습 가능한 벡터 v의 균등 초기화 경계입니다. 값은 [-init_v_bound, init_v_bound] 범위에서 초기화됩니다.
  • target_modules (Union[List[str], str], 선택 사항) — TinyLoRA를 적용할 모듈의 이름입니다. 모듈 이름 목록(예: ['q_proj', 'v_proj']), 정규식 패턴(예: '.*decoder.*(q|v)_proj$'), 또는 모든 선형 모듈을 대상으로 하려면 특수 키워드 "all-linear"를 사용할 수 있습니다. nn.Linear, nn.Embedding, transformers.pytorch_utils.Conv1D 레이어만 지원됩니다.
  • tinylora_dropout (float, 선택 사항, 기본값 0.0) — TinyLoRA 레이어의 dropout 확률입니다.
  • fan_in_fan_out (bool, 선택 사항, 기본값 False) — 교체할 레이어가 가중치를 (fan_in, fan_out) 형식으로 저장하는 경우 True로 설정합니다. 예를 들어, gpt-2는 가중치를 (fan_in, fan_out) 형식으로 저장하는 Conv1D를 사용합니다.
  • bias (str, 선택 사항, 기본값 "none") — TinyLoRA의 Bias 유형입니다. ‘none’, ‘all’, ‘tinylora_only’ 중 하나를 사용할 수 있습니다.
  • modules_to_save (List[str], 선택 사항) — TinyLoRA 레이어를 제외하고 학습 가능하게 설정되어 저장될 모듈 목록.
  • init_weights (bool | Literal["uniform"], 선택 사항, 기본값 True) — 학습 가능한 벡터 v를 초기화하는 방법입니다. True(기본값)를 전달하면 v를 0으로 초기화하여 어댑터를 no-op(항등 연산)으로 만듭니다. "uniform"을 전달하면 v를 [-init_v_bound, init_v_bound] 범위의 균등 분포 무작위 값으로 초기화합니다. False를 전달하면 v를 초기화하지 않은 상태로 둡니다(고급 사용 사례용).
  • layers_to_transform (Union[List[int], int], 선택 사항) — 변환할 레이어의 인덱스입니다. 지정된 경우, 해당 레이어만 적응됩니다.
  • layers_pattern (Optional[Union[List[str], str]], 선택 사항) — layers_to_transform이 None과 다르면만 사용되는 레이어 패턴 이름입니다.

이것은 TinyLoraModel의 구성을 저장하기 위한 구성 클래스입니다.

TinyLoRA는 논문 “Learning to Reason in 13 Parameters” (arXiv:2602.04118)에 기반한 극도로 매개변수 효율적인 미세 조정 방법입니다. 동결된 가중치의 SVD 분해를 사용하고, 고정된 무작위 텐서를 통해 매우 작은 학습 가능 벡터를 투영합니다.

논문: https://arxiv.org/abs/2602.04118

예:

from peft import get_peft_model, TinyLoraConfig

config = TinyLoraConfig(
    r=2,  # SVD rank (paper recommends 2)
    u=64,  # Trainable vector dimension
    weight_tying=0.0,  # No weight tying (0.0 = none, 1.0 = full)
    target_modules=["q_proj", "v_proj"],
    projection_seed=42,
)
model = get_peft_model(base_model, config)

TinyLoraModel

class peft.TinyLoraModel

< >

( modelconfigadapter_namelow_cpu_mem_usage = False**kwargs ) → torch.nn.Module

매개변수

  • model (PreTrainedModel) — 적응할 모델.
  • config (TinyLoraConfig) — TinyLoRA 모델의 구성입니다.
  • adapter_name (str) — 어댑터의 이름이며, 기본값은 "default"입니다.
  • low_cpu_mem_usage (bool, 선택 사항, 기본값 False) — 메타 디바이스에 빈 어댑터 가중치를 생성합니다. 로딩 프로세스를 가속하는 데 유용합니다.

반환값

torch.nn.Module

TinyLoRA 모델.

pretrained transformers model에서 TinyLoRA 모델을 생성합니다.

TinyLoRA는 동결된 가중치의 SVD 분해를 사용하고 고정된 무작위 텐서를 통해 매우 작은 학습 가능 벡터를 투영하는 극도로 매개변수 효율적인 미세 조정 방법입니다. 논문 “Learning to Reason in 13 Parameters” (arXiv:2602.04118)에 기반합니다.

예:

>>> from transformers import AutoModelForCausalLM
>>> from peft import TinyLoraConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = TinyLoraConfig(r=2, u=64, target_modules=["q_proj", "v_proj"])
>>> model = get_peft_model(base_model, config)

속성:

delete_adapter

< >

( adapter_name: str )

어댑터를 삭제하고 모델 수준의 공유 v 매개변수를 정리합니다.

Update on GitHub