Ch.08
PEFT와 LoRA: 적은 파라미터만 고쳐서 미세조정
큰 표 대신, 작은 두 조각
큰 가중치 표를 통째로 고치지 않고, 세로로 긴 B와 가로로 긴 A를 곱해 업데이트를 만듭니다. 가운데 폭 r이 작을수록 새로 맞출 숫자가 훨씬 적습니다.
아래 격자는 예시 크기입니다 (4×2 · 2×5 → 4×5).
① B: 세로로② r: 좁은 길③ A: 가로로④ 합친 표
학습하는 숫자는 두 작은 행렬을 합친 분량 정도로 줄고, 표 전체를 칸마다 맞추는 경우보다 훨씬 적습니다. LoRA는 그 두 조각만 바꿉니다.
PEFT·LoRA: 적은 파라미터만 고쳐서 미세조정
거대 백본은 그대로 두고, 좁은 LoRA 보조 차선(A·B)만 깔아 목적지에 맞춥니다.
이미 만들어 둔 큰 덩어리(W₀)는 그대로 두고, 작은 A·B 두 조각만 새로 배워서 출력을 살짝 돌립니다. 굵은 길과 좁은 지름길이 만나 최종 답이 됩니다.
백본 로드W₀ 동결A·B 학습α/r 스케일출력·병합
학습 흐름 한눈에
- ① 사전학습 백본: 이미 학습된 큰 모델 뼈대를 그대로 가져옵니다.
- ② 동결: 원래 가중치는 손대지 않고, LoRA와 맨 위 층 쪽으로만 학습 신호가 가게 합니다.
- ③ LoRA 학습: 작은 두 조각(A·B)만 새로 맞춰서 출력을 살짝 바꿉니다.
- ④ 세기 조절: LoRA가 얼마나 반영될지 스케일(보통 α를 r로 나눈 값 등)로 맞춥니다. 구현마다 조금씩 달라요.
- ⑤ 쓰기·합치기·나누기: 잘 나오는지 확인한 뒤, 보정을 원래 가중치에 합치거나 어댑터만 따로 배포할 수 있습니다.
인공지능 모델을 학습시키는 과정을 집을 리모델링하는 것에 비유해 볼까요? Chapter 05에서 다룬 ViT나 거대한 언어 모델들은 이미 아주 잘 지어진 으리으리한 대저택(사전학습 모델)과 같습니다. 이 저택을 내 취향에 맞게 바꾸고 싶을 때, 기둥과 벽을 모두 허물고 새로 짓는 것을 전체 미세조정(Full fine-tuning)이라고 합니다. 성능은 좋아질 수 있지만, 어마어마한 비용(메모리와 저장 공간)과 시간이 듭니다.
여기서 등장하는 구원투수가 바로 PEFT(Parameter-Efficient Fine-Tuning)입니다. PEFT는 "집의 기본 골조는 그대로 두고, 내게 꼭 필요한 작은 맞춤 가구(어댑터)만 새로 들이자!"는 아주 똑똑하고 경제적인 실전 전략입니다.
이 PEFT 가문에서 가장 유명한 방법이 바로 LoRA(Low-Rank Adaptation)입니다. 원래 모델이 가지고 있는 엄청나게 큰 지식 행렬은 가만히 내버려 두고, 그 옆에 아주 좁은 우회로(저랭크 행렬)를 새로 깔아서 지름길을 만드는 방식이죠. 수식으로는 원래의 거대한 지식인 대신, 크기가 작은 두 행렬의 곱 를 이용해 새롭게 배울 지식 를 만들어냅니다.
결과적으로 모델이 출력하는 값은 가 됩니다. 기존의 똑똑한 지식()에 우리가 새롭게 가르친 지식()을 살짝 얹어주는 원리입니다. 이 장에서는 큰 모델을 내 컴퓨터에서도 가볍게 다룰 수 있게 해주는 마법 같은 LoRA의 원리를 아주 쉽고 담백하게 풀어봅니다.
수식, 이렇게 읽으면 됩니다 (LoRA 한 층)
1. 사전학습 가중치와 동결
한 줄 요약: 이미 큰 표 는 그대로 두고, 작은 보정 만 새로 배웁니다.
가중치 , 입력 , 출력 라고 할 때, LoRA가 흔히 쓰는 형태는 ‘원래 출력 + 조금 더하기’입니다.
- : 사전학습 때 이미 갖춘 쪽(보통 고정·동결)
- : 내 태스크에 맞게 덧붙이는 쪽(LoRA는 주로 만 학습)
전체 미세조정(풀 FT)은 의 칸마다 손대지만, LoRA는 를 건드리지 않고 보정만 가볍게 맞추는 그림으로 이해하면 됩니다.
2. 저랭크 분해로 표현
한 줄 요약: 를 큰 표 하나로 직접 저장하지 않고, 가운데가 만큼만 좁은 두 표 와 를 곱해 만듭니다.
이 되도록 두고, , 일 때
- : ‘좁은 통로’ 을 지나가며 만든 보정의 모양
- : 보정이 출력에 얼마나 세게 섞일지 조절하는 스케일(구현마다 와 을 어떻게 묶는지 표기가 조금 다름)
새로 학습하는 숫자 개수는 대략 와 에 들어 있는 칸 수를 더한 값, 즉 입니다. 전체를 고치는 것보다 훨씬 적습니다.
3. 왜 ‘저랭크’인가?
직관: 태스크에 필요한 변화가 ‘모든 방향’이 아니라 몇 개의 주요 방향에만 몰려 있다고 보면, 그 방향만 맞추면 되므로 중간 폭 을 작게 잡아도 됩니다.
- 을 키우면 맞출 수 있는 방향이 늘어 표현력은 좋아지지만, 학습·저장 비용도 함께 늘어납니다.
- 어디에 붙이느냐(예: 어텐션의 vs FFN)에 따라 체감 효과가 달라집니다.
4. 추론 시 병합(선택)
한 줄 요약: 배포 후에도 ‘LoRA 경로를 한 번 더 탄다’가 아니라, 한 장의 가중치로 쓰고 싶을 때 씁니다.
학습이 끝난 뒤 를 에 더해
한 덩어리로 만들면, 평소 선형층처럼 행렬곱 한 번으로 계산할 수 있어 지연 시간을 줄이기 쉽습니다. 수치·정밀도·프레임워크마다 합치는 방식은 조금 다를 수 있습니다.
PEFT와 LoRA: 적은 파라미터만 고쳐서 미세조정
1. 왜 PEFT를 사용해야 할까요? (골조는 남기고 가구만 바꾸기)
개념: 챗GPT 같은 거대 모델들은 뇌세포(파라미터)가 수백억 개에 달합니다. 이 파라미터를 모두 업데이트하는 전체 미세조정은 엄청난 성능의 GPU를 요구하며, 결과를 저장할 때도 거대한 용량을 차지합니다. PEFT는 전체 파라미터 중 아주 일부(보통 1% 미만)만 학습시켜 모델을 효율적으로 똑똑하게 만드는 모든 기술을 뜻합니다.
비유: 겨울 분위기를 내고 싶다고 스마트폰을 새로 사는 사람은 없습니다. 대신 예쁜 겨울용 폰케이스(PEFT)만 씌우면 되죠! 용도에 따라 케이스만 바꿔 끼우듯, 모델을 쉽게 변신시킬 수 있습니다.
실전 주의: 가성비가 최고지만 주의점도 있습니다. 추가하는 가구(파라미터)가 너무 작거나, 학습 데이터가 부족하면 새로운 지식을 제대로 흡수하지 못할 수 있습니다. 그래서 학습률(Learning Rate) 등 환경 설정을 잘 조절하는 것이 핵심입니다.
2. LoRA의 비밀: 거대한 행렬 대신 작은 행렬 두 개 곱하기
개념: 딥러닝 모델은 거대한 숫자 표(행렬)들로 이루어져 있습니다. 이 원래의 거대한 행렬을 라고 합시다. LoRA는 는 꽁꽁 얼려두고(동결), 새로운 지식을 배울 작은 행렬 두 개(와 )를 만듭니다. 핵심 수식은 입니다.
비유: 아주 두꺼운 1000페이지짜리 백과사전()에 오타를 수정하려고 통째로 다시 인쇄하는 건 비효율적입니다. 대신, 수정 사항이 적힌 작은 포스트잇()을 해당 페이지에 살짝 붙이는 것과 같습니다.
상세 설명: 행렬은 방대한 정보를 핵심만 요약(압축)하는 역할을 하고, 행렬은 그 요약된 정보를 다시 원래 크기로 풀어주는(복원) 역할을 합니다. 이렇게 하면 거대한 행렬을 직접 고치는 것보다 학습해야 할 숫자가 기적적으로 줄어듭니다.
3. LoRA의 조종석: 핵심 하이퍼파라미터
개념: LoRA를 조종하려면 두 가지 중요한 다이얼을 알아야 합니다. 바로 랭크 과 스케일 입니다.
랭크 (보조 차선의 개수): 포스트잇의 크기라고 볼 수 있습니다. 이 8이면 8차로 우회로, 16이면 16차로입니다. 숫자가 클수록 똑똑해질 수 있지만, 메모리도 더 많이 차지합니다.
스케일 (지식 반영의 강도): 새로 배운 지식()을 기존 지식()에 얼마나 적극적으로 반영할지 결정하는 증폭기입니다.
실전 꿀팁: 컴퓨터 메모리가 벅차면 을 줄이세요! 반대로 모델이 내 데이터를 잘 못 맞춘다면 을 살짝 키워보는 것이 좋습니다.
4. 다른 챕터들과의 찰떡 연결
개념: Chapter 04와 05에서 배운 어텐션(Attention) 모듈 기억나시나요? LoRA는 주로 이 어텐션 모듈의 핵심 부품들(질문 , 열쇠 , 값 )에 포스트잇을 붙이는 데 많이 사용됩니다. 선형층(가중치 행렬)이 있는 곳이라면 어디든 LoRA를 찰싹 붙일 수 있습니다.
예고편: 하지만 LoRA를 써도 원래의 거대한 집() 자체가 뚱뚱해서 메모리를 차지할 수 있습니다. 그래서 다음 Chapter 09에서는 이 거대한 모델 자체를 가벼운 소재로 압축해 버리는 양자화(Quantization) 기술과 LoRA를 결합한 환상의 짝꿍, QLoRA를 만나게 됩니다.
왜 중요한지
누구나 내 방구석 GPU로 거대 모델을 키울 수 있습니다
과거에는 거대 모델을 내 맘대로 바꾸려면 거대한 데이터센터가 필요했습니다. 하지만 LoRA를 사용하면 학습해야 할 파라미터가 100분의 1, 1000분의 1로 줄어듭니다. 즉, 스타트업이나 학생들도 한정된 자원(GPU)으로 엄청나게 큰 모델을 나만의 도메인(의료, 금융, 법률 등)에 맞춰 미세조정할 수 있게 해줍니다.
카멜레온 같은 모델 만들기: 멀티태스크 배포의 마법
하나의 모델을 '번역가', '프로그래머', '요리사'로 각각 만들려면 원래는 모델 전체를 3개나 저장해야 합니다. 하지만 PEFT를 쓰면 똑똑한 공통 뇌(베이스 모델)는 딱 1개만 두고, 번역용 포스트잇, 코딩용 포스트잇(LoRA 어댑터)만 가볍게 저장하면 됩니다. 필요할 때마다 어댑터만 스위칭 하면 되므로 배포와 관리가 상상할 수 없을 만큼 쉬워집니다.
과거를 잊지 않는 똑똑함: 망각 리스크 방지
모델에 새로운 지식을 억지로 쑤셔 넣다 보면(전체 미세조정), 모델이 원래 알던 기본적인 상식을 까먹는 '망각' 현상이 종종 발생합니다. 대학 수학을 배우다가 구구단을 잊어버리는 셈이죠. LoRA는 원래의 뇌()를 얼려두고 보조 뇌만 학습시키기 때문에, 원래의 일반화 능력을 유지하면서 새로운 지식을 안전하게 더할 수 있습니다.
큰 그림 속의 효율성
Chapter 01~03의 뼈대(선형층) 위에 어떻게 효율적으로 살을 붙일 것인가? 에 대한 해답이 이 챕터입니다. 무식하게 다 바꾸지 않고 파라미터 효율(Parameter-Efficient)을 극대화하는 법을 깨우쳤다면, 더 고도화된 최적화 기법을 배울 준비가 된 것입니다.
어떻게 쓰이는지
1단계: 베이스는 얼음! LoRA만 땡! (학습 전략)
1. 가장 먼저 가져온 거대 모델의 가중치를 못 바꾸게 자물쇠를 채웁니다(동결).
2. 모델의 중요한 관절(어텐션 층 등)마다 빈 LoRA 모듈을 달아줍니다.
3. 오직 이 LoRA 모듈들만 학습되도록 설정합니다. 전체를 학습할 때보다 빠르지만, 학습 데이터가 적다면 검증 세트로 과적합을 감시해야 합니다.
2단계: 배포할 땐 하나로 합체! (병합과 추론)
학습이 끝났다면, 포스트잇()에 적힌 내용을 원래 백과사전()에 아예 인쇄해 버릴 수 있습니다. 이것을 가중치 병합(Weight Merge)이라고 합니다.
이렇게 합쳐버리면, 나중에 AI가 대답을 할 때 굳이 두 번 계산할 필요가 없어서 속도 저하(Latency)가 전혀 발생하지 않습니다!
3단계: 내게 맞는 PEFT 옷 고르기
어댑터(Adapter): 각 층의 끝에 작은 신경망을 하나씩 더 붙이는 방식입니다.
프롬프트 튜닝(Prompt Tuning): 입력하는 문장(프롬프트) 앞에 '가상의 단어'들을 추가해서 모델을 유도합니다.
LoRA: 가중치 행렬 자체를 부드럽게 수정해 주기 때문에 제약이 적고 성능이 좋아 현재 업계의 압도적 표준으로 쓰입니다.
✅ 실전 활용 체크리스트
성능 점검: 모델이 아쉬운 대답을 한다면 랭크(), 스케일(), 혹은 목표 모듈(`target_modules`) 범위를 늘려보세요.
메모리 점검: 여전히 메모리가 부족하다면 배치 크기를 줄이고, 다음 챕터의 양자화+LoRA(QLoRA)를 검토해야 합니다.
재현성 점검: 나중에 모델을 다시 똑같이 만들 수 있도록, 어떤 층에 어떤 값으로 LoRA를 붙였는지 실험 로그에 꼼꼼히 남기세요.
요약
한 줄 요약 — 거대한 사전학습 가중치 는 안전하게 동결하고, 새롭게 업데이트할 부분은 저랭크 행렬 로 두어 학습해야 할 파라미터를 획기적으로 줄이는 마법입니다.
앞 장과의 연결: Chapter 01~03의 선형층·어텐션 구조 위에서, 모델을 내 입맛에 맞게 적응시키는 가장 경제적이고 스마트한 방법이 바로 LoRA와 PEFT입니다.
실무 요약: 랭크(), 스케일(), 타깃 모듈 등 핵심 다이얼을 조화롭게 맞추고, 컴퓨터 메모리가 버겁다면 Chapter 09의 QLoRA(양자화) 기술로 배턴을 넘겨 더 가볍게 최적화합니다.
문제 풀이를 위한 설명
LoRA·PEFT 문제는 “동결된 + 저랭크 ” 그림과 “학습 파라미터 수·, ”를 같이 떠올리면 풀기 쉽습니다. ViT 패치 수·격자 계산(Chapter 05 복습)이 나오면 이고, 한 행렬에 LoRA만 붙였을 때 대략 파라미터(전형적 형태)를 연결해 봅니다.
① 세션에 나올 수 있는 숫자형 유형 예시 (은행과 동일한 형태)
예시 (LoRA 학습 파라미터 수 · aggregate) — 한 선형층에 LoRA를 붙일 때 , 이면 대략 는? → 512
예시 (한 변 패치 격자 · config) — 가로·세로에 패치가 8개씩이면 총 칸 수는? → 64
예시 (해상도·패치로 토큰 수 · vote) — 입력 , 패치 , CLS 없이 패치 개수? → 4
예시 (패치 토큰 수 · ensemble) — , 패치 , CLS 제외? → 196
예시 (밀집 어텐션 스케일 · ensemble) — 토큰 수 일 때 는? → 400
예시 (개념)
"PEFT의 목표에 가장 가까운 것은?
① 모든 가중치를 항상 랜덤 초기화
② 적은 추가 파라미터로 적응
③ 레이어 수를 0으로"
→
② → 2
예시 (계산)
", 인 한 개 선형층에 LoRA를 붙일 때, 와 의 학습 파라미터 수 합을 대략 로 본다면?"
→ → 512
예시 (O/X)
"LoRA에서 사전학습 가중치 를 항상 전부 학습 가능하게 두는 것이 일반적이다."
→ 보통 동결이 일반적 → 0
예시 (응용)
"태스크별로 작은 어댑터만 저장·교체하려면?
① 전체 FT 체크포인트만 쌓기
② LoRA 등 PEFT 가중치만 분리 저장
③ 옵티마이저만 바꾸기"
→ 2
예시 (ViT 패치 복습)
, 패치 , CLS 제외 패치 수 → 196
정의 예시 — "LoRA는 를 항상 풀랭크 행렬로 직접 학습한다. 맞으면 1, 틀리면 0." → 저랭크 가 핵심. 정답 0
참/거짓 예시 — "을 키우면 일반적으로 LoRA 학습 파라미터가 늘어난다." → 맞음. 정답 1
선택 예시 — "메모리를 더 아끼며 LoRA를 쓰려면 Chapter 09에서 무엇을 함께 보는가?
① 양자화
② 데이터 라벨만 삭제"
→
①. 정답 1
계산 예시 — ", 일 때 는?" → . 정답 128