브로드캐스팅 규칙
브로드캐스팅이란?
섹션 제목: “브로드캐스팅이란?”서로 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]로 자동 복사되어 덧셈이 이루어집니다. 이것이 브로드캐스팅입니다. 실제로 메모리에 복사되는 것은 아니지만, 그렇게 동작하는 것처럼 보입니다.
3가지 브로드캐스팅 규칙
섹션 제목: “3가지 브로드캐스팅 규칙”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 + Bprint(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
더 복잡한 예시 — (3, 1)과 (1, 4)
섹션 제목: “더 복잡한 예시 — (3, 1)과 (1, 4)”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 + Bprint(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
호환 / 비호환 shape 예시 표
섹션 제목: “호환 / 비호환 shape 예시 표”| A shape | B 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는 오른쪽 끝에서부터 비교한다
다음 장에서는 실전 예시를 통해 다양한 브로드캐스팅 패턴을 연습합니다.