텐서를 “다차원 배열”로 배우면 가장 중요한 것을 놓친다. 배열은 특정 기저를 선택한 뒤의 성분 표현이고, 텐서는 그 선택 이전에 존재하는 대상이다. 좌표가 바뀌어도 텐서가 기술하는 물리적·기하적 관계는 변하지 않는다 — 이것이 핵심이다. 그렇다면 신경망의 가중치 행렬과 아인슈타인의 곡률 텐서는 같은 언어로 쓰일 수 있는가?
텐서의 진짜 정의
(p,q)-형 텐서는 다음 다중선형 사상이다.
T:pV∗×⋯×V∗×qV×⋯×V→R
각 슬롯에 대해 개별적으로 선형이라는 뜻이다. 스칼라는 (0,0), 벡터는 (1,0), 선형연산자(행렬)는 (1,1), 내적은 (0,2)이다. 이것들은 서로 다른 대상이 아니라 같은 정의의 특수 경우다.
왜 V∗∗≃V인가? v∈V에 대해 v^(ϕ)=ϕ(v)로 정의하면 V→V∗∗ 선형사상이 구성된다. 유한차원에서 이 사상은 단사이고 dimV=dimV∗∗이므로 전사다. 따라서 “벡터 = (1,0)-텐서”는 단순한 편의 표기가 아니라 엄밀한 동형사상이다.
반변 지표는 S−1로, 공변 지표는 S로 변환된다. 이 법칙을 만족하는 대상이 텐서다 — 이것이 고전적 정의이고, 다중선형 사상이라는 현대적 정의와 동치다.
Kronecker 곱 — 텐서를 행렬에 가두기
추상적인 텐서곱 공간 V⊗W를 구체적인 행렬 연산으로 구현하는 장치가 Kronecker 곱이다. A∈Rm×n, B∈Rp×q에 대해
A⊗B=a11B⋮am1B⋯⋯a1nB⋮amnB∈Rmp×nq
혼합곱 공식 (A⊗B)(C⊗D)=(AC)⊗(BD)이 성립하고, 고유값은 αiβj의 모든 쌍이 된다.
Kronecker 곱의 진가는 vec 연산자와 결합할 때 드러난다.
정리 1
· vec-Kronecker 관계
차원이 맞는 행렬 A,X,B에 대해
vec(AXB)=(BT⊗A)vec(X)
▷ 증명
(AXB)ij=∑k,lAikXklBlj이므로 vec(AXB)의 (j−1)m+i번째 성분은 ∑k,lAikBljXkl이다. 한편 BT⊗A의 ((j−1)m+i,(l−1)n+k) 성분은 (BT)jlAik=BljAik이므로 일치한다. ■
∎
이 공식 하나로 Sylvester 방정식 AX+XB=C가 선형계 (I⊗A+BT⊗I)vec(X)=vec(C)로 환원된다. 양자역학에서 합성계를 HA⊗HB로 기술하는 것도, 딥러닝의 K-FAC가 Fisher 행렬을 A⊗B로 근사하는 것도 같은 언어다.
einsum — 수식과 코드 사이의 다리
Einstein 합 규약은 “반복되는 지표 하나는 위, 하나는 아래에 나타나면 합을 취한다”는 단 하나의 규칙이다. NumPy의 einsum은 이를 그대로 구현한다.
# 행렬곱C = np.einsum("ik,kj->ij", A, B)# Scaled Dot-Product Attention (배치·멀티헤드)S = np.einsum("bhid,bhjd->bhij", Q, K) / np.sqrt(d_k)O = np.einsum("bhij,bjhd->bihd", A_attn, V)
-> 오른쪽에 없는 지표는 합산(축약)되고, 있는 지표는 유지된다. 3차 텐서의 축약, 배치 행렬곱, 멀티헤드 분리가 모두 같은 문법으로 표현된다.
계산 순서도 중요하다. A∈R1000×10, B∈R10×1000, C∈R1000×5의 연쇄곱에서 (AB)C는 약 1.5×107 FLOPs, A(BC)는 약 105 FLOPs로 100배 이상 차이가 난다. einsum(optimize=True)는 이 최적 경로를 자동으로 탐색한다.
텐서 분해 — SVD를 고차원으로
행렬 SVD가 2차 텐서에 대한 완전한 이론을 제공하듯, 고차 텐서에도 분해가 필요하다. 그러나 3차 이상에서는 상황이 근본적으로 달라진다.
CP 분해는 텐서를 rank-1 텐서의 합으로 표현한다.
Tijk≈r=1∑Rλrairbjrckr
Kruskal 조건 kA+kB+kC≥2R+2가 만족되면 분해가 본질적으로 유일하다. SVD와 달리 회전 불변성이 없어 오히려 해석 가능성이 높다.
Tucker 분해는 코어 텐서 G와 인자 행렬 Un으로 구성된다. HOSVD는 각 모드의 unfolding 행렬에 SVD를 적용해 직교 인자를 구한다.
전체 텐서 저장은 IN이지만 TT는 NIr2으로 N에 선형이다. 차원의 저주를 정면 돌파하는 구조다.
✎ 분해 선택의 트레이드오프
CP는 해석 가능성과 유일성을 위해, Tucker는 각 모드의 독립적 압축을 위해, TT는 고차원 효율을 위해 존재한다. 텐서 랭크 결정은 NP-hard(Håstad 1990)이므로 세 방법 모두 근사 알고리즘에 의존하고, ALS 기반 반복법은 전역 최적을 보장하지 않는다.
신경망은 텐서 수축 그래프다
여기서 모든 것이 연결된다. FC 계층 Y=XWT, 컨볼루션 O[co,y,x]=∑ci,ky,kxK[co,ci,ky,kx]⋅I[ci,y+ky,x+kx], Attention의 QKT, LSTM의 4-게이트 행렬 — 모두 텐서 축약이다.
FC 계층의 SVD 압축 W≈UrΣrVrT은 파라미터를 mn에서 r(m+n)으로 줄인다. 컨볼루션 커널 K∈RCo×Ci×k×k의 Tucker 분해는 ”1×1 conv → k×k conv → 1×1 conv” 세 단계로 구현되며, 이는 depthwise-separable의 일반화다. GPT-3의 파라미터 수 ≈12d2L=12×(1.2×108)×96≈1.7×1011도 텐서 shape에서 바로 계산된다.
역전파도 텐서 연산이다. Y=XW에서 ∂L/∂Y=G가 주어지면 ∂L/∂W=XTG, ∂L/∂X=GWT — 둘 다 forward와 같은 복잡도의 텐서 수축이다. 리버스 모드 자동미분의 본질은 VJP(vector-Jacobian product)를 Jacobian을 명시적으로 구성하지 않고 수행하는 것이다.
정리
텐서는 다차원 배열이 아니라 좌표변환 불변의 다중선형 사상이다. 배열은 기저를 선택한 뒤의 성분 표현이다.
Kronecker 곱과 vec 연산자는 텐서 방정식을 행렬 선형계로 환원한다. vec(AXB) = (B^T ⊗ A) vec(X) 한 줄이 Sylvester 방정식부터 K-FAC까지를 잇는다.