Введение в ML


<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) Объясните, почему мы работаем именно с **линейным** векторным пространством.