<h2>Оглавление</h2>
[TOC]
<hr>
## Краткий очерк линейной алгебры
В статье будет объяснено, почему искусственный интеллект так сильно связан с линейной алгеброй и будет дано небольшое введение в линейную алгебру
## Как всё начиналось
Линейная алгебра возникла как результат развития и обобщения различных математических областей, а также из-за потребности решать задачи в других науках и инженерных дисциплинах. Например, в какой-то момент времени математикам нужно было решать много различных систем уравнений (инженерия, физика, статистика). Рассмотрим пример:
$$
\begin{cases}
3x+4y+5z=10 \\\\
4x+2y+7z=13
\end{cases}
$$
Пока 2 уравнения, в целом, постоянно писать переменные x, y и z не накладно. Но если уравнений 1000? 1000 раз писать x, y и z, у которых не так много смысловой нагрузки? Математики - люди ленивые, и естественно, хотелось бы сократить эту запись.
А почему бы не прописать x, y и z один раз? Как бы договориться, что перед первым числом в каждом нашем уравнении всегда будет x, перед вторым -- y, и так далее (если в каком-то уравнении x нет, то считаем, что на самом деле у нас 0*x). И это оказалось сильно удобнее. Вот как это выглядит:
$$
\begin{bmatrix}
3 & 4 & 5 \\\\
2 & 4 & 7 \\\\
\end{bmatrix}
\begin{pmatrix}
x\\\\
y\\\\
z\\\\
\end{pmatrix} =
\begin{pmatrix}
3x + 4y + 5z \\\\
2x + 4y + 7z \\\\
\end{pmatrix}
$$
Вот так и появились матрицы и вектора. Жалко, правила русского языка нельзя также оптимизировать...
**Формальное определение:**
> Матрица размерности m × n -- это набор m * n элементов, расположенных в m строках и n столбцах. Вектор же можно рассматривать как матрицу размера m x 1.
Таким образом, если говорить упрощённо, матрица -- это набор векторов.
В машинном обучении без линейной алгебры не обойтись: многие базовые алгоритмы (например, линейная регрессия или PCA) построены на произведениях векторов и матриц, извлечение признаков из картинок и текста происходит благодаря перемножению матриц, благодаря произведению матриц возможны многослойные нейросети, и так далее.
> Линейная алгебра -- самый весомый раздел математики в контексте машинного обучения. Именно поэтому важно ознакомиться немного ознакомиться с линейной алгеброй даже на школьном уровне изучения машинного обучения.
## Основные операции с матрицами (и векторами)
### 1. Сложение и вычитание матриц
Возьмём матрицы:
$$ A =
\begin{bmatrix}
1 & 2 & 3 \\\\
4 & 5 & 6 \\\\
7 & 8 & 9 \\\\
\end{bmatrix}; \\ \\
B =
\begin{bmatrix}
9 & 8 & 7 \\\\
6 & 5 & 4 \\\\
3 & 2 & 1 \\\\
\end{bmatrix}
$$
> Формально: при сложении матриц каждый символ $A_{i,j}$ складывается с другим символом $B_{i,j}$:
$$
\begin{bmatrix}
1 & 2 & 3 \\\\
4 & 5 & 6 \\\\
7 & 8 & 9 \\\\
\end{bmatrix} +
\begin{bmatrix}
9 & 8 & 7 \\\\
6 & 5 & 4 \\\\
3 & 2 & 1 \\\\
\end{bmatrix} =
\begin{bmatrix}
1+9 & 2+8 & 3+7 \\\\
4+6 & 5+5 & 6+4 \\\\
7+3 & 8+2 & 9+1 \\\\
\end{bmatrix} =
\begin{bmatrix}
10 & 10 & 10 \\\\
10 & 10 & 10 \\\\
10 & 10 & 10 \\\\
\end{bmatrix}
$$
**Почему так:**
В данном случае векторы $(x, y, z)^{T}$ опущены, но подразумеваются (Вспомним про ленивость математиков). Рассмотрим и запишем первую строку матриц алгебраически: $(1x + 2y + 3z) + (9x + 8y + 7z)$, раскроем скобки и запишем подобные рядом: $1x + 9x + 2y + 8y + 3z + 7z = 10x + 10y + 10z$, что в векторном виде будет выглядеть как $(10 \ 10 \ 10)$ -- это проходится в курсе школьной алгебры.
**Связь с машинным обучением:**
Сложение матриц может использоваться для объединения результатов разных моделей или для добавления смещения (bias) к данным.
**Важное условие:**
Матрицы должны быть одиной размерности (одинаковое количество строк и столбцов).
### 2. Умножение матрицы на скаляр (число)
Формально:
> Каждый элемент матрицы $A_{i,j}$ умножается на скаляр (число).
$$ k \cdot
\begin{bmatrix}
a & b \\\\
c & d \\\\
\end{bmatrix} =
\begin{bmatrix}
k \cdot a & k \cdot b \\\\
k \cdot c & k \cdot d \\\\
\end{bmatrix}
$$
**Почему так:**
Вспомним, что каждая строка матрицы -- это уравнение. Если в уравнении у вас появится желание умножить левую и правую часть на число, то каждый элемент левой и правой части просто умножается на число:
$$
k \cdot (ax + by + cz) \to kax + kby + kcz
$$
При этом, если мы рассматриваем уравнение с левой и правой частями, то вектор ответов также нужно умножить на скаляр (иначе левая и правая части не будут равны)
**Пример из жизни:**
Изменение масштаба изображения (увеличение или уменьшение яркости).
**Связь с машинным обучением:**
Изменение масштаба признаков (feature scaling), чтобы все признаки имели примерно одинаковый диапазон значений. Это важно для многих алгоритмов машинного обучения.
### 3. Умножение матрицы на вектор
Формально:
> Каждый i-ый столбец матрицы умножается на i-ый элемент вектора, а результат суммируется.
$$
\begin{bmatrix}
a & b \\\\
c & d \\\\
\end{bmatrix}
\begin{pmatrix}
x \\\\
y \\\\
\end{pmatrix} =
\begin{pmatrix}
a \cdot x + b \cdot y \\\\
c \cdot x + d \cdot y \\\\
\end{pmatrix}
$$
**Почему так:**
В самом начале статьи мы именно так определили умножение матрицы на вектор (чтобы не прописывать постоянно x, y и z), решив, что именно так удобнее.
**Важное условие:**
* Количество столбцов в матрице должно быть равно количеству строк в векторе.
* Если матрица имеет размер m x n, а вектор имеет размер n x 1, то результатом будет вектор размера m x 1 (нагдяно видно на рисунке)
**Связь с машинным обучением:**
* Линейные модели: В линейной регрессии, умножение матрицы признаков на вектор весов даёт нам предсказание (об этом подробнее будет сказано позже).
* Нейронные сети: Умножение матрицы на вектор -- это основная операция в нейронных сетях. Каждый слой нейронной сети выполняет умножение матрицы весов на вектор входных данных.
### 4. Умножение матрицы на матрицу
**Формально:**
> Каждая строка матрицы A умножается на каждый столбец матрицы B, при этом, перемноженные элементы суммируются.
$$
\begin{bmatrix}
a & b \\\\
c & d \\\\
\end{bmatrix}
\begin{bmatrix}
e & f \\\\
g & h \\\\
\end{bmatrix} =
\begin{bmatrix}
a \cdot e + b \cdot g & a \cdot f + b \cdot h \\\\
c \cdot e + d \cdot g & c \cdot f + d \cdot h \\\\
\end{bmatrix}
$$
**Почему так:**
Существуют строгое сложное доказательство, но мы ограничимся лишь наглядным и на основе логики. Вспомним, что вектор -- это матрица $m \cdot 1$, тогда матрица -- это n векторов. Разложим из примера вторую матрицу на вектора $m \cdot 1$:
$$
\begin{bmatrix}
e & f \\\\
g & h \\\\
\end{bmatrix} =
\begin{bmatrix}
\begin{pmatrix} e \\\\ g\\\\ \end{pmatrix} & \begin{pmatrix} f \\\\ h\\\\ \end{pmatrix} \\
\end{bmatrix}
$$
А теперь для каждого из этих векторов сделаем операцию умножения матрицы на вектор:
$$
\begin{bmatrix}
a & b \\\\
c & d \\\\
\end{bmatrix} \cdot
\begin{bmatrix}
\begin{pmatrix} e \\\\ g\\\\ \end{pmatrix} & \begin{pmatrix} f \\\\ h\\\\ \end{pmatrix} \\\\
\end{bmatrix} =
\begin{bmatrix}
(a \cdot e + b \cdot g) & (a \cdot f + b \cdot h) \\\\
(c \cdot e + d \cdot g) & (c \cdot f + d \cdot h) \\\\
\end{bmatrix}
$$
**Условие:**
> Если матрица A имеет размерность m x n (где m -- количество строк, n -- количество столбцов), а матрица B имеет размерность p x q, то произведение AB определено только в том случае, если n = p. Почему: иначе у нас либо останется столбец, который не перемножился ни на один вектор, либо останется лишний вектор.
**Связь с машинным обучением:**
Нейронные сети полностью построены на умножениях матриц.
### 5. Транспонирование матрицы
**Формально:**
> Каждый столбец матрицы становится строкой, и каждая строка — столбцом соответственно:
$$
\begin{bmatrix}
a & b \\\\
c & d \\\\
\end{bmatrix}^{T} =
\begin{bmatrix}
a & c \\\\
b & d \\\\
\end{bmatrix}
$$
Как видно из формулы, транспонирование обозначают буквой $T$ в степени.
Для чего нам такая операция:
1. Иногда для умножения матрицы на матрицу одну из матриц нужно транспонировать, чтобы умножение было возможным.
1. Если транспонированная матрица равна исходной матрице, то такая матрица — симметричная. Симметричные матрицы обладают многими полезными свойствами и некоторые алгоритмы лучше работают именно с такими матрицами.
Подводя итоги краткого описания матриц, скажу, что видов матриц на самом деле очень и очень много: так же, как и методов работы с ними. Большинство классических алгоритмов так или иначе завязаны на одном или нескольких методах.
## Немного про линейное векторное пространство
Машинное обучение работает с числами. Чтобы научить компьютер чему-то, нужно сначала преобразовать все, что мы хотим ему показать (текст, изображения, звуки и т.д.), в числовые векторы. Векторное пространство – это как раз то место, где живут эти числовые векторы (которые были рассказаны выше).
После того, как мы представили данные в виде векторов, мы можем выполнять с ними различные операции: складывать, вычитать, умножать на числа, поворачивать, масштабировать и т.д. Все эти операции имеют смысл только в контексте векторного пространства. Они позволяют нам извлекать полезную информацию из данных, преобразовывать их и подготавливать к обучению. Именно поэтому удобно преобразовывать данные в числа.
<blockquote style="border-left: 4px solid #ccc; padding-left: 10px;">
Линейное пространство — математическая структура, представляющая собой набор векторов, для которых определены операции сложения друг с другом и умножения на скаляр.
</blockquote>
Почему так:
> Это очень видно геометрически в двумерном пространстве. Умножая векторы на числа (скаляры) и складывая их друг с другом, мы можем получить любую точку в этом пространстве. Например, пусть у нас есть векторы (1, 2) и (2, 3). Используя эти векторы, мы можем добраться до любой точки, например, до (6, 6). Для этого нужно умножить (1,2) на -1 и прибавить (2,3), а затем полученное умножить на 3.
При этом, превратив данные в вектора, мы сможем на них обучать что-то (как это происходит, будет объяснено позднее).
Так как складывать вектора и умножать на скаляры можно бесконечно много раз, то мы можем “построить” всё векторное пространство. Набор таких векторов, которые могут достичь любой точки (по законам линейного пространства), именуют базисом. Базис - это как строительные блоки, из которых можно сложить любой вектор в пространстве.
При этом, базисом будет являться не любой набор векторов. Например, в двумерном пространстве мы не сможем достигнуть любой точки при помощи векторов (1, 1) и (2, 2). Очень наглядно видно, что второй вектор — это первый вектор, умноженный на 2. То есть, на самом деле у нас как бы один вектор (если считать все такие вектора новыми, то векторов у нас бесконечность, но это ведь нам ничего не даёт), а один вектор — это просто напросто линия. Также, если у нас есть вектора (1, 1, 1) и (2, 1, 1), нам не подойдёт для базиса вектор (3, 2, 2) — просто потому, что этот вектор -- это сумма двух векторов. Такой вектор считать отдельным также не стоит, иначе у нас бесконечность векторов (вспомним про умножение на скаляр).
Получается, нам нужны вектора, которые нельзя получить путём умножений на скаляр и сложения исходных векторов. Назовём такие нужные нам вектора **линейно независимыми**, а про остальные вектора скажем, что они являются **линейной комбинацией** исходных векторов.
<blockquote style="border-left: 4px solid #ccc; padding-left: 10px;">
Базис — это набор из линейно независимых векторов, способных породить всё пространство.
</blockquote>
Почему векторное пространство линейно?
Работать с линейными зависимостями сильно проще. Для нелинейных же зависимостей требуются глубокие нейронные сети или создание специальных нелинейных признаков (например, если мы предсказываем цену квартиры, и у нас есть информация о стороне каждой комнаты, мы можем добавить признак площадь).
Вдобавок, линейные зависимости интерпретировать сильно проще, и для работы с ними существует огромное количество теорий и методов.
**Связь с машинным обучением:**
1. Уменьшение размерности пространства. Например, в данных 1000 признаков, но 900 из них являются линейными преобразованиями других. Чтобы не зашумлять данные, их стоит убрать.
2. Разложение матриц для выявления свойств.
3. Линейные модели. Идея — предсказать целевую переменную как линейную комбинацию признаков.
#### Практика
1) Выполните сложение матриц A и B, если:
A =
| Vector 1 | Vector 2 | Vector 3 |
|----------|----------|----------|
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
B =
| Vector 1 | Vector 2 | Vector 3 |
|----------|----------|----------|
| 8 | 6 | 3 |
| 4 | 0 | 11 |
| 1 | -2 | 3 |
2) Выполните с этими же матрицами умножение.
3) Объясните, почему мы работаем именно с **линейным** векторным пространством.