🤖 AI/ML

전이 학습

Transfer Learning

사전 학습된 모델을 새 작업에 적용하는 기법. 적은 데이터로 높은 성능. 파인튜닝의 기반.

📖 상세 설명

전이 학습(Transfer Learning)은 한 도메인에서 학습된 지식을 다른 관련 도메인의 문제 해결에 활용하는 머신러닝 기법입니다. 대규모 데이터셋으로 사전 학습된 모델의 가중치를 새로운 작업에 재사용함으로써, 적은 데이터로도 높은 성능을 달성할 수 있습니다. 현대 딥러닝의 핵심 패러다임으로, GPT, BERT, ResNet 등 거의 모든 최신 AI 모델이 전이 학습을 기반으로 합니다.

전이 학습의 핵심 원리는 저수준 특징의 범용성입니다. 이미지 모델의 초기 레이어는 엣지, 텍스처 같은 범용 특징을 학습하고, 언어 모델은 문법과 의미 구조를 학습합니다. 이러한 범용 지식은 새로운 작업에도 유용하며, 최종 레이어만 교체하거나 전체를 미세조정(Fine-tuning)하여 특정 작업에 적응시킵니다.

전이 학습의 주요 방식은 세 가지입니다: (1) Feature Extraction - 사전학습 모델을 고정하고 최종 분류 레이어만 학습, (2) Fine-tuning - 사전학습 가중치를 초기값으로 전체 모델을 낮은 학습률로 재학습, (3) Domain Adaptation - 소스 도메인과 타겟 도메인의 분포 차이를 줄이는 기법. 데이터가 적을수록 Feature Extraction이, 충분하면 Fine-tuning이 효과적입니다.

2025년 현재, 전이 학습은 Foundation Model 시대의 기본 전략입니다. GPT-4, Claude, Gemini 같은 LLM은 수조 토큰으로 사전학습된 후 특정 도메인에 파인튜닝됩니다. LoRA, QLoRA 같은 효율적 파인튜닝 기법이 발전하면서, 소규모 조직도 대형 모델을 자사 데이터에 적응시킬 수 있게 되었습니다. 훈련 비용을 90% 이상 절감하면서도 scratch 학습 대비 성능이 우수합니다.

💻 코드 예제

PyTorch를 사용한 전이 학습 (ResNet → 커스텀 분류기):

import torch
import torch.nn as nn
from torchvision import models
from transformers import AutoModel, AutoTokenizer

# 방법 1: 이미지 분류 - ResNet 전이 학습
def create_transfer_model(num_classes, freeze_backbone=True):
    """
    ResNet50 사전학습 모델을 커스텀 분류기로 전이
    """
    # 사전학습된 가중치 로드
    model = models.resnet50(weights='IMAGENET1K_V2')

    # Feature Extraction: backbone 동결
    if freeze_backbone:
        for param in model.parameters():
            param.requires_grad = False

    # 최종 분류 레이어 교체
    num_features = model.fc.in_features
    model.fc = nn.Sequential(
        nn.Dropout(0.3),
        nn.Linear(num_features, 256),
        nn.ReLU(),
        nn.Linear(256, num_classes)
    )
    return model

# 방법 2: NLP - BERT Fine-tuning
class BertClassifier(nn.Module):
    def __init__(self, num_classes):
        super().__init__()
        self.bert = AutoModel.from_pretrained('bert-base-multilingual-cased')
        self.classifier = nn.Linear(768, num_classes)

    def forward(self, input_ids, attention_mask):
        outputs = self.bert(input_ids, attention_mask=attention_mask)
        pooled = outputs.last_hidden_state[:, 0]  # [CLS] 토큰
        return self.classifier(pooled)

# 방법 3: LoRA 효율적 파인튜닝 (2024년 표준)
from peft import LoraConfig, get_peft_model

def apply_lora_finetuning(model):
    """대형 LLM을 0.1%의 파라미터만으로 파인튜닝"""
    lora_config = LoraConfig(
        r=8,              # Low-rank 차원
        lora_alpha=16,    # 스케일링 팩터
        target_modules=["q_proj", "v_proj"],
        lora_dropout=0.1
    )
    return get_peft_model(model, lora_config)

📊 성능 & 비용

학습 방식 필요 데이터 학습 시간 GPU 비용 (예시)
Scratch 학습 100만+ 샘플 100% (기준) $10,000+
Feature Extraction 1,000-10,000 샘플 1-5% $10-50
Full Fine-tuning 10,000-100,000 샘플 5-15% $50-500
LoRA Fine-tuning 1,000-10,000 샘플 1-3% $10-100
Prompt Tuning 100-1,000 샘플 0.1-1% $1-10

※ 비용은 클라우드 GPU(A100 기준) 예상치이며, 모델 크기와 데이터에 따라 변동

🗣️ 실무에서 이렇게 말하세요

💬 프로젝트 기획에서
"데이터가 5천 건밖에 없으니 scratch 학습은 무리입니다. BERT-base를 가져와서 파인튜닝하면 2주 안에 90% 이상 정확도를 달성할 수 있어요."
💬 모델 리뷰에서
"LLM 파인튜닝에 LoRA를 적용했습니다. 전체 파라미터의 0.1%만 학습해서 메모리 사용량을 80% 줄였고, A100 1장으로도 7B 모델 학습이 가능해졌습니다."
💬 면접에서
"전이 학습은 소스 도메인의 지식을 타겟 도메인에 전달하는 기법입니다. Negative Transfer를 방지하려면 도메인 유사성을 평가하고, 적절한 학습률과 동결 전략을 선택해야 합니다."

⚠️ 흔한 실수 & 주의사항

높은 학습률로 파인튜닝

사전학습 가중치가 급격히 변하면 "catastrophic forgetting"이 발생합니다. 파인튜닝 시 학습률은 사전학습의 1/10 이하로 설정하세요.

도메인 불일치 무시

ImageNet 모델을 의료 이미지에 바로 적용하면 성능이 떨어집니다. 도메인 특화 사전학습 모델(예: MedCLIP)을 우선 검토하세요.

라이선스 확인 누락

일부 사전학습 모델은 상업적 사용에 제한이 있습니다. Llama 2, Mistral 등의 라이선스 조건을 반드시 확인하세요.

올바른 접근법

데이터가 적으면 Feature Extraction부터, 충분하면 점진적 언프리징으로 파인튜닝하세요. 항상 검증 세트로 과적합을 모니터링합니다.

🔗 관련 용어

📚 더 배우기