반응형
남이 미리 공부해 놓은 걸 똑똑하게 활용하는 방법, 그게 전이 학습이다.
전이 학습은 이미 학습된 모델의 지식을 다른 유사한 작업에 적용하는 학습 방법입니다.
쉽게 말해, 이미 거대한 데이터셋(예 : ImageNet)으로 학습된 딥러닝 모델(예 : ResNet, EfficientNet)을 다시 처음부터 학습하지 않고, 그 학습된 가중치나 구조를 새로운 과제에 맞게 재활용합니다.
1. 왜 사용하는가?
기존 딥러닝은 학습을 위해 방대한 데이터와 시간이 필요하지만, 전이 학습은 아래와 같이 이유로 사용됩니다.
1) 데이터가 부족한 경우
- 새로운 문제에 사용할 데이터가 적을 때, 기존 모델의 지식을 활용하면 효과적으로 학습할 수 있음.
2) 학습 시간 단축
- 처음부터 모델을 훈련시키는 데 필요한 시간, 자원을 크게 줄일 수 있음.
3) 성능 향상
- 기존에 잘 훈련된 모델의 일반화 능력을 그대로 가져올 수 있어, 성능이 높아질 가능성이 큼.
2. 전이 학습의 장점은?
항목 | 설명 |
빠른 학습 | 전체 학습보다 훨씬 빠르게 모델 완성 가능 |
적은 데이터로도 성능 확보 | 소량의 데이터로도 높은 정확도 가능 |
리소스 절약 | GPU 비용, 시간 모두 줄일 수 있음 |
일반화 능력 활용 | 대규모 데이터로 사전 학습된 모델의 성능 이점 활용 |
3. 그래서 어디에 쓰이는가?
전위 학습은 거의 모든 딥러닝 분야에서 쓰이지만, 특히 다음과 같은 상황에서 매우 효과적입니다.
1) 이미지 분류
- 기존 ImageNet 사전학습 모델 → 새로운 소규모 이미지 데이터셋 분류
2) 의료 영상 분석
- CT, MRI 데이터는 수집이 어렵고 적은데, 전위 학습으로 좋은 성능 확보 가능
3) 자연어 처리(NLP)
- BERT, GPT 같은 대규모 사전학습 언어 모델을 특정 도메인(QA, 감정 분석 등)에 파인튜닝
4) 음성 인식
- 사전 학습된 음성 모델을 새로운 언어에 적용하거나, 소량의 화자 데이터에 맞게 수정
4. 전이 학습의 방법, 예제 코드
1) Feature Extraction (특징 추출)
- 기존 모델의 가중치는 고정(freeze)하고, 출력층만 새로 학습
- 가장 빠르고 간단한 방식
# 예시 (PyTorch)
for param in model.parameters():
param.requires_grad = False # 모든 레이어 freeze
model.fc = nn.Linear(2048, 10) # 출력층만 새로 학습
2) Fine-Tuning (미세 조정)
- 기존 모델을 기반으로 하되, 일부 레이어는 재학습
- 작은 학습률로 전체 또는 일부 레이어 가중치를 조정
for name, param in model.named_parameters():
if 'layer4' in name: # 마지막 블록만 학습
param.requires_grad = True
else:
param.requires_grad = False
3) PyTorch를 활용한 전위 학습 예제 코드
이미지 분류를 위한 모델을 만들 때 자주 쓰이는 방식입니다.
# 라이브러리 임포트
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torchvision import models
# GPU 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 데이터 전처리 및 로딩 (CIFAR-10 예시)
transform = transforms.Compose([
transforms.Resize(224), # ResNet 입력 크기 맞추기
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
# 사전 학습된 모델 불러오기 (ResNet50)
model = models.resnet50(pretrained=True)
# 전이 학습 설정 (Feature Extraction 방식)
for param in model.parameters():
param.requires_grad = False # 기존 레이어 freeze
# 분류를 위한 최종 출력층 수정
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 10) # CIFAR-10은 10개 클래스
model = model.to(device)
# 손실 함수와 최적화 함수 설정
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.fc.parameters(), lr=0.001)
# 모델 학습
epochs = 5
for epoch in range(epochs):
model.train()
running_loss = 0.0
for images, labels in trainloader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"[Epoch {epoch+1}/{epochs}] Loss: {running_loss:.4f}")
# 정확도 평가
correct = 0
total = 0
model.eval()
with torch.no_grad():
for images, labels in testloader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f"테스트 정확도: {100 * correct / total:.2f}%")
5. 전이 학습 vs 처음부터 학습
항목 | 전이 학습 | 처음부터 학습 |
학습 시간 | 빠름 | 오래 걸림 |
데이터 필요량 | 적음 | 많음 |
일반화 능력 | 높음 | 데이터에 따라 다름 |
적용 범위 | 유사한 작업에 효과적 | 완전히 새로운 문제에 적합 |
6. 실제 사례
- ResNet50 + 의료 이미지 분류 : ImageNet으로 학습된 ResNet을 활용해 폐렴 진단 정확도 향상
- BERT + 감정 분석 : BERT를 기본으로 한국어 리뷰에 맞게 파인튜닝
- YOLOv8 + 스마트팜 : 농작물 병해충 탐지 시, COCO로 학습된 모델을 농업 이미지에 파인튜닝
전이 학습은 딥러닝의 핵심 전략 중 하나입니다.
특히 데이터가 부족하거나 자원이 제한된 환경에서, 기존의 대형 모델이 가진 능력을 효율적으로 활용할 수 있게 합니다.
반응형