Матрица задаёт действие сразу на всё пространство
Вектор описывает один объект пространства. Матрица задаёт правило, которое согласованно действует на каждый допустимый вектор. При столбцовом соглашении
Число столбцов обязано совпадать с размерностью входа, а число строк определяет размерность выхода. Это не только правило синтаксиса: каждая строка содержит коэффициенты одного выходного признака,
Для
получаем
Столбцы являются образами базисных векторов
Любой вход раскладывается по стандартному базису: . Линейность даёт
Умножение на выбирает -й столбец, поэтому
В нашем примере , , а
Достаточно знать образы базисных стрелок, чтобы восстановить действие матрицы на любой линейной комбинации. Поэтому двумерную матрицу удобно видеть как деформацию всей координатной сетки: каждая прямая сетки строится из тех же преобразованных базисных направлений.
Что сохраняет линейное отображение
Для любых совместимых и скаляров :
Отсюда следуют три геометрических свойства. Начало остаётся на месте, потому что . Прямые переходят в прямые или схлопываются. Параллельность сохраняется, если направления не были уничтожены. Углы и длины сохраняются далеко не каждой матрицей.
Единичный квадрат с вершинами переходит в параллелограмм со сторонами-столбцами и . Его ориентированная площадь умножается на determinant, здесь на 2.
Линейное и аффинное преобразования
Правило при переносит начало в . Оно называется аффинным. Разность двух выходов всё ещё преобразуется линейно:
но строгое равенство нарушено. Поэтому bias нейронного слоя нельзя незаметно включать в геометрический рассказ о линейном операторе, не расширив координаты или не назвав отображение аффинным.
Поворот на 90 градусов
переводит в , сохраняет длины и площадь. Shear меняет углы, но может сохранять площадь. Диагональная матрица независимо масштабирует координатные направления. Одна и та же таблица чисел может быть оператором, dataset или covariance matrix; роль определяется контрактом задачи.
Плотный matvec размера выполняет умножений и сложений в прямом алгоритме. Матрица содержит 16 777 216 чисел, то есть 64 MiB float32 payload. Это только один числовой массив: activations, gradients, optimizer state и overhead считаются отдельно.