LoRA(Low-Rank Adaptation)는 2021년 Microsoft가 제안한 대규모 언어 모델 파인튜닝 기법이다. 원래 모델 가중치를 고정하고 저랭크(Low-Rank) 행렬을 추가해 훨씬 적은 파라미터로 효과적인 파인튜닝이 가능하다.
핵심 아이디어
기존 파인튜닝: 모든 가중치 W를 업데이트 (수십억 파라미터)
LoRA: W' = W + ΔW, 단 ΔW = B·A (저랭크 분해)
- •W: (d × k) 고정 원본 가중치
- •A: (r × k), B: (d × r), r << min(d,k)
- •실제 학습 파라미터: A와 B만 (r이 8이면 파라미터 수 99% 감소)
구현
python
import torch
import torch.nn as nn
class LoRALinear(nn.Module):
def __init__(self, in_features, out_features, rank=8, alpha=16):
super().__init__()
self.original = nn.Linear(in_features, out_features, bias=False)
self.original.weight.requires_grad = False # 원본 고정
self.lora_A = nn.Linear(in_features, rank, bias=False)
self.lora_B = nn.Linear(rank, out_features, bias=False)
self.scaling = alpha / rank
nn.init.kaiming_uniform_(self.lora_A.weight)
nn.init.zeros_(self.lora_B.weight)
def forward(self, x):
return self.original(x) + self.scaling * self.lora_B(self.lora_A(x))
# 사용 예시
layer = LoRALinear(768, 768, rank=8)
x = torch.randn(4, 32, 768)
out = layer(x) # (4, 32, 768)
LoRA 변형
| 방식 | 특징 |
|---|
| LoRA | 기본 저랭크 어댑터 |
| QLoRA | 4비트 양자화 + LoRA (VRAM 절감) |
| AdaLoRA | 중요도에 따라 랭크 자동 조절 |
| LoRA+ | A, B 학습률 차별화 |
| DoRA | 방향/크기 분리 학습 |
실제 적용 (HuggingFace PEFT)
python
from peft import get_peft_model, LoraConfig, TaskType
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=8,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05
)
model = get_peft_model(base_model, config)
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.062
관련 개념