2013-06-07 3 views
2

Я построил простую рекуррентную нейронную сеть, которая предсказывает очень шумный сигнал из серии из 15 входов (статистические пробоя сигнала).Pybrain: Пользовательские функции ошибок/производительности?

Из того, что я могу сказать в источнике пирамина (pybrain \ supervined \ trainers \ backprop.py), функция ошибки жестко запрограммирована в функции _calcDerivs как сумма квадратов ошибок, деленная на общие цели (MSE). Разделение происходит в функции train.

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

Мой вопрос: Есть ли best Способ изменения функции производительности по умолчанию? Является ли весь код функции производительности в _calcDerivs или я что-то упускаю?

ответ

2

ОК, поэтому я нашел источник своей проблемы и возможное решение, albiet не один в PyBrain.

Источником моей проблемы является производная от моей пользовательской стоимости (производительность a.k.a и т. Д.) ... или ее отсутствие. Функция затрат используются, как представляется:

0.5 * (error ** 2) # 1/2 the average square error 

И производное это просто:

error 

Поскольку я реализую более сложную функцию ошибки с более сложной производной, и я hadn» t изменил hardcoded производную (везде, где она должна была идти), градиентный спуск не смог предпринять разумные шаги по градиенту ошибки.

Решение, которое я нашел, состояло в использовании neurolab, что упрощает реализацию функций пользовательской ошибки модульным способом. Хотя в основных файлах потребовалось некоторое взломать, мне нужно было изменить примерно три или четыре строки кода ядра. (В частности, я изменил ff_grad_step в tool.py и в последней строке класса Train в core.py. Я внедрил свою собственную функцию затрат, создав новую функцию error.py и подключив ее к сети net.py.)

Я надеюсь, что это было не слишком специфично для моей собственной проблемы для кого-то другого в подобной ситуации, но это была огромная боль в заднице для чего-то, что может быть настолько критично в изучении нейронной сети!