C.W.K.
Stream
Lesson 01 of 06 · published

Transfer Learning 이 실제로 뭐냐

~12 min · transfer, feature-extraction, fine-tuning

Level 0Tensor 호기심
0 XP0/62 lessons0/13 achievements
0/120 XP to next level120 XP to go0% complete

처음부터 시작 안 해도 됨 — 보통 안 해야

거대 dataset (vision 의 ImageNet, text 의 Common Crawl) 에 pretrained 된 model 이 generalize 하는 representation 학습. 너 specific task 에 적응하는 게 — 거의 항상 — 너 (훨씬 작은) dataset 에 fresh model train 하는 것 이김, task 가 무관해 보여도.

두 극단, 그리고 중간

  • Feature extraction — 전체 pretrained model freeze, 새 head 만 train. 싸고 빠르고 data 적게 필요. task 가 pretraining task 와 '충분히 가까울' 때 잘 작동.
  • Full fine-tuning — 다 unfreeze, 작은 lr 로 전체 model 을 너 data 에 train. best result, data 와 care 더 필요. 진지한 작업의 표준.
  • Partial fine-tuning — 이른 layer (generic feature 학습) freeze, 나중 layer (task-specific feature 학습) unfreeze. 실용적 중간.

큰 modern 추가: parameter-efficient fine-tuning

거대 model (BERT-large, Llama, ViT-Huge) 위, full fine-tuning 도 비싸 — 수십억 parameter update 필요. LoRA (Low-Rank Adaptation) 와 친구들이 frozen weight 옆에 작은 trainable matrix 주입, parameter 의 0.1-1% 만 train 하면서 full fine-tune 품질. 나중 lesson 에 LoRA 다룰 거; 지금은 존재하고 economics 바꿈만 알아둬.

torchvision weights API — modern

models.resnet50(pretrained=True) 는 deprecated. modern 호출은 models.resnet50(weights=ResNet50_Weights.IMAGENET1K_V2). 새 API 가 versioned weight AND weights.transforms() — model 이 train 됐던 정확한 preprocessing — 줘. 항상 사용.

Code

Feature extraction — backbone freeze, head train·python
import torch
import torch.nn as nn
from torchvision.models import resnet50, ResNet50_Weights

model = resnet50(weights=ResNet50_Weights.IMAGENET1K_V2)

# Freeze the entire pretrained model
for p in model.parameters():
    p.requires_grad = False

# Replace the final classifier — new layer is trainable by default
num_classes = 5
model.fc = nn.Linear(model.fc.in_features, num_classes)

trainable = sum(p.numel() for p in model.parameters() if p.requires_grad)
total = sum(p.numel() for p in model.parameters())
print(f"trainable: {trainable:,} / {total:,} ({trainable/total*100:.2f}%)")
# trainable: 10,245 / 25,567,037 (0.04%)
Partial fine-tune — 나중 layer unfreeze·python
import torch.nn as nn
from torchvision.models import resnet50, ResNet50_Weights

model = resnet50(weights=ResNet50_Weights.IMAGENET1K_V2)

# Freeze everything
for p in model.parameters():
    p.requires_grad = False

# Replace head + unfreeze layer4 (the deepest backbone block)
model.fc = nn.Linear(model.fc.in_features, 5)
for p in model.layer4.parameters():
    p.requires_grad = True

# Per-group learning rate — backbone gets smaller LR
import torch.optim as optim
optimizer = optim.AdamW([
    {'params': model.layer4.parameters(), 'lr': 1e-5},
    {'params': model.fc.parameters(),     'lr': 1e-3},
], weight_decay=0.01)
model-specific transform 이 weight 에서 옴·python
from torchvision.models import resnet50, ResNet50_Weights

weights = ResNet50_Weights.IMAGENET1K_V2

# This is the EXACT preprocessing the model was pretrained with
preprocess = weights.transforms()
print(preprocess)
# ImageClassification(
#     crop_size=[224]
#     resize_size=[232]
#     mean=[0.485, 0.456, 0.406]
#     std=[0.229, 0.224, 0.225]
#     interpolation=InterpolationMode.BILINEAR
# )

# Pass it to your DataLoader transform pipeline. No more hard-coded means.

External links

Exercise

torchvision model (resnet18 빠름) 잡기. freeze, 5 class 위 final layer 교체. trainable parameter count vs total print. 그 다음 layer4 도 unfreeze 하고 다시 print. 두 숫자가 feature extraction 과 partial fine-tuning 차이 한눈에 알려줌.

Progress

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

댓글 0

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

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