대규모 일반 도메인 데이터로 사전학습을 하고, 특정 작업이나 도메인에 맞게 적응시키는 것은 자연어 처리의 중요한 패러다임이다. 그러나 더 큰 모델을 사전학습할수록, 모든 모델 파라미터를 다시 학습시키는 전체 파인튜닝 방식은 점점 실용성이 떨어진다.
이를 해결하기 위해 본 논문에서는 LoRA를 제안한다.
즉, 큰 모델 건드리지 말고, 작은 추가 파라미터만 학습하는 방식.
GPT-3 175B를 Adam으로 파인튜닝하는 경우와 비교하면, LoRA는 학습해야 할 파라미터 수를 10,000배 감소시키고, GPU 메모리 요구량을 3배 절약할 수 있다.
LoRA는 RoBERTa, DeBERTa, GPT-2, GPT-3에서 전체 파인튜닝과 비교해 동등하거나 더 나은 성능을 보였으며, 학습해야 하는 파라미터는 훨씬 적고, 학습 처리량은 더 높으며, 기존 어댑터와 달리 추론 시 추가 지연도 없다.

파인튜닝 방식의 큰 단점은 새로 만들어진 모델이 원래 모델과 동일한 수의 파라미터를 가진다는 점이다.
이러한 문제를 해결하기 위해 저자는 “학습된 과대매개변수 모델은 실제로 낮은 고유 차원에 존재한다” 라는 점에서 영감 받아 모델 적응 과정에서의 가중치 변화 또한 낮은 고유 랭크를 가진다고 가정하며, 이를 바탕으로 LoRA를 제안한다
모델은 거대해 보이지만 실제로는 몇 개의 중요한 방향만 쓴다.
그러므로 ΔW도 몇 가지 방향(저랭크)만 바꿔도 충분하다.
LoRA는 사전학습된 가중치를 그대로 유지한 채, 신경망의 일부 밀집층을 직접 학습하는 대신 “해당 층의 가중치 변화”를 저랭크 분해 행렬로 학습하도록 한다.
LoRA는 다음과 같은 핵심 장점들을 가진다.
• 하나의 사전학습 모델만 공유하고, 작업별로 매우 작은 LoRA 모듈만 관리하면 됨
→ A, B 행렬만 교체하면 되기 때문에 저장 공간·작업 전환 비용이 크게 줄어든다.• 훈련 효율이 매우 좋고, 하드웨어 요구량이 최대 3배까지 감소
전체 파라미터의 그래디언트와 옵티마이저 상태를 계산할 필요가 없고,
A, B라는 아주 작은 행렬만 학습하면 되기 때문.• 추론 속도에 추가 지연 없음
학습이 끝난 후 BA를 W0에 합쳐서 기존 모델과 동일한 방식으로 추론할 수 있다.
→ Adapters처럼 layer를 추가하지 않기 때문에 속도 저하 없음.• 다른 방식들과도 쉽게 결합 가능 (예: prefix tuning)
→ LoRA는 orthogonal한 방식이라 기존 메서드를 방해하지 않음.
GPT 같은 사전학습된 자동회귀 언어모델은 문맥 𝑥가 주어졌을 때 목표 텍스트 𝑦를 생성하는 확률 모델이다. 실제 다운스트림 작업(요약, MRC, NL2SQL 등)에 모델을 적용할 때는 각 작업마다 문맥–정답 쌍
(𝑥𝑖,𝑦𝑖) 형태의 데이터셋을 가진다.
- 요약: 기사 본문 𝑥 → 요약문 𝑦
- MRC: 본문+질문 𝑥 → 정답 𝑦
- NL2SQL: 자연어 질문 𝑥 → SQL 쿼리 𝑦
이처럼 모든 작업은 “주어진 문맥에 맞는 출력 문장을 생성하는 문제”로 표현된다. 그래서 파인튜닝은 결국 사전학습된 모델을 특정 작업용 데이터 (𝑥,𝑦) 에 맞춰 확률 𝑃(𝑦∣𝑥) 를 최대로 만드는 과정이 된다.
① Full Fine-tuning
full fine-tuning은 사전학습된 모델의 모든 파라미터 W0를 시작점으로 두고, 각 작업 데이터 (x, y)에 대해 조건부 확률 P(y | x)를 최대화하도록 전체 가중치 W0 + ΔW를 업데이트하는 방식이다.(정답 문장을 한 단어씩 맞출 확률을 최대화하는 것)
(1).한 샘플 (x,y)에 대해 y의 각 토큰 y₁, y₂, …, y_|y| 에 대해
모델이 그 토큰을 맞출 확률의 log를 다 더함(2).이렇게 나온 log 확률 합을 모든 (x, y) ∈ Z 에 대해 또 다 더함
(3).마지막으로 이 전체 합이 최대가 되도록 파라미터 Φ를 찾는다
그러나 이런 방식은 사전학습 모델 전체 파라미터 W₀를 전부 업데이트해야 해서 모델이 커질수록 저장·배포·관리 비용이 폭발적으로 증가한다는 단점이 있다.
② LoRA approach
full finetuning의 한계를 해결하기 위해 기존 가중치 W₀는 그대로 두고,변화량 ΔW만 따로 아주 작은 파라미터 φ로 표현해서 학습하는 방식이 고안됨.
사전학습된 가중치 θ₀는 얼린다(freeze)
대신 Δθ(Φ) 라는 “변화량”만 학습한다
따라서 실제 모델은 원래 가중치 θ₀ LoRA가 만든 업데이트 Δθ(Φ)
두 개 합친 걸로 예측함.
1) Adapter Layers
: Transformer 블록 사이에 새로운 작은 Layer(어댑터)를 끼워 넣는 방식.
✔ 장점
파라미터 추가량은 매우 적음 (<1%)
✔ 단점
속도가 느림
why?
2) Prefix Tuning / Prompt Optimization
: 입력 토큰 앞에 학습 가능한 prefix 토큰을 붙여서 모델을 조정하는 방식.
✔ 단점
Transformer의 dense layer 가중치 W0는 보통 full-rank.
연구에 따르면 사전학습된 모델은 사실 낮은 차원의 구조를 가진다.
그래서 “가중치 변화(ΔW)도 실제로는 저랭크로 표현 가능하다”고 가정함
LoRA 아이디어
원래 업데이트 방식: W0 + ΔW
LoRA 방식(저랭크 행렬 분해): ΔW = B * A
-> 기존 업데이트(ΔW)를 대형 행렬로 직접 학습하는 게 아니라, 작은 두 행렬 B·A로 분해해서 학습하자는 개념
W₀ = 사전학습된 본체 모델
BA = 작업별 추가 보정 패치
파라미터 수
ΔW 직접 학습하면: d × k
LoRA로 학습하면: d × r + r × k
훈련 방식
- W0(사전학습 가중치)는 freeze
- A와 B만 학습
새로운 forward pass: h = W0 x + (B A) * x
즉, 원래 출력에 LoRA가 만든 작은 변화량을 더해주는 방식.
초깃값은 아래와 같이 설정
- A = 랜덤 가우시안 초기화
- B = 0으로 초기화
왜 B=0?
처음에는 모델이 원래 W0 그대로 작동해야 하니까
B=0이면 BA=0 → LoRA 영향 ‘0’ → 안전한 시작
그 다음 학습이 진행되면 B가 업데이트되면서 점점 LoRA 변화가 생김.
또한 LoRA는 (𝐵𝐴)𝑥 에 스케일링 계수 α/r을 곱해서 안정적으로 학습되도록 만든다. 이렇게 하면 랭크 r을 바꿔도 학습률 튜닝 거의 필요 없음.
LoRA는 원칙적으로 모든 가중치 행렬에 적용 가능하지만 논문에서는 Attention 쪽만 적용해 실험함.
WHY?
그 결과 아래와 같은 효과가 있음
- VRAM 사용량이 2~3배 감소
- GPT-3 175B도 1.2TB→350GB로 줄어듦.
- 체크포인트 크기10,000배 줄어듦 (350GB → 35MB).
- 작업 전환 시 BA만 교체하면 돼서 비용 거의 0.
- 학습 속도도 25% 향상
LoRA의 한계(Limitations)
🔸 여러 작업(A,B가 다른 LoRA 모듈)을 한 배치에 섞어 처리하기 어려움
-> 추론 속도를 최대로 하려면 BA를 W₀에 합쳐서 하나의 W로 만들어 사용해야 함
그러면 “샘플마다 다른 BA”를 붙이는 게 불가능함
즉 병렬(batch) 추론에 여러 LoRA 모듈을 섞는 건 어려움
단, latency(속도)가 덜 중요할 때는
merge 안 하고 sample마다 LoRA 모듈 달리 쓰면 가능하긴 함
파라미터 예산이 제한되어 있을 때, 다운스트림 성능을 최대화하려면 어떤 종류의 가중치 행렬에 LoRA를 적용해야 할까?
GPT-3 175B에 대해 다음과 같은 설정을 사용했다:
총 학습 가능한 파라미터 예산 = 1800만 개 (약 35MB, FP16 기준)
하나의 Attention weight만 LoRA로 조정하면 r = 8
두 개의 weight를 LoRA로 적용하면 r = 4
모든 96층(layer)에 동일하게 적용
Transformer Self-Attention 가중치 중:
Wq만 적용 → 별로
Wk만 적용 → 별로
Wq + Wk + Wv + Wo → 나쁘지 않지만 비용 큼
Wq + Wv → 가장 효율적이고 성능이 좋음
왜 Wq + Wv 조합이 좋을까
Wq(query)와 Wv(value)는 attention의 정보 흐름을 크게 결정하는 역할
이 둘을 함께 업데이트하면
→ attention이 무엇을 보고(질의) / 어떤 정보를 전달(value) 할지 같이 조정됨
단일 weight를 크게 업데이트하는 것보다
→ 여러 weight에 “작게 LoRA 적용”하는 게 더 많은 정보 반영 가능
Wq 하나만 r=8로 왕창 업데이트
→ 한 방향 정보만 강화됨
→ 모델 변화 폭은 크지만 “편향된 변화”Wq & Wv를 r=4씩 업데이트
→ 두 가지 방향 정보가 동시에 업데이트됨
→ 전체적으로 훨씬 다양한 정보가 반영됨
실험은 세 가지 방식으로 LoRA를 적용하여 비교
- Wq만 적용
- Wq + Wv 적용
- Wq + Wk + Wv + Wo 적용
그리고 랭크 r을 1, 2, 4, 8, 64까지 바꿔가며 WikiSQL와 MultiNLI에서 검증 accuracy를 측정
| 결론 | 요약 |
|---|---|
| r=1도 괜찮음 | 생각보다 ΔW가 필요로 하는 정보량이 작다 = intrinsic rank 낮음 |
| r 키워도 큰 변화 없음 | r이 1→64 되어도 성능 거의 비슷 |
| 중요한 조합 존재 | Wq 단독 < Wq+Wv 조합 더 효율적 |
| 결론 | 모델 업데이트는 고차원 필요 없다 → 작은 랭크로 충분히 학습됨 |
LoRA에서 rank = 8로 학습한 공간이 rank = 64로 학습한 공간 안에 얼마나 겹쳐 있을까?
| 식 구성요소 | 뜻 |
|---|---|
| (U_{A_8}^{(i)}) | r=8 행렬 A에서 상위 i개의 singular vector로 만든 subspace |
| (U{A{64}}^{(j)}) | r=64 행렬 A에서 상위 j개 singular vector subspace |
| (‖·‖_F^2) | 두 subspace가 얼마나 겹치는지(Frobenius norm 기반) |
| 나누기 (\min(i,j)) | i와 j 중 비교 가능한 최대 차원으로 정규화 |
--
| similarity 값 | 의미 |
|---|---|
| 1 | 두 rank 공간이 거의 동일 → 정보 거의 같음 |
| 0 | 완전 다른 방향 → 정보 공유 X |