🤖 AI/ML

모델

Model

학습된 머신러닝 알고리즘. 입력에서 출력을 예측. 훈련, 검증, 테스트 단계를 거쳐 개발.

📖 상세 설명

머신러닝에서 모델(Model)은 데이터로부터 학습된 패턴을 캡슐화한 수학적 표현입니다. 입력 데이터를 받아 예측, 분류, 생성 등의 출력을 만들어내는 함수로 볼 수 있습니다. 선형 회귀부터 트랜스포머까지 다양한 아키텍처가 있으며, 문제에 맞는 적절한 모델 선택이 성공의 첫걸음입니다.

모델 개발은 일반적으로 세 단계를 거칩니다: 1) 훈련(Training) - 학습 데이터로 모델 파라미터를 최적화, 2) 검증(Validation) - 하이퍼파라미터 튜닝과 과적합 모니터링, 3) 테스트(Test) - 보지 않은 데이터로 최종 성능 평가. 이 과정에서 데이터를 적절히 분할하는 것이 중요합니다.

모델의 복잡도는 편향-분산 트레이드오프(Bias-Variance Tradeoff)와 직결됩니다. 너무 단순한 모델은 언더피팅(과소적합), 너무 복잡한 모델은 오버피팅(과적합)을 일으킵니다. 정규화, 드롭아웃, 조기 종료 등의 기법으로 이를 조절합니다.

최근에는 사전 학습된 대형 모델(Foundation Models)을 파인튜닝하여 사용하는 패러다임이 주류가 되었습니다. GPT, BERT, ResNet 등을 기반으로 특정 태스크에 맞게 조정하면 적은 데이터로도 높은 성능을 얻을 수 있습니다.

💻 코드 예제

PyTorch를 사용한 모델 정의, 훈련, 평가의 전체 파이프라인입니다:

import torch
import torch.nn as nn
from torch.optim import Adam
from torch.utils.data import DataLoader, TensorDataset
from sklearn.model_selection import train_test_split

# 1. 모델 정의
class ClassificationModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_classes):
        super().__init__()
        self.model = nn.Sequential(
            nn.Linear(input_dim, hidden_dim),
            nn.BatchNorm1d(hidden_dim),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(hidden_dim, hidden_dim // 2),
            nn.ReLU(),
            nn.Linear(hidden_dim // 2, num_classes)
        )

    def forward(self, x):
        return self.model(x)

# 2. 데이터 분할 (Train/Val/Test)
def prepare_data(X, y, val_ratio=0.15, test_ratio=0.15):
    X_temp, X_test, y_temp, y_test = train_test_split(
        X, y, test_size=test_ratio, stratify=y, random_state=42
    )
    X_train, X_val, y_train, y_val = train_test_split(
        X_temp, y_temp, test_size=val_ratio/(1-test_ratio),
        stratify=y_temp, random_state=42
    )
    return (X_train, y_train), (X_val, y_val), (X_test, y_test)

# 3. 학습 루프
def train_model(model, train_loader, val_loader, epochs=100, lr=1e-3):
    optimizer = Adam(model.parameters(), lr=lr)
    criterion = nn.CrossEntropyLoss()
    best_val_acc = 0

    for epoch in range(epochs):
        # Training
        model.train()
        for X_batch, y_batch in train_loader:
            pred = model(X_batch)
            loss = criterion(pred, y_batch)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        # Validation
        model.eval()
        correct = total = 0
        with torch.no_grad():
            for X_batch, y_batch in val_loader:
                pred = model(X_batch).argmax(dim=1)
                correct += (pred == y_batch).sum().item()
                total += len(y_batch)

        val_acc = correct / total
        if val_acc > best_val_acc:
            best_val_acc = val_acc
            torch.save(model.state_dict(), 'best_model.pt')

        if (epoch + 1) % 10 == 0:
            print(f"Epoch {epoch+1}: Val Acc = {val_acc:.4f}")

    return best_val_acc

# 사용 예시
model = ClassificationModel(input_dim=128, hidden_dim=256, num_classes=10)
print(f"모델 파라미터 수: {sum(p.numel() for p in model.parameters()):,}")

📊 성능 & 비용

모델 유형 파라미터 수 학습 시간 추론 속도
Linear Regression ~100 수초 <1ms
Random Forest ~100K 수분 ~10ms
ResNet-50 25M 수시간 (GPU) ~20ms
BERT-base 110M 수일 (Multi-GPU) ~50ms
GPT-4 ~1.7T (추정) 수개월 (클러스터) ~100ms/토큰

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

"베이스라인 모델로 간단한 걸 먼저 만들고, 점진적으로 복잡도를 높여봅시다."
프로젝트 시작 시 검증된 접근법을 제안할 때 사용합니다.

"검증 세트 성능이 정체되기 시작했으니 Early Stopping 적용해볼게요."
과적합을 방지하기 위한 학습 종료 시점을 논의할 때 씁니다.

"이 모델은 프로덕션에 배포하기엔 레이턴시가 너무 높아요. 경량화가 필요합니다."
서비스 요구사항과 모델 복잡도 간 트레이드오프를 설명할 때 활용합니다.

⚠️ 흔한 실수 & 주의사항

1. 테스트 데이터로 모델 선택: 테스트 세트는 최종 평가에만 사용해야 합니다. 모델 선택이나 하이퍼파라미터 튜닝에 사용하면 과적합됩니다.

2. 데이터 누수(Data Leakage): 미래 정보가 학습 데이터에 포함되거나, 전처리 시 테스트 데이터 정보가 새는 경우를 주의하세요.

3. 클래스 불균형 무시: 불균형 데이터에서 accuracy만 보면 다수 클래스만 맞추는 모델도 높은 점수를 받습니다. F1, AUC-ROC 등을 함께 확인하세요.

4. 재현성 미확보: random_state, 모델 버전, 데이터 버전을 기록하지 않으면 실험 재현이 불가능해집니다.

🔗 관련 용어

  • 하이퍼파라미터: 학습 전 설정하는 파라미터 (학습률, 레이어 수 등)
  • 손실 함수: 모델 예측과 실제값의 차이를 측정하는 함수
  • 과적합(Overfitting): 학습 데이터에만 과도하게 맞춰진 상태
  • 모델 레지스트리: 학습된 모델의 버전을 관리하는 저장소
  • 앙상블: 여러 모델의 예측을 결합하여 성능 향상

📚 더 배우기