Нейронные сети - обратное распространение - PullRequest
2 голосов
/ 29 января 2012

Только один быстрый вопрос и некоторые пояснения, которые мне нужны в отношении нейронных сетей и обратного распространения для учебных примеров.

Если бы кто-нибудь мог основать свой пример на чем-то похожем на это, было бы здорово, так как мне не хватает простых для понимания примеров.

Допустим, для обучения необходимо три цвета: красный, синий и зеленый, где мы представляем красный цвет, как показано ниже, используя нормализацию, поскольку они являются номинальными значениями.

red = 0.4
blue = 0.7
green = 1.0

Есть 3 входных слоя, 2 скрытых и 1 выходной.

Я предполагаю, что предоставлены случайные веса от -1 до 1, и они умножаются на каждый узел входного слоя, пропускающий его через слой и дающий выходное значение сети 0,562, которое сохраняется вместе с экземпляром. Будет ли это выходное значение храниться вместе со всеми тремя экземплярами? Как тренировка происходит так, что ошибка вычисляется, а затем распространяется обратно? Это то, что действительно смущает меня.

Поскольку мне нужно закодировать этот алгоритм, было бы здорово сначала получить лучшее понимание.

1 Ответ

10 голосов
/ 01 февраля 2012

Хотя я не совсем понимаю ваш пример, вопрос обратного распространения довольно распространен.В простейшем случае со строго многослойной прямой связью и одним выходным узлом:

Сначала необходимо распространить информацию вперед.Похоже, что вы уже можете иметь это, однако убедитесь, что вы отслеживаете, какое значение в каждом узле было после функции сжатия, давайте вызовем это 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] и т. Д., Слоев.

((Примечание: это предполагает функцию сдавления сигмовидной кишки))

Надеюсь, это поможет.Дополнительная информация может быть найдена во многих местах.Я учился у машинного обучения Тома Митчелла.Имеет хороший раздел псевдокода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...