Fine-Tuning을 이용한 모델 성능 개선
전이 학습(Transfer Learning)은 기존의 학습된 모델을 새로운 작업에 적용하는 기법으로, 특히 데이터가 부족한 상황에서 강력한 성능을 발휘할 수 있습니다. 전이 학습의 한 방법인 Fine-Tuning(미세 조정)은 기존 모델의 일부 계층을 조정하여 특정 작업에 맞게 성능을 향상시키는 기법입니다. 이번 포스팅에서는 Fine-Tuning의 개념과 원리를 설명하고, TensorFlow 및 PyTorch를 활용한 실전 구현 예제를 다뤄보겠습니다.
1. Fine-Tuning이란?
Fine-Tuning(미세 조정)은 전이 학습의 한 방식으로, 사전 학습된 모델을 새로운 데이터셋에 적합하도록 추가 학습을 수행하는 방법입니다. 보통 다음과 같은 방식으로 진행됩니다:
- 사전 학습된 모델 로드: ImageNet과 같은 대규모 데이터셋으로 학습된 모델을 가져옵니다.
- 기존 모델의 일부 계층 고정: 일반적으로 초기 계층은 고정하고, 마지막 몇 개의 계층을 조정합니다.
- 새로운 출력 계층 추가: 기존 모델의 출력층을 새로운 작업에 맞게 변경합니다.
- 모델 미세 조정(Fine-Tuning) 수행: 새롭게 추가한 계층과 일부 기존 계층을 함께 학습합니다.
이러한 접근 방식은 모델이 이미 학습한 일반적인 특징을 유지하면서, 새로운 데이터에 대한 적응력을 높이는 데 도움을 줍니다.
2. Fine-Tuning의 장점
- 적은 데이터로도 높은 성능: 데이터가 충분하지 않은 경우에도 좋은 성능을 발휘할 수 있습니다.
- 학습 시간 단축: 처음부터 모델을 학습하는 것보다 훨씬 적은 시간으로 훈련이 가능합니다.
- 일반화 성능 향상: 기존 모델이 학습한 일반적인 특성을 활용하여 과적합을 방지할 수 있습니다.
3. TensorFlow를 활용한 Fine-Tuning 구현
TensorFlow의 tf.keras를 활용하여 Fine-Tuning을 수행하는 방법을 알아보겠습니다. 여기서는 사전 학습된 ResNet50 모델을 사용하여 새로운 데이터셋에 적응시키는 과정을 설명합니다.
3.1. 사전 학습된 모델 로드 및 일부 계층 고정
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# 사전 학습된 ResNet50 모델 로드 (가중치는 ImageNet 기반)
base_model = keras.applications.ResNet50(weights='imagenet', include_top=False)
base_model.trainable = False # 기본 모델의 가중치를 고정
# 새로운 출력 계층 추가
inputs = keras.Input(shape=(224, 224, 3))
x = base_model(inputs, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(128, activation='relu')(x)
outputs = layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs, outputs)
3.2. 새롭게 추가한 계층 학습
먼저 추가한 출력 계층을 학습하고, 이후 일부 기존 계층을 함께 미세 조정합니다.
# 모델 컴파일
model.compile(optimizer=keras.optimizers.Adam(),
loss='categorical_crossentropy',
metrics=['accuracy'])
# 데이터셋 로드 및 학습 수행
train_dataset = ... # 적절한 데이터셋 로드
val_dataset = ...
model.fit(train_dataset, validation_data=val_dataset, epochs=10)
3.3. 모델의 일부 계층을 해제하고 Fine-Tuning 수행
일반적으로 마지막 몇 개의 계층을 학습할 수 있도록 설정합니다.
# 특정 계층부터 학습 가능하도록 설정
base_model.trainable = True
for layer in base_model.layers[:100]: # 처음 100개의 계층은 고정
layer.trainable = False
# 다시 컴파일 및 학습 수행
model.compile(optimizer=keras.optimizers.Adam(learning_rate=1e-5),
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_dataset, validation_data=val_dataset, epochs=10)
이제 모델이 새로운 데이터셋에 더 적합한 특징을 학습할 수 있도록 조정되었습니다.
4. PyTorch를 활용한 Fine-Tuning 구현
PyTorch에서도 동일한 방식으로 사전 학습된 모델을 불러와 Fine-Tuning을 수행할 수 있습니다.
4.1. 사전 학습된 모델 로드 및 일부 계층 고정
import torch
import torch.nn as nn
import torchvision.models as models
# 사전 학습된 ResNet50 모델 불러오기
model = models.resnet50(pretrained=True)
# 특정 계층 고정
for param in model.parameters():
param.requires_grad = False
# 새로운 출력 계층 추가
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10) # 예제에서는 10개의 클래스 분류
4.2. 미세 조정 수행
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-4)
criterion = nn.CrossEntropyLoss()
# 학습 루프
for epoch in range(10):
for images, labels in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
이후 일부 기존 계층을 해제하고, 전체 모델을 미세 조정할 수도 있습니다.
# 일부 계층을 학습 가능하게 변경
for param in model.layer4.parameters(): # ResNet의 마지막 블록
param.requires_grad = True
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
# 추가 학습 수행
for epoch in range(10):
for images, labels in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
5. Fine-Tuning 적용 시 고려할 점
- 학습률 설정: 처음에는 추가한 계층만 학습하고, 이후 기존 계층을 조정할 때는 더 낮은 학습률을 설정하는 것이 일반적입니다.
- 데이터셋 차이 고려: 사전 학습된 모델이 학습한 데이터와 새로운 데이터의 분포가 다를 경우, 일부 계층을 고정하지 않고 조정하는 것이 유리할 수 있습니다.
- 과적합 방지: 데이터가 적은 경우, Dropout이나 데이터 증강(Data Augmentation) 기법을 함께 사용하는 것이 도움이 됩니다.
6. 마무리
Fine-Tuning을 활용하면 사전 학습된 모델을 효과적으로 재사용하여, 제한된 데이터로도 높은 성능을 낼 수 있습니다. TensorFlow와 PyTorch에서 Fine-Tuning을 구현하는 방법을 살펴보았으며, 실제 프로젝트에서 이를 적용하여 성능을 개선할 수 있습니다.
'Python > Deep Learning' 카테고리의 다른 글
| 강화 학습(Reinforcement Learning)이란? 기초 개념 정리 (0) | 2026.01.19 |
|---|---|
| 전이 학습을 활용한 스타일 변환(Style Transfer) (1) | 2026.01.18 |
| 사전 학습 모델을 활용한 이미지 분류 (0) | 2026.01.14 |
| 사전 학습된 모델(VGG, ResNet, EfficientNet) 활용법 (1) | 2026.01.13 |
| 전이 학습(Transfer Learning)의 개념과 필요성 (0) | 2026.01.12 |