28.4 고차 텐서(Higher-Order Tensor)의 정의와 다차원 인덱싱

28.4 고차 텐서(Higher-Order Tensor)의 정의와 다차원 인덱싱

1. 고차 텐서의 형식적 정의

3차 이상의 텐서를 고차 텐서(higher-order tensor)라 한다. d차 텐서 \mathcal{T} \in \mathbb{R}^{n_1 \times n_2 \times \cdots \times n_d}d개의 인덱스 (i_1, i_2, \ldots, i_d)에 의해 원소가 지정되는 다차원 배열이다.

\mathcal{T}_{i_1 i_2 \cdots i_d} \in \mathbb{R}, \quad 1 \leq i_k \leq n_k \quad (k = 1, \ldots, d)

전체 원소의 수는 N = \prod_{k=1}^{d} n_k이다. 예를 들어, (10, 3, 224, 224) 형상의 4차 텐서는 10 \times 3 \times 224 \times 224 = 15,052,800개의 원소를 가진다.

수학적으로 d차 텐서는 d개의 벡터 공간 V_1, V_2, \ldots, V_d의 텐서곱 공간 V_1 \otimes V_2 \otimes \cdots \otimes V_d의 원소이다. 각 벡터 공간 V_k의 차원이 n_k이면, 텐서곱 공간의 차원은 \prod_{k=1}^{d} n_k이다. 텐서곱 공간의 기저는 각 공간의 기저의 모든 조합으로 구성된다.

\mathcal{T} = \sum_{i_1=1}^{n_1}\sum_{i_2=1}^{n_2}\cdots\sum_{i_d=1}^{n_d} \mathcal{T}_{i_1 i_2 \cdots i_d}\; \mathbf{e}_{i_1}^{(1)} \otimes \mathbf{e}_{i_2}^{(2)} \otimes \cdots \otimes \mathbf{e}_{i_d}^{(d)}

2. 차 텐서의 구조

3차 텐서 \mathcal{T} \in \mathbb{R}^{I \times J \times K}는 고차 텐서의 가장 기본적인 경우이다. 기하학적으로 직육면체 형태의 수의 배열로 시각화할 수 있다.

3차 텐서의 하위 구조는 다음과 같이 분류된다.

섬유(Fiber): 두 인덱스를 고정하고 하나의 인덱스만 변화시킨 1차원 부분이다.

  • 모드-1 (열) 섬유: \mathcal{T}_{:jk} \in \mathbb{R}^Ij, k를 고정
  • 모드-2 (행) 섬유: \mathcal{T}_{i:k} \in \mathbb{R}^Ji, k를 고정
  • 모드-3 (관) 섬유: \mathcal{T}_{ij:} \in \mathbb{R}^Ki, j를 고정

슬라이스(Slice): 하나의 인덱스를 고정한 2차원 부분(행렬)이다.

  • 수평 슬라이스: \mathcal{T}_{i::} \in \mathbb{R}^{J \times K}
  • 측면 슬라이스: \mathcal{T}_{:j:} \in \mathbb{R}^{I \times K}
  • 정면 슬라이스: \mathcal{T}_{::k} \in \mathbb{R}^{I \times J}

이러한 분류는 d차 텐서로 자연스럽게 일반화된다. d차 텐서에서 (d-1)개의 인덱스를 고정하면 섬유(1차원)를 얻고, (d-2)개를 고정하면 슬라이스(2차원)를 얻는다.

3. 다차원 인덱싱

고차 텐서의 원소에 접근하는 다차원 인덱싱(multidimensional indexing)은 딥러닝 프레임워크에서 가장 기본적인 연산이다.

기본 인덱싱: 각 모드에 대하여 정수 인덱스를 지정하여 단일 원소에 접근한다. \mathcal{T}[i_1, i_2, \ldots, i_d]는 스칼라 값을 반환한다.

슬라이스 인덱싱: 하나 이상의 모드에 대하여 범위(range)를 지정하여 부분 텐서에 접근한다. Python 표기법으로 \mathcal{T}[a_1:b_1, a_2:b_2, \ldots]는 지정된 범위의 부분 텐서를 반환한다. 콜론 :은 해당 모드의 전체 범위를 나타낸다.

고급 인덱싱: 정수 배열이나 불리언 마스크를 사용하여 비연속적인 원소들에 접근한다. 정수 배열 인덱싱 \mathcal{T}[\mathbf{idx}]는 지정된 인덱스의 원소들을 모은 텐서를 반환하고, 불리언 마스크 인덱싱 \mathcal{T}[\mathbf{mask}]는 마스크가 참인 위치의 원소들을 1차원 텐서로 반환한다.

