35분
LoRA 원리: 70억 개 중 6만 개만 바꾸는 마법
파인튜닝 개요 & LoRA/QLoRA
LoRA 원리: 70억 개 중 6만 개만 바꾸는 마법
QLoRA 파인튜닝 > 파인튜닝 개요 & LoRA/QLoRA
학습 목표
LoRA의 저랭크 분해(Low-Rank Decomposition) 직관을 이해한다 r(랭크), alpha, target_modules의 의미를 파악한다 LoRA가 적용되는 Transformer 레이어를 안다
LoRA: Low-Rank Adaptation
핵심 아이디어를 비유로 이해하기
김대리: "7B 모델의 70억 파라미터를 다 수정해야 하는 거예요?"
박선배: "아니, 생각해봐. 너가 영어를 할 줄 아는 상태에서 일본어를 배운다고 치자. 뇌 전체를 바꿀 필요 없잖아? 언어 처리 부분만 조금 바꾸면 돼. LoRA도 같은 원리야. 변화에 필요한 부분만 효율적으로 수정하는 거지."
수학적 원리 (간단 버전)
기존 방식 (Full Fine-tuning):
W' = W + deltaW
W: 기존 가중치 행렬 (4096 x 4096 = 16,777,216 파라미터)
deltaW: 변화량 (역시 16,777,216 파라미터를 학습해야 함!)
LoRA 방식:
W' = W + B x A
B: 4096 x r 행렬 (r = 8이면 32,768 파라미터)
A: r x 4096 행렬 (r = 8이면 32,768 파라미터)
총 학습 파라미터: 65,536 (원래의 0.4%!)
왜 이게 가능한가? - 저랭크 가설
"파인튜닝 시 가중치 변화(deltaW)는 실제로 저차원에서 일어난다."
- LoRA 논문 (Hu et al., 2021)
직관적 이해:
제조 도메인 파인튜닝 시 변하는 것:
- "스핀들" -> 기계 부품으로 인식 (기존: 단순 단어)
- "AL-3012" -> 특정 알람 코드 체계로 인식
- "공차 0.01mm" -> 정밀도 수치로 인식
변하지 않는 것:
- 문법 이해력
- 논리적 추론 능력
- 일반 상식
-> 변하는 부분은 전체의 극히 일부!
-> 그 "일부"를 저랭크 행렬로 표현 가능!
핵심 하이퍼파라미터
1. r (랭크) - 가장 중요!
r = 4: 극소 변화만 학습 (간단한 스타일 변경)
r = 8: 표준 설정 (대부분의 파인튜닝)
r = 16: 복잡한 도메인 지식 학습
r = 32: 매우 복잡한 태스크 (번역, 코드 생성)
r = 64: Full Fine-tuning에 근접
제조 도메인 권장: r = 16 (전문 용어 + 판단 로직)
2. lora_alpha (스케일링)
실제 적용: W' = W + (alpha / r) * B * A
alpha = 16, r = 8 -> 스케일 = 2.0 (강하게 적용)
alpha = 32, r = 16 -> 스케일 = 2.0 (표준)
alpha = 8, r = 8 -> 스케일 = 1.0 (약하게 적용)
경험적 권장: alpha = 2 * r
3. target_modules (어디에 적용?)
# Llama 계열 모델의 Attention 레이어
target_modules = [
"q_proj", # Query 프로젝션 (항상 적용)
"k_proj", # Key 프로젝션 (항상 적용)
"v_proj", # Value 프로젝션 (항상 적용)
"o_proj", # Output 프로젝션 (권장)
]
# MLP도 포함하면 더 강력 (메모리 더 사용)
target_modules_extended = [
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj", # MLP
]
LoRA 적용 시각화
원래 Transformer 레이어:
Input -> [ Q ] -> Attention -> Output
[ K ]
[ V ]
LoRA 적용 후:
Input -> [ Q ] + [B_q][A_q] -> Attention -> Output
[ K ] + [B_k][A_k]
[ V ] + [B_v][A_v]
학습 시: W (고정, frozen) + BA (학습)
추론 시: W' = W + BA (병합 가능, 추가 비용 0!)
파라미터 수 계산 실습
# Llama-2-7B의 LoRA 파라미터 수 계산
hidden_size = 4096
num_layers = 32
r = 16
# Attention Q, K, V, O 에 적용
params_per_layer = 4 * (hidden_size * r + r * hidden_size)
# = 4 * (4096 * 16 + 16 * 4096) = 4 * 131,072 = 524,288
total_lora_params = params_per_layer * num_layers
# = 524,288 * 32 = 16,777,216 (약 1,680만)
total_model_params = 7_000_000_000 # 70억
ratio = total_lora_params / total_model_params * 100
# = 0.24% -> 전체의 0.24%만 학습!
print(f"학습 파라미터: {total_lora_params:,} ({ratio:.2f}%)")
print(f"고정 파라미터: {total_model_params - total_lora_params:,} ({100-ratio:.2f}%)")AI로 학습하기 — 꿀팁
🧪LoRA 저랭크 분해 직관 심화AI 학습 팁
LoRA의 저랭크 행렬 분해 원리를 제조 품질 데이터나 센서 신호 압축에 비유해 이해하면 수식이 훨씬 직관적으로 와닿습니다.
LoRA의 저랭크 분해(W = W₀ + BA, B∈R^{d×r}, A∈R^{r×k})를 직관적으로 이해하고 싶어. 제조 현장에서 CNC 진동 센서 데이터를 PCA로 압축하는 사례에 비유해서, r(랭크)이 작을수록 파라미터가 줄어드는 이유와, r을 4→16→64로 높일 때 제조 도메인 학습에 어떤 트레이드오프가 생기는지 수식 없이 직관적으로 설명해줘.이 팁이 도움이 됐나요?
실습 — 직접 해보기
🧪QLoRA 파인튜닝 랩
rank·타깃 모듈을 바꾸며 70억 중 몇 개를 학습하는지(전체의 %) 직접 확인해보세요
핵심 포인트
- • LoRA: deltaW = B x A (저랭크 분해로 파라미터 99%+ 절약)
- • r=16, alpha=32가 제조 도메인 파인튜닝 표준 설정
- • target_modules: q_proj, k_proj, v_proj, o_proj (최소)
- • 추론 시 병합하면 원래 모델과 동일한 속도