Визуальный вывод уравнений, позволяющих нейронным сетям учиться

По сути, нейронная сеть принимает входные данные и сопоставляет их с выходным значением. Независимо от того, смотрите ли вы на изображения, слова или необработанные числовые данные, сеть видит все числа, и она просто находит закономерности в этих числах. Входные данные фильтруются через матрицу весов, которые являются параметрами сети и могут исчисляться от тысяч до миллионов или миллиардов. Совершенно очевидно, что точная настройка этих весов для распознавания закономерностей не является задачей, которую человек хочет или может выполнить, поэтому метод для этого был разработан несколько раз, особенно в 1986 году [1]. Метод берет ошибку вывода нейронной сети и распространяет эту ошибку в обратном направлении по сети, определяя, какие пути имеют наибольшее влияние на вывод. Это, конечно, обратное распространение.

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

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

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

Приходи еще?? Я люблю Википедию, но это серьезная проблема. Быстро становится ясно, что метод обратного распространения ошибки - непростая идея и требует серьезных усилий, чтобы усвоить концепции и формулы, которые будут вам брошены. Хотя вы никогда не поймете что-то полностью, пока сами не начнете писать на бумаге, цель здесь - предоставить ресурс, который сделает эту важную концепцию более доступной для тех, кто уже работает с нейронными сетями и желает «проникнуть в суть дела». Фундаментальные принципы не следует прятать за пеленой формул, которые, если они будут представлены в связной форме, будут представлять собой дорожную карту, а не дорожный блок.

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

Инструмент, используемый здесь для передачи этой визуальной информации, - это manim, библиотека математической анимации, созданная Грантом Сандерсоном на YouTube-канале 3Blue1Brown. Я также должен отнести использование некоторого кода из его сетевого класса из серии нейронных сетей. Если вы не знакомы с его каналом, сделайте себе одолжение и посмотрите его (Канал 3B1B). Хотя я выбрал маним, это не самый простой способ, и в какой-то момент между Я зашел слишком далеко, чтобы останавливаться сейчас и Я откусил намного больше, чем могу прожевать, я, возможно, пожалел об этом решении, но здесь мы. Если вы начинаете работать с нейронными сетями и / или нуждаетесь в переподготовке по прямому распространению, функциям активации и тому подобному, посмотрите видео 3B1B в ref. [2 ], чтобы закрепиться. Некоторое исчисление и линейная алгебра также очень помогут вам, но я пытаюсь объяснить вещи на фундаментальном уровне, поэтому, надеюсь, вы все еще понимаете основные концепции. Хотя реализация нейронной сети в коде может иметь большое значение для развития понимания, вы можете легко реализовать алгоритм обратного распространения, даже не понимая его (по крайней мере, я это сделал). Вместо этого цель здесь состоит в том, чтобы получить подробное представление о том, что на самом деле происходит при обратном распространении, и это влечет за собой понимание математики.

Сеть и обозначение

Упрощенная модель используется для иллюстрации концепций и во избежание чрезмерного усложнения процесса. Сеть с 2 входами, 2 выходами и 2 скрытыми слоями показана на рисунке 1. Выходные узлы обозначены как e, что указывает на ошибку, хотя вы также можете увидеть их, как правило, обозначаемые как C для стоимости. функция. Обычно это функция, подобная среднеквадратической ошибке (MSE) или бинарной перекрестной энтропии. Узел E - это общая ошибка или сумма e ₁ и e ₂. Основное отличие здесь от типичного макета нейронной сети состоит в том, что я явно разбил скрытые узлы на две отдельные функции: взвешенная сумма (z узлов) и активации (a узлы). Обычно они сгруппированы под одним узлом, но здесь это более понятно и требуется, чтобы каждая функция отображалась отдельно. Я предполагаю, что мы имеем дело с одним обучающим примером, на самом деле вам придется усреднить все обучающие примеры в вашем обучающем наборе.

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

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

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

Уравнения финального слоя

Конечная цель обратного распространения ошибки - найти изменение ошибки по отношению к весам в сети. Если мы ищем изменение одного значения по отношению к другому, это производная. Для нашей вычислительной карты каждый узел представляет функцию, и каждое ребро выполняет операцию над присоединенным узлом (умножение на вес). Мы начинаем с узла ошибки и перемещаемся назад по одному узлу за раз, беря частную производную текущего узла по отношению к узлу в предыдущем слое. Каждый член привязан к предыдущему, чтобы получить общий эффект, это, конечно, цепное правило.

Примечание: веса на этом слое влияют только на один из выходных значений: e ₁ или e ₂, поэтому в конечных уравнениях появляется только соответствующая ошибка.

Это отслеживание краев и узлов выполняется для каждого пути от узла ошибки до каждого веса в последнем слое, быстро проходя через него, как показано на рисунке 4.

