Изменения

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

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

610 байт добавлено, 19:32, 4 сентября 2022
м
rollbackEdits.php mass rollback
'''Метод обратного распространения ошибок''' (англ. ''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> {{---}} действительный ответ сети.
:<math>o_j = \varphi(\text{net}_j) = \varphi\left(\sum_{k=1}^n w_{kj}o_k\right).</math>
Входные значения <math>\text{net}_j</math> нейрона {{---}} это взвешенная сумма выходных значений <math>o_k</math> предыдущих нейронов. Если нейрон в первом слове слое после входного слоя, то <math>o_k</math> входного слоя {{---}} это просто входные значения <math>x_k</math> сети. Количество входных значений нейрона <math>n</math>. Переменная <math>w_{kj}</math> обозначает вес на ребре между нейроном <math>k</math> предыдущего слоя и нейроном <math>j</math> текущего слоя.
Функция активации <math>\varphi</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>
 
== Алгоритм ==
 
* <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, в области, где а производная сжимающей активирующей функции будет очень мала. Так как посылаемая обратно в процессе обучения ошибка пропорциональна этой производной, то процесс обучения может практически замереть.
=== Локальные минимумы ===
Градиентный спуск с обратным распространением ошибок гарантирует нахождение только локального минимума функции; также, возникают проблемы с пересечением плато на поверхности функции ошибки.
== Алгоритм Примечания=='''Алгоритм*[https:''''''''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<habr.com/ru/post/math># Повторить <math>steps<198268/math> раз:Алгоритм обучения многослойной нейронной сети методом обратного распространения ошибки]#: .Для всех d от 1 до m*[https:## Подать <math>\{x_i^d\}</math> на вход сети и подсчитать выходы <math>o_i</math> каждого узлаfrnsys.## Для всех <math>k \in Outputs<com/ai_notes/math>##: <math>\delta _k = o_k(1 - o_k)(t_k - o_k)<machine_learning/math>neural_nets.html Neural Nets]## Для каждого уровня l, начиная с предпоследнего:##: Для каждого узла j уровня l вычислить##*[http: <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>cs231n.##: <math>w_{i,j}(n) = w_{i,j}(n-1) + \Delta w_{i,j}(n)</math>stanford.# Выдать значения <math>w_{ij}<edu/math>. где <math>\alpha<slides/math> — коэффициент инерциальности для сглаживания резких скачков при перемещении по поверхности целевой функции  ==Заметки==<references group="заметка" 2018/>cs231n_2018_lecture04.pdf Understanding backpropagation]
==См. также==
*[[:Нейронные_сети,_перцептрон|Нейронные_сетиНейронные сети,_перцептронперцептрон]]
*[[:Стохастический градиентный спуск|Стохастический градиентный спуск]]
*[[:Настройка_глубокой_сети|Настройка глубокой сети]]
*[[:Практики_реализации_нейронных_сетей|Практики реализации нейронных сетей]]
== Источники информации ==
1632
правки

Навигация