C.W.K.
Stream
Lesson 03 of 08 · published

Transfer Learning vs Fine-Tuning

~16 min · transfer, fine-tune, freezing

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

3 escalating commitment

Frozen feature extractor — backbone frozen, new head 만 train. 싸고, 빠르고, small dataset 에 자주 surprisingly competitive. 항상 첫 시도.

Partial fine-tuning — head + 마지막 몇 layer unfreeze, early layer freeze. Small data 의 capacity 와 overfitting risk 사이 compromise.

Full fine-tuning — 모든 parameter train. 가장 높은 accuracy ceiling, 가장 높은 compute 비용, 가장 큰 overfitting risk. From-scratch training 보다 훨씬 낮은 learning rate (1e-5 또는 1e-6) 사용.

팁: 항상 frozen baseline 먼저 돌려. 그 숫자가 더 비싼 approach 가 이겨야 할 floor. 많은 production project 가 frozen baseline 으로 ship — fully fine-tuned 까지의 gap 이 engineering 비용 가치 없어서.

Discriminative learning rate trick

New head (random 시작, update 더 필요) 에 더 높은 learning rate, pretrained backbone (이미 좋고 큰 update 가 손상) 에 더 낮은 learning rate. 흔한 비율: 10x ~ 100x.

Fine-tuning 이 해칠 때

Small dataset + full fine-tune = overfitting paradise. Pretrained backbone 100M+ parameter, dataset 1000 example — model 이 10 epoch 만에 외우고 test set 에서 degrade. Frozen 머무르거나, 강한 augmentation 쓰거나, gradually escalate.

원칙: Fine-tuning 은 항상 올바른 escalation 순서: frozen → partial → full. 'Default lr 의 full fine-tune' 으로 바로 건너뛰는 게 본인 dataset 이 너무 작다는 걸 painful way 로 발견하는 방식.

Code

Frozen, partial, and full fine-tune in one file·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

같은 small dataset 에 모든 3 configuration train: frozen, partial unfreeze, full fine-tune. Validation accuracy 와 training time 비교. 어디서 diminishing returns 나오는지 봐.

Progress

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

댓글 0

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

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