На данный момент у нас есть набор формул, которые будет трудно отслеживать, если мы не будем вести бухгалтерский учет. Это означает размещение терминов в матрицах, чтобы нам было легче управлять терминами и отслеживать их. На рисунке 5 показано, как сгруппированы термины, стоит отметить использование оператора Адамара (кружок с точкой внутри). Это используется для поэлементного умножения матриц, что помогает упростить матричные операции.

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

Более глубокие слои

Для более глубоких слоев применяется та же методология с двумя ключевыми обновлениями: 1) дельта-члены снова появляются на более поздних уровнях, поэтому мы сделаем соответствующие замены; 2) Теперь будет два пути от узла общей ошибки к интересующему весу. Когда несколько ветвей сходятся в одном узле, мы добавляем эти ветки, а затем перемножаем оставшуюся цепочку функций. На рисунке 7 показан процесс для одного из весов первого слоя.

Теперь, если мы присмотримся, вы заметите повторяющиеся члены. Рисунок 8 напоминает уравнения предыдущего слоя рядом с нашим текущим уравнением для w₁₁ и показывает, какие термины повторяются, и множит их как дельты.

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

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

Самая левая матрица, конечно, может быть разбита дальше, нам нужно значение дельты само по себе, чтобы мы могли просто вставить значение, вычисленное из предыдущего слоя. Теперь, чтобы следовать рисунку 11, вам нужно вспомнить скалярное произведение, это строки, умноженные на столбцы, поэтому мы также добавляем транспонирование к дельта-членам.

Добавление матричных обозначений дает окончательную формулу

Теперь некоторые производные члены на рисунке 12 будут одинаковыми, независимо от того, что у вас есть для функции активации. Узлы, соединенные ребрами, производят линейный выходной сигнал, который затем передается в функцию активации для внесения нелинейности. Учитывая линейный характер функции, поиск производной функции узла по отношению к предыдущему узлу упрощается и может быть определен визуально. Принимая термины dz / da, эта производная сообщает нам, как выходной (z ₁) изменяется по отношению к входу, a ₁. Эти функции связаны только через край w ₁₁ , поэтому вес - единственный способ, которым a ₁ может изменить z ₁, то есть dz / da = w ₁₁. На рисунке 13 показаны узлы, соединенные ребром, и вместо него значение ребра подставляется в матрицу как решение для производного члена.

Аналогичный сценарий для dz / dw. В этом случае производная относится к ребру, а не к узлу, но та же логика сохраняется, есть только одна функция, подключенная через ребро, которая воздействует на узел z, который является входом (который я помечены как x⁰, но могли также быть отмечены как a⁰). Затем производные решения могут быть включены в матричное уравнение, как показано на рисунке 14.

Наконец-то у нас есть уравнения для последнего и начального слоев.

Обобщенные уравнения

Если вы читаете прекрасную онлайн-книгу Майкла Нильсена [3], он отмечает некоторые более общие уравнения, как и 3B1B [4]. Уравнения здесь также могут быть дополнительно обобщены. Здесь верхний индекс 1 представляет текущий слой (l), а верхний индекс 0 представляет предыдущий слой (l-1). Верхний индекс 2 в верхнем уравнении относится к следующему слою (l + 1), в то время как в нижнем уравнении он относится к последнему слою (L)… или просто наблюдайте за заменами на рисунке 16.

Предвзятость

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

Как видите, процесс такой же. Важно отметить, что для данного слоя все члены, кроме последнего, будут такими же, как только что найденные нами уравнения относительно данного веса. Последние члены представляют собой просто смещение, которому присвоено значение 1 (весовые коэффициенты смещения используются для корректировки смещения). Это позволяет нам относительно легко упростить и обобщить уравнение смещения, как на рисунке 18.

Объединение всех уравнений дает окончательный обобщенный набор уравнений в матричной форме.

Заключительные замечания

Если изображение стоит тысячи слов, чем, безусловно, дюжина GIF-файлов стоит намного больше (или, может быть, вы просто никогда не захотите снова увидеть еще один GIF). Я действительно надеюсь, что это помогло пролить свет на непростую концепцию. Если вам это понравилось, я надеюсь, что скоро у вас будет больше контента. Эта статья на самом деле была отходом от моего первоначального проекта, который строил одноразовый детектор объектов, который в нескольких точках ломался и приводил меня к этой кроличьей норе.

Дополнительные ресурсы, связанные с этой статьей:

использованная литература

[1] Д. Рамелхарт, Г. Хинтон и Р. Уильямс, Изучение представлений с помощью ошибок обратного распространения (1986), Nature

[2] Дж. Сандерсон, Но что такое нейронная сеть? Глубокое обучение, глава 1 (2017), 3Blue1Brown

[3] М. Нильсен, Нейронные сети и глубокое обучение - Глава 2, Determination Press, 2015 г.

[4] Дж. Сандерсон, Расчет обратного распространения ошибки - глубокое обучение, глава 4 (2017), 3Blue1Brown

Теорема Бетховена - это канал на YouTube, который я использовал, на нем есть много полезных видео по использованию Manim.