Цель этой статьи — дать читателю представление об аспекте математики, связанном с линейной алгеброй, который необходимо знать, чтобы начать программирование или разработку моделей машинного/глубокого обучения и получить представление о них. Каждый раздел соответствует уникальной операции линейной алгебры. Я надеюсь, что эта статья будет легко читаема и понятна человеку, имеющему базовые знания математики на уровне средней школы.
Габаритные размеры
Прежде всего, что, черт возьми, такое матрица? Ну, матрица — это «прямоугольный массив чисел». Проще говоря, матрица — это сетка, в которой каждый квадрат содержит значение. Возможно, вы знакомы с матрицами в программировании (также известными как «массив массивов»). Например, в 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-го столбца:
И, наконец, получаем:
Почему
Почему это важно знать?
Ну, если честно, если вы не занимаетесь чем-то, связанным с математикой или информатикой (машинным обучением), мне будет сложно дать вам вескую причину, по которой вам нужно это знать. Но для машинного обучения это ЧРЕЗВЫЧАЙНО полезно.
При моделировании слоев нейронной сети в программе на компьютере каждый слой может быть представлен вектором, а веса — матрицей. Затем, когда приходит время для прямого распространения, следующий слой сети вычисляется путем скалярного произведения предыдущего слоя (вектора) и весов. На самом деле существует множество служб облачных вычислений, к которым у вас есть доступ к компьютерам, специально разработанным для быстрого выполнения матричных операций, что значительно улучшает процесс обучения сети.
Это все, что я получил за это! Пожалуйста, не стесняйтесь, пишите мне по любым вопросам 👍📬