모두의 AI
머신러닝AI논문
로딩 중…

배우기

🏅내 업적

Ch.08

PEFT와 LoRA: 적은 파라미터만 고쳐서 미세조정

큰 표 대신, 작은 두 조각

큰 가중치 표를 통째로 고치지 않고, 세로로 긴 B와 가로로 긴 A를 곱해 업데이트를 만듭니다. 가운데 폭 r이 작을수록 새로 맞출 숫자가 훨씬 적습니다.
아래 격자는 예시 크기입니다 (4×2 · 2×5 → 4×5).
① B: 세로로② r: 좁은 길③ A: 가로로④ 합친 표
B: 4행 × 2열A: 2행 × 5열×=ΔW: 4행 × 5열가운데가가장 좁음
학습하는 숫자는 두 작은 행렬을 합친 분량 정도로 줄고, 표 전체를 칸마다 맞추는 경우보다 훨씬 적습니다. LoRA는 그 두 조각만 바꿉니다.

PEFT·LoRA: 적은 파라미터만 고쳐서 미세조정

거대 백본은 그대로 두고, 좁은 LoRA 보조 차선(A·B)만 깔아 목적지에 맞춥니다.

이미 만들어 둔 큰 덩어리(W₀)는 그대로 두고, 작은 A·B 두 조각만 새로 배워서 출력을 살짝 돌립니다. 굵은 길과 좁은 지름길이 만나 최종 답이 됩니다.

백본 로드W₀ 동결A·B 학습α/r 스케일출력·병합

학습 흐름 한눈에

  1. ① 사전학습 백본: 이미 학습된 큰 모델 뼈대를 그대로 가져옵니다.
  2. ② 동결: 원래 가중치는 손대지 않고, LoRA와 맨 위 층 쪽으로만 학습 신호가 가게 합니다.
  3. ③ LoRA 학습: 작은 두 조각(A·B)만 새로 맞춰서 출력을 살짝 바꿉니다.
  4. ④ 세기 조절: LoRA가 얼마나 반영될지 스케일(보통 α를 r로 나눈 값 등)로 맞춥니다. 구현마다 조금씩 달라요.
  5. ⑤ 쓰기·합치기·나누기: 잘 나오는지 확인한 뒤, 보정을 원래 가중치에 합치거나 어댑터만 따로 배포할 수 있습니다.
인공지능 모델을 학습시키는 과정을 집을 리모델링하는 것에 비유해 볼까요? Chapter 05에서 다룬 ViT나 거대한 언어 모델들은 이미 아주 잘 지어진 으리으리한 대저택(사전학습 모델)과 같습니다. 이 저택을 내 취향에 맞게 바꾸고 싶을 때, 기둥과 벽을 모두 허물고 새로 짓는 것을 전체 미세조정(Full fine-tuning)이라고 합니다. 성능은 좋아질 수 있지만, 어마어마한 비용(메모리와 저장 공간)과 시간이 듭니다.
여기서 등장하는 구원투수가 바로 PEFT(Parameter-Efficient Fine-Tuning)입니다. PEFT는 "집의 기본 골조는 그대로 두고, 내게 꼭 필요한 작은 맞춤 가구(어댑터)만 새로 들이자!"는 아주 똑똑하고 경제적인 실전 전략입니다.
이 PEFT 가문에서 가장 유명한 방법이 바로 LoRA(Low-Rank Adaptation)입니다. 원래 모델이 가지고 있는 엄청나게 큰 지식 행렬은 가만히 내버려 두고, 그 옆에 아주 좁은 우회로(저랭크 행렬)를 새로 깔아서 지름길을 만드는 방식이죠. 수식으로는 원래의 거대한 지식인 W0W_0W0​ 대신, 크기가 작은 두 행렬의 곱 BABABA를 이용해 새롭게 배울 지식 ΔW\Delta WΔW를 만들어냅니다.
결과적으로 모델이 출력하는 값은 h=W0x+ΔWxh = W_0x + \Delta Wxh=W0​x+ΔWx 가 됩니다. 기존의 똑똑한 지식(W0xW_0xW0​x)에 우리가 새롭게 가르친 지식(ΔWx\Delta WxΔWx)을 살짝 얹어주는 원리입니다. 이 장에서는 큰 모델을 내 컴퓨터에서도 가볍게 다룰 수 있게 해주는 마법 같은 LoRA의 원리를 아주 쉽고 담백하게 풀어봅니다.

수식, 이렇게 읽으면 됩니다 (LoRA 한 층)

