손실 함수 — 틀린 정도를 숫자 하나로 ★★★
모델이 낸 예측값(prediction)과 정답(target)이 얼마나 다른지를 숫자 하나로 요약하는 함수가 손실 함수예요. 그 숫자가 loss예요. 예측이 정답과 같으면 loss는 0이고, 많이 틀릴수록 커져요.
시험을 채점해서 "틀린 정도"를 점수로 매기는 채점표라고 생각하세요. 점수가 낮을수록 잘 푼 거예요. 모델은 이 점수를 줄이는 방향으로 공부해요.
회귀(숫자를 맞히는 문제)에서 가장 많이 쓰는 손실이 평균제곱오차(MSE, Mean Squared Error)예요. 순서는 세 단계예요.
- 오차 = 예측 − 정답
- 오차를 제곱해요.
- 모두 더해서 개수로 나눠 평균을 내요.
왜 제곱할까요? 오차 +2와 −2를 그냥 더하면 0이 돼서 "틀리지 않았다"고 착각하게 돼요. 제곱하면 부호가 사라져서 서로 상쇄되지 않고, 큰 오차에는 더 큰 벌점이 붙어요.
| 코드 줄 | 무슨 뜻 |
|---|---|
prediction - target | [3−1, 4−5] = [2, −1]. 숫자별로 빼요. |
** 2 | 제곱해서 [4, 1]이 돼요. |
.mean() | (4 + 1) ÷ 2 = 2.5. 평균이에요. |
criterion = nn.MSELoss() | MSE 계산기를 하나 만들어요. 이름 criterion은 "기준"이라는 뜻이고 loss 담당 변수로 흔히 쓰는 이름이에요. |
criterion(prediction, target) | 계산기를 함수처럼 불러요. 순서는 (예측, 정답)이에요. 결과는 직접 계산과 같은 2.5예요. |
criterion(...)처럼 객체를 함수처럼 부를 수 있는 이유는 5장에서 배운 __call__ 덕분이에요. nn.MSELoss()도 nn.Module의 자식이라서 model(x)와 같은 방식이에요.
평균은 모든 원소 개수로 나눠요. 예를 들어 예측 [[1, 2], [3, 4]], 정답 [[1, 0], [3, 2]]이면 오차는 0, 2, 0, 2이고 제곱하면 0, 4, 0, 4예요. 합 8을 원소 4개로 나눠서 2.0이에요. 과제 1에서도 "(예측 − 목표)² 전체 원소 평균"으로 loss를 구했어요.
교수님 자료에는 nn.CrossEntropyLoss(), nn.SmoothL1Loss() 같은 다른 손실 함수도 있다고 이름만 나와요. 참고로 CrossEntropyLoss는 보통 분류 문제에 써요. 시험에서는 MSE만 정확히 알면 충분해요.
MSE 결과를 묻는 문제는 ① 뺀다 ② 제곱한다 ③ 평균 낸다, 순서로 손으로 풀어요. 예를 들어 예측 [1, 2, 3], 정답 [2, 2, 5]이면 오차 [−1, 0, −2] → 제곱 [1, 0, 4] → 평균 5/3 = 약 1.67이에요. "합계"가 아니라 "평균"이라서 개수로 나누는 것을 잊지 마세요.
잠깐 확인 — 예측 [3, 4], 정답 [1, 5]의 MSE는? 그리고 criterion(prediction, target)에서 두 인자 순서는?
(4 + 1) ÷ 2 = 2.5예요. 순서는 (예측, 정답)이에요.
자료: 6·7주차 · Week04_Autograd_Loss_Optimizer · 7주차 녹취(빅데이터07)