Какую функцию активации использовать или какие изменения вносить, когда нейронная сеть дает такой же результат при регрессии с PyBrain?

У меня есть нейронная сеть с одним входом, тремя скрытыми нейронами и одним выходом. У меня есть 720 входных и соответствующих целевых значений, 540 для обучения, 180 для тестирования. Когда я обучаю свою сеть с помощью функции Logistic Sigmoid или Tan Sigmoid, я получаю одинаковые выходные данные во время тестирования, то есть я получаю одно и то же число для всех 180 выходных значений. Когда я использую функцию линейной активации, я получаю NaN, потому что, по-видимому, значение становится слишком большим.

Можно ли в таком случае использовать какую-либо функцию активации? Или какие-то улучшения нужно сделать? При необходимости я могу обновить вопрос, указав детали и код.


person Vivek Mehta    schedule 22.07.2014    source источник
comment
Можете ли вы опубликовать график ваших пар ввода / вывода?   -  person Danica    schedule 22.07.2014
comment
@Dougal: Вы имеете в виду, сюжет против ввода против целевого? Или отдельные графики вложений и целей?   -  person Vivek Mehta    schedule 23.07.2014
comment
Ввод против цели. Каждый из них равен 1d, не так ли?   -  person Danica    schedule 23.07.2014
comment
@ Дугал: Да. Выложу сюжет.   -  person Vivek Mehta    schedule 23.07.2014
comment
@Dougal: Так как мне нужно было 10 очков репутации, чтобы опубликовать фото, я не мог сделать это здесь. Вот ссылка на график (ось x - входные данные, ось y - цели): s1369.photobucket.com/user/vivekmehta2612/media/   -  person Vivek Mehta    schedule 23.07.2014


Ответы (2)


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

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

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

person Newmu    schedule 23.07.2014
comment
Спасибо за ответ, @Newmu. Не могли бы вы уточнить, как я могу выполнить масштабирование / повторное центрирование с помощью Python или Pybrain? - person Vivek Mehta; 23.07.2014
comment
Как только я получу результаты, как преобразовать их в предыдущий масштаб? - person Vivek Mehta; 23.07.2014

Ньюму прав в том, что проблема, вероятно, заключается в масштабировании; вам необходимо масштабировать свои входные данные, чтобы они находились в допустимом диапазоне. (Стандартизация к нулевому среднему, единичная дисперсия, как они предполагают, однако, не лучший выбор, поскольку это означает, что примерно треть ваших данных будут нравиться за пределами [-1, 1] ....) Я не знаю насчет pybrain, но в scikit-learn вам понадобится _1 _ .

Но также в комментариях вы сказали, что ваш набор данных выглядит так:

набор данных

где горизонтальная ось - входы, вертикальная - цели. Итак, когда вы видите ввод 200, у вас есть один обучающий пример, говорящий, что это 80, и другой, говорящий, что это 320; что ты хочешь сказать тогда? «Оптимальная» нейронная сеть (которой может быть трудно достичь) предсказывала бы 200 или около того.

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

person Danica    schedule 23.07.2014
comment
Спасибо за ответ, @Dougal. Фактически, ось X - это цели, а ось Y - входные данные. Я допустил ошибку при вводе текста и сейчас не могу редактировать комментарий. Можете ли вы предложить мне, что именно я должен сделать, чтобы получить близкие выходные значения? Я относительно новичок в ИНС и поэтому не очень разбираюсь в этой теме. - person Vivek Mehta; 23.07.2014