PEFT documentation

AdaLoRA

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

AdaLoRA

AdaLoRA(Adaptive LoRA)는 모든 모듈에 매개변수를 균등하게 분배하는 LoRA와 달리, 가중치 행렬과 레이어에 할당할 학습 가능 매개변수의 수를 최적화하는 방법입니다. 중요한 가중치 행렬과 레이어에는 더 많은 매개변수가 배정되고, 중요도가 낮은 것에는 더 적은 매개변수가 배정됩니다. 행렬의 평균 목표 rank 또는 r를 제어하고, target_modules를 통해 AdaLoRA를 적용할 모듈을 지정할 수 있습니다. 설정해야 할 다른 중요한 매개변수로는 lora_alpha(스케일링 팩터)와 modules_to_save(AdaLoRA 레이어 외에 학습 및 저장할 모듈)가 있습니다. 이 모든 매개변수와 그 외의 항목은 AdaLoraConfig에서 찾을 수 있습니다.

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

하류 작업에서 대규모 사전 학습 언어 모델을 미세 조정하는 것은 NLP에서 중요한 패러다임이 되었습니다. 그러나 일반적인 관행은 사전 학습 모델의 모든 매개변수를 미세 조정하는 것이며, 이는 대규모의 하류 작업이 존재할 때 수행이 불가능해집니다. 따라서 사전 학습 가중치의 증분 업데이트를 저순위 증분과 같은 매개변수 효율적인 방식으로 학습하기 위해 많은 미세 조정 방법이 제안되었습니다. 이러한 방법은 일반적으로 사전 학습 가중치 행렬 전체에 걸쳐 증분 업데이트의 예산을 균등하게 분배하며, 서로 다른 가중치 매개변수의 중요도 차이를 간과합니다. 그 결과, 미세 조정 성능이 최적에 미치지 못합니다. 이러한 격차를 메우기 위해, 우리는 중요도 점수에 따라 가중치 행렬 간에 매개변수 예산을 적응적으로 할당하는 AdaLoRA를 제안합니다. 특히, AdaLoRA는 증분 업데이트를 특이값 분해의 형태로 매개변수화합니다. 이러한 새로운 접근 방식은 중요하지 않은 업데이트의 특이값을 효과적으로 가지칠 수 있게 해주며, 이는 본질적으로 해당 업데이트의 매개변수 예산을 줄이되 집약적인 정확한 SVD 계산을 우회하는 것입니다. 우리는 자연어 처리, 질의응답, 자연어 생성에서 여러 사전 학습 모델을 사용하여 광범위한 실험을 수행하여 AdaLoRA의 효과성을 검증했습니다. 결과에 따르면, AdaLoRA는 베이스라인 대비 뚜렷한 개선, 특히 저예산 설정에서 이를 보여줍니다. 우리의 코드는 https://github.com/QingruZhang/AdaLoRA에서 공개되어 있습니다.

AdaLoRA에는 매 학습 단계마다 매개변수 예산과 마스크를 업데이트해야 하는 update_and_allocate() 메서드가 있습니다. 이 메서드를 호출하지 않으면 적응 단계가 수행되지 않습니다. 이를 위해 커스텀 학습 루프를 작성하거나 Trainer를 서브클래싱하여 해당 메서드를 통합해야 합니다. 예시로 이 커스텀 학습 루프를 참고하세요.

AdaLoRA는 LoRA에서 도입된 매개변수 예산을 관리하며, 더 많은 매개변수, 즉 더 높은 랭크를 r - 작업에 더 잘 적응할 수 있는 중요한 가중치 행렬에 할당하고 덜 중요한 행렬은 제거합니다. 랭크는 고유값 분해(SVD)와 유사한 방법으로 제어됩니다. ΔW\Delta W 는 두 개의 직교 행렬과 고유값을 포함하는 대각 행렬로 매개변수화됩니다. 이 매개변수화 방법은 계산 비용이 높은 SVD를 반복적으로 적용하는 것을 피합니다. 이 방법에 기반하여 ΔW\Delta W 의 랭크는 중요도 점수에 따라 조정됩니다. ΔW\Delta W 는 3중 집합(triplet)으로 나뉘며, 각 3중 집합은 모델 성능에 대한 기여도에 따라 점수를 받습니다. 중요도 점수가 낮은 3중 집합은 제거되고, 점수가 높은 3중 집합은 파인튜닝을 위해 유지됩니다.

AdaLoRA를 사용한 학습은 세 가지 단계로 구성됩니다: 초기화 단계, 예산 배정 단계, 최종 단계입니다. 초기화 단계에서는 예산 배정이 적용되지 않으므로 랭크는 변경되지 않습니다. 예산 배정 단계에서는 위에서 설명한 프로세스가 적용되며, 예산에 따라 랭크가 재분배됩니다. 이 과정에서 더 중요한 어댑터에는 더 많은 랭크를, 덜 중요한 레이어에는 더 적은 랭크를 할당하는 것을 목표로 합니다. 최종 단계에 도달하면 예산 배정이 종료되고 랭크가 재분배되며, 재분배된 랭크로 학습을 잠시 더 진행하여 성능을 추가로 향상시킬 수 있습니다.

기여 환영: 이 섹션은 명확한 설명이 필요합니다.

중요도가 어떻게 측정되는지는 명확하지 않습니다. 설명도 다소 중복되어 있어 통합할 필요가 있습니다. 기여하는 방법은 여기에서 확인하세요.

벤치마크 개요

사용

from peft import AdaLoraConfig, get_peft_model

