$$
\definecolor{input}{RGB}{66, 133, 244}
\definecolor{output}{RGB}{219, 68, 55}
\definecolor{dinput}{RGB}{244, 180, 0}
\definecolor{doutput}{RGB}{15, 157, 88}
\definecolor{dweight}{RGB}{102, 0, 255}
$$
Алгоритм обратного распространения
Алгоритм обратного распространения необходим для быстрого обучения больших нейронных сетей. В этой статье объясняется, как работает алгоритм.
Пожалуйста, прокрутите вниз... Простая нейронная сеть
Справа вы видите нейронную сеть с одним входным, одним выходным узлом и двумя скрытыми слоями по два узла в каждом.
Узлы в соседних слоях связаны весами \(w_{ij}\), которые являются параметрами сети. Функция активации
Каждый узел имеет общий вход \(\color{input}x\), функцию активации \(f(\color{input}x\color{black})\)и выход \(\color{output}y\color{black}=f(\color{input}x\color{black})\). \(f(\color{input}x\color{black})\) должна быть нелинейной функцией, иначе нейронная сеть сможет обучаться только линейным моделям.
Обычно используемой функцией активации является сигмовидная функция : \(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\). Функция ошибки
Цель состоит в том, чтобы автоматически узнать веса сети из данных, чтобы прогнозируемый выход \(\color{output}y_{output}\)был близок к целевому \(\color{output}y_{target}\) для всех входов \(\color{input}x_{input}\).
Чтобы измерить, насколько мы далеки от цели, мы используем функцию ошибок \(E\). Обычно используемая функция ошибок — \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \). Прямое распространение
Начнем с того, что возьмем входной пример \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) и обновим входной слой сети.
Для согласованности мы считаем входные данные такими же, как и любой другой узел, но без функции активации, поэтому его выходные данные равны входным, т. е. \( \color{output}y_1 \color{black} = \color{input} x_{input} \). Прямое распространение
Теперь мы обновляем первый скрытый слой. Мы берем выходные \(\color{output}y\) узлов предыдущего слоя и используем веса для вычисления входных данных \(\color{input}x\) узлов следующего слоя. $$ \color{input} x_j \color{black} = $$ $$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$
Прямое распространение
Затем мы обновляем вывод узлов в первом скрытом слое. Для этого мы используем функцию активации \( f(x) \).$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
Прямое распространение
Используя эти 2 формулы, мы распространяемся на остальную часть сети и получаем окончательный результат сети.$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$ $$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$
Производная ошибки
Алгоритм обратного распространения решает, насколько обновить каждый вес сети после сравнения прогнозируемого результата с желаемым результатом для конкретного примера. Для этого нам нужно вычислить, как изменяется ошибка относительно каждого веса \(\color{dweight}\frac{dE}{dw_{ij}}\).
Получив производные ошибки, мы можем обновить веса, используя простое правило обновления:$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
где \(\alpha\) — положительная константа, называемая скоростью обучения, которую нам необходимо точно настроить эмпирически.
[Примечание] Правило обновления очень простое: если ошибка уменьшается при увеличении веса (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)), то увеличивайте вес, в противном случае, если ошибка увеличивается при увеличении веса (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)), то уменьшайте вес. .
Дополнительные производные
Чтобы помочь вычислить \(\color{dweight}\frac{dE}{dw_{ij}}\), мы дополнительно храним для каждого узла еще две производные: как ошибка изменяется с:- общий ввод узла \(\color{dinput}\frac{dE}{dx}\) и
- вывод узла \(\color{doutput}\frac{dE}{dy}\).
Обратное распространение
Давайте начнем обратное распространение производных ошибки. Поскольку у нас есть предсказанный результат этого конкретного примера ввода, мы можем вычислить, как ошибка изменится с этим выводом. Учитывая нашу функцию ошибки \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) , мы имеем:$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$
Обратное распространение
Теперь, когда у нас есть \(\color{doutput} \frac{dE}{dy}\) , мы можем получить \(\color{dinput}\frac{dE}{dx}\) , используя правило цепочки.$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
где \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) , когда \(f(\color{input}x\color{black})\) — функция активации сигмоида. Обратное распространение
Как только у нас есть производная ошибки по отношению к общему входу узла, мы можем получить производную ошибки по весам, поступающим в этот узел.$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$
Обратное распространение
И с помощью цепного правила мы также можем получить \(\frac{dE}{dy}\) из предыдущего слоя. Мы сделали полный круг.$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$
Обратное распространение
Все, что осталось сделать, это повторять предыдущие три формулы, пока мы не вычислим все производные ошибки.