Точность результата алгоритма NEAT - PullRequest
0 голосов
/ 04 декабря 2018

Я аспирант, который пытается использовать алгоритм NEAT в качестве контроллера для робота, и у меня возникают некоторые проблемы с точностью.Я работаю с Python 2.7 и для него и использую две NEAT реализации Python:

  1. NEAT, который находится в этом репозитории GitHub: https://github.com/CodeReclaimers/neat-python Поиск в Google, этопохоже, что он использовался в некоторых проектах с succed.
  2. Библиотека 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 или аналогичными функциями)

Шаги, которые я выполняю при разработке программы:

  1. «Y» - это входные данные длясеть и «Х» выходы.Функциями активации нейронной сети являются сигмовидные функции.
  2. Я создаю набор данных из "n" выборок с заданными значениями "X" между xmin = 0.0 и xmax = 10.0
  3. Поскольку я использую сигмовидные функции, я делаю нормализацию значений "Y" и "X":

    • "Y" линейно нормализуется между (Ymin, Ymax) и (-2.0,2.0) (входной диапазон сигмоида).
    • «Х» нормируется линейно между (Xmin, Xmax) и (0.0, 1.0) (выходной диапазон сигмоида).
  4. После создания набора данных я подразделяю на образец поезда (70% от общего количества), проверочный образец и тестовый образец (по 15% каждый).

  5. На этом этапе я создаю популяцию людей для эволюции.Каждый человек из популяции оценивается во всех выборках поездов.Каждая позиция оценивается как:

    eval_pos = xmax - abs (xtarget - xobtained)

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

  6. После всей оценки я проверяю лучшего полученного человека на тестовом образце.И вот где я получил эти «неточные значения».Более того, во время процесса оценки максимальное значение, где «abs (xtarget - xobtained) = 0» составляет никогда , получено.

Кроме того, я предполагаю, что то, как я манипулирую данными, является правильным, потому что я использую тот же набор данных для обучения нейронной сети в Keras, и я получаю гораздо лучшие результаты, чем с NEAT (ошибка меньше 1%достижимо после 1000 эпох в слое с 5 нейронами).

На данный момент, я хотел бы знать, нормально ли то, что происходит, потому что я не должен использовать набор данных для разработки контроллера, этонеобходимо выучить «онлайн» и NEAT выглядит как подходящее решение для моей проблемы.

Заранее спасибо.

РЕДАКТИРОВАННАЯ ПОЧТА:

Во-первых, спасибо за комментарий,Я отвечу на ваши вопросы ниже: *

  1. Я использую алгоритм NEAT.

  2. Да, я провел экспериментыувеличение числа людей в популяции и количества поколений.Типичный график, который я получаю, выглядит следующим образом:

Evolution after 50 generations with a population of 150 individuals

Хотя численность населения в этом примере не такая большая, яПолучили аналогичные результаты в экспериментах, увеличивая количество особей или количество поколений.Например, население 500 особей и 500 поколений.В этих экспериментах алгоритм he быстро сходится к решению, но, находясь там, лучшее решение застревает и больше не улучшается.

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

Кроме того, два других эксперимента, которые я попробовал, были: как только эволюция достигнет точки, где максимальное значение имедиана сходятся, я генерирую другую популяцию на основе этого генома с новыми параметрами конфигурации, где:

  • Параметры мутации изменяются с высокой вероятностью мутации (вес и вероятность нейрона), чтобы найтиновые решения с целью «перепрыгнуть» из текущего генома в другой.

    • Мутация нейрона уменьшена до 0, а вес "mutation probability" увеличен для "mutate weight" вболее низкий диапазон, чтобы получить немного модификаций с целью лучшей настройкивесов.(пытаясь получить «подобную» функциональность как у backprop. внося незначительные изменения в вес) *

Эти два эксперимента не сработали, как я ожидал, и лучший геном изнаселение было таким же, как и у предыдущего населения.

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

С уважением!

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

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

0 голосов
/ 12 декабря 2018

Отказ от ответственности: я внес вклад в эти библиотеки.

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

Еще одна вещь, о которой стоит подумать, - это применять ваши собственные взвешенные штрафы и вознаграждения в вашей функции фитнеса, чтобы все, что не подходит слишком близко, "убивалось" быстрее и правильный геном находился быстрее.Следует отметить, что Нит использует функцию фитнеса для обучения, в отличие от градиентного спуска, поэтому он не будет сходиться одинаково, и, возможно, вам придется тренироваться немного дольше.

Последний вопрос, используете ли выаккуратный или hyperneat algo от multineat?

...