| 구분 | Training Set (학습용) | Validation Set (검증용) | Test Set (평가용) |
|---|---|---|---|
| 목적 | 모델의 가중치() 학습 | 하이퍼파라미터 튜닝 및 과적합 방지 | 모델의 최종 성능 객관적 검증 |
| 비유 | 교과서 및 연습문제 | 중간고사 / 모의고사 | 실전 수능 시험 |
| Loss/Metric | Loss 필수, Metric 선택 | Loss/Metric 모두 필수 | Metric 필수, Loss 지양 |
| 데이터 비중 | 전체의 60% ~ 80% | 전체의 10% ~ 20% | 전체의 10% ~ 20% |
| 업데이트 | 가중치()가 직접 업데이트됨 | 학습률, 레이어 수 등 구조 수정 | 절대 수정 금지 (Read-only) |
8:1:1이나 7:1.5:1.5를 많이 썼습니다.98:1:1처럼 비율이 극단적으로 변하기도 합니다."교과서(Train)만 외운 학생이 모의고사(Validation)를 통해 공부 방향을 잡고, 생전 처음 보는 수능 문제(Test)에서 실력을 발휘하게 하기 위해서입니다."
| 유의 사항 | 세부 내용 및 실행 전략 | 주의 사항 및 예외 |
|---|---|---|
| Shuffle (무작위 섞기) | 데이터가 수집 순서대로 정렬되어 특정 패턴이 생기는 것을 막기 위해, 나누기 전 반드시 랜덤하게 섞어야 함 | 예외 (Time-series / Text): 시계열이나 문맥이 중요한 데이터는 섞지 않고 시간 순서대로 잘라야 함 (Data Leakage 방지) |
| Test Set 성역화 | 테스트 세트를 보고 모델 구조를 바꾸거나 파라미터를 수정하는 순간, 그 데이터는 더 이상 '테스트'가 아닌 '검증(Validation)' 데이터가 됨 | 테스트 세트는 학습 및 튜닝 과정에서 절대 관여 금지 (Strict Isolation) |
| Stratified Split | 분류 문제에서 특정 클래스가 한쪽 세트에만 몰리지 않도록 원본 데이터의 클래스 비율을 유지하며 분할 | 데이터 불균형(Imbalance)이 심할 때 필수적으로 적용해야 함 |
| Data Leakage 방지 | 학습 데이터에 테스트 데이터의 미래 정보나 정답 정보가 미리 포함되지 않도록 데이터 오염을 상시 체크 | 시계열 데이터에서 '미래 데이터'로 '과거'를 학습하는 실수를 특히 경계해야 함 |
Shuffle (무작위 섞기):
데이터가 수집된 순서대로 정렬되어 있을 수 있으므로, 나누기 전에 반드시 랜덤하게 섞어야 합니다.
Test Set은 절대 학습에 관여 금지:
테스트 세트를 보고 모델 구조를 바꾸거나 파라미터를 수정하는 순간, 그 데이터는 더 이상 '테스트'가 아닌 '검증(Validation)' 데이터가 되어버립니다.
Stratified Split (층화 추출):
분류 문제에서 특정 클래스가 한쪽 세트에 몰리지 않도록 클래스 비율을 유지하며 나눠야 합니다. (예: 암 환자 데이터가 Test 세트에만 몰려있으면 제대로 된 평가 불가)
Data Leakage (데이터 누수) 방지:
학습 데이터에 있는 내용이 테스트 데이터에 섞여 들어가면 안 됩니다. (예: 시계열 데이터에서 미래 데이터를 학습에 쓰고 과거 데이터를 테스트에 쓰는 실수)
시계열 데이터의 핵심 가정은 "과거의 데이터를 보고 미래를 예측한다"는 것입니다.
텍스트 데이터, 특히 긴 글이나 대화 데이터(Chat log)는 문맥의 흐름이 중요합니다.
딥러닝 모델은 데이터를 한꺼번에 소화할 수 없기 때문에 이를 쪼개서 학습합니다. 이때 사용하는 세 가지 단위의 관계는 다음과 같습니다.
| 단위 | 정의 | 비유 (문제집 풀기) |
|---|---|---|
| Batch Size | 한 번의 연산(Update)에 사용되는 데이터 묶음의 크기 | 한 번에 풀고 채점할 문제의 양 (예: 10문제) |
| Iteration | 전체 데이터를 배치 단위로 나누어 학습(가중치 업데이트)한 횟수 | 문제집 한 권을 끝내기 위해 채점한 횟수 |
| Epoch | 전체 데이터셋이 모델을 한 번 완전히 통과한 상태 | 문제집 한 권을 통째로 다 푼 횟수 |
가장 중요한 포인트입니다. Epoch, Batch, Iteration은 오직 'Training Set' 안에서만 일어나는 역동적인 과정입니다.
loss.backward()와 optimizer.step()을 통해 가중치()가 실시간으로 변합니다. 설정한 Epoch만큼 이 과정을 반복합니다.backward()를 하지 않습니다. (가중치 고정)| 학습 단위 | 적용 대상 (Dataset) | 가중치 업데이트 () | 주요 역할 |
|---|---|---|---|
| Batch Size | Training, Validation, Test | - | 연산 시 메모리에 올리는 데이터 묶음의 크기 |
| Iteration | Only Training | Yes (매회) | 모델이 오답 노트를 쓰고 실제로 똑똑해지는 단계 |
| Epoch | Training, Validation | - | 전체 학습 데이터를 한 번 다 훑은 반복 횟수 |
블로그에 아래와 같은 구조로 설명글을 넣으시면 독자들이 흐름을 잡기 좋습니다.
loss.backward()와 optimizer.step()이 일어남.# 전체 데이터셋을 8:1:1 또는 5:5로 나눈 후 시작
for epoch in range(total_epochs): # [에포크]: 전체 문제집을 N번 반복
# 1. Training Phase (학습 단계)
model.train()
for batch_idx, (data, target) in enumerate(train_loader): # [이터레이션]: 배치 단위로 학습
optimizer.zero_grad() # 칠판 지우기 (initialize)
output = model(data) # Forward: 문제 풀기
loss = criterion(output, target) # Loss: 채점
loss.backward() # Backward: 오답 분석 (기울기 계산)
optimizer.step() # Step: 지식 업데이트 (가중치 수정)
# 여기서 'batch_idx'가 올라가는 횟수가 곧 'Iteration'입니다.
# 2. Validation Phase (검증 단계)
model.eval()
with torch.no_grad(): # 중요: 가중치 업데이트 안 함! (성역)
for data, target in val_loader:
output = model(data)
# Metric(정확도 등) 계산하여 현재 모델의 실력 점검
# 3. Test Phase (최종 평가)
# 모든 Epoch가 끝난 후, 단 한 번 가장 좋았던 모델로 실행
| 구분 | 가중치() 업데이트 | 에폭(Epoch) 반복 | 목적 |
|---|---|---|---|
| Training | O (Backward 있음) | O (수백~수천 번) | 모델의 '뇌(지능)'를 만드는 과정 |
| Validation | X (Backward 없음) | O (학습 에폭마다 수행) | '최적의 설정(, LR 등)'을 찾는 과정 |
| Test | X (Backward 없음) | X (단 1번만 수행) | '최종 성적'을 산출하는 과정 |