Обучение черного ящика

Предыдущая статья была посвящена прямому распространению в нейронных сетях, как оно работает и почему оно работает. Одним из важных объектов в прямом распространении являются веса. Мы увидели, как настройка весов может использовать нелинейность, представленную в каждом слое, для усиления результирующего вывода. Как мы уже говорили, мы собираемся случайным образом инициализировать веса и смещения и позволить сети изучить эти веса с течением времени. Теперь самый важный вопрос. как эти веса будут обновляться? как будут изучены правильные веса и смещения, которые оптимизируют производительность сети для аппроксимации исходного соотношения между x и y, ?

Знакомство с градиентным спуском

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

Давайте рассмотрим пример функции, как показано на рис. 1.1. Это не что иное, как y = (x + 2)². Мы знаем, просто взглянув на эту функцию, что значение y будет минимальным, когда x = -2. Но есть ли способ заставить алгоритм изучить это итеративным способом?

Давайте случайным образом инициализируем значение x, а затем итеративно изменим значение x таким образом, чтобы значение y достигло минимума. Предположим, что значение x равно 0. Тогда y будет равно 4. Найдите наклон или тангенс y относительно x (dy/dx) при x = 0. Ответ: 4 (положительное число). Проделайте тот же процесс для x = -4. вы заметите, что наклон или тангенс y по отношению к x (dy/dx) при x = -4 равен -4 (отрицательное число).

мы знаем, что значение x нужно уменьшить, когда оно больше -2, и его нужно увеличить, когда оно меньше -2.

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

Следовательно, мы можем использовать дифференцирование, чтобы найти направление, в котором нам нужно переместить значение x, чтобы уменьшить y. Это направление есть не что иное, как направление, противоположное наклону или касательной в этой точке. Еще одна вещь, которую следует признать, заключается в том, что мы будем перемещать x в этом направлении только на крошечную величину, чтобы гарантировать, что он не выйдет за рамки и не уйдет от глобальных минимумов на другую сторону. Повторяя этот процесс снова и снова, мы, наконец, сможем достичь x = -2 и y = 0, чего мы и хотим.

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

Обратное распространение: основная идея, стоящая за ним

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

Затем мы приступаем к дифференцированию функции потерь по каждому отдельному весу в сети, аналогично тому, как мы дифференцировали y по x в предыдущем примере. Как только это будет сделано, мы обновим веса в направлении, противоположном дифференцированному члену.

Выводы и доказательства

Что я не могу создать, я не понимаю

- Ричард П. Фейнман

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

Давайте рассмотрим пример нейронной сети и выведем всю формулу обратного распространения ошибки.

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

Прямое распространение

Все прямо от входа X до выхода Net(3) представляет собой матрицу на рис. 2.2.
Я не рассматривал термины смещения только для простоты. Как только обновление весов будет правильно интерпретировано, несложно сделать то же самое для смещений. Кроме того, приведенные выше 6 строк в значительной степени говорят сами за себя, если вы хорошо разбираетесь в прямом распространении.

Обратное распространение

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

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

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

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

Обновить веса

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

Доказательство того, что это работает

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

Некоторый окончательный анализ и заключение

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

Поскольку нас интересует только направление, можно ли удалить сигмовидные члены из уравнения, поскольку сигмоид(х) (1-сигмоид(х)) всегда будет лежать между 0 и 0,5 для любого значения х? оказывается, это метод, принятый в Создай собственную нейронную сеть. Это сделано в качестве альтернативы увеличению скорости обучения.

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

Рекомендации

  1. Создайте свою собственную нейронную сетьТарик Рашид
  2. Нейронные сети и глубокое обучение, Майкл Нильсон
  3. Глубокое обучение Эндрю Н.Г.