IT Study/인공지능 관련

🤖 텐서 연산과 브로드캐스팅 개념(PyTorch, TensorFlow)

cs_bot 2025. 4. 11. 14:43

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는 이 기능을 효과적으로 제공하고 있으며, 모델 구현 및 최적화 과정에서 필수적으로 이해하고 있어야 할 개념임