1. 사전학습 가중치와 동결
한 줄 요약: 이미 큰 표 W0W_0W0​는 그대로 두고, 작은 보정 ΔW\Delta WΔW만 새로 배웁니다.
가중치 W0∈Rdout×dinW_0\in\mathbb{R}^{d_{\mathrm{out}}\times d_{\mathrm{in}}}W0​∈Rdout​×din​, 입력 xxx, 출력 hhh라고 할 때, LoRA가 흔히 쓰는 형태는 ‘원래 출력 + 조금 더하기’입니다.
h=W0x+ΔWxh = W_0 x + \Delta W xh=W0​x+ΔWx
- W0xW_0 xW0​x: 사전학습 때 이미 갖춘 쪽(보통 고정·동결)
- ΔWx\Delta W xΔWx: 내 태스크에 맞게 덧붙이는 쪽(LoRA는 주로 ΔW\Delta WΔW만 학습)
전체 미세조정(풀 FT)은 W0W_0W0​의 칸마다 손대지만, LoRA는 W0W_0W0​를 건드리지 않고 보정만 가볍게 맞추는 그림으로 이해하면 됩니다.
xW0동결×W0xAB×α/rΔWx+h
한 층에서: 위쪽은 동결된 W0W_0W0​로 만든 W0xW_0xW0​x, 아래쪽은 학습하는 A ⁣→ ⁣BA\!\to\!BA→B와 α/r\alpha/rα/r가 붙은 ΔWx\Delta W xΔWx입니다. 둘이 더해져 h=W0x+ΔWxh=W_0x+\Delta W xh=W0​x+ΔWx가 됩니다.
2. 저랭크 분해로 ΔW\Delta WΔW 표현
한 줄 요약: ΔW\Delta WΔW를 큰 표 하나로 직접 저장하지 않고, 가운데가 rrr만큼만 좁은 두 표 BBB와 AAA를 곱해 만듭니다.
r≪min⁡(din,dout)r\ll \min(d_{\mathrm{in}},d_{\mathrm{out}})r≪min(din​,dout​)이 되도록 두고, B∈Rdout×rB\in\mathbb{R}^{d_{\mathrm{out}}\times r}B∈Rdout​×r, A∈Rr×dinA\in\mathbb{R}^{r\times d_{\mathrm{in}}}A∈Rr×din​일 때
ΔW=αrBA\Delta W = \frac{\alpha}{r} B AΔW=rα​BA
- BABABA: ‘좁은 통로’ rrr을 지나가며 만든 보정의 모양
- α/r\alpha/rα/r: 보정이 출력에 얼마나 세게 섞일지 조절하는 스케일(구현마다 α\alphaα와 rrr을 어떻게 묶는지 표기가 조금 다름)
새로 학습하는 숫자 개수는 대략 BBB와 AAA에 들어 있는 칸 수를 더한 값, 즉 doutr+rdind_{\mathrm{out}}r + r d_{\mathrm{in}}dout​r+rdin​입니다. W0W_0W0​ 전체를 고치는 것보다 훨씬 적습니다.
3. 왜 ‘저랭크’인가?
직관: 태스크에 필요한 변화가 ‘모든 방향’이 아니라 몇 개의 주요 방향에만 몰려 있다고 보면, 그 방향만 맞추면 되므로 중간 폭 rrr을 작게 잡아도 됩니다.
- rrr을 키우면 맞출 수 있는 방향이 늘어 표현력은 좋아지지만, 학습·저장 비용도 함께 늘어납니다.
- 어디에 붙이느냐(예: 어텐션의 WQ,WK,…W_Q,W_K,\dotsWQ​,WK​,… vs FFN)에 따라 체감 효과가 달라집니다.
4. 추론 시 병합(선택)
한 줄 요약: 배포 후에도 ‘LoRA 경로를 한 번 더 탄다’가 아니라, 한 장의 가중치로 쓰고 싶을 때 씁니다.
학습이 끝난 뒤 ΔW\Delta WΔW를 W0W_0W0​에 더해
W=W0+ΔWW = W_0 + \Delta WW=W0​+ΔW
한 덩어리로 만들면, 평소 선형층처럼 행렬곱 한 번으로 계산할 수 있어 지연 시간을 줄이기 쉽습니다. 수치·정밀도·프레임워크마다 합치는 방식은 조금 다를 수 있습니다.

PEFT와 LoRA: 적은 파라미터만 고쳐서 미세조정

