텐서는 수·벡터·행렬의 사다리다
텐서라는 말이 어렵게 들려도 사실은 우리가 이미 다 아는 것들을 한 사다리에 꿴 이름이다. 한 칸 = 그냥 수(스칼라). 한 줄로 늘어놓으면 벡터, 격자로 펴면 행렬, 격자를 여러 층 쌓으면 큐브다. 인덱스가 몇 개 필요한지가 곧 계급(rank)이에요. 0개, 1개, 2개, 3개. 두 벡터를 바깥으로 곱한 외적 u⊗v = u vᵀ는 가장 단순한 rank-1 행렬을 짓고, 어떤 행렬이든 이런 조각의 합으로 쌓을 수 있다. SVD가 바로 그것이었다. 행렬은 두 벡터를 먹어 수 하나(uᵀ M v)를 뱉기도 해요. 이미지 한 장도 학습 배치 한 묶음도 전부 텐서다. 사다리를 한 칸씩 올라간다.
버튼으로 계급을 한 칸씩 올린다. rank 0은 칸 하나, 그냥 수다. 위치를 가리킬 인덱스가 필요 없어요. rank 1은 칸을 한 줄로 늘여 벡터가 되고, 어느 칸인지 고르려면 인덱스 한 개가 필요하다. rank 2는 줄을 격자로 펴 행렬이 되고, 몇 행 몇 열이라 인덱스가 두 개다. rank 3은 그 격자를 여러 층 쌓은 큐브라 인덱스가 세 개다. 계급이 곧 인덱스 축 개수라는 게 한눈에 보여요. 모양도 같이 자라서 점 → 줄 → 면 → 부피로 간다. 텐서는 새로운 괴물이 아니라 우리가 아는 것들을 같은 사다리에 세운 이름이에요.
이번에는 두 벡터를 바깥으로 곱해 행렬을 만든다. 슬라이더로 u = (u1, u2)를 왼쪽 세로에, v = (v1, v2)를 위쪽 가로에 놓으면 격자 칸 (i, j)에는 ui · vj가 들어가요. 곧 u⊗v = u vᵀ다. 왼쪽 값과 위쪽 값을 곱한 게 그 자리 숫자이고, 칸은 값에 따라 짙고 옅게 칠해진다. u를 두 배로 키우면 행 전체가 두 배가 되고, v를 키우면 열 전체가 두 배가 된다. 신기한 건 어떻게 돌려도 이 행렬의 랭크는 늘 1이라는 점이에요. 모든 행이 u의 배수, 모든 열이 v의 배수라 독립 방향이 하나뿐이기 때문이다. 외적은 가장 단순한 행렬, rank-1 벽돌이다.
그럼 보통의 행렬은 어떻게 만들까. rank-1 벽돌 여러 개를 쌓으면 된다. 토글로 층을 하나씩 더할 수 있어요. 층 1은 첫 조각 σ1·u1·v1ᵀ 하나뿐이라 목표 행렬의 큰 윤곽만 거칠게 흉내 낸다. 층 2를 더하면 σ2·u2·v2ᵀ가 남은 차이를 메워 합이 목표 행렬과 정확히 일치한다. 화면에는 현재 재구성과 목표를 나란히 띄우고 둘의 차이도 숫자로 보여줘요. 이게 바로 SVD의 핵심이다. 어떤 행렬이든 A = Σ σk uk vkᵀ, 곧 rank-1 조각의 합이고, 큰 σ부터 몇 개만 남겨도 형태가 거의 살아남는다. 압축이 여기서 나와요.
행렬을 변환이 아니라 두 벡터를 먹는 기계로도 볼 수 있다. 고정된 행렬 M에 왼쪽에서 u를, 오른쪽에서 v를 끼우면 수 하나가 나오는데 그게 uᵀ M v예요. 이게 rank 2 텐서인 행렬이 두 벡터를 받아 스칼라를 뱉는 쌍선형형이다. 좌표 평면에서 u와 v 화살표를 끌면 아래 숫자판에 uᵀ M v 값이 실시간으로 뜬다. 한쪽을 고정하고 다른 쪽만 두 배로 늘이면 결과도 정확히 두 배가 된다. 두 인자 각각에 대해 선형이라 쌍선형이에요. 길이 재기인 내적, 에너지(½ xᵀ K x), 곡률, 응력처럼 두 방향을 먹어 수 하나를 주는 양은 전부 이 틀이다.
마지막으로 텐서가 왜 머신러닝의 모국어인지 본다. 토글로 차원을 한 축씩 더할 수 있어요. 흑백 이미지 한 장은 픽셀 밝기의 격자, 곧 [H, W] 행렬(rank 2)이다. 컬러로 가면 빨강과 초록과 파랑 세 채널이 쌓여 [H, W, 3] 큐브(rank 3)가 된다. 여러 장을 한 번에 학습시키면 그 큐브를 N개 겹쳐 [N, H, W, 3] (rank 4)가 돼요. 화면은 축을 더할 때마다 모양 라벨과 격자가 어떻게 쌓이는지를 같이 보여준다. 텐서는 추상 수학 장식이 아니라 데이터의 여러 축을 한 그릇에 담는 실용 그릇이다. 딥러닝 프레임워크 이름에 'Tensor'가 들어가는 이유예요.