데이터가 너무 크면 한 번에 다 넣을 수 없다
학습 데이터가 수만~수백만 개라면, 한 번에 전부 모델에 넣고 가중치를 한 번만 업데이트하는 것은 메모리에도, 학습 효율에도 좋지 않다. 그래서 데이터를 작은 묶음으로 나눠 여러 번에 걸쳐 학습시킨다. 이때 등장하는 세 용어가 Batch, Epoch, Mini-Batch다.
Batch(묶음): 학습 데이터를 나누는 단위
Batch는 모델이 가중치를 한 번 업데이트할 때 사용하는 데이터 묶음이다. 예를 들어 사람 1,000명의 몸무게와 키를 이용해 몸무게로 키를 예측하는 모델을 학습한다고 해보자. 이때 한 사람의 ‘몸무게–키’ 쌍이 하나의 학습 데이터이고, 전체 데이터는 1,000개다.
Full Batch
Full Batch는 1,000개의 몸무게–키 데이터를 한꺼번에 모델에 넣고 오차를 계산한 뒤 가중치를 한 번 업데이트하는 방식이다. 전체 데이터를 반영하므로 업데이트 방향은 비교적 안정적이지만, 데이터가 커질수록 한 번에 많은 메모리가 필요하고 가중치 업데이트 기회가 적어진다.
Mini-Batch
Mini-Batch는 전체 데이터를 더 작은 묶음으로 나눈 것이다. 1,000개의 몸무게–키 데이터를 100개씩 나누면 10개의 Mini-Batch가 만들어진다. 모델은 첫 번째 100개를 학습한 뒤 가중치를 한 번 업데이트하고, 다음 100개를 학습한 뒤 다시 한 번 업데이트한다. 같은 과정을 열 번째 묶음까지 반복한다.
여기서 Batch Size는 한 Mini-Batch에 들어가는 데이터 개수인 100이다. 전체 데이터 1,000개를 모두 보면 1 Epoch이 끝난다. 따라서 이 예에서는 1 Epoch 동안 Mini-Batch 10개를 학습하고, 가중치도 총 10번 업데이트한다.
Batch Size: 한 번에 몇 문제를 풀고 채점할까
Batch Size는 가중치를 한 번 업데이트하기 전에 모델에 넣는 데이터 개수다. 예를 들어 데이터가 100개이고 Batch Size가 10이면, 10개씩 풀고 정답과 비교해 가중치를 업데이트하는 과정을 10번 반복해야 데이터 전체를 한 바퀴 도는 것이다.
Batch Size | 가중치 업데이트 횟수(데이터 100개 기준) | 특징 |
|---|---|---|
100 (전체를 한 번에) | 1회 | 업데이트는 적지만 한 번에 큰 메모리가 필요하고, 세밀한 조정이 어렵다 |
10 | 10회 | 더 자주 업데이트되어 학습이 촘촘해지지만, 배치마다의 노이즈에 더 민감하다 |
1 (완전한 확률적 경사하강법) | 100회 | 가장 자주 업데이트되지만 각 업데이트가 불안정하게 흔들릴 수 있다 |
Batch Size가 작을수록 가중치가 더 자주 업데이트되어 학습을 촘촘하게 진행할 수 있지만, 그만큼 노이즈가 섞인 방향으로도 자주 움직이게 된다. 이 여러 개의 작은 묶음 하나하나를 Mini-Batch라고 부른다.
Epoch: 전체 데이터를 몇 번 반복해서 볼까
Epoch은 전체 학습 데이터셋을 처음부터 끝까지 한 번 다 사용한 단위를 말한다. Epoch = 20이라는 것은 “같은 시험 문제 1세트를 20번 반복해서 푼다”는 뜻이다. 반복할수록 데이터의 특징을 더 잘 학습할 것을 기대할 수 있지만, 지나치게 많이 반복하면 훈련 데이터를 암기해버리는 과적합으로 이어질 수 있다.
코드로 관계 확인하기
PyTorch의 DataLoader로 20개 샘플을 Batch Size 5로 나누면 한 Epoch에 4개의 Mini-Batch가 만들어진다. 3 Epoch를 반복하면 Mini-Batch 학습은 총 12번 일어난다.
import torch
from torch.utils.data import DataLoader, TensorDataset
# 더미 데이터셋: 20개 샘플, 샘플마다 피처 2개
X = torch.arange(1, 41).reshape(-1, 2).float() # shape: (20, 2)
y = torch.arange(1, 21).float().reshape(-1, 1) # shape: (20, 1)
dataset = TensorDataset(X, y)
batch_size = 5
loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
num_epochs = 3
total_updates = 0
for epoch in range(num_epochs):
for batch_idx, (features, targets) in enumerate(loader):
total_updates += 1 # 가중치 업데이트 1회
print(f"한 Epoch당 Mini-Batch 수: {len(loader)}")
print(f"{num_epochs} Epoch 동안 총 가중치 업데이트 횟수: {total_updates}")
한 Epoch당 Mini-Batch 수: 4
3 Epoch 동안 총 가중치 업데이트 횟수: 12
샘플 20개 ÷ Batch Size 5 = 한 Epoch당 4개의 Mini-Batch, 여기에 Epoch 3회를 곱하면 총 12번 가중치가 업데이트된다. ( shuffle=True로 매 Epoch마다 데이터 순서를 섞기 때문에 각 Mini-Batch에 어떤 샘플이 들어가는지는 실행할 때마다 달라진다.)
정리
Batch(Size)는 한 번의 가중치 업데이트에 쓰는 데이터 묶음의 크기, Mini-Batch는 그렇게 나뉜 묶음 하나하나, Epoch은 전체 데이터셋을 몇 번 반복해서 학습할지를 나타낸다. 세 값 모두 사람이 정하는 하이퍼파라미터이며, Batch Size는 학습의 촘촘함과 안정성을, Epoch은 학습량과 과적합 위험을 함께 조절한다.
참고 자료
torch.utils.data.DataLoader — PyTorch 공식 문서 — batch_size·shuffle 등 DataLoader 파라미터 정의 (2026-08-07 확인)
댓글 0
댓글을 불러오는 중…