1. 텐서(Tensor)의 개념 및 필요성
- 텐서는 다차원 배열 구조를 일반화한 수학적 개념으로, 벡터, 행렬보다 더 높은 차원을 다룰 수 있는 데이터 구조임
- 스칼라(0차), 벡터(1차), 행렬(2차), 그리고 3차원 이상의 고차원 데이터를 통칭하여 텐서라고 정의함
- 딥러닝 프레임워크(PyTorch, TensorFlow)에서 입력 데이터, 모델의 파라미터, 출력값 등이 모두 텐서로 표현됨
- GPU 병렬 연산에 적합한 구조로 설계되어 있어 대규모 행렬 연산을 효율적으로 수행 가능함
- 다차원 이미지, 시계열, 음성, 자연어 등 다양한 형태의 데이터를 일관되게 표현하고 처리할 수 있는 표준 형태로 사용됨
2. 텐서 연산(Tensor Operation)의 유형
2.1 기본 연산
- 덧셈, 뺄셈, 곱셈, 나눗셈 등 원소 단위(Element-wise) 연산 지원
- 연산의 대상이 되는 두 텐서의 shape(형상)이 동일하거나, 브로드캐스팅이 가능해야 연산 수행 가능함
- 예:
a + b
, a * b
등은 각 요소에 대해 연산을 수행함
2.2 행렬 연산
- 내적(dot product), 행렬 곱(matrix multiplication), 전치(transpose), 역행렬(inverse) 등의 연산 포함
- TensorFlow:
tf.matmul()
, PyTorch: torch.matmul()
등의 함수로 지원함
- 예: (m×n) * (n×p) → (m×p) 결과 반환됨
2.3 축(axis) 기반 연산
- 차원 축을 따라 합(sum), 평균(mean), 최대값(max), 최소값(min) 등의 연산 가능
- 예:
torch.sum(tensor, dim=1)
또는 tf.reduce_sum(tensor, axis=1)
등으로 특정 차원 축소 연산 수행함
2.4 차원 변형 연산
reshape()
, view()
, expand_dims()
, squeeze()
등을 통해 텐서의 구조를 변경함
- 모델 입력 형식에 따라 데이터 차원을 조절할 때 필수적으로 사용됨
3. 브로드캐스팅(Broadcasting)의 개념
- 서로 다른 shape(형상)을 가진 텐서 간 연산을 수행할 수 있도록 자동으로 차원을 확장하거나 복제하여 연산 가능하게 만드는 기능
- NumPy 연산에서 유래되었으며, PyTorch 및 TensorFlow 모두 동일한 방식으로 적용됨
- 작은 텐서를 큰 텐서의 형상에 맞게 자동으로 확장(replicate)하여 연산을 수행하는 과정임
4. 브로드캐스팅 동작 원리
4.1 규칙 1: 뒤에서부터 비교하여 차원을 맞춤
- 연산 대상이 되는 두 텐서의 shape를 뒤에서부터 비교하며 차원을 비교함
- 각 차원이 동일하거나, 하나의 차원이 1이면 브로드캐스팅 가능함
- 예: (3, 1, 5) + (1, 4, 5) → (3, 4, 5)로 확장하여 연산 가능함
4.2 규칙 2: 부족한 차원은 앞에서 1로 채움
- 차원 수가 다른 경우, 부족한 차원은 앞쪽에서 1로 간주하여 연산에 참여시킴
- 예: (5,) + (3, 5) → (1, 5) + (3, 5) → (3, 5)
4.3 규칙 3: 브로드캐스팅 후 확장된 텐서는 실제 복제가 아님
- 실제로 메모리에서 값이 복제되는 것이 아니라, 내부적으로 반복 처리하여 연산 성능을 최적화함
- 메모리 낭비 없이 대규모 연산 가능하게 하는 고성능 처리 방식임
5. 브로드캐스팅 예시(PyTorch & TensorFlow)
PyTorch 예시
import torch
a = torch.ones(3, 1)
b = torch.ones(1, 4)
result = a + b # 결과 shape: (3, 4)
TensorFlow 예시
import tensorflow as tf
a = tf.ones([3, 1])
b = tf.ones([1, 4])
result = a + b # 결과 shape: (3, 4)
6. 브로드캐스팅의 응용 사례
- 모델 학습 시 배치 연산에 활용되어 다양한 shape 간의 연산을 간결하게 수행할 수 있음
- Convolution 연산 후 bias 벡터를 각 채널에 자동 확장 적용할 때 사용됨
- Attention 계산 시 Query, Key, Value 벡터 간 연산에 활용됨
- 정규화 계수(gamma, beta) 적용이나 loss 계산 시 차원 자동 확장에 활용됨
7. PyTorch와 TensorFlow 간 차이점 및 공통점
항목 |
PyTorch |
TensorFlow |
텐서 클래스 |
torch.Tensor |
tf.Tensor |
연산 방식 |
NumPy 유사, 동적 실행 방식 |
정적 그래프 기반, TF 2.x 이후 eager mode 기본화됨 |
브로드캐스팅 규칙 |
NumPy 스타일 완전 준수 |
NumPy 스타일 준수, 일부 함수에서 사용자 옵션 추가 제공 |
디버깅 편의성 |
즉시 실행(eager execution)으로 직관적 디버깅 용이 |
TF 1.x에서는 복잡, TF 2.x부터는 유사해짐 |
8. 주의사항 및 한계
- 브로드캐스팅 과정에서 의도하지 않은 자동 확장으로 인해 shape mismatch 오류가 발생할 수 있음
- 연산의 차원이 명확하지 않을 경우, 명시적 reshape 또는 expand를 통해 사전 확인 필요함
- 연산 결과가 큰 텐서로 확장될 경우 메모리 사용량 증가로 인한 오버헤드 발생 가능함
- 고차원 텐서 연산 시 shape 확인이 필수적이며,
tensor.shape
, tensor.size()
등의 디버깅 도구 활용이 권장됨
9. 결론
- 텐서 연산과 브로드캐스팅은 현대 딥러닝 프레임워크에서 핵심적인 역할을 수행함
- 복잡한 모델 연산을 단순하고 직관적으로 구현 가능하게 해주는 수단이며, 코드 간결성과 성능 모두 확보할 수 있음
- PyTorch와 TensorFlow는 이 기능을 효과적으로 제공하고 있으며, 모델 구현 및 최적화 과정에서 필수적으로 이해하고 있어야 할 개념임