Epoch
에포크
전체 훈련 데이터를 한 번 학습하는 단위. 여러 에포크 반복으로 모델 개선.
에포크
전체 훈련 데이터를 한 번 학습하는 단위. 여러 에포크 반복으로 모델 개선.
에포크(Epoch)는 전체 훈련 데이터셋을 한 번 완전히 학습하는 것을 의미하는 단위입니다. 예를 들어, 10만 개의 훈련 샘플이 있고 배치 사이즈가 100이라면, 1 에포크는 1,000번의 배치 학습(iteration)으로 구성됩니다.
에포크 개념은 신경망 학습 초기부터 사용되어온 기본적인 학습 단위입니다. 데이터를 한 번만 보는 것으로는 모델이 충분히 학습되지 않기 때문에, 여러 에포크에 걸쳐 같은 데이터를 반복 학습하여 가중치를 점진적으로 최적화합니다.
각 에포크마다 모델은 전체 데이터를 순회하면서 손실(loss)을 계산하고 역전파를 통해 가중치를 업데이트합니다. 일반적으로 에포크가 증가할수록 training loss는 감소하지만, validation loss는 어느 시점 이후 증가할 수 있습니다(과적합).
적절한 에포크 수는 데이터셋 크기, 모델 복잡도, 학습률에 따라 달라집니다. 실무에서는 보통 10~100 에포크 사이에서 시작하며, Early Stopping을 통해 validation loss가 더 이상 개선되지 않으면 학습을 조기 종료합니다.
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
# 샘플 데이터 생성
X = torch.randn(1000, 10) # 1000개 샘플, 10개 피처
y = torch.randint(0, 2, (1000,)) # 이진 분류
dataset = TensorDataset(X, y)
batch_size = 100 # 배치 사이즈
train_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
# 간단한 모델
model = nn.Sequential(
nn.Linear(10, 32),
nn.ReLU(),
nn.Linear(32, 2)
)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 에포크 단위 학습
num_epochs = 20
for epoch in range(num_epochs):
epoch_loss = 0.0
num_batches = 0
# 1 에포크 = 전체 데이터셋 1회 순회
for batch_X, batch_y in train_loader:
optimizer.zero_grad()
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
loss.backward()
optimizer.step()
epoch_loss += loss.item()
num_batches += 1
avg_loss = epoch_loss / num_batches
print(f"Epoch [{epoch+1}/{num_epochs}], "
f"Iterations: {num_batches}, "
f"Avg Loss: {avg_loss:.4f}")
# 총 iterations = num_epochs * (데이터 수 / 배치 사이즈)
# 이 경우: 20 * (1000/100) = 200 iterations
print(f"\n총 iterations: {num_epochs * len(train_loader)}")
"현재 50 에포크까지 학습했는데, validation loss가 30 에포크 이후로 계속 증가하고 있어요. Early Stopping을 30 에포크로 설정하거나, 정규화를 강화해야 할 것 같습니다."
"Epoch과 Iteration의 차이는, Epoch이 전체 데이터를 한 번 도는 것이라면, Iteration은 한 배치를 처리하는 것입니다. 1만 개 데이터에 배치 100이면, 1 에포크는 100 이터레이션입니다."
"대규모 LLM 학습에서는 에포크 단위보다 토큰 수로 학습량을 측정해요. Chinchilla 논문에 따르면 모델 파라미터 수의 20배 토큰을 학습시키는 게 compute-optimal이라고 합니다."
무조건 100 에포크 같은 고정값을 쓰면 과적합이나 불필요한 학습 시간이 발생합니다. Early Stopping으로 동적으로 종료하세요.
Training loss만 보면 과적합을 감지할 수 없습니다. 매 에포크마다 validation loss를 함께 기록하고 비교해야 합니다.
Early Stopping patience를 5~10으로 설정하고, validation loss 기준으로 best model을 저장하세요. Learning rate scheduler와 함께 사용하면 더 효과적입니다.