Алгоритм обратного распространения ошибки
дата публикации: 2016-07-06

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

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

Многослойный персептрон

Не будем вдаваться в подробности, так как приведенная схема более чем очевидна, однако позволю несколько слов по структуре. Система состоит из L слоев, для обозначения которых введем переменную k \in (1..L). Количество персептронов в каждом слое разное и для обозначения введем N_k. Предполагается, что на вход каждого персептрона в k слое поступает N_{k-1} входных сигналов, то есть выходы предыдущего слоя являются входами для текущего (конечно за исключением первого слоя). На самом деле входных сигналов для каждого персептрона может быть и меньше, что вполне можно в дальнейшем смоделировать нулевыми весами. Система Адалайн подробно рассмотрена в статье про простейший персептрон, поэтому не будем вдаваться во внутренности AD. Исходя из схемы сети, очевидны следующие соотношения:

\begin{aligned} & \varepsilon_{i,L}(n) = d_i(n) - y_{i,L}(n); i \in (1..N_L), \\ & y_{i,k}(n) = f(x_{i,k}(n)); i \in (1..N_k); k \in (1..L), \\ & x_{i,k}(n) = \sum_{j = 0}^{N_{k-1}} w_{i,j,k} \cdot y_{j,k-1}(n); i \in (1..N_k); k \in (1..L), \end{aligned}

где f(x) - функция активации, d_i(n) - эталонные выходные сигналы, \varepsilon_{i,L}(n) - невязка выходных сигналов в последнем слое, x_{i,k}(n) - выходной сигнал персептрона до преобразования функцией активации, w_{i,j,k} - веса персептронов. На первый слой поступают сигналы y_{j,0}(n) = u_j(n). На каждом слое существует так называемый сигнал смещения y_{0,k}(n) = 1, который позволяет задавать смещение для каждого персептрона за счет веса w_{i,0,k} = v_{i,k}.

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

J(\widehat{w}) = \sum_{i = 1}^{N_L} E \{ \varepsilon_{i,L}^2(n) \} = \sum_{i = 1}^{N_L} E \left\{ \left[ d(n) - y_{i,L}(n) \right] ^2 \right\}.

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

\widehat{w}_{i,j,k}^{\langle m+1 \rangle} = \widehat{w}_{i,j,k}^{\langle m \rangle} - \frac{\eta}{2} \cdot \frac{\partial J(\widehat{w}^{\langle m \rangle})}{\partial \widehat{w}_{i,j,k}^{\langle m \rangle}},

где m - номер итерации, \eta - коэффициент спуска.

Выведем формулу для производной функционала, упустив индекс итерации, упрощая запись.

\frac{\partial J(\widehat{w})}{\partial \widehat{w}_{i,j,k}} = 2 \cdot E \left\{ \varepsilon_{i,k}(n) \cdot \frac{\partial \varepsilon_{i,k}(n)}{\partial \widehat{w}_{i,j,k}} \right\} = -2 \cdot E \left\{ \varepsilon_{i,k}(n) \cdot f'(x_{i,k}(n)) \cdot \frac{\partial x_{i,k}(n)}{\partial \widehat{w}_{i,j,k}} \right\},

таким образом, формула для определения весов примет вид:

\widehat{w}_{i,j,k}^{\langle m+1 \rangle} = \widehat{w}_{i,j,k}^{\langle m \rangle} + \eta \cdot E \left\{ \varepsilon_{i,k}(n) \cdot f'(x_{i,k}(n)) \cdot y_{j,k-1}(n) \right\}.

Получена формула, однако применение ее затруднено ввиду того, что мы не знаем как определить \varepsilon_{i,k}(n) . Ключом к пониманию алгоритма является следующее умозаключение: невязка выходных сигналов в k-1 слое зависит от невязки выходных сигналов в k слое. Ввиду того, что мы априорно знаем значение невязки в последнем слое, алгоритм предполагает последовательное вычисление невязки, двигаясь справа налево, именно поэтому алгоритм получил такое название - алгоритм обратного распространения ошибки. Теперь нам необходимо построить зависимость, для чего воспользуемся следующим соотношением:

\frac{\partial J(\widehat{w})}{\partial x_{i,k}} = \sum_{i = 1}^{N_{k+1}} \left[ \frac{\partial J(\widehat{w})}{\partial x_{i,k+1}} \cdot \frac{\partial x_{i,k+1}}{\partial x_{i,k}} \right],

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

Свяжем чувствительность функционала с невязкой:

\frac{\partial J(\widehat{w},n)}{\partial x_{i,k}(n)} = \frac{\partial J(\widehat{w},n)}{\partial \widehat{w}_{i,j,k}} \cdot \frac{\partial \widehat{w}_{i,j,k}}{\partial x_{i,k}(n)} = -2 \cdot \varepsilon_{i,k}(n) \cdot f'(x_{i,k}(n)).

Очевидно следующее соотношение:

\frac{\partial x_{i,k+1}(n)}{\partial x_{i,k}(n)} = \frac{\partial x_{i,k+1}(n)}{\partial y_{i,k}(n)} \cdot \frac{\partial y_{i,k}(n)}{\partial x_{i,k}(n)} = w_{i,j,k+1} \cdot f'(x_{i,k}(n)).

Подставим полученные выражения в формулу для чувствительностей, получим:

-2 \cdot \varepsilon_{i,k}(n) \cdot f'(x_{i,k}(n)) = -2 \cdot f'(x_{i,k}(n)) \cdot \sum_{i = 1}^{N_{k+1}} \left[ \varepsilon_{i,k+1}(n) \cdot f'(x_{i,k+1}(n)) \cdot w_{i,j,k+1} \right],

итоговая формула, которая связывает ошибку между слоями примет вид:

\varepsilon_{i,k}(n) = \sum_{i = 1}^{N_{k+1}} \left[ \varepsilon_{i,k+1}(n) \cdot f'(x_{i,k+1}(n)) \cdot w_{i,j,k+1} \right].

Сформулируем алгоритм в пошаговом режиме:

1. Берется ансамбль входных u_i(n), i \in (0..N_0), n = 1,2... и выходных сигналов d_i(n), i \in (0..N_L), n = 1,2... ;

2. Выбирается коэффициент спуска \eta;

3. Определяются начальные значения весов \widehat{w}_{i,j,k}^{\langle 0 \rangle};

4. Последовательно рассчитываются x_{i,k}(n), y_{i,k}(n), f'(x_{i,k}(n)), \varepsilon_{i,L}(n) для всего ансамбля, всех слоев и персептронов;

5. Последовательно вычисляются \varepsilon_{i,k}(n) на всех слоях сети;

6. Вычисляется математическое ожидание \varepsilon_{i,k}(n) \cdot f'(x_{i,k}(n)) \cdot y_{j,k-1}(n), умножается на коэффициент спуска и складывается с предыдущим значением весов, далее выполняем пункт 4 до тех пор, пока полученное решение не удовлетворит нашим требованиям.