
전이 학습(Transfer Learning)은 이미 대규모 데이터셋(ImageNet 등)에서 검증된 지식을 새로운 도메인에 이식하는 효율적인 기법입니다. 하지만 많은 개발자들이 범하는 실수는 모델 전체를 한꺼번에 학습시키거나, 반대로 백본(Backbone) 모델을 너무 오래 동결(Freeze)하여 부적응(Underfitting) 혹은 치명적 망각(Catastrophic Forgetting) 문제를 겪는 것입니다. 본 가이드에서는 파이썬(Python) 환경에서 사전 학습된 가중치를 보호하면서도 타겟 데이터에 최적화된 성능을 이끌어내기 위해 특정 레이어를 Freeze하는 최적의 시점을 분석하고, 실무에서 즉시 활용 가능한 7가지 정교한 구현 예시를 제안합니다.
1. 데이터 도메인 유사도에 따른 레이어 Freeze 전략과 차이
학습 시점을 결정하기 전, 현재 다루는 데이터가 사전 학습 데이터와 얼마나 유사한지 파악하는 것이 우선입니다. 유사도가 높을수록 하위 레이어(General Features)는 더 길게 동결해야 합니다.
| 데이터 유사성 | 데이터 규모 | 권장 Freeze 범위 | 학습 시점 및 해결책 |
|---|---|---|---|
| 매우 유사 (예: 풍경 vs 도심) | 적음 | Backbone 전체 동결 | 초기부터 Classifier만 학습 |
| 다소 상이 (예: 일반 사진 vs 의료 영상) | 적음 | 하위 레이어 동결, 상위 해제 | Warm-up 후 점진적 해제 |
| 매우 상이 | 많음 | 초기에만 동결 후 전체 해제 | Fine-tuning 속도 조절 |
| 신규 도메인 특화 | 방대함 | 동결 없이 낮은 LR 적용 | 전체 레이어 미세 조정 |
2. 실무 전이 학습 고도화를 위한 7가지 Freeze 해결 패턴 (Examples)
PyTorch 프레임워크를 기준으로, 실전 프로젝트에서 성능 병목을 해결하기 위해 바로 적용 가능한 레이어 제어 예시입니다.
Example 1: 특정 이름을 포함한 레이어만 선택적으로 Freeze하기
백본의 특정 블록(예: Layer 1, 2)만 동결하고 나머지 레이어의 그래디언트를 활성화하는 해결 방법입니다.
import torch
import torchvision.models as models
model = models.resnet50(pretrained=True)
# 'layer1'과 'layer2'라는 이름이 들어간 레이어만 동결
for name, param in model.named_parameters():
if "layer1" in name or "layer2" in name:
param.requires_grad = False
else:
param.requires_grad = True
print("선택적 레이어 동결 완료.")
Example 2: Classifier만 초기 학습(Warm-up)하는 표준 해결 패턴
사전 학습된 백본의 지식을 해치지 않기 위해, 새로 추가한 FC 레이어만 먼저 학습시키는 시점 조절 방법입니다.
# 1단계: 백본 전체 동결
for param in model.parameters():
param.requires_grad = False
# 2단계: 새로운 분류기 추가 (자동으로 requires_grad=True)
model.fc = torch.nn.Linear(model.fc.in_features, 10)
# 옵티마이저는 requires_grad=True인 파라미터만 관리
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.001)
Example 3: 학습 에포크에 따른 점진적 Unfreeze (Gradual Unfreezing)
학습 초기에는 분류기를 다듬고, 특정 에포크 이후에 백본의 상위 레이어부터 해제하여 수렴 안정성을 해결하는 기법입니다.
def adjust_freeze_status(epoch, model):
if epoch == 10:
print("시점 도달: 상위 블록(layer4) 해제")
for param in model.layer4.parameters():
param.requires_grad = True
# 학습 루프 내부에서 호출하여 사용
Example 4: Differential Learning Rates (레이어별 차등 학습률) 적용
Freeze 대신, 백본에는 아주 낮은 학습률을, 새로운 레이어에는 높은 학습률을 적용하여 정보 소실 문제를 해결합니다.
optimizer = torch.optim.Adam([
{'params': model.layer4.parameters(), 'lr': 1e-5}, # 백본 상위: 미세 조정
{'params': model.fc.parameters(), 'lr': 1e-3} # 분류기: 적극 학습
], lr=1e-4)
Example 5: BatchNorm 레이어의 Freeze 주의사항 해결
배치 정규화 층은 학습 모드(train)일 때 통계량을 업데이트하므로, Freeze 시 model.eval() 상태를 유지하는 것이 중요합니다.
def freeze_bn(m):
if isinstance(m, torch.nn.BatchNorm2d):
m.eval() # 통계량 업데이트 방지
for param in m.parameters():
param.requires_grad = False
model.apply(freeze_bn)
Example 6: 미세 조정(Fine-tuning)을 위한 모델 상태 모니터링
어떤 파라미터가 현재 학습 가능한 상태인지 시각적으로 확인하여 실수로 인한 성능 저하를 방지하는 도구입니다.
def check_trainable_params(model):
trainable = 0
fixed = 0
for param in model.parameters():
if param.requires_grad:
trainable += param.numel()
else:
fixed += param.numel()
print(f"학습 가능 파라미터: {trainable}, 동결 파라미터: {fixed}")
check_trainable_params(model)
Example 7: 중간 레이어의 Feature Map 추출을 위한 고정 패턴
학습은 하지 않되, 고정된 특징 추출기(Feature Extractor)로서 특정 레이어의 결과값만 가져오는 해결 방법입니다.
activation = {}
def get_activation(name):
def hook(model, input, output):
activation[name] = output.detach()
return hook
model.layer3[0].register_forward_hook(get_activation('layer3_feat'))
# 이제 forward 이후 activation['layer3_feat']에 고정된 특징이 저장됨
3. Freeze 시점 결정을 위한 3가지 황금률
- 초기 5~10 에포크: 무조건 백본을 Freeze하고 새로운 분류기(Head)의 손실값을 안정화시키십시오. 초기 그래디언트의 큰 변동성은 백본의 유용한 지식을 파괴합니다.
- 성능 정체기(Plateau): 검증 손실(Validation Loss)이 더 이상 줄어들지 않을 때 상위 레이어부터 순차적으로 Unfreeze를 고려하십시오.
- 데이터셋 크기 고려: 데이터가 1,000장 미만으로 매우 적다면 학습 끝까지 백본을 Freeze 상태로 유지하는 것이 오버피팅을 막는 해결책입니다.
4. 결론 및 전문 지식 출처
전이 학습에서 레이어를 동결하는 행위는 단순히 연산량을 줄이는 것이 아니라, 사전 학습된 특징(Feature)의 위계 구조를 보존하는 전략입니다. 하위 레이어일수록 선, 점, 면과 같은 일반적인 정보를 담고 있으므로 동결을 길게 유지하고, 상위 레이어일수록 도메인 특화된 정보를 담으므로 미세 조정을 적용하는 지혜가 필요합니다.
전문 자료 출처:
- Yosinski et al., "How transferable are features in deep neural networks?", NIPS 2014.
- Howard & Ruder, "Universal Language Model Fine-tuning for Text Classification", ACL 2018 (Gradual Unfreezing 기법 제안).
- PyTorch Official Documentation: "Transfer Learning for Computer Vision Tutorial" (2026 Edition).
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] Learning Rate Scheduler 선택 전략 2가지 : Cosine Annealing과 OneCycleLR의 차이 및 해결 방법 (0) | 2026.04.18 |
|---|---|
| [PYTHON] 모델 저장 방식 2가지 : state_dict와 전체 저장의 차이 및 해결 방법 (0) | 2026.04.18 |
| [PYTHON] 커스텀 Optimizer 구현 시 하이퍼파라미터 관리 방법 7가지와 구조적 해결책 (0) | 2026.04.18 |
| [PYTHON] Transformer Attention Masking 구현 방법 3가지와 성능 병목 해결책 7가지 (0) | 2026.04.18 |
| [PYTHON] CNN Receptive Field 수동 계산 방법 1가지와 아키텍처 튜닝 해결책 7가지 (0) | 2026.04.18 |