Topic. LoRA(Low-Rank Adaptation) 에 대해 알아봅니다.
1. LoRA 란?
Low-Rank Adaptation 약어로 Huggingface 에서 개발한 Parameter-Efficient Fine-Tuning (PEFT) 방식
중 하나입니다. 파이썬의 peft 라이브러리를 사용하여 쉽게 LoRA 를 사용할 수 있습니다.
2. 개요
기존 full fine-tuning은 pre-trained Model 전체 파라미터에 가중치와 역전파(back propagation)의 기울기를 더하는 방식입니다.
LoRA 는 기존의 LLM을 직접 fine-tuning 하는 대신,
새로운 레이어(LoRA adapter 의 A Layer, B Layer)를 삽입해서 훈련하는 방식입니다.
LoRA는 훈련 가능한 매개변수가 적고 훈련 처리량이 높으며 어댑터와 달리 추가 추론 대기 시간이 없음에도 불구하고 RoBERTa, DeBERTa, GPT-2 및 GPT-3의 모델 품질에서 미세 조정보다 동등하거나 더 나은 성능을 발휘합니다.
3. LoRA Hyperparameters
LoraConfig(
r=16
,lora_alpha=8
,target_modules=TARGET_MODULES = ["q_proj", "v_proj"]
,lora_dropout=0.05
,bias="none"
,task_type="CAUSAL_LM"
)
1. r : LoRA : Adapter 파라미터의 차원 갯수 , 기본값은 8 (LoRA adapter의 차원지정)
훈련될 각 레이어에 대해, d × k 가중치 업데이트 행렬 ∆W는 낮은 분해 순위 BA로 표현됩니다.
여기서 B는 d × r 행렬이고 A는 r × k 행렬입니다. 분해의 순위 r은 min(d, k)보다 훨씬 작습니다.
A는 무작위 가우스 숫자로 초기화되어 초기 가중치 업데이트에 약간의 변화가 주어집니다.
B는 0으로 초기화되어 훈련 시작 시 ∆W가 0이 됩니다.
이 값이 증가하면 LoRA 학습 과정에서 업데이트해야 하는 매개변수의 수가 증가합니다.
r 값을 낮게 설정 하면 학습속도가 빨라지고 계산 비용이 적은 훈련 과정을 이끌 수 있지만 생성된 모델의 품질이 낮아질 수 있습니다.
그렇다고 r 을 특정 값 이상으로 설정해도 모델의 품질이 눈에 띄게 향상되지 않을 수 있습니다.
2. lora_alpha : Adapter 의 Scaling값으로 Adapter 에서 나온 output 값에 곱해지는 값, 기본값은 8
(LoRA Adapter 의 scaling 값 지정)
LoRA 논문(Hu et. al.)에 따르면 ∆W는 α / r로 스케일링됩니다.
여기서 α는 상수입니다. Adam으로 최적화할 때, 초기화가 적절하게 스케일 조정되었다면 α를 조정하는 것은 거의 학습률을 조정하는 것과 동일합니다. 그 이유는 매개변수의 수가 r과 선형적으로 증가하기 때문입니다.
r이 증가함에 따라 ∆W의 항목 값도 선형적으로 증가합니다.
우리는 ∆W가 사전 훈련된 가중치와 일관되게 스케일링되기를 원합니다.
따라서 일반적으로 α를 첫 번째 r 로 설정하고 조정하지 않습니다.
3. lora_dropout : LoRA 레이어의 드롭아웃 확률, 기본값은 0
훈련 중에 드롭아웃 확률에 따라 무작위로 뉴런을 선택하여 생략하고 과적합을 줄이는 기술입니다.
선택된 이러한 뉴런의 기여는 순전파에서 일시적으로 하향 뉴런의 활성화에서 제거되며,
역전파에서는 해당 뉴런에 대한 어떤 가중치 업데이트도 적용되지 않습니다.
4. target_modules , 기본값은 None (LoRA Adapter를 적용할 layer 목록)
LoRA로 미세 조정할 때 모델 아키텍처에서 타겟팅할 모듈을 설정합니다.
"r"과 유사하게 많은 모듈을 타겟팅하면 훈련 시간이 증가하고 컴퓨팅 리소스 수요가 증가합니다.
따라서 트랜스포머의 어텐션 블록만 타겟팅하는 것이 일반적입니다.
* 참고
최근 Dettmers 등의 QLoRA 논문에서 제시한 바와 같이 모든 선형 레이어를 타겟팅하면 더 나은 Adapter가 완성될 수 있습니다.
모델의 선형 레이어 이름은 다음 코드를 사용하여 목록에 편리하게 추가할 수 있습니다.
import re
model_modules = str(model.modules)
pattern = r'\((\w+)\): Linear'
linear_layer_names = re.findall(pattern, model_modules)
names = []
# Print the names of the Linear layers
for name in linear_layer_names:
names.append(name)
target_modules = list(set(names))
5. lora_bias : LoRA 바이어스 유형, 기본값은 None
바이어스는 'none', 'all', 또는 'lora_only'가 될 수 있습니다.
'all' 또는 'lora_only'인 경우 해당하는 바이어스는 훈련 중에 업데이트됩니다.
어댑터를 비활성화하더라도 모델은 Adapter 없이 기본 모델이 가진 출력을 생성하지 않을 것입니다.
'A.I.(인공지능) & M.L.(머신러닝) > A.I. Information' 카테고리의 다른 글
[실습] google gemini 테스트 [python] 10분컷 (1) | 2024.01.31 |
---|---|
[이론] 퍼셉트론 이란? (0) | 2024.01.16 |
[수학] 가우스함수 (2) | 2023.12.07 |
3. 선형 회귀 모델 & 경사하강법 (1) | 2023.11.01 |
2. A.I. 딥러닝을 위한 기초 수학 (1) | 2023.10.13 |