메모리 상에서의 인덱싱은 다음과 같이 계산된다. 행 우선(row-major) 저장에서 (i_1, i_2, \ldots, i_d) 위치의 원소의 메모리 오프셋(offset)은 다음과 같다.

\text{offset} = \sum_{k=1}^{d} i_k \cdot s_k

여기서 s_kk번째 모드의 스트라이드(stride)이다. 행 우선 저장에서 s_k = \prod_{j=k+1}^{d} n_j이다.

4. 행렬화(Matricization)

고차 텐서를 행렬의 형태로 변환하는 행렬화(matricization, unfolding)는 텐서 분석의 핵심 도구이다.

d차 텐서 \mathcal{T} \in \mathbb{R}^{n_1 \times \cdots \times n_d}의 모드-k 행렬화 \mathbf{T}_{(k)}n_k \times (\prod_{j \neq k} n_j) 크기의 행렬이다. 텐서의 모드-k 섬유들을 열벡터로 배열하여 구성한다. 원소의 대응 관계는 다음과 같다.

(\mathbf{T}_{(k)})_{i_k, j} = \mathcal{T}_{i_1 i_2 \cdots i_d}

여기서 열 인덱스 j는 나머지 인덱스 (i_1, \ldots, i_{k-1}, i_{k+1}, \ldots, i_d)를 사전식(lexicographic) 순서로 나열한 것이다.

예를 들어, \mathcal{T} \in \mathbb{R}^{3 \times 4 \times 2}의 모드-1 행렬화 \mathbf{T}_{(1)} \in \mathbb{R}^{3 \times 8}은 4개의 정면 슬라이스를 좌우로 나란히 배치한 형태이다.

행렬화의 중요한 응용은 모드-k 계수의 계산이다. \text{rank}_k(\mathcal{T}) = \text{rank}(\mathbf{T}_{(k)})이며, 이는 터커 분해에서 핵심 텐서의 크기를 결정한다.

5. 벡터화(Vectorization)

텐서의 모든 원소를 하나의 벡터로 나열하는 것을 벡터화(vectorization)라 한다. d차 텐서 \mathcal{T} \in \mathbb{R}^{n_1 \times \cdots \times n_d}의 벡터화 \text{vec}(\mathcal{T}) \in \mathbb{R}^{N} (N = \prod_k n_k)는 행 우선 또는 열 우선 순서로 원소를 나열한 것이다.

벡터화는 텐서를 선형대수적 도구로 분석할 때 유용하다. 두 텐서의 내적(프로베니우스 내적)은 벡터화된 형태에서 표준 내적으로 계산된다.

\langle\mathcal{A}, \mathcal{B}\rangle = \text{vec}(\mathcal{A})^\top\text{vec}(\mathcal{B}) = \sum_{i_1, \ldots, i_d} \mathcal{A}_{i_1 \cdots i_d}\mathcal{B}_{i_1 \cdots i_d}

프로베니우스 노름도 마찬가지이다. \|\mathcal{T}\|_F = \sqrt{\langle\mathcal{T}, \mathcal{T}\rangle} = \|\text{vec}(\mathcal{T})\|_2이다.

6. 딥러닝에서의 고차 텐서

딥러닝에서 고차 텐서는 어디에서나 등장한다.

3차 텐서: 시퀀스 데이터의 배치 (B, L, d), 다중 채널 1차원 신호 (B, C, T) 등.

4차 텐서: 이미지 배치 (B, C, H, W), 합성곱 커널 (C_{\text{out}}, C_{\text{in}}, k_H, k_W), 어텐션 가중치 (B, h, L, L) (배치, 헤드, 쿼리 위치, 키 위치) 등.

5차 텐서: 비디오 배치 (B, T, C, H, W), 3차원 합성곱 커널 (C_{\text{out}}, C_{\text{in}}, k_D, k_H, k_W) 등.

이러한 고차 텐서의 효율적 처리를 위해 딥러닝 프레임워크는 연속 메모리 블록에 원소를 저장하고, 스트라이드 기반의 인덱싱을 통해 슬라이싱과 전치(transpose)를 메모리 복사 없이 수행한다. view, reshape, permute 등의 연산은 텐서의 메모리 레이아웃을 재해석하는 것으로, 실제 데이터 이동을 최소화하면서 고차 텐서의 다양한 접근 패턴을 지원한다.

텐서의 차수가 증가하면 원소 수가 차원 크기의 곱으로 기하급수적으로 증가하므로(차원의 저주), 실용적으로 각 모드의 크기를 적절히 설정하고 저순위 분해나 희소 구조를 활용하여 계산 가능한 범위로 유지하는 것이 중요하다.