Хотя я не совсем понимаю ваш пример, вопрос обратного распространения довольно распространен.В простейшем случае со строго многослойной прямой связью и одним выходным узлом:
Сначала необходимо распространить информацию вперед.Похоже, что вы уже можете иметь это, однако убедитесь, что вы отслеживаете, какое значение в каждом узле было после функции сжатия, давайте вызовем это o и сохраните единицу для каждого узла.
После прямого распространениясделано, для обратного распространения необходимо рассчитать ошибку.В этом разница между тем, что ожидалось, и тем, что было дано.Кроме того, умножьте это на производную, чтобы указать направление для обновления позже (получение производной сложно, но использование очень просто).
Error[output] = (Expected - Actual) * o(1 - o)
Тогдараспространять ошибку на каждом узле в обратном направлении по сети.Это дает оценку «ответственности» каждого узла за ошибку.Таким образом, ошибка на каждом узле - это ошибка на всех узлах в следующем слое, взвешенных по весам на каждом канале.Опять же, мы умножаем на производную, чтобы у нас было направление.
Error[hidden] = Sum (Error[output]*weight[hiddenToOutput]) * o(1 - o)
Повторите это для каждого слоя ссылок (вход в скрытый, скрытый скрытый, скрытый для вывода) при необходимости.
Наконец, обучение происходит путем обновления весов в ссылках.Для этого мы объединяем всю информацию, необходимую для получения окончательного обновления.
Weight[hiddenToOutput] = weight[hiddenToOutput] + learningRate * error[output] * input
Где input - это значение, которое вошло в ссылку (то есть 'o' из предыдущегослой, и ошибка из следующего слоя), а learningRate - это небольшое число (например, 0,01), чтобы ограничить размер наших обновлений.Аналогичное вычисление выполняется для веса [inputToHidden] и т. Д., Слоев.
((Примечание: это предполагает функцию сдавления сигмовидной кишки))
Надеюсь, это поможет.Дополнительная информация может быть найдена во многих местах.Я учился у машинного обучения Тома Митчелла.Имеет хороший раздел псевдокода.