Как работает алгоритм обучения обратному распространению? - PullRequest
7 голосов
/ 26 января 2012

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

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

Ответы [ 3 ]

16 голосов
/ 26 января 2012

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

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

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


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

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

10 голосов
/ 27 января 2012

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

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

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

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

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

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

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

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

Но у вас нет одного нейрона, у вас их N и значительно больше входных весов.

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

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

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

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

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

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


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

http://page.mi.fu -berlin.de / Rojas / нейронная / глава / K7.pdf

2 голосов
/ 26 января 2012

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

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

Теперь с выходного узла у нас есть 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 - это параметры, которые вы можете настроить, чтобы настроить, насколько быстро он будет оттачиваться в решении, и насколько (надеюсь) вы точно его решите в конце.

...