paper
[논문리뷰] LoRA: Low-Rank Adaptation of Large Language Models
jaeha_lee
2025. 2. 12. 21:50
LoRA: Low-Rank Adaptation of Large Language Models
Edward J. Hu, Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, Weizhu Chen | MS
ICLR 22
Contents
1. ChatGPT
1-1. GPT-1
1-2. GPT-2
1-3. GPT-3
1-4. GPT-4
1-5. Instruct GPT - [https://jaeha-lee.tistory.com/91]
1-6. RLHF
2. LLama
3. Gemini
4. DeepSeek
5. LLaVA
5-1. LLaVA - https://jaeha-lee.tistory.com/93
5-2. LLaVA-Next
5-3. LLaVA-NeXT-Interleave
6. LoRA -
Summary
- LLM 모델 fine-tuning 시 효과적인 방법을 제시한 논문
- LoRA(Low-Rank Adaptation) 방식을 제안 : pretrained weight를 고정한 채, 각 Transformer 계층에 학습 가능한 rank decomposition matrix 행렬을 inject하여 모델을 fine-tuning 하는 방법을 말함
- GPT-3 175B 기준 학습 파라미터는 10,000 배 / GPU 메모리는 3배 적게 사용함
- 빠른 학습 - 필요한 파라미터만 학습
- inferency latency 발생하지 않음 - 기존에는 이게 문제
- 기존 모델의 모든 파라미터를 업데이트하는 대신, 일부 부분인 low rank matirx 행렬 A와 B를 학습함
- 이를 통해 학습 시 필요한 파라미터 수를 10,000배 줄이고, GPU 메모리 사용량을 3배 감소시키면서도 Full fine tuning과 동등한 성능을 유지함
- 다른 방법과 쉽게 결합 가능함
- GLUE 벤치마크(RoBERTa, DeBERTa, GPT-2, GPT-3)에서 Full Fine-Tuning보다 더 나은 성능을 보임.
Method
LoRA 핵심 개념
- LoRA(Low-Rank Adaptation)의 핵심 아이디어는 Transformer 모델의 가중치 행렬 W를 직접 업데이트하지 않고, 학습 가능한 low-rank matrix A와 B를 사용하여 모델을 효율적으로 fine-tuning 하는 것
*rank란 ? - 행렬을 구성하는 행 또는 열 벡터들 중 서로 독립적인 벡터의 최대 개수 를 의미함.
즉, 선형적으로 독립인 벡터의 수를 의미한다. 예를 들어 NxN 짜리 행렬이 있을 때 rank가 1이라면 모든 열 벡터들을 하나의 linear combination으로 표현할 수 있음. rank가 N이라면, 모든 열 벡터는 linear independent 함. 즉 딥러닝에서 rank가 낮을 수록 행렬의 정보가 중복되거나 불필요하다는 것을 의미함
- 기존 방식에서는 Transformer 계층의 가중치 행렬 W를 아래와 같이 업데이트 함 :
- Forwrad propagation 시
-
기존 방식과 비교
- Adapter 방식
- task마다 학습가능한 파라미터를 BERT의 Transformer layer마다 추가
- 다른 task에 해당하는 adapter와 pretrained한 모델의 weight는 고정, 오직 추가되는 adapter에 대해서만 학습
- adapter는 bottleneck architecture로 구성되어 파라미터의 개수를 제한
- LoRA와 비교하여 inference latency 발생하는 이유Adapter layer
- inference latency : LoRA는 pretrained weight를 원래 모델의 weight와 병합할 수 있으므로 inference latency가 발생하지 않음. 반면 adapter는 모델에 추가적인 레이어를 추가하므로 inference latency 시간이 발생할 수 있음
- Prefix tuning(Directly Optimization the Prompt) 방식
- Prompt의 앞부분(prefix)에 학습 가능한 벡터(토큰)를 추가하여 모델을 조정하는 방법
- 학습 가능한 벡터를 프롬프트에 추가하지만, 기존 모델의 가중치는 변경되지 않음
- prefix token 너무 많이 사용하면 원래 입력 내용보다 prefix에 집중되는 결과 가져옴
- transformer의 경우 위치가 중요한데 prefix token을 쓰면 순서가 변하게 되고 이를 통해 성능이 저하될 수 있음
- 짧은 입력에는 효과적일 수 있으나, 긴 입력이 필요한 태스크에서는 시퀀스 길이 제한과 위치 정보 왜곡으로 인해 모델이 효율적으로 학습할 수 없음 - 기존 방식들과 비교 표
방법 | trainable parameter | 메모리 사용량 | inference 속도 | 성능 |
Full Fine-Tuning | 100% | 매우 큼 | 느림 | 높음 |
Adapter 방식 | 0.1~1% | 큼 | 느림 (추론 시 추가 연산 필요) | 보통 |
Prefix based | 0.1~1% | 원래 모델과 동일 | 낮음 | 낮음 |
LoRA (Low-Rank Adaptation) | 0.01~0.1% | 작음 (3배 절약) | 빠름 (추론 시 추가 지연 없음) | 높음 |
Code
LoRA/loralib/layers.py at main · microsoft/LoRA · GitHub
# 초기화
if r > 0:
self.lora_A = nn.Parameter(self.weight.new_zeros((r, num_embeddings)))
self.lora_B = nn.Parameter(self.weight.new_zeros((embedding_dim, r)))
self.scaling = self.lora_alpha / self.r
# Freezing the pre-trained weight matrix
self.weight.requires_grad = False
# 모델 코드
def forward(self, x: torch.Tensor):
if self.r > 0 and not self.merged:
result = nn.Embedding.forward(self, x)
after_A = F.embedding(
x, self.lora_A.transpose(0, 1), self.padding_idx, self.max_norm,
self.norm_type, self.scale_grad_by_freq, self.sparse
)
result += (after_A @ self.lora_B.transpose(0, 1)) * self.scaling
return result
else:
return nn.Embedding.forward(self, x)
Experiment
- 실험 테이블 표기
Conclusion
LoRA는 기존의 전체 미세 조정이나 어댑터 방식과 비교하여 훈련 효율성과 저장 공간을 크게 향상시키면서도 성능 저하 없이 모델을 fine-tuning 할 수 있는 혁신적인 방법
Limitation
- LoRA를 적용할 때, 서로 다른 작업에 대한 입력을 단일 배치로 처리하는 것이 쉽지 않음
- LoRA를 적용할 가중치 행렬을 선택하는 데에는 주로 휴리스틱 방법에 의존
- 어떤 가중치 행렬에 LoRA를 적용하는 것이 가장 효과적인지 결정하기 위한 명확한 기준이 없음