본문 바로가기
C.W.K.
Stream
Lesson 03 of 08 · published

전이 학습 vs 미세 조정

~16 min · transfer, fine-tune, freezing

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

학습 범위를 넓히는 3단계

동결된 특징 추출기: 백본은 동결하고 새 헤드만 학습해. 비용이 적게 들고 빠르며, 작은 데이터셋에서도 기대 이상으로 좋은 성능을 내는 경우가 많아. 항상 이 방법부터 시도해.

부분 미세 조정: 헤드와 마지막 몇 개 층만 동결 해제하고 앞쪽 층은 동결해. 작은 데이터에서 모델의 학습 여력과 과적합 위험 사이에서 균형을 잡는 방법이야.

전체 미세 조정: 모든 매개변수를 학습해. 정확도 상한이 가장 높지만 연산 비용도 가장 크고 과적합 위험도 가장 커. 처음부터 학습할 때보다 훨씬 낮은 학습률인 1e-5 또는 1e-6을 사용해.

팁: 항상 동결된 기준선부터 돌려. 더 비싼 방법이라면 적어도 이 기준선보다 나은 결과를 내야 해. 완전히 미세 조정했을 때 얻는 성능 향상이 추가 엔지니어링 비용만큼 크지 않아서, 동결된 기준선 모델을 그대로 배포하는 운영 프로젝트도 많아.

차등 학습률 요령

무작위 상태에서 시작해 더 많은 갱신이 필요한 새 헤드에는 높은 학습률을 적용하고, 이미 잘 학습되어 있어 큰 갱신으로 성능이 손상될 수 있는 사전학습 백본에는 낮은 학습률을 적용해. 흔히 쓰는 비율은 10x ~ 100x야.

미세 조정이 오히려 해가 될 때

작은 데이터셋에 전체 미세 조정을 적용하면 과적합하기 딱 좋아. 사전학습 백본은 100M+ 매개변수인데 데이터셋에는 1000개 예시만 있다면, 모델이 10에폭 만에 데이터를 외우고 테스트 세트 성능은 떨어질 수 있어. 백본을 동결한 채로 학습하거나, 강한 데이터 증강을 사용하거나, 동결 해제 범위를 점진적으로 넓혀.

원칙: 미세 조정은 항상 동결된 모델 → 부분 미세 조정 → 전체 미세 조정 순서로 범위를 넓혀야 해. 기본 학습률로 전체 미세 조정부터 시작하면, 데이터셋이 너무 작다는 사실을 가장 고통스럽게 확인하게 돼.

Code

한 파일로 보는 동결·부분·전체 미세 조정·python
import torch.nn as nn
import torchvision.models as tvm
from torchvision.models import ResNet50_Weights

backbone = tvm.resnet50(weights=ResNet50_Weights.IMAGENET1K_V2)

def freeze_all(model):
    for p in model.parameters(): p.requires_grad = False

def freeze_except(model, prefixes):
    for name, p in model.named_parameters():
        p.requires_grad = any(name.startswith(prefix) for prefix in prefixes)

# (1) Frozen feature extractor
freeze_all(backbone)
backbone.fc = nn.Linear(backbone.fc.in_features, 7)

# (2) Partial: only last block + head trainable
freeze_except(backbone, prefixes=["layer4", "fc"])

# (3) Full fine-tune with discriminative lr
for p in backbone.parameters(): p.requires_grad = True
opt = torch.optim.AdamW([
    {"params": [p for n, p in backbone.named_parameters() if not n.startswith("fc.")],
     "lr": 1e-5},
    {"params": [p for n, p in backbone.named_parameters() if n.startswith("fc.")],
     "lr": 1e-3},
])

External links

Exercise

같은 작은 데이터셋으로 3가지 구성을 모두 학습해 봐. 백본을 동결한 구성, 일부 층만 동결 해제한 구성, 전체를 미세 조정한 구성을 각각 학습한 뒤 검증 정확도와 학습 시간을 비교해. 어느 지점부터 추가 비용에 비해 성능 향상이 줄어드는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.