세상에서 가장 간단한 파인튜닝 이해하기 — 합치기가 아니라 조정이다
66M개의 숫자를 살짝 바꾸는 것. 데이터를 모델에 넣는 것도, 모델끼리 합치는 것도 아니다
파인튜닝을 처음 들으면 이렇게 이해한다
대부분 이런 식으로 오해한다. 전부 틀렸다.
오해 1: "학습된 모델에 내 데이터를 합치는 거 아니야?"
❌ 학습된 모델 + IMDB 데이터 = 새 모델 (합치기)
아니다. 데이터는 모델 "안에" 들어가지 않는다.
오해 2: "원래 훈련 데이터에 내 데이터를 추가하는 거 아니야?"
❌ Wikipedia(원래 데이터) + IMDB(내 데이터) → 합쳐서 다시 훈련
아니다. 원래 훈련 데이터(Wikipedia)는 건드리지도 않는다. 이미 끝난 일이다.
오해 3: "그러면 pipeline('sentiment-analysis')에다가 IMDB를 합치는 건가?"
❌ pipeline("sentiment-analysis") + IMDB = 더 나은 pipeline
아니다. pipeline()은 이미 완성된 모델을 "사용"하는 도구일 뿐이다.
실제로 일어나는 일
파인튜닝은 숫자를 바꾸는 것이다. 그게 전부다.
DistilBERT 모델은 66,000,000개의 숫자(가중치)로 이루어져 있다. 이 숫자들이 "영어를 이해하는 방법"을 저장하고 있다.
DistilBERT의 가중치 (66M개 숫자):
[0.0234, -0.1523, 0.4891, 0.0012, -0.3345, 0.7721, ...]
이 숫자들이 "영어 문법, 단어 의미, 문맥"을 표현한다
Wikipedia/인터넷 텍스트로 이미 훈련 완료
파인튜닝이 하는 일:
Step 1: IMDB 리뷰를 모델에 넣는다
"This movie was terrible" → model → "긍정 60%, 부정 40%"
Step 2: 정답과 비교한다
정답: 부정
모델: 긍정 60% → 틀렸다
Step 3: 틀린 만큼 숫자를 살짝 바꾼다
[0.0234, -0.1523, 0.4891, ...]
→
[0.0231, -0.1528, 0.4889, ...] ← 소수점 셋째~넷째 자리가 살짝 변함
Step 4: 25,000번 반복
→ 감정 분류를 잘하는 모델이 됨
바뀌는 건 숫자뿐이다. 데이터가 모델 안에 "들어가는" 게 아니다. 데이터를 "보면서" 숫자를 조정하는 것이다.
비유로 이해하기
Pre-training (OpenAI/Google이 함):
= 대학교 4년 (범용 교육)
= 백지 상태에서 영어/수학/과학 전부 배움
= GPU 수천 개, 수억 원, 수개월
Fine-tuning (우리가 함):
= 회사 입사 후 OJT 1주일
= 이미 대졸인 사람에게 "이 리뷰는 긍정, 이건 부정" 가르침
= 노트북 GPU 1개, 수 시간
OJT에서 대학 교재를 다시 펼치지 않는다. 이미 졸업생 머릿속에 있다. 새 업무 매뉴얼(IMDB)만 보면 된다.
마찬가지로, 파인튜닝에서 Wikipedia를 다시 읽히지 않는다. 이미 DistilBERT의 가중치(66M개 숫자) 안에 "녹아있다". IMDB만 보면서 숫자를 조정한다.
코드로 보면 더 명확하다
from transformers import AutoModelForSequenceClassification
# 1. 베이스 모델 로드 (대학 졸업생 데려오기)
model = AutoModelForSequenceClassification.from_pretrained(
"distilbert-base-uncased", num_labels=2
)
# 이 시점에서 model의 가중치:
# [0.0234, -0.1523, 0.4891, ...] (66M개)
# 영어를 이해하지만, 감정 분류는 못 함
# 2. 파인튜닝 (OJT)
trainer = Trainer(model=model, train_dataset=imdb_train, ...)
trainer.train()
# 이 시점에서 model의 가중치:
# [0.0231, -0.1528, 0.4889, ...] (같은 66M개, 값만 살짝 다름)
# 영어도 이해하고, 감정 분류도 잘 함
# 3. 저장 (내 모델)
trainer.save_model("./my-model")
# → ./my-model/model.safetensors (조정된 66M개 숫자가 저장됨)
model.safetensors 파일 하나가 내 모델의 전부다. 66M개의 숫자가 들어있다. 파인튜닝 전과 후의 차이는 이 숫자들이 살짝 바뀐 것뿐이다.
전체 그림: 내가 파인튜닝한 모델은 어디서 왔나
[1단계 — Pre-training (남이 함, 수개월, 수억 원)]
백지 모델 (66M개 숫자 = 전부 랜덤)
↓ Wikipedia + 인터넷 전체 텍스트로 훈련
DistilBERT (66M개 숫자 = 영어를 이해함)
↓ HuggingFace Hub에 공개
[2단계 — Fine-tuning (내가 함, 수 시간, 노트북)]
DistilBERT 다운로드 (이미 영어를 이해하는 66M개 숫자)
↓ IMDB 25,000개 리뷰로 숫자를 살짝 조정
내 모델 (66M개 숫자 = 영어 이해 + 감정 분류)
↓ 저장 → ./my-model/
[3단계 — Inference (사용)]
pipeline(model="./my-model/")
→ "This movie was great!" → POSITIVE 0.98
"합치기"가 아닌 이유를 수학으로 보면
파인튜닝의 핵심은 gradient descent(경사 하강법)다:
새 가중치 = 기존 가중치 - 학습률 × 기울기
# 극도로 단순화하면:
weight = 0.4891 # 기존 숫자 하나
learning_rate = 0.00001 # 아주 작은 학습률
gradient = 0.23 # "이 숫자를 이 방향으로 바꾸면 정답에 가까워진다"
new_weight = weight - learning_rate * gradient
# = 0.4891 - 0.00001 * 0.23
# = 0.4891 - 0.0000023
# = 0.4890977
# 0.4891 → 0.4890977
# 소수점 다섯째 자리가 바뀌었다. 이게 파인튜닝이다.
이걸 66M개 숫자 × 25,000개 리뷰 × 3번 반복 = 가중치 전체가 "감정 분류에 맞게" 미세하게 조정된다.
합치기가 아니다. 빼기도 아니다. 그냥 0.4891이 0.4890977로 바뀌는 것이다.
그래서 AI에서 "더하기"는 기본적으로 없다
❌ 모델A + 모델B = 모델C (안 됨)
❌ 데이터 → 모델에 주입 (이런 개념이 아님)
✅ 모델의 숫자를 조금씩 조정 (이게 거의 전부)
예외적으로 비슷한 개념:
| 기법 | 뭘 하나 | 더하기? |
|---|---|---|
| 파인튜닝 | 기존 가중치를 조정 | ❌ 조정 |
| LoRA | 작은 어댑터를 모델 옆에 끼움 | △ 플러그인 느낌 |
| RAG | 외부 문서를 프롬프트에 첨부 | △ 참고자료 느낌 |
| 모델 머징 | 두 모델의 가중치를 평균 | ✅ 합치기 (실험적) |
LoRA가 그나마 "더하기"에 가깝다. 베이스 모델(66M, 고정)에 작은 어댑터(1M, 새로 훈련)를 끼워서 쓴다. 근데 이것도 결국 가중치 조정의 효율적인 방법일 뿐이다.
한 줄 요약
파인튜닝 = 0.4891을 0.4890977로 바꾸는 것 × 66,000,000번.
핵심 개념
베이스 모델 다운로드 — 이미 영어를 이해하는 66M개 숫자(가중치)를 가져온다
IMDB 리뷰를 모델에 넣고 예측시킨다 — \"긍정 60%\" → 정답은 \"부정\" → 틀렸다
틀린 만큼 66M개 숫자를 살짝 조정한다 — 0.4891 → 0.4890977 (gradient descent)
25,000번 반복한다 — 감정 분류를 잘하는 모델이 된다
조정된 숫자를 저장한다 — ./my-model/model.safetensors = 내 모델