PEFT documentation
Householder Reflection Adaptation(HRA)를 통한 저랭크 적응과 직교 적응 간의 간극 해소
Householder Reflection Adaptation(HRA)를 통한 저랭크 적응과 직교 적응 간의 간극 해소

HRA는 Householder reflections를 활용하여 매개변수와 계산 비용을 줄이면서 사전 학습 지식의 손실을 페널티로 부과함으로써 LoRA와 OFT를 연결하는 새로운 관점을 제공합니다. 이를 통해 두 전략의 장점을 모두 활용할 수 있으며, 학습 가능한 매개변수가 더 적은 상태에서 일관되게 더 나은 성능을 달성합니다. 또한 대규모 언어 모델(LLM)과 조건부 이미지 생성기를 포함한 다양한 모델에서 최첨단 어댑터보다 우수한 성능을 보입니다.
HRA는 r 개의 학습 가능한 Householder 반사(HR) 체인을 구성합니다. Householder 반사 행렬은 직교 행렬이고, 직교 행렬의 곱 역시 직교 행렬이므로 HRA는 Orthogonal Finetuning(OFT)의 이론적 보장을 충족합니다. 한편, HRA는 저랭크 fine-tuning 어댑터로도 볼 수 있습니다. r, 이 클수록 학습 가능한 매개변수가 많아져 모델 용량이 커지고 성능이 향상됩니다. 또한 체인 구조로 인해 HR 평면의 직교성이 HRA의 용량과 규칙성에 영향을 미칩니다. 모델 용량과 규칙성 사이의 균형을 맞추기 위해 손실 함수에 HR 평면의 직교성 정규화 항을 추가합니다. 가중치 으로 정규화 항의 강도를 조절할 수 있습니다.
해당 논문의 초록은 다음과 같습니다:
기술적 경로가 서로 다르지만, 저랭크 적응과 직교 적응 기법 모두 소수의 학습 가능 파라미터를 기반으로 대규모 사전 학습 모델을 특정 작업이나 도메인에 효율적으로 적응시킬 수 있습니다. 본 연구에서는 이 두 기법 사이의 간극을 메우기 위해 Householder 반사(Householder reflections)에 기반한 단순하면서도 효과적인 적응 방법을 제안합니다. 사전 학습된 모델이 주어졌을 때, 본 방법은 각 동결된 가중치 행렬을 학습 가능한 Householder 반사(HR)의 체인으로 구성된 직교 행렬과 곱셈하여 해당 모델의 레이어를 미세 조정(fine-tune)합니다. 이러한 HR 기반 직교 미세 조정은 적응형 저랭크 적응과 동치입니다. 또한, HR에 대응하는 반사 평면의 직교성이 모델의 용량(capacity)과 규칙성(regularity)에 영향을 미친다는 것을 보여줍니다. 이러한 분석은 HR의 직교성을 정규화(regularize)하도록 동기를 부여하며, 이는 제안된 Householder 반사 적응(HRA) 방법의 다양한 구현으로 이어집니다. 최첨단(state-of-the-art) 방법들과 비교했을 때, HRA는 대규모 언어 모델과 조건부 이미지 생성기를 적응시킬 때 더 적은 학습 가능 파라미터로 우수한 성능을 달성합니다. 코드는 peft와 HRA에서 사용할 수 있습니다.
API
HRAConfig
클래스 peft.HRAConfig
< 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 = 8apply_GS: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )
매개변수
- r (
int) — HRA의 레이어 간 랭크입니다. ‘r’은 짝수로 설정하는 것이 좋습니다. 그렇지 않으면 기본 초기화 방법이 작동하지 않습니다. - apply_GS (
bool) — Gram-Schmidt 직교화를 적용할지 여부. - target_modules (
Optional[Union[List[str], str]]) — 어댑터를 적용할 모듈의 이름입니다. 이 값이 지정되면, 지정된 이름을 가진 모듈만 교체됩니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다. 이 값이 ‘all-linear’로 지정되면 출력 레이어를 제외한 모든 선형 모듈이 선택됩니다. 이 값이 지정되지 않으면 모델 아키텍처에 따라 모듈이 선택됩니다. 아키텍처가 알려지지 않은 경우 오류가 발생하며, 이 경우 대상 모듈을 수동으로 지정해야 합니다. - exclude_modules (
Optional[Union[List[str], str]]) — 어댑터를 적용하지 않을 모듈의 이름입니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다. - init_weights (
bool) — HRA 가중치 초기화를 수행할지 여부. - layers_to_transform (
Union[List[int], int]) — 변환할 레이어의 인덱스입니다. 정수 목록을 전달하면 이 목록에 지정된 레이어 인덱스에 어댑터를 적용합니다. 단일 정수를 전달하면 해당 인덱스의 레이어에 변환을 적용합니다. - layers_pattern (
Optional[Union[List[str], str]]) —layers_to_transform가None과 다르면만 사용되는 레이어 패턴 이름입니다. 이는 모델의nn.ModuleList를 대상으로 해야 하며, 보통'layers'또는'h'라고 불립니다. - bias (
str) — HRA의 Bias 유형입니다.'none','all'또는'hra_only'를 사용할 수 있습니다. - modules_to_save (
List[str]) — 어댑터 레이어를 제외한 최종 체크포인트에 학습 가능 상태로 설정되고 저장될 모듈 목록.
이것은 HRAModel의 구성을 저장하기 위한 구성 클래스입니다.
HRAModel
클래스 peft.HRAModel
< 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 (
torch.nn.Module) — 어댑터 튜너 레이어가 연결될 모델입니다. - config (HRAConfig) — HRA 모델의 구성입니다.
- adapter_name (
str) — 어댑터의 이름이며, 기본값은"default"입니다. - low_cpu_mem_usage (
bool,optional, 기본값False) — 메타 디바이스에 빈 어댑터 가중치를 생성합니다. 로딩 프로세스를 가속하는 데 유용합니다.
반환값
torch.nn.Module
HRA 모델.
사전 학습된 모델에서 Householder reflection adaptation(HRA) 모델을 생성합니다. 해당 방법은 https://huggingface.co/papers/2405.17484에 설명되어 있습니다.
예:
>>> from diffusers import StableDiffusionPipeline
>>> from peft import HRAConfig, get_peft_model
>>> config_te = HRAConfig(
... r=8,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... init_weights=True,
... )
>>> config_unet = HRAConfig(
... r=8,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... init_weights=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = get_peft_model(model.text_encoder, config_te)
>>> model.unet = get_peft_model(model.unet, config_unet)속성:
- model (
~torch.nn.Module) — 적응할 모델. - peft_config (HRAConfig): HRA 모델의 구성입니다.