시험공부빅데이터분석
← 보드학습 루프와 검증 · 6/7

학습 데이터와 검증 데이터 — 참고 참고

이 절은 교수님 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주차 슬라이드에도 학습이 끝난 모델로 예측할 때 이렇게 써요.

model.eval() with torch.no_grad(): y = model(torch.tensor([[5.0], [10.0]])) # 결과는 약 [[11.0], [21.0]]

평가 함수를 만들면 이런 모양이에요. 학습 5줄과 비교해서 보세요. 이 코드는 노트북의 학습 목표(evaluate())에 맞춰 제가 쓴 예시예요.

def evaluate(model, loader, criterion): model.eval() # 평가 모드 total_loss, total_samples = 0.0, 0 with torch.no_grad(): # 기울기 추적 끄기 for batch_x, batch_y in loader: prediction = model(batch_x) loss = criterion(prediction, batch_y) n = batch_x.size(0) total_loss += loss.item() * n total_samples += n return total_loss / total_samples
비교학습(train) 5줄평가(evaluate)
zero_grad()있음없음 (기울기를 안 만드니까)
model(x), criterion있음있음
backward(), step()있음없음 (weight를 고치면 안 돼요)
모드와 추적model.train()model.eval() + torch.no_grad()
DataLoadershuffle=Trueshuffle=False
이렇게 고르세요 (풀이 요령)

평가 단계 설명에서는 "weight를 갱신하지 않는다. backward와 step을 쓰지 않고 loss만 계산한다"가 맞아요. model.eval()이 기울기 계산도 꺼 준다는 보기는 오답이에요. 그건 torch.no_grad()의 일이에요.

잠깐 확인 — 검증 데이터로 loss를 구한 뒤 loss.backward()와 optimizer.step()을 하면 왜 안 될까요?

검증 데이터가 학습에 쓰이는 셈이라서 "처음 보는 데이터에서의 성능"을 잴 수 없어요. 검증은 weight를 건드리지 않고 점수만 매겨야 해요.

다음 카드 → 이 장 3줄 요약

자료: 6·7주차 · Week04_Autograd_Loss_Optimizer, Week05_Dataset_DataLoader_Train_Validation(part1), 딥러닝 모델 Training 과정.pdf · 7주차 녹취(빅데이터07)