텐서는 수·벡터·행렬의 사다리다
'텐서'라는 말이 어렵게 들려도, 사실은 우리가 이미 다 아는 것들을 한 사다리에 꿴 이름이에요. 한 칸 = 그냥 수(스칼라). 한 줄로 늘어놓으면 벡터. 격자로 펴면 행렬. 격자를 여러 층 쌓으면 큐브. 인덱스가 몇 개 필요한지가 곧 계급(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'가 들어가는 이유죠.