왜 element-wise 가 아닌가
행렬 덧셈은 element-wise — 쉬움. 행렬 곱셈은 element-wise 아님. 행과 열의 신중한 춤: 출력의 각 셀 = 왼쪽 행렬 한 행과 오른쪽 행렬 한 열의 내적.
모양 룰: . 안쪽 차원 일치, 바깥쪽 차원이 결과 형성. 룰 어기면 코드 폭발; 맞히면 신경망 layer 만든 거.
변환 합성
행렬곱이 변환 합성 인코딩. 회전, 스케일, translate — 각각 행렬; 곱하면 셋 다 한 번에 하는 단일 행렬. 순서 중요: 는 일반적으로 와 다름. 회전-그다음-스케일 ≠ 스케일-그다음-회전 (3D 에서 매우 명확).
Broadcasting 슬쩍 다시 등장
NumPy/PyTorch 가 행렬 × 벡터를 * (element-wise) 로 허락 — broadcasting 이 조용히 벡터를 행렬의 행이나 열에 적용. 이건 행렬곱 아님; broadcasting 있는 element-wise 연산. 진짜 행렬곱엔 @ 사용.
나 물었던 그 버그. 딥러닝 초기에 forward pass 에
output = weights * inputs 썼어. Shape 가 broadcast 됐고, loss 가 숫자로 나왔고, 학습도 좀 개선됐어. "linear layer" 가 element-wise 곱셈이지 진짜 linear 변환 아님을 깨닫는데 한 시간. @ 사용. 매번.
import numpy as np
R = np.array([[0., -1.], [1., 0.]]) S = np.array([[2., 0.], [0., 2.]]) v = np.array([1., 0.])
print('(R @ S) @ v =', (R @ S) @ v) print('(S @ R) @ v =', (S @ R) @ v) print('same:', np.allclose((R @ S) @ v, (S @ R) @ v))