Поскольку этот вопрос будет довольно длинным, вы можете прочитать примечания к скале внизу или прочитать полный текст здесь.Я играю с генетическими алгоритмами и нейронными сетями (то есть использую генетические алгоритмы для развития нейронных сетей), но я сталкиваюсь с несколькими проблемами, в частности я нахожу эволюцию чрезвычайно медленной, чтобы сходиться и часто вообще не сходится к желаемым результатам!Тем не менее, поскольку существует очень много параметров (размер популяции, частота мутаций, частота кроссовера и т. Д.), Я не знаю, связано ли это с некоторыми ошибками в моем коде или из-за того, что я сделал плохой выбор из вышеупомянутых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
к текущему значению.
Что-то я делаю явно неправильно?Можете ли вы указать мне на любой учебник, обсуждающий, как оптимизировать использование генетического алгоритма с нейронными сетями (какой тип кроссовера работает лучше, какой размер популяции лучше, а также коэффициент мутации и т. Д.) Или может датьмне какие-нибудь советы?
Я создаю нейронную сеть, которая обучается генетическим алгоритмам, но ведет себя очень плохо, даже не имея возможности научиться умножать два числа.Некоторые примеры приведены в полном тексте.