Разберитесь с обобщенным дельта-правилом и добавьте его в код при реализации алгоритма.
Алгоритм обратного распространения ошибки
Инициализация.
Генерируем небольшие случайные веса.
Предъявление примеров обучения.
В сеть подаются образцы из обучающего множества (эпохи).
Прямой проход.
Вычисляем по слоям выходы нейронов. Сигнал до активации будет:
$ v_i^k = \sum_{i=0}^m ω_{ij}^k y_{j}^{k-1}$,
Выходной сигнал будет равен:
$ y_{i}^{k} = f_i(v_i^k)$, (1)
где $k$ – номер слоя, $i$ – номер нейрона в слое, $j$ – номер нейрона предыдущего слоя от которого пришел сигнал $y$, $f_i$ – функция активации i-го нейрона, $m$ – количество нейронов в слое, $y_{j}^{k-1}$ – выходной сигнал $j$-го нейрона на предыдущем $(k-1)$-м слое.
Если нейрон находится в первом скрытом слое, то для него в качестве выходов предыдущего слоя используются входы $x$.
Вычисляем ошибку (целевые значения есть только для выходного слоя):
$ e_i^{k} = Y_i - y_i^k$, (2)
где $k$ – номер слоя, $i$ – номер нейрона в выходном слое, $Y_i$ – ожидаемый выходной сигнал $i$-го нейрона.
Обратный проход.
Вычисляем оценку ошибки для остальных узлов сети:
$ \delta_i^k = \sum_{q=0}^m (\delta_q^{k+1} ω_{qi}^{k+1}) $ (3) где $m$ – количество слоев.
Изменяем веса сети(можно это делать сразу после вычисления ошибки, можно отдельным проходом слева направо):
$ω_{ij}^k(n+1) = ω_{ij}^k(n) + α (f'_i(v_i^k) \delta_i^k y_i^{k-1} ) $, (4) где $α$ – параметр скорости обучения ($< 0$), $f'_i()$ – дифференцирование по аргументу (реализуете функцию расчета производной для вашей функции активации и вызываете ее), $y_i^{k-1}$ – выходной сигнал нейрона предыдущего слоя, $v_i^k$ – сигнал до активации текущего нейрона (для последних двух переменных значения можно запомнить при первом прямом проходе или расчитывать сейчас).
Итерации.
Если не достигнут критерий останова, возвращаемся к п.2.
В качестве критерия останова может быть малое значение Евклидовой нормы вектора градиента или малое значение среднеквадратической ошибки или ее изменения.
Задание 🔧
Изменить код однослойной сети (2-й лабораторной), добавив слои. Если вы использовали list для весов и циклы для их обработки, заменить на numpy.array и скалярное произведение векторов.
Реализовать алгоритм обратного распространения ошибки.
Полносвязная сеть на два слоя: вход на 3 нейрона, выход 2 нейрона, функция активации – сигмоида.
В результате обучения, у сети должны быть следующие веса: $w_{11}$ = [1, 4, -3],$w_{12}$ = [5, -2, 4], $w_{13}$ = [2, -3, 1], $w_{21}$ = [2, 4, -2], $w_{22}$ = [-3, 2, 3].