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

    

Householder Reflection Adaptation을 통한 저랭크 적응과 직교 적응 간의 간극 해소

[HRA](https://huggingface.co/papers/2405.17484)는 [Householder reflections](https://en.wikipedia.org/wiki/Householder_transformation)를 활용하여 매개변수와 계산 비용을 줄이면서 사전 학습 지식의 손실을 페널티로 부과함으로써 LoRA와 OFT를 연결하는 새로운 관점을 제공합니다. 이를 통해 두 전략의 장점을 모두 활용할 수 있으며, 학습 가능한 매개변수가 더 적은 상태에서 일관되게 더 나은 성능을 달성합니다. 또한 대규모 언어 모델(LLM)과 조건부 이미지 생성기를 포함한 다양한 모델에서 최첨단 어댑터보다 우수한 성능을 보입니다.

HRA는 `r`개의 학습 가능한 Householder reflection(HR)으로 체인을 구성합니다. Householder reflection 행렬은 직교 행렬이며 직교 행렬의 곱 역시 직교 행렬이므로, HRA는 Orthogonal Finetuning(OFT)의 이론적 보장을 충족합니다. 한편, HRA는 저랭크 fine-tuning 어댑터로도 볼 수 있습니다. `r`이 높을수록 학습 가능한 매개변수가 많아져 모델 용량이 커지고 성능이 향상됩니다. 또한, 체인 구조로 인해 HR 평면의 직교성은 HRA의 용량과 규칙성에 영향을 미칩니다. 모델 용량과 규칙성 사이의 균형을 달성하기 위해, HR 평면의 직교성 정규화자를 손실 함수에 추가합니다. 가중치 \\(\lambda\\)로 정규화자의 강도를 제어할 수 있습니다.

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

> 기술적 경로가 서로 다르지만, 저랭크 적응과 직교 적응 기법 모두 소수의 학습 가능 파라미터를 기반으로 대규모 사전 학습 모델을 특정 작업이나 도메인에 효율적으로 적응시킬 수 있습니다. 본 연구에서는 이 두 기법 사이의 간극을 메우기 위해 Householder 반사(Householder reflections)에 기반한 단순하면서도 효과적인 적응 방법을 제안합니다. 사전 학습된 모델이 주어졌을 때, 본 방법은 각 동결된 가중치 행렬을 학습 가능한 Householder 반사(HR)의 체인으로 구성된 직교 행렬과 곱셈하여 해당 모델의 레이어를 미세 조정(fine-tune)합니다. 이러한 HR 기반 직교 미세 조정은 적응형 저랭크 적응과 동치입니다. 또한, HR에 대응하는 반사 평면의 직교성이 모델의 용량(capacity)과 규칙성(regularity)에 영향을 미친다는 것을 보여줍니다. 이러한 분석은 HR의 직교성을 정규화(regularize)하도록 동기를 부여하며, 이는 제안된 Householder 반사 적응(HRA) 방법의 다양한 구현으로 이어집니다. 최첨단(state-of-the-art) 방법들과 비교했을 때, HRA는 대규모 언어 모델과 조건부 이미지 생성기를 적응시킬 때 더 적은 학습 가능 파라미터로 우수한 성능을 달성합니다. 코드는 [peft](https://github.com/huggingface/peft/tree/main/src/peft/tuners/hra)와 [HRA](https://github.com/DaShenZi721/HRA)에서 사용할 수 있습니다.

# API

## HRAConfig[[peft.HRAConfig]]

#### peft.HRAConfig[[peft.HRAConfig]]

```python
peft.HRAConfig(task_type: Optional[Union[str, TaskType]] = None, peft_type: Optional[Union[str, PeftType]] = None, auto_mapping: Optional[dict] = None, peft_version: Optional[str] = None, base_model_name_or_path: Optional[str] = None, revision: Optional[str] = None, inference_mode: bool = False, r: int = 8, apply_GS: bool = False, target_modules: Optional[Union[list[str], str]] = None, exclude_modules: Optional[Union[list[str], str]] = None, init_weights: bool = True, layers_to_transform: Optional[Union[list[int], int]] = None, layers_pattern: Optional[Union[list[str], str]] = None, bias: str = 'none', modules_to_save: Optional[list[str]] = None)
```

[소스](https://github.com/huggingface/peft/blob/main/src/peft/tuners/hra/config.py#L25)

**매개변수:**

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]`) : 변환할 레이어 인덱스입니다. 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](/docs/peft/main/ko/package_reference/hra#peft.HRAModel)의 구성을 저장하기 위한 구성 클래스입니다.

## HRAModel[[peft.HRAModel]]

#### peft.HRAModel[[peft.HRAModel]]

```python
peft.HRAModel(model, peft_config: Union[PeftConfig, dict[str, PeftConfig]], adapter_name: str, low_cpu_mem_usage: bool = False, state_dict: Optional[dict[str, torch.Tensor]] = None)
```

[소스](https://github.com/huggingface/peft/blob/main/src/peft/tuners/hra/model.py#L24)

**매개변수:**

model (`torch.nn.Module`) : 어댑터 튜너 레이어가 연결될 모델입니다.

config ([HRAConfig](/docs/peft/main/ko/package_reference/hra#peft.HRAConfig)) : HRA 모델의 구성입니다.

adapter_name (`str`) : 어댑터의 이름이며, 기본값은 `"default"`입니다.

low_cpu_mem_usage (`bool`, `optional`, 기본값 `False`) : meta device에 빈 어댑터 가중치를 생성합니다. 로딩 프로세스를 가속하는 데 유용합니다.

**반환값:** `torch.nn.Module`

HRA 모델.

pretrained 모델에서 Householder reflection adaptation(HRA) 모델을 생성합니다. 해당 방법은 https://huggingface.co/papers/2405.17484 에 설명되어 있습니다.

예:
```py
>>> 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](/docs/peft/main/ko/package_reference/hra#peft.HRAConfig)): HRA 모델의 구성입니다.

