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 하는 것

귀찮아서 GPT의 힘을 빌림..

*rank란 ? - 행렬을 구성하는 행 또는 열 벡터들 중 서로 독립적인 벡터의 최대 개수 를 의미함.
 즉, 선형적으로 독립인 벡터의 수를 의미한다. 예를 들어 NxN 짜리 행렬이 있을 때 rank가 1이라면  모든 열 벡터들을 하나의  linear combination으로 표현할 수 있음. rank가 N이라면, 모든 열 벡터는 linear independent 함. 즉 딥러닝에서 rank가 낮을 수록 행렬의 정보가 중복되거나 불필요하다는 것을 의미함
  • 기존 방식에서는 Transformer 계층의 가중치 행렬 W를 아래와 같이 업데이트 함 :

  • Forwrad propagation 시
    -

기존 방식과 비교

adapter layer

  • 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를 적용하는 것이 가장 효과적인지 결정하기 위한 명확한 기준이 없음
  •