28.20 텐서의 기본 연산 2: 브로드캐스팅(Broadcasting) 규칙과 확장 메커니즘
브로드캐스팅은 형상(shape)이 서로 다른 두 텐서 사이에서 원소별 연산을 수행할 수 있도록, 작은 쪽 텐서의 일부 축을 논리적으로 반복(replication)하여 큰 쪽 텐서의 형상에 맞추는 메커니즘이다. 이 규약은 1995년 NumPy 라이브러리에서 체계화된 이래 PyTorch, TensorFlow, JAX 등 거의 모든 현대 텐서 라이브러리에 표준으로 채택되었다. 브로드캐스팅은 명시적 반복 연산 없이도 벡터화된 코드 작성을 가능하게 하며, 실제 메모리 복사를 수반하지 않으므로 메모리 효율과 연산 성능 면에서 매우 유리하다.
1. 브로드캐스팅 규칙의 형식적 정의
두 텐서 A와 B가 각각 형상 (a_1, a_2, \ldots, a_m)과 (b_1, b_2, \ldots, b_n)을 가진다고 하자. 브로드캐스팅은 다음 세 단계 절차를 통해 수행된다.
첫째, 두 형상의 길이가 같지 않을 경우, 짧은 쪽의 형상 앞에 1을 추가하여 두 형상의 길이를 맞춘다. 즉, m < n이면 A의 형상은 (1, \ldots, 1, a_1, \ldots, a_m)으로 확장된다.
둘째, 이제 길이가 같아진 두 형상의 각 축 k에 대하여 다음 호환 조건(compatibility condition) 중 하나가 성립해야 한다.
a_k = b_k \quad \text{또는} \quad a_k = 1 \quad \text{또는} \quad b_k = 1
셋째, 각 축의 출력 크기는 다음과 같이 결정된다.
c_k = \max(a_k, b_k)
어느 하나의 축에서 호환 조건이 만족되지 않으면 브로드캐스팅은 실패하고, 두 텐서는 원소별 연산을 수행할 수 없다.
2. 확장 메커니즘과 가상 복제
크기가 1인 축을 크기가 c_k인 축으로 확장할 때, 해당 방향의 스트라이드를 0으로 설정함으로써 실제 메모리 복사 없이 논리적 반복을 구현한다. 즉, 지표가 그 축에서 증가하더라도 메모리 주소는 변화하지 않으며, 동일한 원소가 반복 참조된다. 원소별 연산 수행 시 A와 B의 원소는 다음과 같이 색인된다.
[A \oplus B]_{i_1 i_2 \cdots i_n} = A_{j_1 j_2 \cdots j_n} \oplus B_{k_1 k_2 \cdots k_n}
j_k = \begin{cases} i_k & (a_k = c_k) \\ 0 & (a_k = 1) \end{cases}, \qquad k_k = \begin{cases} i_k & (b_k = c_k) \\ 0 & (b_k = 1) \end{cases}
이러한 방식으로 A와 B의 각 원소가 출력 형상의 모든 위치로 올바르게 매핑된다.
3. 구체적 예시
다음 표는 대표적인 브로드캐스팅 사례를 정리한 것이다.
| 입력 A의 형상 | 입력 B의 형상 | 출력 형상 | 호환 여부 |
|---|---|---|---|
| (3, 4) | (4,) | (3, 4) | 가능 |
| (3, 4) | (3, 1) | (3, 4) | 가능 |
| (2, 3, 4) | (3, 4) | (2, 3, 4) | 가능 |
| (5, 1, 4) | (1, 3, 1) | (5, 3, 4) | 가능 |
| (3, 4) | (4, 3) | 오류 | 불가능 |
| (2, 3) | (2, 4) | 오류 | 불가능 |
예를 들어 형상 (5, 1, 4)의 텐서와 형상 (1, 3, 1)의 텐서가 주어지면, 첫 번째 축은 5와 1로 5가 선택되고, 두 번째 축은 1과 3으로 3이 선택되며, 세 번째 축은 4와 1로 4가 선택되어 출력 형상은 (5, 3, 4)가 된다.
4. 편미분과 역전파에서의 의미
브로드캐스팅을 포함한 원소별 연산의 역전파는 순전파에서 반복된 원소들에 대한 기울기를 모두 합산함으로써 수행된다. 예를 들어 z = x + y에서 x의 형상이 출력 z보다 작아 브로드캐스팅이 발생했다면, z에 대한 상류 기울기 \partial L / \partial z는 다음과 같이 x의 원래 형상에 맞게 축소된다.
\frac{\partial L}{\partial x_{j_1 \cdots j_m}} = \sum_{(i_1, \ldots, i_n)\ \text{for which}\ j_k = i_{k+\text{offset}}}\ \frac{\partial L}{\partial z_{i_1 \cdots i_n}}
즉, 브로드캐스트된 축에 대해서는 z의 기울기를 합산(reduce-sum)하여 x의 원래 형상으로 환원시킨다. 이 합산 규칙은 아다마르 곱, 스칼라 곱 등 모든 원소별 연산의 역전파에서 동일하게 적용된다.
5. 성능 및 메모리 효율
브로드캐스팅의 가장 큰 실용적 장점은 메모리 효율과 코드 간결성에 있다. 형상이 다른 두 텐서를 명시적으로 확장(tiling)하지 않고도 연산을 수행할 수 있으므로, 메모리 사용량이 획기적으로 감소하고 불필요한 복사 연산이 제거된다. 예를 들어 배치 정규화에서 배치 차원에 대한 평균과 분산을 계산한 후, 이를 입력 텐서의 각 샘플에 대해 뺄셈과 나눗셈을 수행하는 연산은 브로드캐스팅을 통해 다음과 같이 간결하게 표현된다.
\hat{x} = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}}
이때 x의 형상이 (B, C)이고 \mu와 \sigma^2의 형상이 (C,)이면, 브로드캐스팅에 의해 \mu와 \sigma^2는 논리적으로 (B, C) 형상으로 확장되어 원소별 연산이 수행된다. 이러한 메커니즘은 딥러닝에서 가중치 공유, 편향 가산, 마스킹 등 핵심 연산의 표현을 극도로 단순화시키며, 오늘날 텐서 기반 수치 계산 패러다임의 근간을 이룬다.