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