콘텐츠로 이동

브로드캐스팅 규칙

서로 shape가 다른 텐서끼리 연산할 때, 더 작은 텐서를 자동으로 확장하여 연산을 가능하게 하는 메커니즘입니다.

직관적으로 생각해보세요. 숫자 2를 벡터 [1, 2, 3]에 더하면 어떻게 될까요?

import torch
a = torch.tensor([1, 2, 3])
b = torch.tensor(2)
print(a + b) # tensor([3, 4, 5])

2[2, 2, 2]자동 복사되어 덧셈이 이루어집니다. 이것이 브로드캐스팅입니다. 실제로 메모리에 복사되는 것은 아니지만, 그렇게 동작하는 것처럼 보입니다.


PyTorch는 다음 세 가지 규칙을 순서대로 적용합니다.

규칙 1 — 차원이 부족하면 앞에 1을 추가한다

섹션 제목: “규칙 1 — 차원이 부족하면 앞에 1을 추가한다”

두 텐서의 차원 수(ndim)가 다르면, 차원이 적은 쪽의 shape 앞에 1을 붙입니다.

A: shape (3, 4) → shape (3, 4)
B: shape (4,) → shape (1, 4) ← 앞에 1 추가

규칙 2 — 크기가 1인 차원은 상대방 크기로 확장된다

섹션 제목: “규칙 2 — 크기가 1인 차원은 상대방 크기로 확장된다”

어느 한 쪽의 차원 크기가 1이면, 다른 쪽의 크기에 맞춰 반복 확장됩니다.

A: shape (3, 4)
B: shape (1, 4) → (3, 4) ← 크기 1이 3으로 확장

규칙 3 — 크기가 1도 아니고 같지도 않으면 오류

섹션 제목: “규칙 3 — 크기가 1도 아니고 같지도 않으면 오류”

두 차원의 크기가 다르고, 어느 쪽도 1이 아니면 연산 불가입니다.

A: shape (3, 4)
B: shape (3, 5) ← 4 ≠ 5, 둘 다 1이 아님 → RuntimeError

(4, 3) 행렬과 (3,) 벡터를 더하는 과정을 추적해봅니다.

초기 shape:
A: (4, 3)
B: (3,)
규칙 1 적용 — 차원 수를 맞춤:
A: (4, 3)
B: (1, 3) ← (3,) 앞에 1 추가
규칙 2 적용 — 크기 1 확장:
A: (4, 3)
B: (4, 3) ← (1, 3)의 첫 번째 차원 1 → 4로 확장
결과 shape: (4, 3)
import torch
A = torch.ones(4, 3)
B = torch.tensor([10.0, 20.0, 30.0]) # shape: (3,)
result = A + B
print(result.shape) # torch.Size([4, 3])
print(result)
# tensor([[11., 21., 31.],
# [11., 21., 31.],
# [11., 21., 31.],
# [11., 21., 31.]])

B의 [10, 20, 30]이 4번 반복되어 각 행에 더해진 것을 확인할 수 있습니다.

(4, 3) + (3,) 브로드캐스팅 시각화
1단계: 원래 shape두 텐서의 원래 shape을 확인합니다.
텐서 A
1
2
3
4
5
6
7
8
9
10
11
12
shape: (4, 3)
텐서 B
1
2
3
shape: (3)
1 / 3

A: shape (3, 1)
B: shape (1, 4)
규칙 2 적용:
A: (3, 1) → (3, 4) ← 열 방향으로 4번 확장
B: (1, 4) → (3, 4) ← 행 방향으로 3번 확장
결과 shape: (3, 4)
A = torch.tensor([[1], [2], [3]]) # shape: (3, 1)
B = torch.tensor([[10, 20, 30, 40]]) # shape: (1, 4)
result = A + B
print(result.shape) # torch.Size([3, 4])
print(result)
# tensor([[11, 21, 31, 41],
# [12, 22, 32, 42],
# [13, 23, 33, 43]])

이것이 바로 외적(outer product) 패턴입니다.

(3, 1) + (1, 4) 브로드캐스팅 시각화
1단계: 원래 shape두 텐서의 원래 shape을 확인합니다.
텐서 A
1
2
3
shape: (3, 1)
텐서 B
1
2
3
4
shape: (1, 4)
1 / 3

A shapeB shape결과 shape호환 여부
(3,)(3,)(3,)호환
(3, 4)(4,)(3, 4)호환
(3, 1)(1, 4)(3, 4)호환
(2, 3, 4)(3, 4)(2, 3, 4)호환
(2, 3, 4)(1, 1, 4)(2, 3, 4)호환
(3, 4)(3, 5)비호환 (4 ≠ 5)
(2, 3)(2,)비호환 (3 ≠ 2)
(2, 3, 4)(2, 4)비호환 (3 ≠ 2)

  • 브로드캐스팅 = shape가 다른 텐서를 자동으로 확장해 연산하는 메커니즘
  • 규칙 1: 차원 수가 부족하면 앞에 1 추가
  • 규칙 2: 크기 1인 차원은 상대방 크기로 확장
  • 규칙 3: 크기가 다르고 둘 다 1이 아니면 RuntimeError
  • shape는 오른쪽 끝에서부터 비교한다

다음 장에서는 실전 예시를 통해 다양한 브로드캐스팅 패턴을 연습합니다.