Пример пошагового выполнения алгоритма обратного распространения ошибки

Источник: Matt Mazur. A Step by Step Backpropagation Example

Введение.

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

Поэтому в этом разделе алгоритм обратного распространения будет рассмотрен на примере простейшей нейронной сети с двумя входами (I1, I2), двумя скрытыми (h1, h2) и двумя выходными (o1, o2) нейронами. При этом, на скрытые и выходные нейроны еще действуют и смещения (b1 и b2), которые в англоязычном варианте называют bias.

Основной целью backpropagation применительно к нейронным сетям является оптимизация весов связей между нейронами для того, чтобы проектируемая нейронная сеть смогла обучиться правильно отображать произвольные входные данные в нужные значения выходов. В данном примере обучающая выборка будет состоять всего из одного набора данных, при входных значения которого 0.05 и 0.10 требуется, чтобы нейронная сеть выдавала значения 0,01 и 0,99, соответственно.

1. Прямое распространение сигналов

Настройка любой нейронной сети всегда начинается с прямого распространения входных сигналов по слоям нейронной сети. При этом на первом этапе требуется выяснить, а на что в данный момент способна нейронная сеть, и какие значения выходов она может предсказать для входных сигналов x1 = 0.05 и x2 = 0.10 с учетом сгенерированных случайным образом значений весовых коэффициентов и смещений. Для этого требуется поступившие входные значения передать вперед по слоям сети: от входного слоя к скрытому, и от скрытого к выходному.

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

2. Вычисление обобщенной ошибки настройки сети

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

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

На данный момент выход нейрона o1 равен 0,75136507, а его желаемое (целевое) значение должно быть 0.01. Поэтому ошибка предсказания нейрона o1 будет:

Вспоминая, что желаемое (целевое) значение выхода o2 должно быть 0.99, а текущее значение равно 0.772928465, можно вычислить ошибку предсказания нейрона o2, которая будет равна:

Общая ошибка предсказания нейронной сети представляет собой сумму ошибок предсказания всех выходных нейронов, и равна:

3. Обратное распространение ошибки

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

3.1. Обновление весовых коэффициентов выходного слоя

На выходном слое нейронной сети присутствуют связи с весами w5 и w6 к нейрону o1, а также связи с весами w7 и w8 к нейрону o2. Они поступают с выходов нейронов скрытого слоя. Кроме этого на оба выходных нейрона оказывает влияние связь от смещения b2.

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

Визуально, это можно представить следующим образом:

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

Выполнив все, приведенные выше вычисления, появляется возможность объединить их в одно выражение и провести расчет, а именно:

Замечание:
В общем случае это выражение может быть представлено в виде: Откуда видно, что первые два сомножителя полностью определяются параметрами нейрона выходного слоя о1, на который связь w5 воздействует. А третий сомножитель зависит от сигнала нейрона скрытого слоя h1, откуда связь w5 берет свое начало.
Если теперь объединить первые два сомножителя и обозначит их греческой буквой дельта то исходное выражение с учетом дельты узла может быть записано в виде: Такого типа расчеты и форма записи получили название дельта правила или правила дельты.

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

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

Выполняя аналогичные операции, можно получит скоррктированные значения для всех других весов выходного слоя:

!!!! Мы выполняем фактические обновления в нейронной сети после того, как у нас появились новые веса, ведущие к нейронам скрытого слоя (т. Е. Мы используем исходные веса, а не обновленные веса, когда мы продолжаем алгоритм backpropagation ниже).

3.2. Обновление весовых коэффициентов скрытого слоя

Сделав шаг назад, мы от выходного слоя перейдем к скрытому с целью обновления значений весов w1, w2, w3 и w4. Остановимся на рассмотрении процесса обновления веса w1 и выясним степень его влияния на общую ошибку настройки сети:

Визуально это может быть представлено следующим образом:

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

Так как изменение сигнала outh1 вызывает изменение, как outo1, так и outo2, то для оценки степени его влияния на общую ошибку сети необходимо вычислить

Вспомним, что мы рассмотриваем процесс обновления веса w1 и выясням степень его влияния на общую ошибку настройки сети:

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

Объединяя все полученные выше соотношения, можно получить окончательное выражение для частной производной от общей ошибки сети по весовому коэффициенту w1:

Замечание:

В общем случае данное выражение может быть записано в виде:

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

Повторяя все проведенные выше расчеты для w2, w3 и w4, можно получить:

Наконец, мы обновили все наши веса! При подачи на вход сети вектора исходных данных (0.05; 0.10), ошибка сети в результате прямого распространения составляла 0.298371109. В результате одной итерации алгоритма backpropagation общая ошибка предсказания сети теперь составляет 0.291027924. Это может показаться не очень много, но после повторения этого процесса, например, 10 000 раз ошибка падает до 0,0000351085.