본문 바로가기
자연어 처리(NLP)

LoRA 정리

by Kaya_Alpha 2025. 11. 20.

🧩 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

❌ 차이점

구분AdapterLoRA
구조 레이어 사이에 작은 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에 적용하는 기본 예시 코드 구조:

 
lora_config = LoraConfig( r=8, lora_alpha=16, target_modules=["c_attn", "c_proj"], lora_dropout=0.05, ) model = get_peft_model(model, lora_config)

여기에 데이터셋(예: 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