2013-11-12 4 views
3

В настоящее время я реализую простую нейронную сеть и алгоритм backprop в Python с numpy. Я уже протестировал свой метод backprop, используя центральные различия, и получившийся градиент равен.Весы нейронной сети взрываются в линейном блоке

Однако сеть не может аппроксимировать простую кривую синуса. В сети имеется один скрытый слой (100 нейронов) с функциями активации tanh и выходной уровень с функцией линейной активации. Каждый блок имеет также вход смещения. Обучение осуществляется с помощью простого градиентного спуска с частотой обучения 0,2.

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

EDIT: Я загрузил код Pastebin: http://pastebin.com/R7tviZUJ

+3

Это хороший, хорошо сформулированный вопрос. К сожалению, это не по теме для этого сайта. Если он закрывается, подумайте о том, как задать вопрос по http://stats.stackexchange.com/ – NPE

ответ

0

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

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

+0

. Перепродажа не будет проблемой, но моя сеть обеспечивает слишком большие результаты. Поэтому вместо значений в [-1, 1] я получаю значения, большие, чем 1e60. – Masala

1

Есть две вещи, которые вы можете попробовать, возможно, в комбинации:

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

  2. Используйте меньшие исходные веса. Это связано с первым элементом. Меньшая скорость обучения также исправит это.

+1

Я уже пробовал это. К сожалению, градиент «взрывается», тем не менее, только медленнее. Если шаги будут большими, то градиент должен сверкать? Но он становится все больше и больше. – Masala

0

Слишком большая скорость обучения может не совпадать, и даже DIVERGE - это точка.

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

Источник: мое понимание следующего видео (часы около 7:30). https://www.youtube.com/watch?v=Fn8qXpIcdnI&list=PLLH73N9cB21V_O2JqILVX557BST2cqJw4&index=10

0

У меня была аналогичная проблема (с другой библиотекой DL4J), даже в случае чрезвычайно простых целевых функций. In my case, the issue turned out to be the cost function. Когда я изменился с отрицательного логарифмического правдоподобия на Poisson или L2, я начал получать приличные результаты. (И мои результаты стали намного лучше, как только я добавил экспоненциальный спад скорости обучения.)

Смежные вопросы