Линейная алгебра

Галерея трансформаций: матрицы в деле

Каждый кадр в видеоигре - это применение десятков матричных преобразований к миллионам вершин. Поворот, масштабирование, перспективная проекция - всё это умножение на матрицу 4x4. GPU делает это параллельно для каждой вершины за доли миллисекунды.

  • 3D-графика: Model-View-Projection - три матрицы, определяющих положение каждого пикселя
  • Робототехника: кинематика манипулятора - цепочка матриц поворота и сдвига
  • Компьютерное зрение: преобразование между системами координат камер
  • Медицина: выравнивание МРТ-снимков - аффинные преобразования 3D-объёмов
  • Анимация: скелетная анимация персонажа - матрицы для каждой кости

Галерея трансформаций: матрицы в деле

**Каждый `nn.Linear(in, out)` в PyTorch - это умножение на матрицу.** GPT-4 делает это буквально сотни раз на каждый токен. Когда torchvision.transforms поворачивает картинку перед обучением - матрица поворота. Когда рендерер игрового движка переводит 3D-сцену на экран - три матричных умножения (Model, View, Projection). Матрицы не просто хранят числа - они преобразуют пространство. В этом уроке - конкретные матрицы для конкретных операций, с кодом который реально запускается.

Матрица - это не таблица чисел, это **действие**. Растяжение, поворот, отражение, проекция - каждое из этих движений записывается одной матрицей. Вся 3D-графика - бесконечная цепочка таких действий, применяемых к вершинам. Слой нейросети - тоже действие. После этого урока матрицы перестают читаться как статичные блоки и начинают читаться как **глаголы**. Код `torchvision.transforms.RandomRotation(30)` и `cv2.warpAffine` перестают быть чёрными ящиками.

Что главное в концепте «Галерея трансформаций: матрицы в деле»?

Проверка усвоения материала концепта.

Как читать матрицу трансформации

Как читать матрицу трансформации

Матрица трансформации 2×2 полностью определяется тем, **куда она отправляет базисные векторы** i = (1,0) и j = (0,1). Первый столбец матрицы - это образ i, второй - образ j:

МАТРИЦА A = [a b] [c d] i = (1, 0) ---> A·i = (a, c) <- первый столбец j = (0, 1) ---> A·j = (b, d) <- второй столбец ЛЮБОЙ ВЕКТОР v = (x, y) = x·i + y·j A·v = x·(a,c) + y·(b,d) = (ax+by, cx+dy) ЭТО ВСЕГДА ТАК - для любой матрицы, любой размерности. Зная куда уходят базисные векторы, знаешь всё о трансформации.

**Лайфхак для чтения ML-кода**: `nn.Linear(4, 3)` хранит матрицу весов W размера (3, 4). При forward pass: `out = W @ x` - x преобразуется из 4-мерного пространства в 3-мерное. Столбцы W - это образы единичных векторов входного пространства.

Что главное в концепте «Как читать матрицу трансформации»?

Проверка усвоения материала концепта.

1. Масштабирование

1. Масштабирование

Диагональная матрица с числами s по диагонали растягивает или сжимает пространство вдоль осей. Каждое число - независимый "ползунок" для своей оси:

РАВНОМЕРНОЕ (одинаково по всем осям, k = 2): [2 0] i=(1,0) -> (2,0) [0 2] j=(0,1) -> (0,2) <- все длины удваиваются НЕРАВНОМЕРНОЕ (разное по осям): [sₓ 0] растяжение по X на sₓ [ 0 sᵧ] растяжение по Y на sᵧ СЖАТИЕ В ОДИН ИЗ СЛОЁВ CNN: Adaptive Average Pooling 2×2 эквивалентен матрице 0.25 * [[1,1],[1,1]] (умеренно - это проекция, а не масштаб, но идея та же) PYTORCH: nn.Upsample(scale_factor=2) применяет масштабирование к feature maps

Что главное в концепте «1. Масштабирование»?

Проверка усвоения материала концепта.

2. Поворот

2. Поворот

