🧩 LoRA: 대규모 언어모델을 효율적으로 미세조정하는 Low-Rank Adaptation 기법
1. 왜 LoRA가 필요한가?
대규모 언어모델(LLM)은 수십억 개의 파라미터를 가진 거대한 신경망이다.
이런 모델에 새로운 작업이나 도메인 적응을 위해 Full Fine-Tuning을 적용하면 다음과 같은 문제가 발생한다.
❌ Full Fine-Tuning의 한계
- 모든 파라미터를 다시 학습해야 하므로 GPU 메모리 사용량이 폭증한다.
- Optimizer 상태(momentum, variance 등)까지 저장해야 하므로 추가 메모리 2~3배가 필요하다.
- 학습 시간도 매우 길고, 비용 역시 높다.
- 동일한 모델을 여러 태스크용으로 fine-tune하면 모델 파일만 수GB씩 생성된다.
즉, 기존 방식은 연구실 규모에서는 가능할지 몰라도,
개인 GPU 환경이나 제한된 리소스 환경에서는 사실상 불가능하다.
이 문제를 해결하기 위해 등장한 것이 **PEFT(Parameter-Efficient Fine-Tuning)**이며,
그 중 가장 널리 사용되는 접근이 바로 LoRA(Low-Rank Adaptation) 이다.
2. LoRA란 무엇인가?
**LoRA(Low-Rank Adaptation)**는 대규모 모델을 효율적으로 미세조정하기 위한 PEFT 기법이다.
기존의 사전학습된 가중치 WW는 그대로 유지하고,
그 변화량 ΔW\Delta W만 저차원(low-rank) 행렬로 근사하여 학습한다.
즉,
전체 모델을 다시 학습하는 대신, 극히 일부의 저차원 파라미터만 학습한다.
이를 통해 학습 시 요구되는 GPU 메모리, 연산량, 시간을 크게 줄일 수 있다.
중요한 점은 LoRA가 모델 자체를 압축하는 기술은 아니라는 것이다.
모델 크기와 추론 속도는 동일하며, 줄어드는 것은 “학습” 비용이다.
3. LoRA의 수학적 원리
기존 선형층은 다음과 같이 표현된다:
y=Wxy = W x
Full Fine-Tuning에서는 WW 전체를 다시 학습한다.
그러나 LoRA는 **“W가 어떻게 변해야 하는지”**만 학습한다:
W′=W+ΔWW' = W + \Delta W
그리고 이 변화량을 저차원 행렬 곱으로 제한한다:
ΔW=BA\Delta W = B A
여기서
- A∈Rr×kA \in \mathbb{R}^{r \times k} : down projection
- B∈Rd×rB \in \mathbb{R}^{d \times r} : up projection
- r≪min(d,k)r \ll \min(d, k) : 저차원(rank)
이 방식은 선형대수의 핵심 아이디어 중 하나인
“저차원 근사(low-rank factorization)” 원리에 기반한다.
왜 효율적일까?
- 전체 파라미터 WW는 엄청나게 크지만,
- ΔW=BA\Delta W = BA는 매우 작은 공간에서 표현된다 (학습 파라미터가 수천~수만 배 감소).
추론 시 장점
추론 시에는 W+BAW + BA를 미리 병합할 수 있어:
y=(W+BA)xy = (W + BA)x
기존 모델과 추론 속도(latency)가 동일하다.
4. LoRA가 실제로 줄여주는 것들
🔹 학습해야 하는 파라미터 수 → 수천~수만 배 감소
GPT-3 175B 기반 실험에서도 Full FT 대비 10,000배 감소가 확인됨.
🔹 GPU 메모리 → 약 3배 절감
Optimizer 상태를 거의 저장하지 않아도 되기 때문.
🔹 저장 공간
Full FT는 모델 전체를 저장해야 하지만,
LoRA는 수MB짜리 adapter weight만 저장하면 된다.
🔹 추론 속도
기존 모델과 완전히 동일 (병합 가능).
5. Adapter 방식과 LoRA의 차이
LoRA는 흔히 Adapter의 개선형으로 오해되지만, 구조적으로 차이가 있다.
✔️ 공통점
- 둘 다 pretrained parameter는 동결
- 작은 파라미터만 학습하여 task-specific adaptation
❌ 차이점
| 구조 | 레이어 사이에 작은 FFN을 추가 | 기존 weight에 low-rank update를 더함 |
| 연산 | up/down projection 두 개 추가 → 추론 latency 증가 | 병합 가능 → 추론 latency 동일 |
| memory | 적음 | 더 적음 |
| 적용 난이도 | 모델 구조 수정 필요 | target modules만 주면 자동 적용 |
특히,
Adapter는 sequential 연산이 추가되어 GPU 병렬 효율을 떨어뜨려 추론이 느려진다
LoRA는 기존 행렬 내에서 update를 병합해 추론 속도를 해치지 않는다
이게 가장 중요한 차이다.
6. LoRA가 언제 유용한가?
✔️ GPU가 적은 환경에서 7B~13B 모델을 미세조정할 때
RTX 2060·3060·Colab T4에서도 가능.
✔️ 여러 태스크마다 별도 Fine-Tuning 저장공간을 줄이고 싶을 때
LoRA weight만 저장하면 되므로 수MB면 충분.
✔️ RAG + Chatbot을 특정 도메인에 특화하고 싶을 때
예: 의학/법률/게임 커뮤니티/고객서비스 등
✔️ 이미지 모델(Stable Diffusion) 스타일 변화
LoRA는 SD에서도 강력하게 쓰이는 기법(LoRA, LoCon, LoHa 등).
7. LoRA는 어떤 모듈에 적용하나?
Transformer 구조에서 주로 사용되는 부분은:
- q_proj
- k_proj
- v_proj
- o_proj
- 필요 시 FFN의 up_proj, down_proj
가장 효과 좋은 조합은 Q + V projection이다.
8. PEFT 기법들과 비교하면?
| Full Fine-Tuning | 100% | 동일 | 필요없음 | 성능 최고 | 비용 매우 큼 |
| Adapter | 1~3% | 느려짐 | 모델 수정 필요 | 안정적 | latency 증가 |
| Prefix/Prompt Tuning | 매우 적음 | 동일 | 입력만 수정 | 메모리 최소 | 성능 변동 큼 |
| BitFit | 거의 없음 | 동일 | 없음 | 단순 | 성능 약함 |
| LoR A | 0.1~1% | 동일 | 최소 | 비용↓·성능↑·latency 동일 | rank 선택 필요 |
LoRA는 “효율성·안정성·속도”를 모두 갖춘 가장 균형 잡힌 PEFT 방식이다.
9. LoRA 실습 예시 (구조만 소개)
아래는 LoRA를 GPT-2에 적용하는 기본 예시 코드 구조:
여기에 데이터셋(예: SAMSum 또는 한국어 뉴스 요약)을 넣고 Trainer로 학습하면 된다.
학습 후 weight는 수MB짜리 LoRA adapter 파일 하나만 저장된다.
10. 마무리: LoRA가 가져온 변화
LoRA는 LLM 시대에 매우 중요한 전환점을 만들었다.
“7B~70B급 모델도, 전체를 건드리지 않고 작은 파라미터만 학습하면 된다.”
이 접근 덕분에
- 개인 GPU 환경에서도 실험 가능
- 비용 억제
- 추론 속도 동일
- 성능은 Full FT와 거의 유사
즉, LoRA는 LLM 시대의 실용적이고 효율적인 Fine-Tuning 표준이 되었다.
'자연어 처리(NLP)' 카테고리의 다른 글
| QA System 서론 (0) | 2025.01.15 |
|---|