config = AdaLoraConfig(
    r=8,
    init_r=12,
    tinit=200,
    tfinal=1000,
    deltaT=10,
    target_modules=["query", "value"],
    modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()

[... training code ...]

model.update_and_allocate(step_idx)

API

AdaLoraConfig

클래스 peft.AdaLoraConfig

< >

( 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 = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonelora_alpha: int = 8lora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: Literal['none', 'all', 'lora_only'] = 'none'use_rslora: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_lora_weights: bool | Literal['gaussian', 'eva', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'corda', 'astra', 'loftq', 'orthogonal', 'mica', 'nora'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: dict | None = Nonealpha_pattern: Optional[dict] = <factory>megatron_config: Optional[dict] = Nonemegatron_core: Optional[str] = 'megatron.core'trainable_token_indices: Optional[Union[list[int], dict[str, list[int]]]] = Noneloftq_config: Union[LoftQConfig, dict] = <factory>eva_config: Optional[EvaConfig] = Nonecorda_config: Optional[CordaConfig] = Noneastra_config: Optional[AstraConfig] = Nonelora_ga_config: Optional[LoraGAConfig] = Noneuse_dora: bool = Falsevelora_config: Optional[Union[VeloraConfig, dict]] = Nonealora_invocation_tokens: Optional[list[int]] = Noneuse_qalora: bool = Falseqalora_group_size: int = 16monteclora_config: Optional[MontecloraConfig] = Nonelayer_replication: Optional[list[tuple[int, int]]] = Noneruntime_config: LoraRuntimeConfig = <factory>lora_bias: bool = Falsetarget_parameters: Optional[list[str]] = Noneuse_bdlora: Optional[BdLoraConfig] = Nonearrow_config: Optional[ArrowConfig] = Nonekasa_config: Optional[KasaConfig] = Noneensure_weight_tying: bool = Falsetarget_r: int = 8init_r: int = 12tinit: int = 0tfinal: int = 0deltaT: int = 1beta1: float = 0.85beta2: float = 0.85orth_reg_weight: float = 0.5total_step: int | None = None )

매개변수

  • target_r (int) — 증분 행렬의 목표 평균 랭크입니다.
  • init_r (int) — 각 증분 행렬의 초기 랭크입니다.
  • tinit (int) — 초기 fine-tuning warmup 단계 수.
  • tfinal (int) — 최종 미세 조정의 단계 수.
  • deltaT (int) — 두 번의 예산 할당 사이의 시간 간격.
  • beta1 (float) — 민감도 스무딩을 위한 EMA의 하이퍼파라미터입니다.
  • beta2 (float) — 불확실성 정량화를 위한 EMA의 하이퍼파라미터입니다.
  • orth_reg_weight (float) — 직교 정규화 계수입니다.
  • total_step (int) — 학습 전에 지정해야 할 전체 학습 단계 수입니다.
  • rank_pattern (list) — RankAllocator에 의해 각 가중치 행렬에 할당된 랭크입니다.

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

AdaLoRA는 tinit, tfinal, total_step으로 정의되는 세 가지 단계를 가집니다.

초기 단계는 어댑터를 사전 학습하는 단계로 이해할 수 있습니다. 이를 통해 랭크를 축소할 때, 무작위 행렬 대신 축소할 수 있는 정보가 이미 인코딩되어 있습니다. 이 단계는 tinit를 제공하여 정의됩니다.

초기 단계가 끝나면(tinit 스텝이 경과하면) 최종 단계가 시작되기 전에, AdaLoRA는 각 스텝마다 레이어별로 허용되는 랭크의 예산을 줄입니다. 랭크가 감소하는 과정은 여기서 일어납니다. 이 과정은 total_step - tfinal 스텝에 도달할 때까지 계속됩니다.

total_step - tfinal 단계에 도달한 후 시작되는 마지막 단계에서는 더 이상 레이어 랭크를 변경하지 않고, 이전 단계에서 생성된 축소 랭크 레이어를 미세 조정합니다.

실제 예시: tinit은 10, tfinal은 20, total_step은 100입니다. 예산이 일정하기 때문에(init phase) 10단계 동안 랭크 감소 없이 사전 학습을 수행하고, 예산이 단계별로 감소하는 reduction phase에서 80(100-20)단계를 사용하며, 마지막으로 랭크 감소 없이 20단계를 최종 fine-tuning 단계에 사용합니다.

AdaLoraModel

클래스 peft.AdaLoraModel

< >

( modelconfigadapter_name**kwargs ) → torch.nn.Module

매개변수

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

반환값

torch.nn.Module

AdaLora 모델.

사전 학습된 transformers 모델에서 AdaLoRA(Adaptive LoRA) 모델을 생성합니다. 논문: https://openreview.net/forum?id=lq62uWRJjiY

예:

>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import AdaLoraConfig, get_peft_model

>>> config = AdaLoraConfig(
...     peft_type="ADALORA",
...     task_type="SEQ_2_SEQ_LM",
...     init_r=12,
...     lora_alpha=32,
...     target_modules=["q", "v"],
...     lora_dropout=0.01,
...     total_step=1000,
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> adalora_model = get_peft_model(model, config)

속성:

add_weighted_adapter

< >

( *args**kwargs )

이 메서드는 AdaLoRA에서 지원되지 않으며, 대신 LoRA를 사용하세요.

update_and_allocate

< >

( global_step )

매개변수

  • global_step (int) — 현재 학습 단계입니다. adalora 예산을 계산하는 데 사용됩니다.

이 메서드는 Adalora 예산과 마스크를 업데이트합니다.

이것은 loss.backward() 이후, zero_grad() 이전의 모든 학습 단계에서 호출되어야 합니다.

tinit, tfinal 및 deltaT은 해당 메서드 내에서 처리됩니다.

예:

>>> loss = model(**input).loss
>>> loss.backward()
>>> optimizer.step()
>>> model.base_model.update_and_allocate(i_step)
>>> optimizer.zero_grad()
Update on GitHub