← 보드손실 함수와 옵티마이저 · 2/7
prediction과 target의 shape은 꼭 맞추기 ★★★
손실을 계산할 때 예측값과 정답의 크기(shape)가 같아야 해요. 크기가 다르면 오류가 나는 게 아니라 브로드캐스팅(작은 쪽을 늘려 맞추는 것)이 일어나서 엉뚱한 계산이 돼요. 에러 없이 경고만 나와서 더 위험해요. 교수님이 직접 만든 함정 문제예요.
prediction = torch.tensor([[2.0], [4.0], [6.0]]) # 크기 (3, 1)
target = torch.tensor([1.0, 5.0, 4.0]) # 크기 (3,)
print("prediction shape:", prediction.shape)
print("target shape:", target.shape)
print("뺄셈 결과 shape:", (prediction - target).shape)
print("shape 안 맞춘 MSE:", nn.MSELoss()(prediction, target).item())
target = target.reshape(-1, 1) # (3,) → (3, 1)
print("맞춘 뒤 target shape:", target.shape)
print("shape 맞춘 MSE:", nn.MSELoss()(prediction, target).item())
prediction shape: torch.Size([3, 1])
target shape: torch.Size([3])
뺄셈 결과 shape: torch.Size([3, 3])
shape 안 맞춘 MSE: 6.0
맞춘 뒤 target shape: torch.Size([3, 1])
shape 맞춘 MSE: 2.0
| 코드 줄 | 무슨 뜻 |
|---|---|
(3, 1)과 (3,) 뺄셈 | 크기가 달라서 3×3 표로 늘어나요. 예측 3개와 정답 3개를 모든 짝으로 비교해 9개가 돼요. 엉뚱한 비교예요. |
nn.MSELoss()(prediction, target) | 경고가 뜨지만 계산은 돼서 틀린 값 6.0이 나와요. |
target.reshape(-1, 1) | (3,)를 (3, 1)로 바꿔요. -1은 "나머지는 알아서"라는 뜻이에요. |
| 맞춘 뒤 MSE | (1² + 1² + 2²) ÷ 3 = 6 ÷ 3 = 2.0이에요. 올바른 값이에요. |
틀린 계산에서 9개의 제곱 오차는 이래요. 합이 54이고 9로 나눠서 6.0이 나온 거예요.
| 예측 \ 정답 | 1 | 5 | 4 |
|---|---|---|---|
| 2 | 1 | 9 | 4 |
| 4 | 9 | 1 | 0 |
| 6 | 25 | 1 | 4 |
올바른 짝은 대각선(2↔1, 4↔5, 6↔4)뿐이에요. 나머지 6칸은 쓸데없는 비교예요.
외우기 팁
Linear 모델의 출력은 (배치, 출력 개수)인 2차원이에요. 정답을 [1, 5, 4]처럼 1차원으로 만들면 안 맞아요. 정답도 (3, 1)로 reshape(-1, 1)해서 맞춰 주세요.
이렇게 고르세요 (풀이 요령)
prediction이 (3, 1)이고 target이 (3,)인 코드가 나오면 "shape을 맞추지 않아 의도와 다른 값이 나온다"가 정답이에요. 오류로 멈춘다는 보기는 틀려요. 경고만 나오고 잘못된 값이 계산돼요.
잠깐 확인 — prediction이 (3, 1), target이 (3,)일 때 뺄셈 결과의 shape은?
(3, 3)이에요. 두 크기가 달라서 브로드캐스팅으로 3×3으로 늘어나요.
다음 카드 → 옵티마이저 — 기울기로 파라미터를 고치는 손 ★★★
자료: 6·7주차 · Week04_Autograd_Loss_Optimizer · 7주차 녹취(빅데이터07)