텐서
다차원 데이터를 표현하기 위한 기본 단위
다차원 배열로 스칼라, 벡터, 행렬을 일반화한 개념
차원(Dimension) 및 랭크(Rank)
- 0차 텐서 : 스칼라
- 1차 텐서 : 벡터
- 2차 텐서 : 행렬
- n차 텐서 : n-차원 배열
*텐서의 차원을 랭크(rank)라고 함
기본 연산
- 덧셈과 뺄셈 : 동일한 차원의 텐서끼리 요소별 연산
- 스칼라 곱 : 텐서의 각 요소에 스칼라를 곱함
- 내적(Dot Product) : 두 벡터 간의 내적 또는 일반화된 차원 축약
- 외적(Cross Product) : 벡터 간의 외적, 일반적으로 3D 벡터에 적용
- 요소별 곱(Element-wise Product) : 같은 모양의 텐서끼리 대응되는 요소의 곱
텐서를 사용하면 복잡한 다차원 데이터를 효율적으로 표현하고 조작 가능
딥러닝에서는 대규모 데이터와 복잡한 모델 구조를 다루는 데 텐서가 필수적 → 데이터, 가중치, 활성화 등을 텐서로 표현
텐서 축약과 아인슈타인 표기법
텐서 축약(Reduction)
텐서의 특정 축(axis)을 따라 합을 계산하거나 평균 등을 계산
- 행렬 곱셈은 텐서 축약의 한 예
아인슈타인 표기법
텐서 연산을 간결하고 명확하게 표현하는 방법
규칙
- 인덱스를 반복해서 사용하면 자동으로 축소 연산 수행
- 반복되지 않은 인덱스는 결과 텐서의 차원을 나타냄
C_{ij} = A_{ik}B_{kj}
A와 B의 k축을 따라 곱하고 합산하여 C를 생성
아인슈타인 표기법 활용 예
import numpy as np
A = np.random.rand(2, 3) # 2x3 행렬
B = np.random.rand(3, 4) # 3x4 행렬
# 행렬 곱 표현
C = np.einsum('ik,kj->ij', A, B)
print("결과 행렬 C의 형태:", C.shape)
"""
결과 행렬 C의 형태: (2, 4)
"""
텐서 연산의 활용 사례
다중 헤드 어텐션(Multi-Head Attention)
입력 시퀀스와 가중치를 텐서로 표현
Q, K, V 텐서 간의 복잡한 내적 및 축약 연산 수행
3D 합성곱 신경망(3D CNN)
이미지 데이터(폭, 높이, 채널)를 3차원 텐서로 표현
필터를 사용한 텐터 축약 및 합성곱 연산으로 특징 추출
추천 시스템에서의 텐서 분해
사용자-아이템-컨텍스트 상호작용을 3차원 텐서로 표현
CP분해 또는 Tucker 분해를 통해 잠재 요인 모델링
물리학과 컴퓨터 그래픽
텐서를 사용하여 3D 공간에서의 변환(회전, 스케일링)을 효율적으로 표현
물리학에서는 응력, 변형률 등의 복잡한 상호작용을 모델링
→텐서 연산은 머신러닝과 딥러닝에서 광범위하게 사용됨
→ 딥러닝과 데이터 분석에서 모델 구조, 데이터 처리, 특징 추출 등의 핵심 역할 담당
NumPy를 활용한 텐서 연산
# 1.텐서 생성
import numpy as np
#3차원 텐서 생성
T = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("텐서 형태:", T.shape) #(2, 2, 2)
# 2. 텐서 축약
#첫 번째 축(axis = 0) 기준 합
sum_along_axis0 = np.sum(T, axis = 0)
print("첫 번째 축 기준 합:\n", sum_along_axis0)
#마지막 축(axis = -1) 기준 평균
mean_along_last_axis = np.mean(T, axis = -1)
print("마지막 축 기준 평균:\n", mean_along_last_axis)
"""
텐서 형태: (2, 2, 2)
첫 번째 축 기준 합:
[[ 6 8]
[10 12]]
마지막 축 기준 평균:
[[1.5 3.5]
[5.5 7.5]]
"""
텐서 연산 성능 최적화
- NumPy, PyTorch, TensorFlow와 같은 라이브러리 사용
- GPU 가속 연산으로 대규모 텐서 연산 수행
텐서는 데이터를 담고있는 '박스' ! '그릇' !