Python/Deep Learning

Fine-Tuning을 이용한 모델 성능 개선

임베디드 친구 2026. 1. 15. 20:27
728x90
반응형

Fine-Tuning을 이용한 모델 성능 개선

전이 학습(Transfer Learning)은 기존의 학습된 모델을 새로운 작업에 적용하는 기법으로, 특히 데이터가 부족한 상황에서 강력한 성능을 발휘할 수 있습니다. 전이 학습의 한 방법인 Fine-Tuning(미세 조정)은 기존 모델의 일부 계층을 조정하여 특정 작업에 맞게 성능을 향상시키는 기법입니다. 이번 포스팅에서는 Fine-Tuning의 개념과 원리를 설명하고, TensorFlow 및 PyTorch를 활용한 실전 구현 예제를 다뤄보겠습니다.

1. Fine-Tuning이란?

Fine-Tuning(미세 조정)은 전이 학습의 한 방식으로, 사전 학습된 모델을 새로운 데이터셋에 적합하도록 추가 학습을 수행하는 방법입니다. 보통 다음과 같은 방식으로 진행됩니다:

  1. 사전 학습된 모델 로드: ImageNet과 같은 대규모 데이터셋으로 학습된 모델을 가져옵니다.
  2. 기존 모델의 일부 계층 고정: 일반적으로 초기 계층은 고정하고, 마지막 몇 개의 계층을 조정합니다.
  3. 새로운 출력 계층 추가: 기존 모델의 출력층을 새로운 작업에 맞게 변경합니다.
  4. 모델 미세 조정(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 적용 시 고려할 점

  1. 학습률 설정: 처음에는 추가한 계층만 학습하고, 이후 기존 계층을 조정할 때는 더 낮은 학습률을 설정하는 것이 일반적입니다.
  2. 데이터셋 차이 고려: 사전 학습된 모델이 학습한 데이터와 새로운 데이터의 분포가 다를 경우, 일부 계층을 고정하지 않고 조정하는 것이 유리할 수 있습니다.
  3. 과적합 방지: 데이터가 적은 경우, Dropout이나 데이터 증강(Data Augmentation) 기법을 함께 사용하는 것이 도움이 됩니다.

6. 마무리

Fine-Tuning을 활용하면 사전 학습된 모델을 효과적으로 재사용하여, 제한된 데이터로도 높은 성능을 낼 수 있습니다. TensorFlow와 PyTorch에서 Fine-Tuning을 구현하는 방법을 살펴보았으며, 실제 프로젝트에서 이를 적용하여 성능을 개선할 수 있습니다.

반응형