학습 데이터와 검증 데이터 — 참고 참고
이 절은 교수님 5주차 노트북의 학습 목표와 "오늘의 핵심 질문"에 나오는 내용이에요. 녹취에서 5주차 자료는 "반 정도만 준비했다"고 했고 시험 범위는 2~5주차이니, 코드까지 외우기보다 개념만 이해해 두세요.
train 데이터는 모델이 학습에 쓰는 데이터이고, validation(검증) 데이터는 학습에는 쓰지 않고 모델이 처음 보는 데이터에서도 잘 맞히는지 확인하려고 따로 떼어 둔 데이터예요.
연습문제로 공부하고, 한 번도 안 풀어 본 모의고사로 실력을 확인해요. 연습문제 답만 외웠다면 연습문제는 만점이어도 모의고사에서 점수가 떨어져요. 이렇게 학습 데이터에만 지나치게 맞춰진 상태를 과적합(overfitting)이라고 해요. (과적합은 교수님 자료에는 안 나오는 용어이고 참고용이에요.) 모의고사를 따로 두면 이것을 알아챌 수 있어요.
노트북의 핵심 질문을 풀이와 함께 정리하면 이래요.
| 핵심 질문 | 답 |
|---|---|
train은 shuffle=True, validation은 shuffle=False인 이유는? | 학습은 순서에 길들여지지 않게 섞고, 평가는 섞을 필요가 없어서 순서를 고정해 매번 같은 조건으로 비교해요. |
model.eval()만 실행하면 기울기 계산도 꺼질까요? | 아니에요. model.eval()은 모델을 "평가 모드"로 바꾸는 스위치일 뿐이고, 기울기 추적은 torch.no_grad()로 따로 꺼요. |
| 마지막 batch가 작을 때 epoch 평균 loss는? | 9-4처럼 sample 수로 가중해서 구해요. |
validation loss로 backward()와 step()을 하면? | 검증 데이터로 weight를 고치게 돼서 더 이상 "처음 보는 데이터"가 아니에요. 평가의 의미가 없어져요. 검증은 점수만 계산해요. |
모드 스위치는 두 개예요. model.train()은 학습 모드, model.eval()은 평가 모드예요. 층 중에는 학습할 때와 평가할 때 동작이 달라지는 것이 있어서 알려 주는 용도예요. 지금까지 쓴 nn.Linear와 ReLU는 둘 사이에 차이가 없어요. 교수님 4주차 슬라이드에도 학습이 끝난 모델로 예측할 때 이렇게 써요.
평가 함수를 만들면 이런 모양이에요. 학습 5줄과 비교해서 보세요. 이 코드는 노트북의 학습 목표(evaluate())에 맞춰 제가 쓴 예시예요.
| 비교 | 학습(train) 5줄 | 평가(evaluate) |
|---|---|---|
zero_grad() | 있음 | 없음 (기울기를 안 만드니까) |
model(x), criterion | 있음 | 있음 |
backward(), step() | 있음 | 없음 (weight를 고치면 안 돼요) |
| 모드와 추적 | model.train() | model.eval() + torch.no_grad() |
| DataLoader | shuffle=True | shuffle=False |
평가 단계 설명에서는 "weight를 갱신하지 않는다. backward와 step을 쓰지 않고 loss만 계산한다"가 맞아요. model.eval()이 기울기 계산도 꺼 준다는 보기는 오답이에요. 그건 torch.no_grad()의 일이에요.
잠깐 확인 — 검증 데이터로 loss를 구한 뒤 loss.backward()와 optimizer.step()을 하면 왜 안 될까요?
검증 데이터가 학습에 쓰이는 셈이라서 "처음 보는 데이터에서의 성능"을 잴 수 없어요. 검증은 weight를 건드리지 않고 점수만 매겨야 해요.
자료: 6·7주차 · Week04_Autograd_Loss_Optimizer, Week05_Dataset_DataLoader_Train_Validation(part1), 딥러닝 모델 Training 과정.pdf · 7주차 녹취(빅데이터07)