Нейронная сеть с вопросом генетического алгоритма
Поскольку этот вопрос будет длиться довольно долго, вы можете прочитать примечания к скале внизу или прочитать полный текст здесь. Я играю с генетическими алгоритмами и нейронными сетями (то есть использую генетические алгоритмы для развития нейронных сетей), но я сталкиваюсь с несколькими проблемами, в частности я нахожу эволюцию чрезвычайно медленной, чтобы сходиться и часто вообще не сходится к желаемым результатам! Тем не менее, поскольку существует так много настроек (размер популяции, частота мутаций, частота кроссовера и т. Д.), Я не знаю, связано ли это с некоторыми ошибками в моем коде или из-за того, что я сделал плохой выбор из вышеупомянутых параметров, Или, может быть, я ожидаю результатов слишком рано, когда это нормально для такого рода сетей, которые будут такими медленными.
Теперь несколько примеров: Обучение сети для суммирования двух чисел, предоставление обучающего набора из 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 - количество человек, выбранных для участия в турнире, а ELITISM - количество копий, которые я делаю из лучшего человека текущего поколения, чтобы передать его следующему. С этими настройками и сетью всего с 2 входными и 1 выходными нейронами я могу обучить ее, чтобы довольно точно дать сумму двух чисел после 2500 поколений (что мне кажется чертовски много, но что угодно), как:
2 + 2 = 4.01
или же
1 + 5 = 5.98
Используя те же настройки и сеть с 2 входами, 1 выходом и 1 скрытым слоем из 2 нейронов, я пытаюсь научить умножать два числа: после 2500 поколений у меня не получается почти хорошего результата (например: 0 * 10 = 3.7
).
Я не пробовал никаких других операций, так как полагаю, что если я не могу найти сеть, которая учится умножать, то либо с моим кодом, либо с моими настройками что-то не так. Как я уже сказал, я использую выбор турниров, кроссовер реализуется путем выбора каждого гена с равной вероятностью от одного из двух родителей и мутации путем добавления или вычитания значения от 0 до MAX_PERTURBATION к текущему значению.
Что-то я делаю явно неправильно? Можете ли вы указать мне на любой учебник, обсуждающий, как оптимизировать использование генетического алгоритма с нейронными сетями (какой тип кроссовера работает лучше, какой размер популяции лучше, а также коэффициент мутации и т. Д.) Или может дать мне какие-нибудь советы?
Клифф отмечает, что я создаю нейронную сеть, которая обучается с помощью генетических алгоритмов, но ведет себя очень плохо, даже не способна научиться умножать два числа. Некоторые примеры приведены в полном тексте: я ищу что-нибудь, что может помочь мне оптимизировать это или заставить меня понять, что, возможно, что-то не так в моем коде.
Я загрузил свой код (C++) здесь: http://www.megaupload.com/?d=NW8FPZ6M Я знаю, что, скорее всего, никто не собирается смотреть на это, но стоит попробовать
4 ответа
Я провел много исследований по эволюционному дизайну нейронных сетей, и я хотел бы дать несколько советов.
Начните с самого простого алгоритма, а не с GA, который имеет много параметров: начните со случайного поиска, имитируемого отжига и стратегий развития, которые обычно работают намного лучше GA, когда кроссовер приводит к разрушительным эффектам! В NN дизайн кроссовер не всегда эффективен, потому что он имеет тенденцию "разрушать" шаблоны обучения. Вы можете реализовать ES с несколькими строками кода, и имитация отжига уже реализована в MATLAB. НЕ используйте GA только потому, что он уже реализован в MATLAB. По крайней мере, будь проще, убери кроссовер, элитарность и необычные механизмы выбора.
Более того, вы должны всегда сравнивать свой алгоритм с хорошим алгоритмом обучения нейронной сети, чтобы вы знали, когда проблема слишком сложна (или почти невозможна) для конкретной нейронной сети.
Не эксперт в нейронных сетях, но в моей памяти поведение нейрона линейно, то есть выход является суммой входных данных, умноженных на коэффициенты. Генетический алгоритм хочет найти эти коэффициенты. Учитывая только два нейрона, я не думаю, что вы можете вычислить умножение, так как входные операнды никогда не умножатся вместе во время вычисления, если вы не подключите выход нейрона к коэффициенту нейрона.
Моя интуиция подсказывает мне, что для этого нужно больше нейронов, чтобы виртуальный мозг приблизил умножение к нескольким линейным операциям. Возможно, вам также придется ввести нелинейную операцию в вашем виртуальном нейроне, такую как ограничение выходного значения.
Я думаю, что нейронная сеть слишком мала. Попробуйте добавить больше нейронов в скрытый слой, а также попробуйте добавить еще один слой.
Ваш размер турнира, в 35, очень высок. С таким большим размером турнира на 500 человек, вы фактически будете уничтожать все свое разнообразие в каждом поколении. 7 будет довольно типичным размером турнира, с 3-11 типичным диапазоном.