Как работает алгоритм обучения обратному распространению?

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

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

3 ответов


Back-propagation работает в логике, очень похожей на логику feed-forward. Разница заключается в направлении потока данных. На шаге подачи вперед у вас есть входы и выход, наблюдаемые из него. Вы можете распространять значения вперед на железнодорожный ближайшие нейроны.

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

пошаговая демонстрация шагов подачи вперед и назад-распространение можно найти здесь.


редактировать

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


высокоуровневое описание алгоритма backpropagation

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

Я попытаюсь объяснить, в терминах высокого уровня, все только что упомянутые концепции.

поверхность ошибка

Если у вас есть нейронная сеть с, скажем, N нейронов в выходном слое, это означает, что ваш выход действительно n-мерный вектор, и этот вектор живет в N-мерном пространстве (или на N-мерной поверхности.) Так же как и "правильный" результат, против которого вы тренируетесь. Как и разница между вашим "правильным" ответом и фактическим выходом.

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

градиентного спуска

С этой концепцией вы можете думать о тренировке нейронной сети как о процессе регулировки веса ваших нейронов так, чтобы функция ошибки была маленькой, идеально нулевой. Концептуально вы делаете это с помощью исчисления. Если бы у вас был только один выход и один вес, это было бы просто-возьмите несколько производных, которые сказали бы вам, в каком "направлении" двигаться, и сделайте корректировку в этом направлении.

но у вас нет один нейрон, у вас их N, и существенно больше входных Весов.

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

динамическое программирование

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

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

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

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


Я нашел следующий документ (Рохас) очень helpul, когда я пытался понять этот материал, даже если это большой PDF одной главы его книги.

http://page.mi.fu-berlin.de/rojas/neural/chapter/K7.pdf


Я попытаюсь объяснить, не слишком углубляясь в код или математику.

в принципе, вы вычисляете классификацию из нейронной сети и сравниваете с известным значением. Это дает вам ошибку на выходном узле.

теперь из выходного узла у нас есть N входящих ссылок из других узлов. Мы распространяем ошибку на последний слой перед выходным узлом. Затем распространите его на следующий слой (когда существует более одной восходящей линии связи, вы суммируете ошибки). И рекурсивно распространить на первое

чтобы настроить веса для обучения, для каждого узла вы в основном делаете следующее:

for each link in node.uplinks
  error = link.destination.error
  main = learningRate * error * node.output  // The amount of change is based on error, output, and the learning rate

  link.weight += main * alpha * momentum // adjust the weight based on the current desired change, alpha, and the "momentum" of the change.  

  link.momentum = main // Momentum is based on the last change. 

learningRate и alpha-это параметры, которые вы можете установить, чтобы настроить, как быстро он оттачивает решение против того, как (надеюсь) точно вы решаете его в конце.