Лабы

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

Читаем cтр. 219 – 241 у Хайкина. Или кратко стр. 241 – 243.

Или здесь, если нужна математика попроще.

Здесь есть наглядные картинки.

Разберитесь с обобщенным дельта-правилом и добавьте его в код при реализации алгоритма.

Алгоритм обратного распространения ошибки

  • Инициализация. Генерируем небольшие случайные веса.
  • Предъявление примеров обучения. В сеть подаются образцы из обучающего множества (эпохи).
  • Прямой проход. Вычисляем по слоям выходы нейронов. Сигнал до активации будет:
    $ 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].
  • При сдаче работы ответить на вопросы (по теории).