1. 왜 PEFT를 사용해야 할까요? (골조는 남기고 가구만 바꾸기)
개념: 챗GPT 같은 거대 모델들은 뇌세포(파라미터)가 수백억 개에 달합니다. 이 파라미터를 모두 업데이트하는 전체 미세조정은 엄청난 성능의 GPU를 요구하며, 결과를 저장할 때도 거대한 용량을 차지합니다. PEFT는 전체 파라미터 중 아주 일부(보통 1% 미만)만 학습시켜 모델을 효율적으로 똑똑하게 만드는 모든 기술을 뜻합니다.
비유: 겨울 분위기를 내고 싶다고 스마트폰을 새로 사는 사람은 없습니다. 대신 예쁜 겨울용 폰케이스(PEFT)만 씌우면 되죠! 용도에 따라 케이스만 바꿔 끼우듯, 모델을 쉽게 변신시킬 수 있습니다.
실전 주의: 가성비가 최고지만 주의점도 있습니다. 추가하는 가구(파라미터)가 너무 작거나, 학습 데이터가 부족하면 새로운 지식을 제대로 흡수하지 못할 수 있습니다. 그래서 학습률(Learning Rate) 등 환경 설정을 잘 조절하는 것이 핵심입니다.
2. LoRA의 비밀: 거대한 행렬 대신 작은 행렬 두 개 곱하기
개념: 딥러닝 모델은 거대한 숫자 표(행렬)들로 이루어져 있습니다. 이 원래의 거대한 행렬을 W0W_0W0​라고 합시다. LoRA는 W0W_0W0​는 꽁꽁 얼려두고(동결), 새로운 지식을 배울 작은 행렬 두 개(BBB와 AAA)를 만듭니다. 핵심 수식은 ΔW=BA\Delta W = B AΔW=BA 입니다.
비유: 아주 두꺼운 1000페이지짜리 백과사전(W0W_0W0​)에 오타를 수정하려고 통째로 다시 인쇄하는 건 비효율적입니다. 대신, 수정 사항이 적힌 작은 포스트잇(BABABA)을 해당 페이지에 살짝 붙이는 것과 같습니다.
상세 설명: AAA 행렬은 방대한 정보를 핵심만 요약(압축)하는 역할을 하고, BBB 행렬은 그 요약된 정보를 다시 원래 크기로 풀어주는(복원) 역할을 합니다. 이렇게 하면 거대한 행렬을 직접 고치는 것보다 학습해야 할 숫자가 기적적으로 줄어듭니다.
3. LoRA의 조종석: 핵심 하이퍼파라미터
개념: LoRA를 조종하려면 두 가지 중요한 다이얼을 알아야 합니다. 바로 랭크 rrr과 스케일 α\alphaα입니다.
랭크 rrr (보조 차선의 개수): 포스트잇의 크기라고 볼 수 있습니다. rrr이 8이면 8차로 우회로, 16이면 16차로입니다. 숫자가 클수록 똑똑해질 수 있지만, 메모리도 더 많이 차지합니다.
스케일 α\alphaα (지식 반영의 강도): 새로 배운 지식(BABABA)을 기존 지식(W0W_0W0​)에 얼마나 적극적으로 반영할지 결정하는 증폭기입니다.
실전 꿀팁: 컴퓨터 메모리가 벅차면 rrr을 줄이세요! 반대로 모델이 내 데이터를 잘 못 맞춘다면 rrr을 살짝 키워보는 것이 좋습니다.
4. 다른 챕터들과의 찰떡 연결
개념: Chapter 04와 05에서 배운 어텐션(Attention) 모듈 기억나시나요? LoRA는 주로 이 어텐션 모듈의 핵심 부품들(질문 QQQ, 열쇠 KKK, 값 VVV)에 포스트잇을 붙이는 데 많이 사용됩니다. 선형층(가중치 행렬)이 있는 곳이라면 어디든 LoRA를 찰싹 붙일 수 있습니다.
예고편: 하지만 LoRA를 써도 원래의 거대한 집(W0W_0W0​) 자체가 뚱뚱해서 메모리를 차지할 수 있습니다. 그래서 다음 Chapter 09에서는 이 거대한 모델 자체를 가벼운 소재로 압축해 버리는 양자화(Quantization) 기술과 LoRA를 결합한 환상의 짝꿍, QLoRA를 만나게 됩니다.

왜 중요한지

