Я аспирант, который пытается использовать алгоритм NEAT
в качестве контроллера для робота, и у меня возникают некоторые проблемы с точностью.Я работаю с Python 2.7 и для него и использую две NEAT
реализации Python:
-
NEAT
, который находится в этом репозитории GitHub: https://github.com/CodeReclaimers/neat-python Поиск в Google, этопохоже, что он использовался в некоторых проектах с succed. - Библиотека
multiNEAT
, разработанная Питером Червенски и Шейном Райаном: http://www.multineat.com/index.html., которая появляется на "официальной" веб-странице программного обеспечения NEAT
каталог программного обеспечения.
При тестировании первого я обнаружил, что моя программа быстро сходится к решению, но это решение недостаточно точное.В качестве недостатка точности я хочу сказать, что отклонение как минимум на 3-5% от медианы и среднего связано с «идеальным» решением в конце эволюции (в зависимости от сложности проблемы ошибка около 10%Это нормально для моих решений. Более того, я мог бы сказать, что я "никогда" не видел значение ошибки ниже 1% между решением, заданным NEAT
, и решением, которое является правильным).Я должен сказать, что я пробовал много разных комбинаций параметров и конфигураций (это старая проблема для меня).
В связи с этим я протестировал вторую библиотеку.Библиотека MultiNEAT
сходится быстрее и проще, чем предыдущая.(Я предполагаю, что это из-за реализации C ++ вместо чистого Python) Я получаю аналогичные результаты, но у меня все еще есть та же проблема;недостаток точности.Эта вторая библиотека также имеет различные параметры конфигурации, и я не нашел правильной комбинации их для улучшения производительности проблемы.
Мой вопрос:
Нормально ли иметь такое отсутствие точности?в NEAT
результатах?Он достигает хороших решений, но недостаточно хорош для управления роботизированной рукой, для чего я и хочу его использовать.
Я напишу, что делаю, если кто-то увидит какую-то концептуальную или техническую ошибку вспособ постановки задачи:
Чтобы упростить задачу, я покажу очень простой пример: мне нужно решить очень простую задачу, я хочу NN, который может вычислить следующую функцию: y = x^2
(аналогичные результаты можно найти с y=x^3
или y = x^2 + x^3
или аналогичными функциями)
Шаги, которые я выполняю при разработке программы:
- «Y» - это входные данные длясеть и «Х» выходы.Функциями активации нейронной сети являются сигмовидные функции.
- Я создаю набор данных из "n" выборок с заданными значениями "X" между
xmin = 0.0
и xmax = 10.0
Поскольку я использую сигмовидные функции, я делаю нормализацию значений "Y" и "X":
- "Y" линейно нормализуется между (Ymin, Ymax) и (-2.0,2.0) (входной диапазон сигмоида).
- «Х» нормируется линейно между (Xmin, Xmax) и (0.0, 1.0) (выходной диапазон сигмоида).
После создания набора данных я подразделяю на образец поезда (70% от общего количества), проверочный образец и тестовый образец (по 15% каждый).
На этом этапе я создаю популяцию людей для эволюции.Каждый человек из популяции оценивается во всех выборках поездов.Каждая позиция оценивается как:
eval_pos = xmax - abs (xtarget - xobtained)
А пригодность человека - это среднее значение всех позиций поезда (я выбрал минимумтоже, но это дает мне худшие результаты).
После всей оценки я проверяю лучшего полученного человека на тестовом образце.И вот где я получил эти «неточные значения».Более того, во время процесса оценки максимальное значение, где «abs (xtarget - xobtained) = 0» составляет никогда , получено.
Кроме того, я предполагаю, что то, как я манипулирую данными, является правильным, потому что я использую тот же набор данных для обучения нейронной сети в Keras
, и я получаю гораздо лучшие результаты, чем с NEAT (ошибка меньше 1%достижимо после 1000 эпох в слое с 5 нейронами).
На данный момент, я хотел бы знать, нормально ли то, что происходит, потому что я не должен использовать набор данных для разработки контроллера, этонеобходимо выучить «онлайн» и NEAT
выглядит как подходящее решение для моей проблемы.
Заранее спасибо.
РЕДАКТИРОВАННАЯ ПОЧТА:
Во-первых, спасибо за комментарий,Я отвечу на ваши вопросы ниже: *
Я использую алгоритм NEAT
.
Да, я провел экспериментыувеличение числа людей в популяции и количества поколений.Типичный график, который я получаю, выглядит следующим образом:
Хотя численность населения в этом примере не такая большая, яПолучили аналогичные результаты в экспериментах, увеличивая количество особей или количество поколений.Например, население 500 особей и 500 поколений.В этих экспериментах алгоритм he быстро сходится к решению, но, находясь там, лучшее решение застревает и больше не улучшается.
Как я уже упоминал в предыдущем посте, я пробовал несколько экспериментов.со многими различными конфигурациями параметров ... и графика более или менее похожа на предыдущую.
Кроме того, два других эксперимента, которые я попробовал, были: как только эволюция достигнет точки, где максимальное значение имедиана сходятся, я генерирую другую популяцию на основе этого генома с новыми параметрами конфигурации, где:
Эти два эксперимента не сработали, как я ожидал, и лучший геном изнаселение было таким же, как и у предыдущего населения.
Извините, но я не очень хорошо понимаю, что вы хотите сказать, "применяя ваши собственные взвешенные штрафы и вознаграждения в вашей функции пригодности".Что вы подразумеваете под включением штрафов за вес в функции фитнеса?
С уважением!