시험공부빅데이터분석
← 보드손실 함수와 옵티마이저 · 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이 나온 거예요.

예측 \ 정답154
2194
4910
62514

올바른 짝은 대각선(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)