понять смысл матричного умножения и его применения к глубокому обучению, а также почему вы должны изучать линейную алгебру

Если вам не нравится макет Medium, вот версия с открытым текстом Markdown.

https://hirasawakinko.github.io/chika_home/toward_science/So%20What%20Exactly%20is%20happenig%20in%20Matrix%20Multiplication/

Умножение матриц в линейной алгебре, пожалуй, самая жуткая и загадочная математическая функция в мире. Вы можете найти это в любом учебнике, они отстой, ни один из них толком не говорит о том, как это работает, почему это работает именно так, а почему не иначе. Выходит, никто не понимает, что именно происходит в матричном умножении? Я слышал, как вы сказали: «Нет, вы ошибаетесь, я один из авторов этой кучи книг, и я уверен, что знаю свое дело». Ах, да? Докажи мне это. О, вы уже доказали это. Вы написали книгу. И содержание не отражает того, что вы вообще понимаете Матрицу.

Итак, вот я, прочитав несколько этих невыносимых учебников, отказываюсь понимать, что же такое на самом деле Матрица и ее Умножение. Затем эта идея пришла мне в голову, когда я несколько дней назад читал книгу о глубоком обучении…

Предполагая

Я предполагаю, что читатель этой статьи имеет базовые представления о Векторе, Матрице и Внутреннем Продукте. Также я предполагаю, что читатель не понимает, почему Матрица умножает вещи таким образом.

Я предполагаю, что вы спрашиваете: ^ Что, черт возьми, это значит????

Мотивация Матрицы * Вектора

Допустим, существуют факторы, представленные в виде вектора

v — это вектор, поэтому я превращаю его в обычный вектор-столбец. v состоит из 3 компонентов v1 v2 v3.

И есть действия, связанные с этими значениями v1 v2 v3. Например, они представляют собой заработную плату рабочих. Босс решил увеличить всем зарплату на 100%. Как вы собираетесь компьютерировать, используя вектор?

Вот как бы вы это сделали. Умножьте каждый компонент вектора на общую скалярную величину. Звучит просто, но как насчет этого.

Теперь начальник решил увеличить всем заработную плату на общую сумму 10% от заработной платы их коллег.

Теперь вы не можете просто умножить скалярную величину и на этом закончить. Вам нужно посмотреть на заработную плату других людей, чтобы определить размер надбавки. Перефазируйте на языке математических функций:

До:

eq.1) new_v1 = 2 * v1
 
define this as function f as func_f .
f is a function of variable v1.

После:

eq.2) new_v1 = v1 + 0.1*v2 + 0.1*v3
    
define this as function g as func_g .
g is a function of variables {v1, v2, v3} .

Теперь, когда вы видите, что в правой части уравнения 2 больше переменных, также укажите, что это функция с несколькими переменными. new_v1 опирается не только на значение old_v1, но и на старые значения из v2 и v3.

Это похоже на то, как люди, не занимающиеся STEM, говорят о проблемах общества. «Феномен XX обусловлен многими факторами, поэтому он сложен, поэтому нам нужно больше исследований в этом бла-бла-бла». Конечно, вам нужно больше исследований. Но если говорить об исследованиях, то у нас уже есть подходящий инструмент для анализа такого многофакторного многопричинного феномена. Этот инструмент называется линейной алгеброй.

Так как же линейная алгебра может решить такую ​​многофакторную проблему?

Вы выполняете умножение матриц.

Сначала рассмотрим только случай v1. А именно процесс перевода old_v1 в new_v1.

Так что это ситуация вектор * вектор. Или формально вы можете назвать это «внутренним продуктом» или «скалярным продуктом». Глядя на правую часть уравнения, есть вектор-строка слева и вектор-столбец справа, вы умножаете их по компонентам, а затем складываете их вместе. Результатом будет масштабируемая величина, а не вектор. Вот как вы создаете новое значение v1.

Через внутренний продукт теперь вы смешиваете значения всех компонентов. В new_v1 есть некоторая часть v2 и некоторая часть v3. Так что это многофакторная вещь!

И под этим внутренним продуктом есть скрытый параметр. То есть компоненты всех векторов осведомлены о местоположении. Вы не должны произвольно изменять любую позицию. Скажем, ради интереса поменяйте местами 1 и 0,1 в векторе-строке, и вы получите неправильный ответ.

Потому что положение имеет значение. Позиция что-то значит даже не выписанная. В частности, в векторе-столбце сверху вниз содержится информация о коллегах №1 и №3 соответственно. И в векторе-строке слева направо он содержит информацию о коэффициенте, который вы хотели умножить на заработную плату коллеги № 1 и 3 соответственно.

Вы можете заменить любое реальное значение, которое вам нравится, если вы подчиняетесь идее того, какое значение представляет эта позиция.

Так обстоит дело с new_v1. А как насчет new_v2 и new_v3?

Вы можете видеть, что они структурно одинаковы для v1 v2 v3. Все они являются внутренним продуктом.

Теперь мы производим новую заработную плату один за другим, что кажется неэффективным. Есть ли способ сделать все сразу? Да. Это Матрица * Вектор.

Перед тем, как перейти к Matrix * Vector, необходимо повторить ключевую идею. То есть компоненты в векторе-столбце учитывают позицию, и вы не можете изменить это впоследствии. А именно:

[v1=wage of colleague 1]
[v2=wage of colleague 2]
[v3=wage of colleague 3]

Таким образом, после расчета их новой заработной платы должность исключительно для одного человека по-прежнему сохраняется за этим же человеком.

