Loading [MathJax]/jax/output/HTML-CSS/jax.js
Демонстрация обратного распространения

Алгоритм обратного распространения

Алгоритм обратного распространения необходим для быстрого обучения больших нейронных сетей. В этой статье объясняется, как работает алгоритм.

Пожалуйста, прокрутите вниз...

Простая нейронная сеть

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

Узлы в соседних слоях связаны весами wij, которые являются параметрами сети.

Функция активации

Каждый узел имеет общий вход x, функцию активации f(x)и выход y=f(x). f(x) должна быть нелинейной функцией, иначе нейронная сеть сможет обучаться только линейным моделям.

Обычно используемой функцией активации является сигмовидная функция : f(x)=11+ex.

Функция ошибки

Цель состоит в том, чтобы автоматически узнать веса сети из данных, чтобы прогнозируемый выход youtputбыл близок к целевому ytarget для всех входов xinput.

Чтобы измерить, насколько мы далеки от цели, мы используем функцию ошибок E. Обычно используемая функция ошибок — E(youtput,ytarget)=12(youtputytarget)2.

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

Начнем с того, что возьмем входной пример (xinput,ytarget) и обновим входной слой сети.

Для согласованности мы считаем входные данные такими же, как и любой другой узел, но без функции активации, поэтому его выходные данные равны входным, т. е. y1=xinput.

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

Теперь мы обновляем первый скрытый слой. Мы берем выходные y узлов предыдущего слоя и используем веса для вычисления входных данных x узлов следующего слоя.
xj=
iin(j)wijyi+bj

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

Затем мы обновляем вывод узлов в первом скрытом слое. Для этого мы используем функцию активации f(x).
y=f(x)

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

Используя эти 2 формулы, мы распространяемся на остальную часть сети и получаем окончательный результат сети.
y=f(x)
xj=
iin(j)wijyi+bj

Производная ошибки

Алгоритм обратного распространения решает, насколько обновить каждый вес сети после сравнения прогнозируемого результата с желаемым результатом для конкретного примера. Для этого нам нужно вычислить, как изменяется ошибка относительно каждого веса dEdwij.
Получив производные ошибки, мы можем обновить веса, используя простое правило обновления:
wij=wijαdEdwij
где α — положительная константа, называемая скоростью обучения, которую нам необходимо точно настроить эмпирически.

[Примечание] Правило обновления очень простое: если ошибка уменьшается при увеличении веса (dEdwij<0), то увеличивайте вес, в противном случае, если ошибка увеличивается при увеличении веса (dEdwij>0), то уменьшайте вес. .

Дополнительные производные

Чтобы помочь вычислить dEdwij, мы дополнительно храним для каждого узла еще две производные: как ошибка изменяется с:
  • общий ввод узла dEdx и
  • вывод узла dEdy.

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

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

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

Теперь, когда у нас есть dEdy , мы можем получить dEdx , используя правило цепочки.
Ex=dydxEy=ddxf(x)Ey
где ddxf(x)=f(x)(1f(x)) , когда f(x) — функция активации сигмоида.

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

Как только у нас есть производная ошибки по отношению к общему входу узла, мы можем получить производную ошибки по весам, поступающим в этот узел.
Ewij=xjwijExj=yiExj

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

И с помощью цепного правила мы также можем получить dEdy из предыдущего слоя. Мы сделали полный круг.
Eyi=jout(i)xjyiExj=jout(i)wijExj

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

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

Конец.

1y1xinput2y2x2dE/dy2dE/dx2fw12dE/dw3y3x3dE/dy3dE/dx3fw13dE/dw4y4x4dE/dy4dE/dx4fw24dE/dww34dE/dw5y5x5dE/dy5dE/dx5fw25dE/dww35dE/dw6youtputx6dE/dy6dE/dx6fw46dE/dww56dE/dwEytarget
Компьютеры...