Zettelkasten

LoRA는 저랭크 행렬로 가중치 업데이트를 근사한다

·수정 2026.05.01·수정 5

요약

LoRA(Low-Rank Adaptation)는 사전학습된 모델의 가중치를 직접 수정하지 않고, 저랭크(low-rank) 행렬 분해를 통해 가중치 변화량을 효율적으로 학습하는 fine-tuning 기법이다.

본문

핵심 아이디어

기존 가중치 W0W_0를 고정하고, 업데이트 ΔW\Delta W를 두 개의 작은 행렬 AABB의 곱으로 표현한다:

h=W0x+ΔWx=W0x+BAxh = W_0 x + \Delta W x = W_0 x + BA x

여기서:

  • W0Rd×kW_0 \in \mathbb{R}^{d \times k}: 원본 가중치 (frozen)
  • BRd×rB \in \mathbb{R}^{d \times r}, ARr×kA \in \mathbb{R}^{r \times k}: 학습 가능한 저랭크 행렬
  • rmin(d,k)r \ll \min(d, k): 랭크 (보통 4, 8, 16 등 작은 값)

파라미터 효율성

예를 들어 d=k=4096d = k = 4096이고 r=8r = 8인 경우:

  • 전체 fine-tuning: 4096×4096=16,777,2164096 \times 4096 = 16,777,216 파라미터
  • LoRA: (4096×8)+(8×4096)=65,536(4096 \times 8) + (8 \times 4096) = 65,536 파라미터
  • 약 256배 파라미터 감소

초기화

  • AA: 정규분포로 초기화
  • BB: 0으로 초기화
  • 학습 시작 시 ΔW=BA=0\Delta W = BA = 0이므로 원본 모델과 동일하게 시작

Rank란 무엇인가

행렬의 rank는 선형 독립인 행(또는 열)의 최대 개수, 즉 그 행렬이 표현하는 정보의 진짜 차원이다.

예: 아래 행렬은 모든 행이 [1 2 3][1\ 2\ 3]의 배수이므로 본질적으로 1차원 정보만 담고 있다 → rank 1.

B=[123246369]=[123][123]B = \begin{bmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \\ 3 & 6 & 9 \end{bmatrix} = \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} \begin{bmatrix} 1 & 2 & 3 \end{bmatrix}

9개 숫자가 6개(3+3)로 표현 가능. LoRA의 BABA 분해와 같은 형태다.

기하학적으로 d×kd \times k 행렬은 kk차원 → dd차원 선형 변환이고, rank rr이면 출력이 무조건 dd차원 공간 안의 rr차원 부분공간에만 떨어진다. rank가 작을수록 표현 가능한 변화의 종류가 제한된다.

SVD와의 관계 — 동기는 맞지만 직접 쓰지는 않음

LoRA는 SVD(Singular Value Decomposition)에서 영감을 받았지만 SVD를 직접 사용하지 않는다.

행렬 분해 학습 방식
SVD 기존 행렬을 사후 분해 M=UΣVTM = U\Sigma V^T 학습 X (수학적 분해)
LoRA 저랭크 형태를 사전 가정 ΔW=BA\Delta W = BA B,AB, A직접 학습

비유:

  • SVD 압축: 4K 영상을 찍은 다음 720p로 다운스케일 (full FT 후 압축 — 메모리 절약 X)
  • LoRA: 처음부터 720p 카메라로 촬영 (ΔW\Delta W를 명시적으로 만든 적 없음)

SVD가 제공한 직관: "어떤 행렬이든 큰 특이값 몇 개가 대부분의 정보를 담는다 (Eckart-Young 정리)." → 그러니 ΔW\Delta W도 처음부터 저랭크로 가정해도 충분하지 않을까?

왜 작동하는가 — Intrinsic Rank 가설

Hu et al. (2021)의 핵심 가설:

"We hypothesize that the change in weights during model adaptation also has a low intrinsic rank"

거대 사전학습 모델을 특정 태스크에 적응시킬 때 실제로 필요한 변화는 저차원 부분공간에만 존재한다. 경험적으로 r=18r = 1 \sim 8이면 full fine-tuning과 견줄 만한 성능이 나옴.

추론 시 merge — 추가 latency 0

학습 후 가중치를 합쳐버리면:

W=W0+αBAW' = W_0 + \alpha BA

원본 forward pass와 동일한 형태가 되어 추론 시 추가 연산이 0이다. (α=lora_alpha/r\alpha = \text{lora\_alpha}/r, scaling factor)

이게 Adapter tuning(bottleneck 레이어 삽입) 대비 LoRA의 큰 실용적 장점.

참고