[old_v1] -> [new_v1]
[old_v2] -> [new_v2]
[old_v3] -> [new_v3]

Вектор-столбец по-прежнему является вектором-столбцом, и эта позиция по-прежнему представляет заработную плату конкретного человека. Одним словом, вектор-столбец должен сохранять точно такую ​​же структуру после Matrix * Vector.

Чтобы было ясно:

Это то, что мы уже знаем.

И они должны быть в этой структуре.

[new_v1]
[new_v2]
[new_v3]

Возможно, вы уже предвидели это. Вы просто комбинируете их структурно.

Чтобы сделать это визуально более понятным, я должен написать это таким образом.

Это отвечает сразу на два вопроса.

Почему это умножение матрицы должно выполнять такие вещи, как строка-столбец, строка-столбец (как это говорят вам в обычных учебниках)?

Это необходимо для сохранения структуры входного вектора. Между тем, все еще нужно убедиться, что вывод представляет собой линейную комбинацию старых (а именно, new_v1 = a*v1 + b*v2 + c*v3). Чтобы вы могли справиться с трудной проблемой «многие вещи взаимосвязаны друг с другом».

Неквадратная матрица?

Но в мире также существуют неквадратные матрицы, поскольку единственная матрица, представленная в предыдущем разделе, является просто квадратной матрицей. Как я могу понять любую из этих неквадратных матриц?

Повторите последнюю картинку в предыдущем разделе.

Ранее мы считали, что позиционное значение выходного вектора такое же, как и входного вектора. Они по-прежнему представляют собой заработную плату кого-то. Что, если теперь это не так. Скажем, теперь заработная плата этих 3 коллег влияет на другие вещи. Например, они будут тратить свои деньги на выходные, а в торговом центре есть много местных магазинов. Каким-то образом вы узнаете, сколько именно они собираются потратить на эти магазины. Таким образом, вы можете получить это новое умножение матриц.

С помощью такого неквадратного матричного умножения вы не только изменили размер векторного результата, вы также изменили то, что означают эти компоненты в векторе. И эти изменения предназначены, и информация о том, что стоит за тем, что встроено в Матрицу, которую вы решили умножить.

Имеет ли это смысл?

Матрица * Матрица

Таким образом, по мере того, как босс увеличивает свою заработную плату, он может тратить больше на покупку вещей. И совершенно не собираются менять свое покупательское поведение. И вы хотите увидеть, в чем разница между сейчас и тогда. Вы можете сделать это, Матрица * Матрица.

Или это может быть, как-то есть другая команда коллег, состоящая из 3 человек (w1 w2 w3), также они делают покупки в том же торговом центре в выходные, и то, как они тратят свои деньги, полностью такие же, как те 3 человека там сзади .

Как они связаны с глубоким обучением?

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

Например есть картинка. Вы собираетесь написать программу для определения того, что изображено на картинке. На картинке может быть человек, а может быть собака, или кошка, или цветок. Но эта задача совсем не проста с точки зрения программирования. На картинке могут быть волосы, похожие на волосы, но это не приводит автоматически к выводу, что на картинке есть собака. Собака — это больше, чем волосы. Возможно, лапы + шерсть + большие глаза + многое другое могут удовлетворить большинство характеристик собаки. Но написать такую ​​программу, чтобы зафиксировать все особенности собаки, чрезвычайно сложно. Что вы должны сделать? Умножение матриц.

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

Итак, в конечном итоге вы хотите извлечь из исходного изображения тот или иной признак. Вы умножаете вектор, состоящий из информации исходного изображения, на определенную матрицу. Так что, например, feature1 будет линейной комбинацией всех пикселей.

feature1 = a*pixel1 + b*pixel2 + c*pixel3 + …

Например, если feature49 требует, чтобы пиксели 1, 3, 26 были заполнены цветом одновременно, а все остальное оставить пустым:

feature49 = +a*pixel1 -b*picel2 +c*pixel3 -d*pixel4 -… + z*pixel26

Каждый пиксель, не входящий в {1,3,26}, положительно влияет на значение feature49. Только когда пиксели в {1,3,26} заполнены цветами, а не другие, удовлетворяют существование feature49, иначе изображение не имеет feature49.

Итак, вы извлекли основные черты из картинки. Вы можете сделать больше. Как насчет сочетания основных функций. Например, более сложная функция, требующая сосуществования функций feature1 и feature2. Например, узнавать волосы и лапы. Следующий шаг — осознать, что «одновременное наличие волос и лап» важнее любого из них. Так что для этого есть еще одно матричное умножение.

И вы можете делать это снова и снова и снова… наконец, у вас есть вектор строки, который решает, какой сверхсложный признак указывает на то, что на картинке с большой вероятностью есть собака.

Теперь глубокое обучение также имеет смысл после понимания того, что происходит в умножении матриц.

А также нетрудно понять, что решение проблем с помощью линейной алгебры может решать гораздо более сложные проблемы, чем любые методы ученых, не специализирующихся на STEM. У вас наверняка может быть абсурдно большая матрица для представления каждой отдельной особенности всего, чтобы изучить, как они взаимосвязаны друг с другом. Но что я видел в области, отличной от STEM? Построение трехмерного графика — это максимум. Все, что они могут себе представить, это до 3 функций. Волосы, лапы, большие глаза и четыре ноги для собаки? Это считается до 4, и это сложно понять человеку. «Нельзя понять собаку по цифрам», — скажут они. Но я не согласен.