Как работает алгоритм обучения обратному распространению?
Я пытался узнать, как обратное распространение работает с нейронными сетями, но все же найти хорошее объяснение с менее техническим аспектом.
Как работает обратное распространение? Как он учится из предоставленного набора данных обучения? Мне придется закодировать это, но до тех пор мне нужно получить более глубокое понимание этого.
3 ответов
Back-propagation работает в логике, очень похожей на логику feed-forward. Разница заключается в направлении потока данных. На шаге подачи вперед у вас есть входы и выход, наблюдаемые из него. Вы можете распространять значения вперед на железнодорожный ближайшие нейроны.
на шаге обратного распространения вы не можете знать ошибки, возникшие в каждом нейроне, кроме ошибок в выходном слое. Вычисления ошибки выходного узла проста - вы можете взять разницу между выходом из нейрона и фактический объем производства для этого экземпляра в обучающий набор. Нейроны в скрытых слоях должны обновить свои ошибки. Таким образом, вы должны передать им значения ошибок. Из этих значений скрытые нейроны могут обновлять свои ошибки и другие параметры, используя взвешенную сумму ошибок из слоя впереди.
пошаговая демонстрация шагов подачи вперед и назад-распространение можно найти здесь.
редактировать
Если вы новичок в нейронных сетях, вы можете начать обучение с перцептрон, затем перейдите к NN, который на самом деле является многослойный персептрон.
высокоуровневое описание алгоритма backpropagation
Backpropagation пытается сделать градиентного спуска на поверхность ошибка нейронной сети, регулировка веса с динамическое программирование методы для того чтобы держать вычисления tractable.
Я попытаюсь объяснить, в терминах высокого уровня, все только что упомянутые концепции.
поверхность ошибка
Если у вас есть нейронная сеть с, скажем, N нейронов в выходном слое, это означает, что ваш выход действительно n-мерный вектор, и этот вектор живет в N-мерном пространстве (или на N-мерной поверхности.) Так же как и "правильный" результат, против которого вы тренируетесь. Как и разница между вашим "правильным" ответом и фактическим выходом.
эта разница, с соответствующим кондиционированием (особенно некоторым учетом абсолютных значений), является вектора ошибки, проживающего по поверхность ошибок.
градиентного спуска
С этой концепцией вы можете думать о тренировке нейронной сети как о процессе регулировки веса ваших нейронов так, чтобы функция ошибки была маленькой, идеально нулевой. Концептуально вы делаете это с помощью исчисления. Если бы у вас был только один выход и один вес, это было бы просто-возьмите несколько производных, которые сказали бы вам, в каком "направлении" двигаться, и сделайте корректировку в этом направлении.
но у вас нет один нейрон, у вас их N, и существенно больше входных Весов.
принцип тот же, за исключением того, что вместо использования исчисления на линиях, ищущих наклоны, которые вы можете представить в своей голове, уравнения становятся выражениями векторной алгебры, которые вы не можете легко представить. Термин градиент является многомерным аналогом уклон на линии, и спуск означает, что вы хотите двигаться вниз эта поверхность ошибки до ошибки небольшие.
динамическое программирование
есть еще одна проблема, хотя-если у вас есть более одного слоя, вы не можете легко увидеть изменение весов в некотором не выходном слое против фактического выхода.
динамическое программирование-это метод бухгалтерского учета, который помогает отслеживать, что происходит. На самом высоком уровне, если вы наивно пытаетесь сделать все это векторное исчисление, вы в конечном итоге вычисляете некоторые производные снова и снова. Современный метод обратного распространения ошибки алгоритм избегает некоторых из них, и случается так, что вы сначала обновляете выходной слой, затем второй до последнего слоя и т. д. Обновления распространяющейся в обратном направлении из вывода, отсюда и название.
Итак, если вам повезло, что вы подвергались градиентному спуску или векторному исчислению раньше, то, надеюсь, это щелкнуло.
полный вывод backpropagation можно сжать примерно в страницу жесткой символической математики, но трудно получить смысл алгоритма без описания высокого уровня. (По-моему, это просто пугает.) Если у вас нет хорошей обработки векторного исчисления, то, извините, выше, вероятно, не было полезно. Но чтобы заставить backpropagation действительно работать, не нужно понимать полный вывод.
Я нашел следующий документ (Рохас) очень helpul, когда я пытался понять этот материал, даже если это большой 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-это параметры, которые вы можете установить, чтобы настроить, как быстро он оттачивает решение против того, как (надеюсь) точно вы решаете его в конце.