기하 먼저, 인덱스는 나중
Tensor가 '뭐다' 잊어버리는 가장 빠른 길은 정의를 'N차원 array' 로 읽는 거. 그건 storage view야. 모델 디버깅 도와주는 직관은 기하적이야:
- 벡터 (1-D) → 길이 (norm)이랑 방향 (feature 조합) 가진 화살표. 1024-D embedding은 1024차원 공간의 화살표 한 개. '비슷한 개념' = 같은 방향 가리키는 화살표들.
- 행렬 (2-D) → 그 화살표들의 stack. row인지 column인지는 layout에 따라. row-major vs column-major 선택은 정확히 어느 axis가 메모리에서 contiguous인가의 문제.
- Tensor (3-D+) → '시간 step별 / 배치별 / attention head별 행렬'. compute 관점에선 여전히 GEMM 통과하는 batched 행렬, 추가 차원은 부기 처리야.
왜 중요하냐 — 디버깅하는 모든 shape mismatch는 어느 axis가 어느 axis냐 질문이야. 'Attention 출력이 왜 (32, 16, 64, 512) 고 (32, 512, 16, 64) 가 아니지?' 는 기하 그림 잡으면 풀려: batch × head × seq × head_dim, GEMM이 마지막 두 axis 따라 일어났다는 거 기억.