Цель этой статьи — дать читателю представление об аспекте математики, связанном с линейной алгеброй, который необходимо знать, чтобы начать программирование или разработку моделей машинного/глубокого обучения и получить представление о них. Каждый раздел соответствует уникальной операции линейной алгебры. Я надеюсь, что эта статья будет легко читаема и понятна человеку, имеющему базовые знания математики на уровне средней школы.

Габаритные размеры

Прежде всего, что, черт возьми, такое матрица? Ну, матрица — это «прямоугольный массив чисел». Проще говоря, матрица — это сетка, в которой каждый квадрат содержит значение. Возможно, вы знакомы с матрицами в программировании (также известными как «массив массивов»). Например, в Java для создания матрицы можно ввести следующее: int[][] mat = new int[2][2]. Это инициализирует матрицу «2 на 2». Вот пример матрицы «2 на 2» в математике:

Выше находится «матрица чисел». Почему я назвал это «2 на 2»? Он имеет 2 строки и 2 столбца. Так, например, эта матрица будет «3 на 2» или просто 3x2:

Кроме того, символ, обычно используемый для представления размеров матрицы, представляет собой символ всех действительных чисел: ℝ. Размеры предыдущего примера можно записать как ℝ^3x2.

Индексация

Еще одна очень распространенная операция, которую необходимо выполнить с матрицами, — это «индексация». Здесь вы можете получить одно значение из матрицы. Итак, если я назову матрицу 3x2 выше A и хочу проиндексировать первый элемент (1), я бы сказал A₁₁. Причина, по которой я это делаю, заключается в том, что индексирование матрицы происходит по нижнему индексу, где первое число соответствует строке, а второе число соответствует столбцу элемента в матрице, которую вы хотите получить. Другой пример: предположим, я хочу проиндексировать 6 в матрице выше. Он находится в 3-й строке и 2-м столбце, поэтому для индексации я бы сказал A₃₂ (если предположить, что моя матрица называется A).

Векторы

«Вектор» — это просто матрица, но только с одним столбцом. Можно сказать, что это матрица n x 1, потому что она может иметь столько строк (n), но только один столбец. При индексировании вектора вам нужно только одно число в нижнем индексе, которое соответствует строке числа, которое вы индексируете. Итак, если у нас есть этот вектор

тогда Y₁=1, Y₂=2 и Y₃=3.

Небольшое замечание: все индексирование, о котором я писал, называется "1-индексированием", потому что первое значение в матрице обозначается цифрой 1. Если вы знакомы с программированием, то, скорее всего, быть знакомым с нулевой индексацией, где первое значение в массиве (или матрице) является 0-м элементом. 1-индексированные векторы/матрицы являются наиболее распространенными. Еще одно примечание: матрицы и векторы часто по соглашению называются буквами CAPITOL.

Простые операции

Теперь приступим к выполнению операций над матрицами. С каждым простым оператором (сложение, вычитание, умножение, деление) связаны две разные матричные операции. Две матричные операции известны как «скалярная» и «поэлементная». Скалярный оператор берет число и выполняет одну операцию с каждым элементом матрицы. Например,

Это работает таким же образом для вычитания, умножения и деления с использованием скалярных значений. С поэлементными операциями вы берете две матрицы ОДИНАКОВЫХ размеров и выполняете одну операцию с каждым соответствующим элементом в каждой матрице. Например:

Вот пример, когда вы не можете выполнить поэлементную операцию, потому что две матрицы НЕ имеют одинаковых размеров:

Умножение матрицы на вектор

При умножении матрицы на вектор вы берете каждую строку матрицы и умножаете каждый элемент этой строки на соответствующий элемент в векторе, а затем добавляете их. Вы делаете это для каждой строки в матрице, и в итоге вы получаете вектор с количеством строк в исходной матрице. Это известно как «точечный продукт» и обозначается следующим символом: «⨂» (или без символа, например, 2x означает умножение 2 на x). Это будет иметь больше смысла, когда вы увидите этот пример:

Чтобы выполнить скалярное произведение, мы сначала берем первую строку матрицы, [1,3], и умножаем каждый элемент в ней на соответствующий элемент в векторе следующим образом:

Теперь вы складываете значения, 1+15=16. Это становится первым значением в результирующей матрице.

Теперь вы выполняете те же действия с остальными строками в матрице. Для краткости заключительные операции вынесу в матрицу:

И эта последняя матрица является ответом. Это не сложно понять, просто утомительно выполнять. Вот почему НИКТО не делает это вручную, мы используем компьютеры, чтобы сделать это за нас. В python, используя библиотеку numpy, вы можете просто сказать это, чтобы выполнить весь этот точечный продукт: numpy.dot(matrixA, matrixB).

Кроме того, поскольку операции для скалярного произведения настолько специфичны, вы не можете выполнять их только с двумя матрицами со случайными размерами, они также должны быть специфичными. Если матрица имеет размеры ℝᴹˣⁿ(m строк, n столбцов), то вектор должен иметь размеры ℝⁿˣ¹(n-мерный вектор). Тогда ответ будет вектором с размерами ℝᴹˣ¹.

Матрично-матричное умножение

Чтобы умножить матрицу на другую матрицу, нам нужно выполнить «скалярное произведение» строк и столбцов… что это значит? Ну, в предыдущем разделе мы взяли матрицу и вектор, и для каждой строки в матрице мы нашли скалярное произведение этой строки с вектором и в результате получили вектор. Для умножения матриц вы делаете то же самое, но повторяете это для каждого столбца во второй матрице, действующей как отдельные векторы.

Это будет иметь больше смысла в примере. Чтобы найти ответ для 1-й строки и 1-го столбца результирующей матрицы в этой задаче, я должен найти скалярное произведение 1-й строкипервой матрицы и 1-й столбец второй матрицы следующим образом:

Чтобы найти ответ для 2-й строки и 1-го столбца результирующей матрицы, я нашел скалярное произведение 2-й строки матрицы первая матрица и 1-й столбец второй вот так:

Мы можем сделать то же самое для 1-й строки и 2-го столбца:

А для 2-й строки и 2-го столбца:

И, наконец, получаем:

Почему

Почему это важно знать?

Ну, если честно, если вы не занимаетесь чем-то, связанным с математикой или информатикой (машинным обучением), мне будет сложно дать вам вескую причину, по которой вам нужно это знать. Но для машинного обучения это ЧРЕЗВЫЧАЙНО полезно.

При моделировании слоев нейронной сети в программе на компьютере каждый слой может быть представлен вектором, а веса — матрицей. Затем, когда приходит время для прямого распространения, следующий слой сети вычисляется путем скалярного произведения предыдущего слоя (вектора) и весов. На самом деле существует множество служб облачных вычислений, к которым у вас есть доступ к компьютерам, специально разработанным для быстрого выполнения матричных операций, что значительно улучшает процесс обучения сети.

Это все, что я получил за это! Пожалуйста, не стесняйтесь, пишите мне по любым вопросам 👍📬