Матрица поворота на угол θ получается из условия: базисный вектор i = (1,0) должен уйти в точку (cos θ, sin θ). Вектор j = (0,1) - в точку (-sin θ, cos θ). Из этих двух условий матрица строится автоматически:

R(θ) = [cos θ -sin θ] [sin θ cos θ] ПРИМЕРЫ: 90°: R = [ 0 -1] (1,0) -> (0,1), (0,1) -> (-1,0) [ 1 0] 180°: R = [-1 0] (1,0) -> (-1,0), (0,1) -> (0,-1) [ 0 -1] 45°: R = [0.707 -0.707] cos45° = sin45° ≈ 0.707 [0.707 0.707] SWIFT / C++ / Python - везде одна и та же формула. КАЖДЫЙ ПОВОРОТ В ТОРЧВИЖН ИЛИ OPENCV ИСПОЛЬЗУЕТ ИМЕННО ЭТО.

**Data augmentation в ML**: torchvision.transforms.RandomRotation, RandomHorizontalFlip - всё это матричные операции над пикселями. Случайные повороты на ±30 градусов при каждой эпохе обучения делают ResNet устойчивым к ориентации объекта. Без этого сеть не обобщается на повёрнутые примеры.

Что главное в концепте «2. Поворот»?

Проверка усвоения материала концепта.

3. Отражение

3. Отражение

Отражение - это поворот на 180° вокруг оси. Матрицы просты: просто меняем знак у нужной координаты. `RandomHorizontalFlip` в PyTorch - дословная реализация матрицы отражения по оси Y:

ОтражениеМатрицаЭффект
По оси X (лево-право)[-1, 0; 0, 1]x -> -x, зеркало
По оси Y (верх-низ)[1, 0; 0, -1]y -> -y, переворот
По диагонали y=x[0, 1; 1, 0]x <-> y, транспонирование координат
Через начало координат[-1, 0; 0, -1]То же что поворот на 180 градусов

**RandomHorizontalFlip в PyTorch** эквивалентен умножению на матрицу [-1, 0; 0, 1] для каждого пикселя. Это самая простая и самая эффективная аугментация - мгновенно удваивает эффективный размер датасета для симметричных объектов (кошки, машины, лица).

Что главное в концепте «3. Отражение»?

Проверка усвоения материала концепта.

4. Сдвиг (Shear)

4. Сдвиг (Shear)

~Сдвиг~{Shear - скашивание, наклон} - один из базисных векторов остаётся на месте, другой "съезжает" вдоль оси. Квадрат превращается в параллелограмм:

ГОРИЗОНТАЛЬНЫЙ СДВИГ (k = 0.7): [1 0.7] i=(1,0) -> (1,0) <- на месте [0 1] j=(0,1) -> (0.7,1) <- сдвинулся вправо Эффект: j сдвигается на k единиц вправо (наклон вправо) ВЕРТИКАЛЬНЫЙ СДВИГ: [1 0] i=(1,0) -> (1, k) <- сдвинулся вверх [k 1] j=(0,1) -> (0, 1) <- на месте ОПРЕДЕЛИТЕЛЬ сдвига = 1 (площадь не меняется) ПРИМЕНЕНИЕ В ШРИФТАХ: Курсив = горизонтальный сдвиг букв вправо css: font-style: italic <-> matrix: [1, 0.2, 0, 1] АУГМЕНТАЦИЯ TORCHVISION: transforms.RandomAffine(degrees=0, shear=15) Используется для обучения моделей на наклонных текстах (OCR)

Что главное в концепте «4. Сдвиг (Shear)»?

Проверка усвоения материала концепта.

5. Проекция

5. Проекция

Проекция - особый случай: пространство **схлопывается** в меньшую размерность. Определитель такой матрицы равен нулю - информация теряется безвозвратно. В ML проекция повсюду - и это всегда осознанная потеря:

