Линейная алгебра
Матрицы: что они делают?
Матрица весов нейронного слоя 768x768 содержит 589 824 параметра и задаёт линейное преобразование пространства. Понять, что матрица делает геометрически - значит понять, что происходит внутри каждого слоя трансформера.
- Нейросети: матрица весов W задаёт линейное отображение между слоями
- Компьютерная графика: матрица поворота, масштаба, сдвига - базовые блоки 3D-рендеринга
- Экономика: матрица Леонтьева описывает межотраслевые потоки в экономике
- Квантовая механика: операторы - матрицы в пространстве состояний
- Google PageRank: матрица переходов по веб-графу размером 50 миллиардов страниц
Матрицы: что они делают?
Linear(768, 3072) в PyTorch - одна строка кода. Внутри неё матрица размером 768 × 3072, то есть **2 359 296 чисел**. Когда вектор токена проходит через этот слой, происходит умножение матрицы на вектор - и вектор трансформируется. Не перезаписывается заново, не передаётся куда-то - именно **трансформируется**: каждый BERT, каждый GPT, каждый Vision Transformer - это цепочка таких трансформаций. Матрица задаёт правила трансформации.
**Чему этот урок учит на самом деле**: не «как выглядит матрица», а что матрица геометрически делает с пространством. Через 30 минут фраза «Linear слой - это матрица весов» станет не абстрактной, а наглядной - с интуицией о том, что происходит с каждым вектором при прохождении через слой.
Что главное в концепте «Матрицы: что они делают?»?
Проверка усвоения материала концепта.
Матрица = записанная трансформация
Матрица = записанная трансформация
Матрица - это **правила трансформации пространства**, записанные по столбцам. Каждый столбец говорит, куда попадёт один из базисных векторов. Для 2D это выглядит так:
┌ ┐ A = │ a b │ │ c d │ └ ┘ ЧТО ЭТО ЗНАЧИТ: - Первый столбец (a, c) - куда уходит i = (1, 0) - Второй столбец (b, d) - куда уходит j = (0, 1) ПРИМЕР - масштабирование: ┌ ┐ A = │ 3 0 │ i = (1,0) -> (3, 0) (растянули по X в 3 раза) │ 0 2 │ j = (0,1) -> (0, 2) (растянули по Y в 2 раза) └ ┘ ПРИМЕР - поворот на 90 градусов: ┌ ┐ R = │ 0 -1 │ i = (1,0) -> (0, 1) (пошёл вверх) │ 1 0 │ j = (0,1) -> (-1, 0) (пошёл влево) └ ┘
**Главное правило**: чтобы понять, что делает матрица, - смотри на её столбцы. Первый столбец - новое место для вектора (1,0). Второй - новое место для вектора (0,1). Всё остальное выводится из этих двух точек.
Что главное в концепте «Матрица = записанная трансформация»?
Проверка усвоения материала концепта.
Умножение матрицы на вектор: механизм трансформации
Умножение матрицы на вектор: механизм трансформации
Произвольный вектор v = (x, y) можно представить как x·i + y·j. После трансформации матрицей A каждый базисный вектор уйдёт в новое место - и вектор v уйдёт туда же, сохранив коэффициенты:
A * v = x * (A*i) + y * (A*j) = x * (первый столбец) + y * (второй столбец) ФОРМУЛА: ┌ ┐ ┌ ┐ ┌ ┐ │ a b │ * │ x │ = │ ax + by │ │ c d │ │ y │ │ cx + dy │ └ ┘ └ ┘ └ ┘ ПРИМЕР (матрица масштабирования 3x по X, 2x по Y): ┌ ┐ ┌ ┐ ┌ ┐ ┌ ┐ │ 3 0 │ * │ 4 │ = │ 12+0 │ = │ 12 │ │ 0 2 │ │ 5 │ │ 0+10 │ │ 10 │ └ ┘ └ ┘ └ ┘ └ ┘ (4, 5) -> (12, 10): x-координата утроена, y-координата удвоена
Что главное в концепте «Умножение матрицы на вектор: механизм трансформации»?
Проверка усвоения материала концепта.
Линейный слой нейросети: матрица весов
Линейный слой нейросети: матрица весов
**Linear(in, out)** в PyTorch - это матрица весов W размером [out × in] плюс вектор смещения b. Формула: y = Wx + b. Каждый нейрон в выходном слое - это одна строка матрицы W, скалярно умноженная на вектор входа x.
Linear(3, 2): вход 3D -> выход 2D ┌ ┐ ┌ ┐ ┌ ┐ y = W*x: │ w00 w01 w02│ * │ x0 │ + │ b0 │ │ w10 w11 w12│ │ x1 │ │ b1 │ └ ┘ │ x2 │ └ ┘ └ ┘ y[0] = w00*x0 + w01*x1 + w02*x2 + b0 <- первый нейрон y[1] = w10*x0 + w11*x1 + w12*x2 + b1 <- второй нейрон В BERT-base: W имеет shape [3072, 768] - матрица 768->3072 x имеет shape [768] - вектор токена y = W @ x + b - shape [3072] Каждый из 12 слоёв BERT содержит 4 таких матрицы.
**Что происходит с пространством**: Linear(768, 3072) берёт вектор из 768-мерного пространства и переносит его в 3072-мерное. Это не просто добавление нулей - матрица весов задаёт конкретное линейное отображение, и модель **обучает** это отображение так, чтобы оно было полезным для задачи.
Что главное в концепте «Линейный слой нейросети: матрица весов»?
Проверка усвоения материала концепта.
Датасет как матрица: n примеров × d признаков
Датасет как матрица: n примеров × d признаков
В ML датасет почти всегда представляется матрицей X размером [n × d], где n - количество примеров, d - количество признаков (размерность пространства). Это не случайное соглашение - такая форма позволяет обрабатывать весь batch одним матричным умножением.
X: [n_samples x n_features] Пример: MNIST, 1000 картинок 28x28 X: [1000 x 784] X[i] - i-я картинка (вектор 784D) X[:, j] - j-й пиксель всех картинок Пример: табличные данные, 500 клиентов, 10 признаков X: [500 x 10] X[i] - профиль i-го клиента X[:, 0] - возраст всех клиентов Линейная регрессия: y = X @ w X: [n x d], w: [d], y: [n] Один matmul - предсказания для всех n примеров сразу
**Batched processing**: обработка одного примера за раз в цикле в 100 раз медленнее обработки batch из 100 примеров одним matmul. GPU спроектирован под параллельное умножение матриц - именно поэтому batch processing ускоряет обучение в 10-100 раз.
Что главное в концепте «Датасет как матрица: n примеров × d признаков»?
Проверка усвоения материала концепта.
Единичная матрица: «ничего не делать»
Единичная матрица: «ничего не делать»
Единичная матрица I оставляет все векторы на месте - I·v = v для любого v. Это аналог числа 1 для умножения. Главная диагональ заполнена единицами, всё остальное - нули.
2x2: 3x3: ┌ ┐ ┌ ┐ │ 1 0 │ │ 1 0 0 │ │ 0 1 │ │ 0 1 0 │ └ ┘ │ 0 0 1 │ └ ┘ СВОЙСТВО: I * v = v для любого вектора v ПРОВЕРКА: ┌ ┐ ┌ ┐ ┌ ┐ ┌ ┐ │ 1 0 │ * │ x │ = │ 1*x+0*y │ = │ x │ │ 0 1 │ │ y │ │ 0*x+1*y │ │ y │ └ ┘ └ ┘ └ ┘ └ ┘ I - нейтральный элемент умножения матриц: A*I = I*A = A
В deep learning инициализация весов близко к единичной матрице - это одна из техник обучения глубоких residual сетей. Идея: в начале обучения блок делает «почти ничего» (близко к I), и сеть постепенно отклоняется от этого состояния.
Что главное в концепте «Единичная матрица: «ничего не делать»»?
Проверка усвоения материала концепта.
Визуализация: что матрица делает с единичным квадратом
Визуализация: что матрица делает с единичным квадратом
Применение матрицы к единичному квадрату - наглядный способ увидеть трансформацию. Квадрат с вершинами (0,0), (1,0), (0,1), (1,1) превращается в параллелограмм, углы которого - столбцы матрицы.
Матрица [[2,1],[0,2]]: столбцы (2,0) и (1,2) задают стороны параллелограмма. Вершина (1,1) уходит в (2+1, 0+2) = (3, 2). Квадрат наклонился и растянулся - это называется сдвигом (shear) плюс масштабирование.
Что главное в концепте «Визуализация: что матрица делает с единичным квадратом»?
Проверка усвоения материала концепта.
Матрицы в ML: карта применений
Матрицы в ML: карта применений
Матрица как объект в разных контекстах ML
Одна математическая структура - десятки применений
| Компонент | Роль | Детали |
|---|---|---|
| Linear слой (Dense / FC) | y = Wx + b, W: [out x in] | Основной строительный блок нейросетей. BERT: 4 матрицы на слой, 12 слоёв = 48 матриц |
| Датасет X: [n x d] | n примеров, d признаков | MNIST: [60000 x 784]. ImageNet: [1.2M x 150528]. Обработка - батчами через matmul |
| Confusion matrix | Матрица ошибок классификатора [n_classes x n_classes] | confusion[i][j] = сколько объектов класса i предсказаны как класс j. Диагональ - правильные ответы |
| Adjacency matrix (графы) | A[i][j] = 1 если ребро i->j существует | GraphSAGE, GCN, GAT - операции на графах через матричное умножение. Социальные сети, молекулы |
| Attention matrix | QK^T / sqrt(d_k): [seq x seq] | Каждый элемент - сходство двух токенов. Softmax превращает в вероятности внимания |
| Intrinsic camera matrix | 3x3 матрица параметров камеры | Переводит 3D точку в 2D пиксель. NeRF, Structure from Motion, автономные автомобили |
Что главное в концепте «Матрицы в ML: карта применений»?
Проверка усвоения материала концепта.
Сингулярная матрица: когда трансформация «схлопывается»
Сингулярная матрица: когда трансформация «схлопывается»
Если столбцы матрицы коллинеарны - лежат на одной прямой - пространство «схлопывается» в линию. Такая матрица называется **сингулярной**. Обратной матрицы у неё нет, а det = 0.
┌ ┐ A = │ 1 2 │ Столбцы: (1, 2) и (2, 4) │ 2 4 │ (2, 4) = 2 * (1, 2) - коллинеарны! └ ┘ ЛЮБОЙ вектор (x, y) трансформируется: A * (x, y) = x*(1,2) + y*(2,4) = x*(1,2) + 2y*(1,2) = (x + 2y) * (1, 2) Результат ВСЕГДА на прямой через (1, 2)! Всё 2D пространство схлопнулось в одну прямую. det(A) = 1*4 - 2*2 = 4 - 4 = 0 - подтверждение сингулярности
В ML сингулярность матрицы возникает при **мультиколлинеарности признаков** - когда один признак является линейной комбинацией других. Это делает матрицу X^T X необратимой, и нормальное уравнение линейной регрессии перестаёт работать. Решение: регуляризация (ridge regression добавляет lambda*I, что гарантирует обратимость).
Что главное в концепте «Сингулярная матрица: когда трансформация «схлопывается»»?
Проверка усвоения материала концепта.
Практика: трансформация спрайта
Практика: трансформация спрайта
Вопросы для собеседования
Linear(768, 3072) - это матрица размером [768 x 3072] или [3072 x 768]? Почему?
- W имеет shape [3072, 768]: [out_features, in_features] - y = W @ x: [3072, 768] @ [768] = [3072] - внутренние размерности 768 совпадают - PyTorch хранит W именно в форме [out, in] для эффективного matmul - Это соглашение - некоторые фреймворки хранят транспонированно и делают x @ W^T
Матрица X датасета имеет shape [1000, 784]. Что означает X[5] и X[:, 100]?
- X[5] - шестой пример (картинка/объект), вектор размером 784 - X[:, 100] - 100-й признак для всех 1000 примеров, вектор размером 1000 - X[5, 100] - значение 100-го признака у шестого примера (один скаляр) - X[:, :] = X - вся матрица; X[:10] - первые 10 примеров (mini-batch)
Матрица A = [[1,2],[2,4]] сингулярна. Что произойдёт в PyTorch при попытке вычислить torch.linalg.inv(A)?
- torch.linalg.inv выбросит исключение LinAlgError: singular matrix - Математически: обратная матрица не существует при det = 0 - В линейной регрессии: X^T X может быть сингулярной при мультиколлинеарности - Решение: torch.linalg.lstsq или ridge regression (добавить lambda*I перед инверсией)
Что главное в концепте «Практика: трансформация спрайта»?
Проверка усвоения материала концепта.
Что унести из урока
- **Матрица = трансформация** пространства: столбцы показывают, куда уходят базисные векторы
- **A*v = x*(столбец 1) + y*(столбец 2)** - линейная комбинация столбцов с весами из вектора v
- **Linear слой**: y = Wx + b, W: [out x in] - каждый нейрон - одна строка матрицы весов
- **Датасет X**: [n_samples x n_features] - весь batch обрабатывается одним matmul
- **Единичная матрица I**: нейтральный элемент, A*I = I*A = A, I*v = v
- **Сингулярная матрица** (det = 0): пространство схлопывается, обратной нет - мультиколлинеарность в данных
- **GPU = matmul**: batched matrix multiplication - именно поэтому батчи ускоряют обучение в 10-100 раз
Куда дальше
Матрица как объект - начало. Дальше - операции над ней и глубокие свойства
- Операции с матрицами — Сложение, умножение, транспонирование - механика backprop и attention
- Обратная матрица — Нормальное уравнение линейной регрессии: w = (X^T X)^{-1} X^T y
- SVD и собственные векторы — PCA, LoRA (low-rank adaptation) - разложение матрицы весов