누구나 내 방구석 GPU로 거대 모델을 키울 수 있습니다
과거에는 거대 모델을 내 맘대로 바꾸려면 거대한 데이터센터가 필요했습니다. 하지만 LoRA를 사용하면 학습해야 할 파라미터가 100분의 1, 1000분의 1로 줄어듭니다. 즉, 스타트업이나 학생들도 한정된 자원(GPU)으로 엄청나게 큰 모델을 나만의 도메인(의료, 금융, 법률 등)에 맞춰 미세조정할 수 있게 해줍니다.
카멜레온 같은 모델 만들기: 멀티태스크 배포의 마법
하나의 모델을 '번역가', '프로그래머', '요리사'로 각각 만들려면 원래는 모델 전체를 3개나 저장해야 합니다. 하지만 PEFT를 쓰면 똑똑한 공통 뇌(베이스 모델)는 딱 1개만 두고, 번역용 포스트잇, 코딩용 포스트잇(LoRA 어댑터)만 가볍게 저장하면 됩니다. 필요할 때마다 어댑터만 스위칭 하면 되므로 배포와 관리가 상상할 수 없을 만큼 쉬워집니다.
과거를 잊지 않는 똑똑함: 망각 리스크 방지
모델에 새로운 지식을 억지로 쑤셔 넣다 보면(전체 미세조정), 모델이 원래 알던 기본적인 상식을 까먹는 '망각' 현상이 종종 발생합니다. 대학 수학을 배우다가 구구단을 잊어버리는 셈이죠. LoRA는 원래의 뇌(W0W_0W0​)를 얼려두고 보조 뇌만 학습시키기 때문에, 원래의 일반화 능력을 유지하면서 새로운 지식을 안전하게 더할 수 있습니다.
큰 그림 속의 효율성
Chapter 01~03의 뼈대(선형층) 위에 어떻게 효율적으로 살을 붙일 것인가? 에 대한 해답이 이 챕터입니다. 무식하게 다 바꾸지 않고 파라미터 효율(Parameter-Efficient)을 극대화하는 법을 깨우쳤다면, 더 고도화된 최적화 기법을 배울 준비가 된 것입니다.

어떻게 쓰이는지

1단계: 베이스는 얼음! LoRA만 땡! (학습 전략)
1. 가장 먼저 가져온 거대 모델의 가중치를 못 바꾸게 자물쇠를 채웁니다(동결).
2. 모델의 중요한 관절(어텐션 층 등)마다 빈 LoRA 모듈을 달아줍니다.
3. 오직 이 LoRA 모듈들만 학습되도록 설정합니다. 전체를 학습할 때보다 빠르지만, 학습 데이터가 적다면 검증 세트로 과적합을 감시해야 합니다.
2단계: 배포할 땐 하나로 합체! (병합과 추론)
학습이 끝났다면, 포스트잇(BABABA)에 적힌 내용을 원래 백과사전(W0W_0W0​)에 아예 인쇄해 버릴 수 있습니다. 이것을 가중치 병합(Weight Merge)이라고 합니다.
Wmerged=W0+BAW_{merged} = W_0 + BAWmerged​=W0​+BA
이렇게 합쳐버리면, 나중에 AI가 대답을 할 때 굳이 두 번 계산할 필요가 없어서 속도 저하(Latency)가 전혀 발생하지 않습니다!
3단계: 내게 맞는 PEFT 옷 고르기
어댑터(Adapter): 각 층의 끝에 작은 신경망을 하나씩 더 붙이는 방식입니다.
프롬프트 튜닝(Prompt Tuning): 입력하는 문장(프롬프트) 앞에 '가상의 단어'들을 추가해서 모델을 유도합니다.
LoRA: 가중치 행렬 자체를 부드럽게 수정해 주기 때문에 제약이 적고 성능이 좋아 현재 업계의 압도적 표준으로 쓰입니다.
✅ 실전 활용 체크리스트
성능 점검: 모델이 아쉬운 대답을 한다면 랭크(rrr), 스케일(α\alphaα), 혹은 목표 모듈(`target_modules`) 범위를 늘려보세요.
메모리 점검: 여전히 메모리가 부족하다면 배치 크기를 줄이고, 다음 챕터의 양자화+LoRA(QLoRA)를 검토해야 합니다.
재현성 점검: 나중에 모델을 다시 똑같이 만들 수 있도록, 어떤 층에 어떤 rrr 값으로 LoRA를 붙였는지 실험 로그에 꼼꼼히 남기세요.

요약