ПРОЕКЦИЯ НА ОСЬ X: [1 0] (x, y) -> (x, 0) y-компонента уничтожена [0 0] det = 0 - обратной нет ПРОЕКЦИЯ НА ОСЬ Y: [0 0] (x, y) -> (0, y) x-компонента уничтожена [0 1] det = 0 ПРОЕКЦИЯ НА ПРЯМУЮ y = x: [0.5 0.5] (x, y) -> ((x+y)/2, (x+y)/2) - на диагональ [0.5 0.5] det = 0 B ML: PCA проекция на k главных компонент = матрица Vk · Vkᵀ Dropout = случайный обнуляющий вектор (как проекция, но случайная) Attention softmax создаёт проекцию в симплекс

**PCA - это ортогональная проекция**: данные X проецируются на подпространство главных компонент V через X_low = X · V. Это матричное умножение, то есть линейное преобразование. Матрица V содержит собственные векторы ковариационной матрицы - они образуют ортогональный базис нового пространства.

Что главное в концепте «5. Проекция»?

Проверка усвоения материала концепта.

6. Аффинные преобразования: трансляция через однородные координаты

6. Аффинные преобразования: трансляция через однородные координаты

Трансляция (сдвиг начала координат) - **не линейное** преобразование, нельзя записать матрицей 2×2. Но если перейти в **однородные координаты** (добавить единицу), трансляция становится матрицей 3×3. Это стандарт в компьютерной графике и robotics:

ОДНОРОДНЫЕ КООРДИНАТЫ: (x, y) -> (x, y, 1) ТРАНСЛЯЦИЯ на вектор (tx, ty): [1 0 tx] [x] [x + tx] [0 1 ty] · [y] = [y + ty] [0 0 1] [1] [ 1 ] ПОВОРОТ + ТРАНСЛЯЦИЯ (аффинное преобразование): [cos θ -sin θ tx] - поворачиваем И сдвигаем [sin θ cos θ ty] [ 0 0 1] IMPORTANT: умножение матриц = применение нескольких преобразований подряд. Именно так работает Model-View-Projection в OpenGL, Vulkan, Three.js - цепочка матриц 4×4.

Что главное в концепте «6. Аффинные преобразования: трансляция через однородные координаты»?

Проверка усвоения материала концепта.

Комбинирование трансформаций: умножение матриц

Комбинирование трансформаций: умножение матриц

Последовательное применение трансформаций - это умножение матриц. Сначала масштаб, потом поворот = матрица (R · S). Порядок важен - умножение матриц **некоммутативно**:

**Порядок умножения матриц критичен**: R @ S ≠ S @ R. В robotics и 3D-графике перепутанный порядок трансформаций - одна из самых частых ошибок. В PyTorch: `transforms.Compose([transforms.RandomRotation(30), transforms.RandomHorizontalFlip()])` применяет операции слева направо (сначала поворот, потом отражение).

Что главное в концепте «Комбинирование трансформаций: умножение матриц»?

Проверка усвоения материала концепта.

Линейный слой нейросети = матричное умножение

Линейный слой нейросети = матричное умножение

Самое важное применение линейных трансформаций в ML - это **каждый Linear слой** нейросети. `nn.Linear(in_features=4, out_features=3)` хранит матрицу весов W размера (3, 4) и вектор смещения b размера (3). Forward pass: out = W·x + b.

**GPT-4 Transformer block**: каждое attention head вычисляет Q = W_Q·X, K = W_K·X, V = W_V·X - три отдельных матричных умножения. Потом ещё FF слои с W1 и W2. В GPT-4 с 96 слоями и 96 heads - это буквально тысячи матричных умножений на каждый forward pass через одно сообщение.

Что главное в концепте «Линейный слой нейросети = матричное умножение»?

Проверка усвоения материала концепта.

Сводная таблица: что сохраняет каждая трансформация

Сводная таблица: что сохраняет каждая трансформация

ТрансформацияМатрица 2DdetСохраняет
Поворот[cos θ, -sin θ; sin θ, cos θ]1Длины, углы, площадь, ориентацию
Отражение[-1, 0; 0, 1]-1Длины, углы, площадь (меняет ориентацию)
Равномерный масштаб x k[k, 0; 0, k]k²Углы, пропорции
Сдвиг[1, k; 0, 1]1Площадь, параллельность осей
Проекция на X[1, 0; 0, 0]0Проекцию на X (теряет Y навсегда)

