28.19 텐서의 기본 연산 1: 원소별(Element-wise) 연산의 정의
원소별 연산은 두 개(또는 그 이상) 텐서의 동일한 위치에 있는 원소들에 대하여 독립적으로 스칼라 연산을 적용하거나, 하나의 텐서의 각 원소에 단항 함수를 적용하여 동일한 형상의 출력 텐서를 생성하는 연산이다. 이 연산은 텐서의 다차원 구조를 보존하면서 요소 단위로 계산을 수행하므로, 벡터화된 구현과 GPU 병렬화에 가장 친화적이다. 딥러닝의 활성화 함수, 손실 함수, 가중치 갱신 등 다수의 연산은 본질적으로 원소별 연산으로 환원된다.
1. 단항(Unary) 원소별 연산
단일 텐서 T와 스칼라 함수 f: \mathbb{R} \to \mathbb{R}에 대하여, 단항 원소별 연산은 다음과 같이 정의된다.
[f(T)]_{i_1 i_2 \cdots i_n} = f\!\left(T_{i_1 i_2 \cdots i_n}\right)
입력 텐서의 형상이 (d_1, d_2, \ldots, d_n)이면 출력 텐서 역시 동일한 형상을 갖는다. 대표적인 예로는 지수함수 \exp, 로그함수 \log, 절댓값 |\cdot|, 제곱근 \sqrt{\cdot}, 그리고 시그모이드(sigmoid), 하이퍼볼릭 탄젠트(\tanh), 정류 선형 유닛(ReLU) 등의 비선형 활성화 함수가 있다. 예를 들어 ReLU는 다음과 같이 정의된다.
[\mathrm{ReLU}(T)]_{i_1 \cdots i_n} = \max\!\left(0,\, T_{i_1 \cdots i_n}\right)
2. 이항(Binary) 원소별 연산
두 텐서 A와 B가 동일한 형상 (d_1, \ldots, d_n)을 가질 때, 이항 스칼라 연산 \oplus: \mathbb{R} \times \mathbb{R} \to \mathbb{R}에 대하여 원소별 연산은 다음과 같이 정의된다.
[A \oplus B]_{i_1 i_2 \cdots i_n} = A_{i_1 i_2 \cdots i_n} \oplus B_{i_1 i_2 \cdots i_n}
대표적 예로는 덧셈 +, 뺄셈 -, 원소별 곱(아다마르 곱, Hadamard product) \odot, 원소별 나눗셈 \oslash, 그리고 원소별 최댓값/최솟값 연산이 있다. 아다마르 곱은 특히 중요하며, 다음과 같이 정의된다.
(A \odot B)_{i_1 i_2 \cdots i_n} = A_{i_1 i_2 \cdots i_n} \cdot B_{i_1 i_2 \cdots i_n}
아다마르 곱은 일반적인 행렬 곱과 구분되며, 동일한 형상의 두 텐서에서만 정의되고 결과 역시 동일한 형상을 갖는다.
3. 형상 불변성과 대수적 성질
원소별 연산의 가장 기본적 성질은 형상 불변성이다. 즉, 입력 텐서들의 형상이 동일할 때 출력의 형상도 같다. 이항 원소별 연산은 사용된 스칼라 연산의 대수적 성질을 그대로 계승한다. 덧셈은 교환법칙, 결합법칙, 항등원 0, 역원 -A의 존재를 만족한다.
A + B = B + A,\qquad (A + B) + C = A + (B + C)
아다마르 곱 또한 교환법칙과 결합법칙을 만족하며, 모든 원소가 1인 텐서 \mathbf{1}이 항등원의 역할을 한다.
A \odot B = B \odot A,\qquad A \odot \mathbf{1} = A
원소별 연산과 스칼라 곱셈 사이에는 분배법칙이 성립한다.
\alpha (A + B) = \alpha A + \alpha B,\qquad A \odot (B + C) = A \odot B + A \odot C
4. 원소별 연산과 병렬화
원소별 연산은 각 원소의 계산이 서로 독립적이므로, 완전 병렬화(embarrassingly parallel)가 가능한 연산 범주에 속한다. GPU에서는 각 원소 또는 원소의 작은 묶음을 독립된 스레드에 할당하여 대규모 SIMT(Single Instruction Multiple Thread) 병렬 실행을 수행한다. 총 N = \prod_{k=1}^{n} d_k개의 원소에 대한 원소별 연산의 계산 복잡도는 O(N)이며, 이론적 병렬 깊이는 O(1)이다. 메모리 접근 패턴이 단순하고 연속적인 경우, 원소별 연산은 메모리 대역폭(memory bandwidth)에 의해 성능이 제한되는 대표적인 대역폭 속박(bandwidth-bound) 연산으로 분류된다.
5. 딥러닝에서의 역할
딥러닝의 순전파 및 역전파에서 원소별 연산은 다음과 같이 광범위하게 사용된다.
| 범주 | 예시 | 정의 |
|---|---|---|
| 활성화 함수 | Sigmoid | \sigma(x) = 1 / (1 + e^{-x}) |
| 활성화 함수 | ReLU | \max(0, x) |
| 정규화 | 배치 정규화의 스케일/이동 | \gamma \odot \hat{x} + \beta |
| 손실 함수 | 평균 제곱 오차 원소항 | (y - \hat{y})^2 |
| 최적화 | 경사 하강 갱신 | \theta \leftarrow \theta - \eta \cdot g |
| 게이트 연산 | LSTM, GRU 게이트 | i \odot g, f \odot c |
주목할 점은 원소별 연산이 자동 미분(automatic differentiation)에서도 단순한 형태의 역전파 규칙을 가진다는 것이다. 단항 연산 y = f(x)의 경우 \partial y / \partial x = f'(x)가 원소별로 계산되며, 이항 연산 y = a \odot b의 경우 \partial y / \partial a = b, \partial y / \partial b = a가 각각 원소별로 적용된다. 이러한 단순성과 병렬성은 원소별 연산이 현대 딥러닝 계산 그래프의 가장 기본적인 구성 요소 중 하나가 된 이유이다.