Нейронная сеть с вопросом генетического алгоритма - PullRequest
0 голосов
/ 10 сентября 2011

Поскольку этот вопрос будет довольно длинным, вы можете прочитать примечания к скале внизу или прочитать полный текст здесь.Я играю с генетическими алгоритмами и нейронными сетями (то есть использую генетические алгоритмы для развития нейронных сетей), но я сталкиваюсь с несколькими проблемами, в частности я нахожу эволюцию чрезвычайно медленной, чтобы сходиться и часто вообще не сходится к желаемым результатам!Тем не менее, поскольку существует очень много параметров (размер популяции, частота мутаций, частота кроссовера и т. Д.), Я не знаю, связано ли это с некоторыми ошибками в моем коде или из-за того, что я сделал плохой выбор из вышеупомянутыхparameteres.Или, может быть, я ожидаю результатов слишком рано, когда это нормально для сетей такого типа, чтобы быть такими медленными.

Теперь несколько примеров: Обучаем сеть, чтобы получить сумму двух чисел, предоставляя обучающий набор с 20примеры и генетический алгоритм со следующими настройками:

#define MUTATION_RATE       0.5
#define MAX_PERTURBATION    1
#define POP_SIZE            500
#define CROSSOVER_RATE      0.7
#define NUM_TOUR            35
#define ELITISM             4

Где NUM_TOUR - количество выбранных для участия в турнире лиц, а ЭЛИТИЗМ - количество копий, которые я делаю из лучшего человека текущего поколения для распространенияэто к следующему.С этими настройками и сетью всего с 2 входными и 1 выходными нейронами я могу обучить ее, чтобы довольно точно дать сумму двух чисел после 2500 поколений (что мне кажется чертовски много, но что угодно), как:

2 + 2 = 4.01

Или

1 + 5 = 5.98

Используя те же настройки и сеть с 2 входами, 1 выходом и 1 скрытым слоем из 2 нейронов, я пытаюсь заставить его научитьсяумножить два числа: после 2500 поколений у меня не получится ни одного хорошего результата (например: 0 * 10 = 3.7).

Я не пробовал никаких других операций, так как думаю, что если я не смогу прийтис сетью, которая учится умножать, что-то не так с моим кодом или моими настройками.Как я уже сказал, я использую выбор турнира, кроссовер реализуется путем выбора каждого гена с равной вероятностью от одного из двух родителей, а мутация - путем добавления или вычитания значения от 0 до MAX_PERTURBATION к текущему значению.

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

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

Ответы [ 4 ]

3 голосов
/ 13 сентября 2011

Я провел много исследований по эволюционному проектированию нейронных сетей, и я хотел бы дать несколько советов.

Начните с самого простого алгоритма, а не с GA, который имеет много параметров: начните со случайного поиска, имитируемого отжига и стратегий развития, которые обычно работают намного лучше GA, когда кроссовер приводит к разрушительным эффектам! В NN дизайн кроссовер не всегда эффективен, потому что он имеет тенденцию «разрушать» шаблоны обучения. Вы можете реализовать ES с несколькими строками кода, и имитация отжига уже реализована в MATLAB. НЕ используйте GA только потому, что он уже реализован в MATLAB. По крайней мере, будь проще, убери кроссовер, элитарность и необычные механизмы выбора.

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

1 голос
/ 10 сентября 2011

Не эксперт по нейронным сетям, но в моей памяти поведение нейрона линейно, то есть выход является суммой входных данных, умноженных на коэффициенты.Генетический алгоритм хочет найти эти коэффициенты.Учитывая только два нейрона, я не думаю, что вы можете вычислить умножение, так как входные операнды никогда не умножатся вместе во время вычисления, если вы не подключите выход нейрона к коэффициенту нейрона.

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

0 голосов
/ 26 ноября 2015

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

0 голосов
/ 10 сентября 2011

Ваш размер турнира, в 35, очень высокий.С таким большим размером турнира на 500 человек, вы фактически будете уничтожать все свое разнообразие в каждом поколении.7 будет довольно типичным размером турнира, с 3-11 типичным диапазоном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...