한 줄 요약 — 거대한 사전학습 가중치 W0W_0W0​는 안전하게 동결하고, 새롭게 업데이트할 부분은 저랭크 행렬 ΔW=BA\Delta W = BAΔW=BA 로 두어 학습해야 할 파라미터를 획기적으로 줄이는 마법입니다.
앞 장과의 연결: Chapter 01~03의 선형층·어텐션 구조 위에서, 모델을 내 입맛에 맞게 적응시키는 가장 경제적이고 스마트한 방법이 바로 LoRA와 PEFT입니다.
실무 요약: 랭크(rrr), 스케일(α\alphaα), 타깃 모듈 등 핵심 다이얼을 조화롭게 맞추고, 컴퓨터 메모리가 버겁다면 Chapter 09의 QLoRA(양자화) 기술로 배턴을 넘겨 더 가볍게 최적화합니다.

문제 풀이를 위한 설명

LoRA·PEFT 문제는 “동결된 W0W_0W0​ + 저랭크 BABABA” 그림과 “학습 파라미터 수·rrr, α\alphaα”를 같이 떠올리면 풀기 쉽습니다. ViT 패치 수·격자 계산(Chapter 05 복습)이 나오면 (가로/패치)×(세로/패치)(\text{가로}/\text{패치})\times(\text{세로}/\text{패치})(가로/패치)×(세로/패치)이고, 한 행렬에 LoRA만 붙였을 때 대략 2dr2dr2dr 파라미터(전형적 형태)를 연결해 봅니다.
① 세션에 나올 수 있는 숫자형 유형 예시 (은행과 동일한 형태)
예시 (LoRA 학습 파라미터 수 · aggregate) — 한 선형층에 LoRA를 붙일 때 d=64d=64d=64, r=4r=4r=4이면 대략 2dr2dr2dr는? → 2×64×4=2\times64\times4=2×64×4= 512

예시 (한 변 패치 격자 · config) — 가로·세로에 패치가 8개씩이면 총 칸 수는? → 8×8=8\times8=8×8= 64

예시 (해상도·패치로 토큰 수 · vote) — 입력 32×3232\times3232×32, 패치 16×1616\times1616×16, CLS 없이 패치 개수? → (32/16)2=(32/16)^2=(32/16)2= 4

예시 (패치 토큰 수 · ensemble) — 224×224224\times224224×224, 패치 16×1616\times1616×16, CLS 제외? → (224/16)2=142=(224/16)^2=14^2=(224/16)2=142= 196

예시 (밀집 어텐션 스케일 · ensemble) — 토큰 수 N=20N=20N=20일 때 N2N^2N2는? → 202=20^2=202= 400
예시 (개념)
"PEFT의 목표에 가장 가까운 것은?
① 모든 가중치를 항상 랜덤 초기화
② 적은 추가 파라미터로 적응
③ 레이어 수를 0으로"
→
② → 2

예시 (계산)
"d=64d=64d=64, r=4r=4r=4인 한 개 선형층에 LoRA를 붙일 때, BBB와 AAA의 학습 파라미터 수 합을 대략 2dr2dr2dr로 본다면?"
→ 2×64×4=5122\times64\times4=5122×64×4=512 → 512

예시 (O/X)
"LoRA에서 사전학습 가중치 W0W_0W0​를 항상 전부 학습 가능하게 두는 것이 일반적이다."
→ 보통 동결이 일반적 → 0

예시 (응용)
"태스크별로 작은 어댑터만 저장·교체하려면?
① 전체 FT 체크포인트만 쌓기
② LoRA 등 PEFT 가중치만 분리 저장
③ 옵티마이저만 바꾸기"
→ 2

예시 (ViT 패치 복습)
224×224224\times224224×224, 패치 16×1616\times1616×16, CLS 제외 패치 수 → 142=14^2=142= 196
정의 예시 — "LoRA는 ΔW\Delta WΔW를 항상 풀랭크 행렬로 직접 학습한다. 맞으면 1, 틀리면 0." → 저랭크 BABABA가 핵심. 정답 0

참/거짓 예시 — "rrr을 키우면 일반적으로 LoRA 학습 파라미터가 늘어난다." → 맞음. 정답 1

선택 예시 — "메모리를 더 아끼며 LoRA를 쓰려면 Chapter 09에서 무엇을 함께 보는가?
① 양자화
② 데이터 라벨만 삭제"
→
①. 정답 1

계산 예시 — "d=32d=32d=32, r=2r=2r=2일 때 2dr2dr2dr는?" → 2×32×2=1282\times32\times2=1282×32×2=128. 정답 128