Изменения

Перейти к: навигация, поиск

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

620 байт добавлено, 22:20, 8 апреля 2019
Алгоритм
'''Метод обратного распространения ошибок''' (англ. ''backpropagation'') {{---}} метод вычисления градиента, который используется при обновлении весов в [[Нейронные_сети,_перцептрон|нейронной сети]].
==Обучение как задача оптимизации==
Чтобы понять математическое предназначение метода, требуется осознать взаимоотношения между действительными выходными значениями сети и требуемыми выходными значениями для конкретного примера из обучения. Рассмотрим простую нейронную сеть без скрытых слоев, с двумя входными вершинами и одной выходной, в которых каждый нейрон использует линейную [[Практики реализации нейронных сетей#Функции активации|функцию активации]],<ref group="заметка"> Обычно(обычно, многослойные нейронные сети используют нелинейные функции активации, линейные функции используются для упрощения понимания.</ref> ) которая является взвешенной суммой входных данных. [[File:A simple neural network with two input units and one output unit.png|thumb|250px|Простая нейронная сеть с двумя входными вершинами и одной выходной
]]
:<math>E=(t-y)^2, </math> где <math>E</math> ошибка.
В качестве примера, рассмотрим обучим сеть с одним тренировочным объектом: на объекте <math>(1, 1, 0)</math>, таким образом, значения <math>x_1</math> и <math>x_2</math> равны 1, а <math>t</math> равно 0. Теперь, если действительный ответ Построим график зависимости ошибки <math>yE</math> изобразить на графике на горизонтальной оси, а ошибку от действительного ответа <math>Ey</math> на вертикальной, его результатом будет парабола. Минимум параболы соответствует ответу <math>y</math>, который минимизирует ошибку минимизирующему <math>E</math>. Для одиночного тренировочного объектаЕсли тренировочный объект один, минимум также касается горизонтальной оси, следовательно ошибка будет нулевая и сеть может выдать ответ <math>y</math> который точно соответствует равный ожидаемому ответу <math>t</math>. Следовательно, задача преобразования входных значений в выходные может быть сведена к задаче оптимизации, заключающейся в поиске функции, которая даст минимальную ошибку. [[File:Error surface of a linear neuron for a single training case.png|right|thumb|250px|График ошибки для нейрона с линейной функцией активации и одним тренировочным объектом]]
В таком случае, выходное значение нейрона {{---}} взвешенная сумма всех его входных значений:
==Дифференцирование для однослойной сети==
Метод градиентного спуска включает в себя вычисление дифференциала квадратичной функции ошибки относительно весов сети. Обычно это делается с помощью метода обратного распространения ошибки. Предположим, что выходной нейрон один,<ref group="заметка">Их (их может быть несколько, тогда ошибка {{---}} это квадратичная норма вектора разницы.</ref> ) тогда квадратичная функция ошибки:
: <math>E = \tfrac 1 2 (t - y)^2,</math> где <math>E</math> {{---}} квадратичная ошибка, <math>t</math> {{---}} требуемый ответ для обучающего образца, <math>y</math> {{---}} действительный ответ сети.
\end{cases}</math>
Чтобы обновить вес <math>w_{ij}</math> используя градиентный спуск, нужно выбрать скорость обучения, <math>\eta >0</math>. Изменение в весах должно отражать влияние <math>E</math> на увеличение или уменьшение в <math>w_{ij}</math>. Если <math>\frac{\partial E}{\partial w_{ij}} > 0</math>, увеличение <math>w_{ij}</math> увеличивает <math>E</math>; наоборот, если <math>\frac{\partial E}{\partial w_{ij}} < 0</math>, увеличение <math>w_{ij}</math> уменьшает <math>E</math>. Новый <math>\Delta w_{ij}</math> добавлен к старым весам, и произведение скорости обучения на градиент, умноженный на <math>-1</math> , гарантирует , что <math>w_{ij}</math> изменения будут всегда уменьшать <math>E</math>. Другими словами, в следующем уравнении, <math>- \eta \frac{\partial E}{\partial w_{ij}}</math> всегда изменяет <math>w_{ij}</math> в такую сторону, что <math>E</math> уменьшается:
: <math> \Delta w_{ij} = - \eta \frac{\partial E}{\partial w_{ij}} = - \eta \delta_j o_i</math>
== Алгоритм ==
'''Алгоритм:'''
'''''BackPropagation''''' <math>(\eta, \alpha, \{x_i^d, t^d\}_{i=1,d=1}^{n,m}, \textrm{steps})</math>
# Инициализировать <math>\{w_{ij}\}_{i,j} </math> маленькими случайными значениями, <math>\{\Delta w_{ij}\}_{i,j} = 0</math>
# Повторить <math>steps</math> раз:
#: .Для всех d от 1 до m:
## Подать <math>\{x_i^d\}</math> на вход сети и подсчитать выходы <math>o_i</math> каждого узла.
## Для всех <math>k \in Outputs</math>
##: <math>\delta _k = o_k(1 - o_k)(t_k - o_k)</math>.
## Для каждого уровня l, начиная с предпоследнего:
##: Для каждого узла j уровня l вычислить
##: <math>\delta _j = o_j(1 - o_j)\sum_{k \in Children(j)} \delta _k w_{j,k}</math>.
## Для каждого ребра сети {i, j}
##: <math>\Delta w_{i,j}(n) = \alpha \Delta w_{i,j}(n-1) + ( 1 - \alpha ) \eta \delta _j o_{i}</math>.
##: <math>w_{i,j}(n) = w_{i,j}(n-1) + \Delta w_{i,j}(n)</math>.
# Выдать значения <math>w_{ij}</math>.
где * <math>\eta</math> - скорость обучения* <math>\alpha</math> — - коэффициент инерциальности для сглаживания резких скачков при перемещении по поверхности целевой функции* <math>\{x_i^d, t^d\}_{i=1,d=1}^{n,m}</math> {{---}} обучающее множество* <math>\textrm{steps}</math> {{---}} количество повторений* <math>network(x)</math> {{---}} функция, подающая x на вход сети и возвращающая выходные значения всех ее узлов* <math>layers</math> {{---}} количество слоев в сети* <math>layer_i</math> {{---}} множество нейронов в слое i* <math>output</math> {{---}} множество нейронов в выходном слое
'''fun''' BackPropagation<math>(\eta, \alpha, \{x_i^d, t^d\}_{i=1,d=1}^{n,m}, \textrm{steps})</math>:
'''init''' <math>\{w_{ij}\}_{i,j} </math>
'''repeat''' <math>\textrm{steps}</math>:
'''for''' <math>d</math> = <math>1</math> to <math>m</math>:
<math>o</math> = <math>network(\{x_i^d\}) </math>
'''for''' <math>k \in output</math>:
<math>\delta _k</math> = <math>\sigma'(o_k)(t_k - o_k)</math>
'''for''' <math>i</math> = <math>layers - 1</math> to <math>1</math>:
'''for''' <math>j \in layer_i</math>:
<math>\delta _j</math> = <math>\sigma'(o_j)\sum_{k \in layer_{i + 1}} \delta _k w_{j,k}</math>
'''for''' <math>\forall w_{i,j}</math>:
<math>\Delta w_{i,j}^{n}</math> = <math>\alpha \Delta w_{i,j}^{n-1} + ( 1 - \alpha ) \eta \delta _j o_{i}</math>
<math>w_{i,j}^{n}</math> = <math>w_{i,j}^{n-1} + \Delta w_{i,j}^{n}</math>
'''return''' <math>w_{ij}</math>
== Недостатки алгоритма ==
=== Паралич сети ===
В процессе обучения сети значения весов могут в результате коррекции стать очень большими величинами. Это может привести к тому, что все или большинство нейронов будут функционировать при очень больших выходных значениях OUT, в области, где а производная сжимающей активирующей функции будет очень мала. Так как посылаемая обратно в процессе обучения ошибка пропорциональна этой производной, то процесс обучения может практически замереть.
=== Локальные минимумы ===
Градиентный спуск с обратным распространением ошибок гарантирует нахождение только локального минимума функции; также, возникают проблемы с пересечением плато на поверхности функции ошибки.
==ЗаметкиПримечания==<references group="заметка" *[https://habr.com/ru/post/198268/ Алгоритм обучения многослойной нейронной сети методом обратного распространения ошибки]*[https://frnsys.com/ai_notes/machine_learning/neural_nets.html Neural Nets]*[http://cs231n.stanford.edu/slides/2018/>cs231n_2018_lecture04.pdf Understanding backpropagation]
==См. также==
*[[:Нейронные_сети,_перцептрон|Нейронные_сетиНейронные сети,_перцептронперцептрон]]
*[[:Стохастический градиентный спуск|Стохастический градиентный спуск]]
*[[:Настройка_глубокой_сети|Настройка глубокой сети]]
*[[:Практики_реализации_нейронных_сетей|Практики реализации нейронных сетей]]
== Источники информации ==
32
правки

Навигация