🤖 AI/ML

Transfer Learning

전이 학습

사전 학습된 모델을 새로운 작업에 적용하는 기법. 적은 데이터와 비용으로 높은 성능을 달성합니다.

📖 상세 설명

Transfer Learning(전이 학습)은 한 도메인에서 학습한 지식을 다른 도메인이나 작업에 적용하는 기법입니다. 대규모 데이터셋으로 사전 학습(Pre-training)된 모델의 가중치를 가져와 새로운 작업에 맞게 미세 조정(Fine-tuning)함으로써, 적은 데이터와 계산 비용으로 높은 성능을 달성할 수 있습니다.

Transfer Learning의 개념은 1990년대부터 연구되었지만, 2012년 AlexNet이 ImageNet에서 혁신적 성능을 보인 이후 본격적으로 주목받았습니다. 이후 NLP 분야에서 2018년 BERT, GPT가 등장하며 "Pre-train then Fine-tune" 패러다임이 AI 개발의 표준이 되었습니다.

기술적으로 Transfer Learning은 모델의 하위 레이어(일반적 특징 추출)는 동결(freeze)하고, 상위 레이어(작업별 특징)만 학습하는 방식으로 진행됩니다. 예를 들어 ImageNet으로 학습된 CNN은 이미지의 엣지, 텍스처 같은 범용 특징을 이미 알고 있어, 의료 영상 분류 같은 새 작업에 빠르게 적응합니다.

실무에서 Transfer Learning은 데이터가 부족하거나 학습 비용이 제한된 상황에서 필수입니다. Hugging Face에서 제공하는 수천 개의 Pre-trained 모델을 활용하면, 수백만 달러의 학습 비용을 들이지 않고도 GPT-4 수준의 모델을 특정 도메인에 맞춤화할 수 있습니다.

💻 코드 예제

Hugging Face Transformers를 사용한 BERT Transfer Learning 예제입니다.

from transformers import (
    AutoTokenizer,
    AutoModelForSequenceClassification,
    TrainingArguments,
    Trainer
)
from datasets import load_dataset
import numpy as np
from sklearn.metrics import accuracy_score

# 1. 사전 학습된 모델과 토크나이저 로드
model_name = "klue/bert-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 분류 작업을 위한 헤드 추가 (2개 클래스: 긍정/부정)
model = AutoModelForSequenceClassification.from_pretrained(
    model_name,
    num_labels=2
)

# 2. 하위 레이어 동결 (선택적)
for param in model.bert.embeddings.parameters():
    param.requires_grad = False
for layer in model.bert.encoder.layer[:6]:  # 하위 6개 레이어 동결
    for param in layer.parameters():
        param.requires_grad = False

# 3. 데이터셋 준비 (한국어 감성 분석)
dataset = load_dataset("nsmc")

def tokenize_function(examples):
    return tokenizer(
        examples["document"],
        padding="max_length",
        truncation=True,
        max_length=128
    )

tokenized_datasets = dataset.map(tokenize_function, batched=True)

# 4. 훈련 설정
training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    learning_rate=2e-5,  # Fine-tuning은 낮은 LR 사용
    warmup_steps=500,
    weight_decay=0.01,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
)

def compute_metrics(eval_pred):
    predictions, labels = eval_pred
    predictions = np.argmax(predictions, axis=1)
    return {"accuracy": accuracy_score(labels, predictions)}

# 5. Trainer로 Fine-tuning
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
    compute_metrics=compute_metrics,
)

trainer.train()
print("Transfer Learning 완료! 모델 저장 중...")
trainer.save_model("./my-sentiment-model")

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

💬 회의에서
"의료 텍스트 데이터가 5천 건밖에 없어서, BERT를 Transfer Learning해서 쓰려고 합니다. 처음부터 학습하는 것보다 정확도가 15% 이상 높을 것으로 예상돼요."
💬 면접에서
"도메인 특화 모델을 만들 때 Transfer Learning을 활용했습니다. 금융 문서 분류에 KoELECTRA를 Fine-tuning해서 F1 스코어 92%를 달성했습니다."
💬 기술 토론에서
"소스 도메인과 타겟 도메인의 차이가 크면 Negative Transfer가 발생할 수 있어요. 도메인 적응(Domain Adaptation) 기법을 함께 고려해보세요."

⚠️ 흔한 실수 & 주의사항

Learning Rate가 너무 높음

Fine-tuning 시 높은 LR을 사용하면 사전 학습된 지식이 파괴됩니다. 일반적으로 1e-5 ~ 5e-5를 사용하세요.

무관한 사전 학습 모델 선택

영어 모델을 한국어 작업에 사용하면 성능이 떨어집니다. 타겟 도메인과 유사한 데이터로 학습된 모델을 선택하세요.

올바른 방법

도메인에 맞는 Pre-trained 모델 선택, 점진적 언프리징(Gradual Unfreezing), 레이어별 차등 LR 적용을 고려하세요.

🔗 관련 용어

📚 더 배우기