Изменения

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

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

577 байт убрано, 20:18, 5 апреля 2019
Алгоритм
== Алгоритм ==
'''Алгоритм:'''
'''''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>\alpha</math> — коэффициент инерциальности для сглаживания резких скачков при перемещении по поверхности целевой функции
Реализация алгоритма на Python
def backward_propagate_error(network, expected):
for i in reversed(range(len(network))):
layer = network[i]
errors = list()
if i != len(network)-1:
for j in range(len(layer)):
error = 0.0
for neuron in network[i + 1]:
error += (neuron['weights'][j] * neuron['delta'])
errors.append(error)
else:
for j in range(len(layer)):
neuron = layer[j]
errors.append(expected[j] - neuron['output'])
for j in range(len(layer)):
neuron = layer[j]
neuron['delta'] = errors[j] * transfer_derivative(neuron['output'])
== Недостатки алгоритма ==
32
правки

Навигация