이미 잘 학습된 큰 모델을 특정 도메인(예: 한식 사진)에 맞추고 싶을 때가 있다. 가장 단순한 방법은 그 모델 전체를 새 데이터로 다시 학습하는 것이다. 그런데 이건 비싸다. 수억~수십억 개 파라미터를 전부 갱신하려면 큰 GPU와 많은 메모리가 필요하고, 도메인마다 모델 사본을 통째로 따로 저장해야 한다. LoRA는 이 비용을 크게 줄이는 방법이다.
한 줄 정의
LoRA(Low-Rank Adaptation, 저랭크 적응)는 원본 가중치를 고정(freeze)한 채, 그 옆에 작은 보정 행렬 한 쌍만 추가로 학습하는 파인튜닝 방법이다.
비유하면 책에 직접 펜으로 고쳐 쓰는 대신 포스트잇을 붙이는 것이다. 원본(인쇄된 책)은 그대로 두고, 바뀐 부분만 작은 메모로 얹는다. 메모만 학습하면 되니 작업량이 적고, 떼면 원본으로 돌아온다. 책 한 권을 통째로 다시 인쇄하지 않는다.
저랭크가 무슨 뜻인가
LoRA를 이해하는 열쇠는 "랭크(rank)"다. 행렬의 랭크는 그 행렬이 담은 정보의 실질 차원이다. 큰 행렬이라도 랭크가 낮으면, 훨씬 작은 두 행렬의 곱으로 거의 그대로 복원할 수 있다.
직관은 이렇다. 1000 × 1000짜리 큰 표가 있어도, 그 내용이 사실 몇 가지 패턴의 조합이라면 "1000 × 8" 표와 "8 × 1000" 표 두 장의 곱으로 재현된다. 8이라는 작은 수가 랭크다. 핵심 관찰은, 모델을 새 도메인에 적응시킬 때 필요한 변화량이 대체로 이렇게 낮은 랭크라는 것이다. 원본은 풍부해야 하지만, 보정은 작아도 된다.
수식 — W' = W + BA
원본 가중치 행렬을 W라 하자. LoRA는 W를 건드리지 않고 그 옆에 두 행렬 B와 A의 곱을 더한다.
W' = W + B·A
B ∈ ℝ^(d×r), A ∈ ℝ^(r×k), r ≪ min(d, k)
W가 d×k 크기라면, B는 d×r, A는 r×k 크기다. 여기서 r이 랭크이고 d, k보다 훨씬 작게 잡는다. 학습할 때 W는 얼려두고 B와 A만 갱신한다.
파라미터 수를 보면 차이가 분명하다. W의 원소 수는 d×k인데, B와 A를 합친 원소 수는 (d×r) + (r×k) = r×(d+k)다. r이 작으면 후자가 압도적으로 작다. 실제로 r=8 정도로 잡으면 학습되는 파라미터가 전체의 0.5~1% 수준으로 줄어든다. 덕분에 대형 가속기 없이 소비자급 GPU로도 파인튜닝이 가능해진다.
배포할 때는 흔적을 없앤다₩
LoRA의 또 다른 장점은 추론(실제 사용) 때 오버헤드가 0이 될 수 있다는 점이다. 학습이 끝나면 B·A를 미리 계산해서 W에 더해버린다.
W_merged = W + B·A (계산 후 B, A는 폐기)
이렇게 병합(merge)하면 모델은 원래와 똑같은 모양의 가중치 하나로 돌아온다. 추론 시 B·A를 매번 따로 계산하는 비용이 사라진다. 포스트잇 내용을 본문에 반영해 깨끗하게 다시 찍어낸 책과 같다. 반대로 병합하지 않고 어댑터를 분리해 두면, 같은 원본 위에 도메인별 어댑터(한식용, 디저트용 등)를 갈아 끼우는 식으로도 쓸 수 있다.
대안과 비교
| 방법 | 학습 파라미터 | 비용 | 도메인별 저장 |
|---|---|---|---|
| 전체 재학습(Full fine-tuning) | 100% | 큼 | 모델 전체 사본 |
| LoRA | 0.5~1% | 작음 | 어댑터만(수 MB) |
| 마지막 층만 학습(Linear probe) | 매우 적음 | 가장 작음 | 분류기 한 층 |
전체 재학습은 표현력이 가장 크지만 가장 비싸다. 마지막 층만 학습하는 방식은 가장 싸지만, 인코더 내부를 못 건드려서 도메인 차이가 클 때 한계가 있다. LoRA는 그 사이에서, 적은 비용으로 모델 내부까지 폭넓게 적응시키는 균형점이다.
이점과 트레이드오프
이점:
- 저비용: 학습 파라미터가 1% 미만이라 메모리·시간이 크게 준다.
- 저장 효율: 도메인마다 모델 전체가 아니라 작은 어댑터만 저장한다.
- 추론 오버헤드 0: 병합하면 원본과 동일한 구조가 된다.
감수하는 것:
- 랭크 선택: r이 너무 작으면 표현력이 부족하고, 너무 크면 LoRA의 이점이 줄어든다. 도메인에 맞게 조정이 필요하다.
- 상한선: 원본과 도메인 차이가 극단적으로 크면, 저랭크 보정만으로는 부족해 전체 재학습이 나을 수 있다.
- 어느 층에 붙일지: 모든 가중치가 아니라 보통 일부 층(어텐션의 특정 행렬 등)에만 붙이며, 어디에 붙이느냐가 결과에 영향을 준다.
정리하면 LoRA는 "전체 재학습의 표현력"을 일부 양보하는 대신 "비용과 저장"을 크게 아끼는 방법이다. 도메인 정확도를 싸게 끌어올리는 단계에서 특히 유용하다.
'TIL' 카테고리의 다른 글
| MediaPipe Tasks Vision — 브라우저에서 손과 얼굴을 추적하는 법 (0) | 2026.06.08 |
|---|---|
| WASM 온디바이스 추론 — 서버 없이 폰 안에서 모델 돌리기 (0) | 2026.06.07 |
| ONNX와 INT8 양자화 — 학습한 모델을 폰에 올리는 법 (0) | 2026.06.07 |
| KNN과 근사 최근접 이웃 — 벡터 검색은 어떻게 빨라지나 (0) | 2026.06.07 |
| 임베딩과 대조학습 — 학습 없이 분류하는 제로샷의 원리 (0) | 2026.06.07 |