Линейная алгебра
Галерея трансформаций: матрицы в деле
Каждый кадр в видеоигре - это применение десятков матричных преобразований к миллионам вершин. Поворот, масштабирование, перспективная проекция - всё это умножение на матрицу 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 через одно сообщение.
Что главное в концепте «Линейный слой нейросети = матричное умножение»?
Проверка усвоения материала концепта.
Сводная таблица: что сохраняет каждая трансформация
Сводная таблица: что сохраняет каждая трансформация
| Трансформация | Матрица 2D | det | Сохраняет |
|---|---|---|---|
| Поворот | [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.Conv2d | W·x + b - линейное отображение весов | Каждый слой GPT, ResNet, BERT - матричное умножение |
| torchvision.transforms / OpenCV warpAffine | Аффинные матрицы для аугментации изображений | RandomRotation, RandomFlip, RandomAffine - data augmentation в обучении |
| Three.js / Unity / Unreal Engine | Model-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 разложение — Любую матрицу можно разложить в поворот * масштаб * поворот - три трансформации
- Метод Гаусса — Алгоритм нахождения обратной трансформации через элементарные операции