Начните видеть в искусственных нейронных сетях нечто большее, чем сеть кругов и линий.

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

Концепция контролируемого обучения нейронных сетей была разработана на основе аналогичной интуиции:

  1. Представляем его на обучающем примере.
  2. Предполагая, каким должен быть результат. (Это предположение будет казаться совершенно случайным в первые несколько раз).
  3. Представляя ему ожидаемый результат, с помощью которого он измеряет, насколько его предположение было далеко от результата, и пытается скорректировать веса, чтобы, надеюсь, получить более точный результат для будущих примеров.
  4. Повторяя вышеуказанные шаги для каждого примера, который вы хотите показать в сети.

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

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

При представлении этой формулы возникает естественный вопрос: почему бы просто не вычесть y и y-prime и не сделать эту разницу ошибкой? Причина кроется в простоте оптимизации. Скажем, нам нужно построить график зависимости ошибки от веса. Большое количество весов сделало бы этот график очень многомерным, поэтому давайте просто рассмотрим часть всего графика только для одного веса:

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

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

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

Теперь цель ясно видна: изменить значения весов в сети таким образом, чтобы результирующий новый результат давал меньшую ошибку (и, следовательно, был ближе к желаемому/ожидаемому результату). Как нам это сделать? Ясно одно: Величина, на которую мы изменяем значение каждого отдельного веса, должна каким-то образом коррелировать со степенью его влияния на ошибку. Разве это не имеет смысла? Вес, который, скажем, придавал слишком большое значение количеству этажей в доме при расчете цены, должен быть изменен на величину, которая как-то связана с тем, сколько этот вес повлиял на цену. ошибка. (Убедитесь, что вы действительно понимаете это.)

Математически мы определим любой произвольный вес в нейронной сети следующими обозначениями:

где l представляет номер слоя, который предшествует весу (то есть, если бы это был вес, соединяющий узел в первом входном слое с узлом во втором слое, l примет нулевое значение для входного слоя), i представляет индекс первого из двух узлов, которые он соединяет; и j, второй из двух узлов (поэтому, если вес должен был соединять первый узел в слое l с третьим узлом в следующем слое, l +1, то i и j будут равны нулю и двум соответственно). Обратите внимание, как мы начинаем индексацию с нуля, как это делают большинство языков программирования.

Как бы мы математически определили величину, на которую этот вес вносит вклад в общую ошибку (чтобы мы могли найти способ изменить значение этого веса на число, коррелирующее с этим вкладом)? Естественным способом является вычисление частной производной ошибки по весу! Математически мы будем использовать следующие обозначения:

Обратите внимание, что исчисление начинает проникать внутрь. Сделайте себе одолжение и действительно прочитайте некоторые правила дифференцирования (большой акцент на цепное правило). Еще одна вещь, которая может заинтересовать некоторых из вас, это то, что эти странные, но элегантно выглядящие ∂ делают там вместо вашего обычного d из вашего учебника по математическому анализу I / II. Позвольте мне представить вам то, что известно как частная производная. Нет причин для беспокойства, если вы никогда не видели его раньше, так как единственное, что отличает его от обычной производной, это то, что ошибка зависит от множества весов, а не от одной переменной x, как это обычно делают функции в вашем учебнике по исчислению I/II. Это многопараметрическая функция, поэтому мы используем частную производную. Значение ∂E/∂θlij можно рассматривать как насколько изменяется общая ошибка при мгновенном изменении веса или « за какую часть общей ошибки отвечает этот конкретный весθlij”(убедитесь, что вы полностью это понимаете).

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

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

:= известен как оператор присваивания и используется здесь для обозначения того, что мы обновляем значение определенного веса (не путать с равенством, т.е. F=ma), конечно же, значение, пропорциональное частной производной (мы перейдем к α через секунду). Вся строка обернута вокруг оператора повторения, который означает, что мы будем выполнять это обновление и вычислять частную производную до тех пор, пока не обнаружим, что мы сошлися к минимуму (или просто исчерпали обучающие данные). Что не включено в рисунок выше, так это то, что это должно происходить для ВСЕХ весов. Каждый вес будет иметь свою частную производную и будет соответствующим образом обновляться. Таким образом, мы опускаемся вниз по функции ошибки, настраивая наши веса, используя в качестве ориентира их соответствующие частные производные; шаг за шагом, итерация за итерацией. Для наших специалистов по векторному исчислению мы, по сути, используем градиент вектор многомерной функции суммарной ошибки, чтобы спуститься к локальным минимумам. Именно поэтому мы называем этот алгоритм обновления Градиентным спуском. Наконец, α, также известный как скорость обучения, используется для дайте нам некоторый контроль над тем, насколько большие шаги предпринимаются на каждой итерации. Общие значения для α варьируются от 0,001, 0,01, 0,1, 0,5 и т. п. Вы можете поэкспериментировать с ним, но имейте в виду, что слишком большое значение заставит нас делать действительно большие шаги и отклоняться от минимума (а мы этого не хотим).

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

Ура! У нас есть все необходимое для обучения нашей нейронной сети, кроме… как мы вычисляем значения наших частных производных?!? До сих пор мы обсуждали, что бы мы сделали, если бы у нас был доступ к таким ценностям. Теперь у нас есть бремя их фактического вычисления. Позвольте представить вам обратное распространение. Вот тут-то и начинается настоящее веселье ‹вставьте злобный смех›.

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

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

Удачи!

Часть 3: https://medium.com/@adityaa.edu/cracking-the-neural-network-part-3-45c00d77d433