От векторов к тензорам: многомерные структуры данных в AI
От векторов к тензорам: многомерные структуры данных в AI
В классической бэкенд-разработке на Go мы редко выходим за пределы двумерных структур. Срез байтов []byte (1D) для чтения из сети, срез срезов [][]float64 (2D) для таблицы базы данных. Но в исходных кодах современных нейросетей вы постоянно будете встречать 4D, 5D и даже 6D-массивы.
Почему машинному обучению не хватает обычных плоских таблиц? Ответ кроется в том, как нейросети воспринимают реальный мир. Для ИИ структура данных — это не просто способ хранения в памяти, это геометрия самой задачи.
В этой статье мы разберем универсальный язык общения всех AI-моделей — тензоры.
Лестница размерностей
В предыдущих курсах, изучая NumPy и Pandas, мы уже касались понятия векторизации. Теперь давайте посмотрим на размерности (оси) строго математически, как на эволюцию сложности данных.
- Скаляр (0D-тензор). Одно-единственное число. Температура за окном, возраст пользователя, вероятность клика. В математике обозначается просто . У него нет осей, его размерность (shape) пуста:
(). - Вектор (1D-тензор). Одномерный массив чисел. Вектор описывает один объект через набор признаков (фичей). Например, вектор квартиры:
[площадь, этаж, расстояние_до_метро]. В линейной алгебре вектор из элементов обозначается как . - Матрица (2D-тензор). Двумерная таблица. Для бэкендера это
[][]float64или DataFrame. Матрица — это либо набор векторов (например, батч из 100 квартир, где у каждой 3 признака — shape(100, 3)), либо одно черно-белое изображение, где оси — это высота и ширина в пикселях.
До этого момента всё привычно. Матрица отлично описывает табличные данные. Но что, если наш объект сложнее строки в базе данных?
Переход в 3D: Анатомия цвета
Представьте цветную фотографию размером 256×256 пикселей. Одной матрицы 256×256 хватит только для передачи яркости (черно-белое фото). Цветное изображение на экранах формируется из трех базовых цветов: красного (Red), зеленого (Green) и синего (Blue).
Чтобы передать цвет, нам нужны три матрицы 256×256, сложенные стопкой. Это и есть 3D-тензор.
Его размерность (shape) записывается как (256, 256, 3).
- Первая ось: высота ().
- Вторая ось: ширина ().
- Третья ось: каналы ().
Тензор — это просто многомерный массив чисел. Скаляр, вектор и матрица — это частные случаи тензора (0D, 1D и 2D соответственно). Начиная с 3D, математики перестают придумывать новые имена и используют слово «тензор» с указанием количества измерений (осей).
4D-тензоры: Эффективность батчей
В курсе по экосистеме Python мы выяснили, что передавать данные в вычисления по одной штуке (в цикле) — катастрофически медленно из-за накладных расходов интерпретатора и неэффективного использования кэша процессора. Индустрия использует батчи (batches) — пакетную обработку.
Если одна цветная картинка — это 3D-тензор (256, 256, 3), то как передать в видеокарту сразу 32 картинки?
Мы добавляем еще одну ось. Получается 4D-тензор с размерностью (32, 256, 256, 3).
В AI-фреймворках (TensorFlow, PyTorch) оси имеют строгий семантический смысл:
- Batch () — индекс конкретного изображения в пакете (от 0 до 31).
- Height () — координата Y пикселя.
- Width () — координата X пикселя.
- Channels () — цвет (0=R, 1=G, 2=B).
Примечание: PyTorch по умолчанию использует порядок (N, C, H, W), ставя каналы перед пространственными осями, но суть остается неизменной.
Ментальная модель Senior-разработчика
В Go мы привыкли к строгим интерфейсам и структурам:
type UserRequest struct {
ID int
Payload []byte
}
В машинном обучении на Python строгих структур нет (Duck Typing). Вместо них контрактом выступает shape тензора.
Когда вы читаете документацию к слою нейросети (например, сверточному слою Conv2D), там всегда указано: «Ожидает на вход тензор размерности (N, H, W, C), возвращает тензор размерности (N, H/2, W/2, C2)»*.
Тензор — это универсальный API.
Вам не нужно писать классы Image, AudioFeature или TextEmbedding. Вы берете реальный физический объект, кодируете его геометрию в оси тензора и передаете в математический конвейер. Обучение нейросети — это, по сути, последовательность матричных и тензорных умножений, которые «сжимают» или «растягивают» эти оси, пока на выходе не получится тензор с нужным ответом (например, 1D-вектор вероятностей классов).
В следующей главе мы заглянем внутрь этого конвейера и разберем, как именно слои нейросети трансформируют тензоры с помощью линейной алгебры.