🤖 AI/ML

에포크

Epoch

전체 훈련 데이터셋을 한 번 학습하는 단위. 여러 에포크 반복으로 모델 성능 개선.

📖 상세 설명

에포크(Epoch)는 전체 훈련 데이터셋이 신경망을 한 번 완전히 통과하는 것을 의미합니다. 예를 들어 10,000개의 샘플로 구성된 데이터셋을 학습할 때, 1 에포크는 이 10,000개 샘플 모두가 모델을 통과하여 가중치 업데이트에 기여한 시점을 말합니다.

에포크는 배치(Batch), 이터레이션(Iteration)과 함께 학습 진행을 측정하는 핵심 단위입니다. 배치 크기가 100이고 데이터가 10,000개라면, 1 에포크 = 100 이터레이션입니다. 각 이터레이션에서 배치 단위로 경사 하강법이 적용되고, 에포크가 끝날 때마다 전체 데이터를 순회한 것이 됩니다.

적절한 에포크 수를 선택하는 것은 중요한 하이퍼파라미터 튜닝입니다. 에포크가 너무 적으면 모델이 충분히 학습하지 못해 과소적합(Underfitting)이 발생하고, 너무 많으면 훈련 데이터에 과대적합(Overfitting)됩니다. 일반적으로 검증 손실(Validation Loss)을 모니터링하며 Early Stopping 기법으로 최적의 에포크를 결정합니다.

대규모 모델 학습에서는 에포크 수가 학습 시간과 비용에 직접적인 영향을 미칩니다. GPT-3는 수십 에포크에 걸쳐 수개월간 학습되었습니다. 전이학습(Transfer Learning)을 활용하면 사전학습된 모델을 3-5 에포크만 파인튜닝해도 좋은 성능을 얻을 수 있어, 학습 효율성이 크게 향상됩니다.

💻 코드 예제

# PyTorch에서 에포크 기반 학습 구현
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset

# 하이퍼파라미터 설정
EPOCHS = 100
BATCH_SIZE = 32
LEARNING_RATE = 0.001
PATIENCE = 10  # Early Stopping 인내심

# 모델 정의
model = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Dropout(0.2),
    nn.Linear(256, 10)
)

# 손실 함수와 옵티마이저
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE)

# 학습 데이터 로더 (예시)
train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE)

# Early Stopping 변수
best_val_loss = float('inf')
patience_counter = 0

# 에포크 루프
for epoch in range(EPOCHS):
    # === 훈련 단계 ===
    model.train()
    train_loss = 0.0

    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

        train_loss += loss.item()

        # 이터레이션 진행 상황
        if batch_idx % 100 == 0:
            print(f"Epoch {epoch+1}/{EPOCHS} - "
                  f"Iteration {batch_idx}/{len(train_loader)}")

    train_loss /= len(train_loader)

    # === 검증 단계 ===
    model.eval()
    val_loss = 0.0
    correct = 0

    with torch.no_grad():
        for data, target in val_loader:
            output = model(data)
            val_loss += criterion(output, target).item()
            pred = output.argmax(dim=1)
            correct += pred.eq(target).sum().item()

    val_loss /= len(val_loader)
    accuracy = 100. * correct / len(val_dataset)

    print(f"Epoch {epoch+1}/{EPOCHS} 완료 - "
          f"Train Loss: {train_loss:.4f}, "
          f"Val Loss: {val_loss:.4f}, "
          f"Val Acc: {accuracy:.2f}%")

    # === Early Stopping 체크 ===
    if val_loss < best_val_loss:
        best_val_loss = val_loss
        patience_counter = 0
        torch.save(model.state_dict(), 'best_model.pt')  # 최고 모델 저장
        print(f"  → 최적 모델 저장 (Val Loss: {val_loss:.4f})")
    else:
        patience_counter += 1
        if patience_counter >= PATIENCE:
            print(f"\nEarly Stopping: {PATIENCE} 에포크 동안 개선 없음")
            break

print(f"\n학습 완료! 최종 에포크: {epoch+1}, 최적 Val Loss: {best_val_loss:.4f}")

📊 성능 & 비용

항목 일반적인 값 비고
이미지 분류 (전이학습) 3-10 에포크 사전학습 모델 파인튜닝 시
이미지 분류 (처음부터) 50-200 에포크 데이터 규모에 따라 상이
NLP 파인튜닝 2-5 에포크 BERT, GPT 기반 모델
대규모 사전학습 1-3 에포크 데이터가 충분히 크면 1 에포크도 OK
GPU 시간 (ImageNet) ~2시간/에포크 V100 단일 GPU 기준

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

"10 에포크 돌려봤는데 5 에포크에서 이미 오버피팅 시작하더라고요."

"Early Stopping 걸어두고 patience 5로 설정했어요."

"에포크당 학습 시간이 너무 길어서 배치 사이즈를 늘렸어요."

"검증 로스가 3 에포크부터 안 떨어지네요. 학습률 줄여볼까요?"

⚠️ 흔한 실수 & 주의사항

1. 에포크 수 고정: 검증 손실을 보지 않고 고정된 에포크로 학습하면 과적합 또는 과소적합이 발생합니다. Early Stopping을 반드시 사용하세요.

2. 셔플링 미적용: 에포크마다 데이터 순서가 같으면 학습이 편향될 수 있습니다. DataLoader에서 shuffle=True를 설정하세요.

3. 검증 누락: 에포크마다 검증 데이터로 성능을 측정하지 않으면 오버피팅을 감지할 수 없습니다.

4. 학습률 스케줄링 무시: 에포크가 진행될수록 학습률을 감소시키면 더 안정적인 수렴이 가능합니다. StepLR, CosineAnnealing 등을 활용하세요.

🔗 관련 용어

배치 정규화 (Batch Normalization) - 학습 안정화 기법

경사하강법 (Gradient Descent) - 가중치 업데이트 알고리즘

과적합 (Overfitting) - 에포크 과다 시 발생

드롭아웃 (Dropout) - 과적합 방지 기법

전이 학습 (Transfer Learning) - 에포크 절감 전략

📚 더 배우기

PyTorch 학습 튜토리얼 - 에포크 기반 학습 실습

TensorFlow/Keras 학습 가이드 - epochs 파라미터 활용

Early Stopping 가이드 - 최적 에포크 찾기