32
правки
Изменения
→Алгоритм
'''Метод обратного распространения ошибок''' (англ. ''backpropagation'') {{---}} метод вычисления градиента, который используется при обновлении весов в [[Нейронные_сети,_перцептрон|нейронной сети]].
==Обучение как задача оптимизации==
]]
:<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>
== Алгоритм ==
'''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]
==См. также==
*[[:Нейронные_сети,_перцептрон|Нейронные_сетиНейронные сети,_перцептронперцептрон]]
*[[:Стохастический градиентный спуск|Стохастический градиентный спуск]]
*[[:Настройка_глубокой_сети|Настройка глубокой сети]]
*[[:Практики_реализации_нейронных_сетей|Практики реализации нейронных сетей]]
== Источники информации ==