alterna ai
ALTERNA AI / ГЛАВА 02 · 01

02.1 Матрица меняет пространство

Вектор описывает объект несколькими координатами.

Одна таблица коэффициентов преобразует каждую точку по одинаковому правилу. Сетка поможет увидеть растяжение и поворот.

Возьмём [1,2] и таблицу [[2,1],[0,1]]. Первая координата результата: 2×1+1×2=4; вторая: 0×1+1×2=2. Именно этот пример стоит на рисунке до изменения параметров.

Матрица задаёт действие сразу на всё пространство

Вектор описывает один объект пространства. Матрица задаёт правило, которое согласованно действует на каждый допустимый вектор. При столбцовом соглашении

A∈Rm×n,x∈Rn,y=Ax∈Rm.A\in\mathbb R^{m\times n}, \qquad x\in\mathbb R^n, \qquad y=Ax\in\mathbb R^m.

Число столбцов AA обязано совпадать с размерностью входа, а число строк определяет размерность выхода. Это не только правило синтаксиса: каждая строка содержит коэффициенты одного выходного признака,

yi=∑j=1nAijxj.y_i=\sum_{j=1}^{n}A_{ij}x_j.

Для

A=[2101],x=[12]A=\begin{bmatrix}2&1\\0&1\end{bmatrix}, \qquad x=\begin{bmatrix}1\\2\end{bmatrix}

получаем

Ax=[2⋅1+1⋅20⋅1+1⋅2]=[42].Ax=\begin{bmatrix}2\cdot1+1\cdot2\\0\cdot1+1\cdot2\end{bmatrix} =\begin{bmatrix}4\\2\end{bmatrix}.

Столбцы являются образами базисных векторов

Любой вход раскладывается по стандартному базису: x=x1e1+⋯+xnenx=x_1e_1+\cdots+x_ne_n. Линейность даёт

Ax=x1Ae1+⋯+xnAen.Ax=x_1Ae_1+\cdots+x_nAe_n.

Умножение на eje_j выбирает jj-й столбец, поэтому

Ax=x1A:,1+⋯+xnA:,n.Ax=x_1A_{:,1}+\cdots+x_nA_{:,n}.

В нашем примере Ae1=[2,0]TAe_1=[2,0]^T, Ae2=[1,1]TAe_2=[1,1]^T, а

Ax=1[2,0]T+2[1,1]T=[4,2]T.Ax=1[2,0]^T+2[1,1]^T=[4,2]^T.

Достаточно знать образы базисных стрелок, чтобы восстановить действие матрицы на любой линейной комбинации. Поэтому двумерную матрицу удобно видеть как деформацию всей координатной сетки: каждая прямая сетки строится из тех же преобразованных базисных направлений.

Что сохраняет линейное отображение

Для любых совместимых x,zx,z и скаляров α,β\alpha,\beta:

A(αx+βz)=αAx+βAz.A(\alpha x+\beta z)=\alpha Ax+\beta Az.

Отсюда следуют три геометрических свойства. Начало остаётся на месте, потому что A0=0A0=0. Прямые переходят в прямые или схлопываются. Параллельность сохраняется, если направления не были уничтожены. Углы и длины сохраняются далеко не каждой матрицей.

Единичный квадрат с вершинами 0,e1,e2,e1+e20,e_1,e_2,e_1+e_2 переходит в параллелограмм со сторонами-столбцами [2,0]T[2,0]^T и [1,1]T[1,1]^T. Его ориентированная площадь умножается на determinant, здесь на 2.

Линейное и аффинное преобразования

Правило x↦Ax+bx\mapsto Ax+b при b≠0b\ne0 переносит начало в bb. Оно называется аффинным. Разность двух выходов всё ещё преобразуется линейно:

(Ax+b)−(Az+b)=A(x−z),(Ax+b)-(Az+b)=A(x-z),

но строгое равенство f(0)=0f(0)=0 нарушено. Поэтому bias нейронного слоя нельзя незаметно включать в геометрический рассказ о линейном операторе, не расширив координаты или не назвав отображение аффинным.

Поворот на 90 градусов

R=[0−110]R=\begin{bmatrix}0&-1\\1&0\end{bmatrix}

переводит [1,2]T[1,2]^T в [−2,1]T[-2,1]^T, сохраняет длины и площадь. Shear меняет углы, но может сохранять площадь. Диагональная матрица независимо масштабирует координатные направления. Одна и та же таблица чисел может быть оператором, dataset или covariance matrix; роль определяется контрактом задачи.

Плотный matvec размера [m,n][m,n] выполняет mnmn умножений и m(n−1)m(n-1) сложений в прямом алгоритме. Матрица [4096,4096][4096,4096] содержит 16 777 216 чисел, то есть 64 MiB float32 payload. Это только один числовой массив: activations, gradients, optimizer state и overhead считаются отдельно.

A, x = [[2, 1], [0, 1]], [1, 2]
y = [sum(row[j] * x[j] for j in range(2)) for row in A]
assert y == [4, 2]

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

Каждый вход внёс свой вклад. Большая таблица повторяет это правило для остальных выходов. Здесь вектор записан столбцом Ax; в Mini-GPT строки используют запись xW.

Два преобразования подряд. Как этот вопрос продолжает полученный результат?

Python-примеры главы 02 Академическая база →