epoch 평균 loss — 마지막 배치가 작을 때 ★★
한 epoch이 끝나면 "이번 epoch의 평균 loss"를 보고 싶어요. 그런데 단순히 배치 loss들을 평균 내면 안 돼요. 배치 크기가 다르면(예 20, 20, 20, 20, 10) sample이 적은 마지막 배치가 같은 비중으로 계산돼서 값이 틀어져요. 그래서 교수님은 "각 배치 loss에 그 배치의 sample 수를 곱해서 모두 더한 뒤, 전체 sample 수로 나눈다"고 했어요.
1반 학생이 40명, 2반이 10명이에요. 두 반의 평균이 각각 80점, 60점일 때 전교 평균은 (80+60)/2 = 70점이 아니라 (80×40 + 60×10)/50 = 76점이에요. 인원이 많은 반이 더 크게 반영돼야 하기 때문이에요. 배치 loss도 똑같아요.
배치 3개의 크기가 4, 4, 2이고 각각의 평균 loss가 3, 6, 9라고 해 봐요.
| 방법 | 계산 | 결과 |
|---|---|---|
| 단순 평균 (틀림) | (3 + 6 + 9) ÷ 3 | 6.0 |
| sample 수로 가중 (맞음) | (3×4 + 6×4 + 9×2) ÷ 10 = (12 + 24 + 18) ÷ 10 | 5.4 |
코드의 해당 줄은 이래요.
| 코드 줄 | 무슨 뜻 |
|---|---|
batch_x.size(0) | batch_x의 첫 번째 차원 크기예요. 이 배치에 sample이 몇 개인지 알려 줘요. (4, 2)이면 4. |
loss.item() | 그 배치의 평균 loss(숫자 하나)예요. |
loss.item() * batch_samples | 평균에 개수를 다시 곱해서 그 배치의 loss 총합으로 되돌려요. |
total_loss / total_samples | 모든 loss 총합을 전체 sample 수로 나눠서 올바른 epoch 평균을 구해요. |
이것은 학습(backward, step)에는 영향이 없고 기록용이에요. 숫자만 필요하니까 .item()으로 순수 숫자를 꺼내서 쌓아요. 교수님은 "어려운 수학은 아니고 산수"라고 했어요. 시험에는 개념으로 나올 수 있으니 왜 이렇게 하는지만 알아 두세요.
"마지막 배치가 작을 때 epoch 평균 loss를 구하는 올바른 방법"은 각 배치 loss에 sample 수를 곱해 합산하고 전체 sample 수로 나눈다예요. "배치 loss를 단순 평균한다"는 오답이에요.
잠깐 확인 — 크기 4, 4, 2인 배치의 loss가 3, 6, 9일 때 epoch 평균 loss는?
(3×4 + 6×4 + 9×2) ÷ 10 = 5.4예요.
자료: 6·7주차 · Week04_Autograd_Loss_Optimizer, Week05_Dataset_DataLoader_Train_Validation(part1), 딥러닝 모델 Training 과정.pdf · 7주차 녹취(빅데이터07)