**det - ключевая метрика**: |det| показывает во сколько раз изменилась площадь. det = 0 означает что информация потеряна (нет обратной). det < 0 - ориентация изменилась (левосторонняя система).

Линейные трансформации в реальных системах

От формулы до продакшена

КомпонентРольДетали
PyTorch nn.Linear / nn.Conv2dW·x + b - линейное отображение весовКаждый слой GPT, ResNet, BERT - матричное умножение
torchvision.transforms / OpenCV warpAffineАффинные матрицы для аугментации изображенийRandomRotation, RandomFlip, RandomAffine - data augmentation в обучении
Three.js / Unity / Unreal EngineModel-View-Projection цепочка матриц 4×4Каждый 3D-кадр - три матричных умножения для каждой вершины
ROS / Boston Dynamics / Tesla AutopilotПреобразования систем координат (TF frames)Позиция руки робота = цепочка 10+ аффинных матриц
PCA / SVDПроекция на главные компонентыОртогональная матрица V как базис нового пространства

Что главное в концепте «Сводная таблица: что сохраняет каждая трансформация»?

Проверка усвоения материала концепта.

Практика: матрица поворота

Практика: матрица поворота

Вопросы для собеседования

Как по матрице трансформации понять, сохраняет ли она площадь?

- det(A) - коэффициент изменения площади (объёма в 3D) - |det| = 1 - площадь сохраняется (поворот, отражение, сдвиг) - |det| = k² - площадь изменяется в k² раз (масштаб на k) - det = 0 - площадь стала нулём, матрица необратима (проекция) - det < 0 - ориентация изменилась (зеркало)

Почему nn.Linear - это линейное преобразование, и что это значит для backpropagation?

- Линейность: L(ax + by) = aL(x) + bL(y) - выполняется для W·x + b только при b=0, иначе аффинное - Градиент выхода по матрице весов W: dL/dW = (dL/dout) · xᵀ - внешнее произведение - Именно линейность делает backprop аналитически вычислимым через цепное правило - Активации (ReLU, GELU) добавляют нелинейность - без них стопка Linear-слоёв = один Linear-слой

Почему порядок матричных умножений важен при комбинировании трансформаций?

- Умножение матриц НЕ коммутативно: A @ B ≠ B @ A в общем случае - R @ S применяет S первой (правая матрица действует на вектор первой) - Сначала масштаб потом поворот = R @ S, сначала поворот потом масштаб = S @ R - разные результаты - В 3D-графике порядок: сначала Model (поворот объекта), потом View (камера), потом Projection (экран)

Что главное в концепте «Практика: матрица поворота»?

Проверка усвоения материала концепта.

Что унести из урока

  • **Матрица = трансформация**: столбцы матрицы - образы базисных векторов, отсюда всё следует
  • **Поворот**: [cos θ, -sin θ; sin θ, cos θ] - длины и площадь сохраняются, det = 1
  • **Проекция**: det = 0, информация теряется навсегда - основа PCA, dropout, average pooling
  • **Комбинирование**: R @ S значит S применяется первой - порядок критичен
  • **nn.Linear = матричное умножение**: W·x + b - каждый слой нейросети это одна матрица
  • **Data augmentation**: RandomRotation, RandomFlip - матрицы поворота и отражения применённые к каждому пикселю
  • **Аффинные преобразования**: трансляция + поворот + масштаб в однородных координатах - стандарт 3D-графики и robotics

Куда дальше

Трансформации - визуальная основа более глубоких концепций

  • Обратная матрица — Обратное преобразование: когда можно вернуться в исходное пространство
  • Собственные векторы — Направления, которые трансформация не поворачивает - только растягивает
  • SVD разложение — Любую матрицу можно разложить в поворот * масштаб * поворот - три трансформации
  • Метод Гаусса — Алгоритм нахождения обратной трансформации через элементарные операции

Связанные уроки

  • ml-25-neural-networks
  • stat-09-regression
  • stat-37-glm
Галерея трансформаций: матрицы в деле

0

1

Войти