연산 — 원소별 곱(*)과 행렬곱(@), 그리고 dim 집계 ★★
Tensor끼리 + - * /를 하면 같은 자리끼리 계산돼요. 이것을 원소별(element-wise) 연산이라고 해요. 곱셈은 모양이 비슷해 보여도 두 종류가 달라요.
| 기호 | 이름 | 어떻게 계산하나 |
|---|---|---|
* | 원소별 곱 | 같은 자리끼리 곱해요. 두 Tensor의 shape이 같아야 해요(또는 브로드캐스팅 가능) |
@ | 행렬곱 | 행렬 곱셈 규칙. torch.matmul(A, B)와 같아요. 앞의 마지막 크기 = 뒤의 첫 크기여야 해요 |
| 코드 줄 | 무슨 뜻 |
|---|---|
A * B | 같은 자리끼리. 1×5=5, 2×6=12, 3×7=21, 4×8=32 |
A @ B | 첫 행 [1, 2]와 첫 열 [5, 7]을 곱해 더함 → 1×5 + 2×7 = 19. 같은 방식으로 [1,2]·[6,8] = 22, [3,4]·[5,7] = 43, [3,4]·[6,8] = 50 |
행렬곱의 shape 규칙은 외워 둘 만해요. (a, b) @ (b, c) → (a, c)예요. 가운데 b끼리 같아야 하고 b는 사라져요. 그래서 (2, 3) @ (3, 4)는 (2, 4)이고, (4, 3) @ (3, 2)는 (4, 2)예요. 이 규칙이 모델의 한 층(Y = XWᵀ + b)에서 그대로 쓰여요(4장).
반면 shape이 다른 두 Tensor에 *를 쓰면 에러가 날 수 있어요. 예를 들어 (3, 2) * (2, 3)은 "크기가 맞지 않다(2와 3)"는 에러예요. 같은 두 Tensor에 @를 쓰면 (3, 2) @ (2, 3) → (3, 3)으로 잘 계산돼요.
집계 연산은 합, 평균, 최댓값을 구하는 함수예요. dim으로 "어느 방향으로 모을지"를 정해요. 모은 방향의 차원은 결과 shape에서 사라져요.
| 코드 줄 | 무슨 뜻 |
|---|---|
z.sum() | 전부 더함 1+2+…+6 = 21 |
z.mean() | 전체 평균 21 ÷ 6 = 3.5 |
z.sum(dim=0) | 0번(행) 방향으로 모아요. 같은 열끼리 더해요 → [1+4, 2+5, 3+6]. 행 차원이 사라져 (3,) |
z.sum(dim=1) | 1번(열) 방향으로 모아요. 같은 행끼리 더해요 → [1+2+3, 4+5+6]. 열 차원이 사라져 (2,) |
결과 shape은 "원래 shape에서 dim번째 숫자를 지운 것"이에요. (2, 3)에서 dim=0이면 2를 지워 (3,), dim=1이면 3을 지워 (2,)예요.
*는 같은 위치 원소끼리 곱하는 원소별 곱이고 @는 행렬곱이다. 행렬곱은 (a, b) @ (b, c) → (a, c)로 앞의 마지막 차원과 뒤의 첫 차원이 같아야 한다. sum(dim=k)는 k번 차원을 따라 합하며 그 차원은 결과에서 사라진다.
잠깐 확인 — shape (4, 3)과 (3, 2)를 @로 곱하면 결과 shape은?
(4, 2)예요. 가운데 3이 같고, 3은 사라져요.
자료: 2주차 · Week02_Tensor_and_GPU(pdf, 풀이포함 ipynb) · 빅분02(2주차) 녹취