시험공부빅데이터분석
← 보드Tensor · 8/11

연산 — 원소별 곱(*)과 행렬곱(@), 그리고 dim 집계 ★★

Tensor끼리 + - * /를 하면 같은 자리끼리 계산돼요. 이것을 원소별(element-wise) 연산이라고 해요. 곱셈은 모양이 비슷해 보여도 두 종류가 달라요.

기호이름어떻게 계산하나
*원소별 곱같은 자리끼리 곱해요. 두 Tensor의 shape이 같아야 해요(또는 브로드캐스팅 가능)
@행렬곱행렬 곱셈 규칙. torch.matmul(A, B)와 같아요. 앞의 마지막 크기 = 뒤의 첫 크기여야 해요
A = torch.tensor([[1., 2.], [3., 4.]]) B = torch.tensor([[5., 6.], [7., 8.]]) print(A * B) print(A @ B)
tensor([[ 5., 12.], [21., 32.]]) tensor([[19., 22.], [43., 50.]])
코드 줄무슨 뜻
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 = torch.tensor([[1., 2., 3.], [4., 5., 6.]]) print(z.sum()) print(z.mean()) print(z.sum(dim=0)) print(z.sum(dim=1))
tensor(21.) tensor(3.5000) tensor([5., 7., 9.]) tensor([ 6., 15.])
코드 줄무슨 뜻
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은 사라져요.

다음 카드 → 브로드캐스팅 — shape이 달라도 계산되는 규칙 ★★★

자료: 2주차 · Week02_Tensor_and_GPU(pdf, 풀이포함 ipynb) · 빅분02(2주차) 녹취