После внедрения NEAT в Unity несколько недель назад я попытался придумать способы улучшить его производительность.

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

Сначала я не придал этому большого значения. Благодаря методу видообразования, который использует NEAT, одна популяция способна осуществлять поиск в домене во многих различных направлениях. Это означает, что опыт, собранный одним видом, исследующим область домена, не будет применим к геномам за пределами этого вида. Однако именно тогда у меня возникла мысль: а что, если каждый вид будет вести отдельный список переживаний?

Я немедленно приступил к проверке своих идей.

Среда тестирования

Окружение настроено так:

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

Агент выглядит так.

На вход агент получает (нормализованно):

Разница между позицией цели и позицией агента

Должность агента

Скорость агента по оси Y

Независимо от того, находится ли агент на земле и может ли он прыгать.

Результат 16 лучей по кругу вокруг агента, которые возвращают расстояние до ближайшей платформы, на которую он попал.

На выходе агент выдает:

Один выход для определения перемещения влево (‹0,5) или вправо (>0,5)

Один выход для того, прыгать или нет (>0,5)

Конфигурация

25% каждого поколения было создано путем бесполого размножения. Часть поколения, созданная с помощью скрещивания, имеет 35% вероятность мутации. Два лучших генома каждого вида остались неизменными, и вероятность межвидового скрещивания составляла 5%. В начальном поколении было 2000 геномов, чтобы гарантировать, что популяция изначально имела достаточно членов, способных подняться на первую платформу, но последующие поколения имели только 500 геномов. Популяция считается неудавшейся, если она не находит ни одного агента, достигшего звезды в течение 500 поколений.

Hindsight Experience Replay потребовалось немного доработать для работы с NEAT, но в конечном итоге я остановился на стратегии, которая выглядела следующим образом:

Примеры целей/опыта (последняя платформа, на которой находился геном, чтобы убедиться, что цели не зависли в воздухе) из каждого генома в конце поколения, которые соответствуют следующим критериям:

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

Цели добавляются к видам каждого генома, так что каждый вид поддерживает отдельный список целей.

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

Приспособленность рассчитывается по следующим двум значениям:

(начальное_расстояние-ближайшее_расстояние)/начальное_расстояние

наградить агента за приближение к цели

(начальное_расстояние-конечное_расстояние)/конечное_расстояние

чтобы вознаградить агента за то, что он остался близок к цели.

Если агент остается внизу слишком долго, он удаляется из симуляции и получает штраф. В основном это делается для ускорения оценки.

В случае NEAT с HER вознаграждение кубизируется, чтобы усилить различия между хорошими и плохими решениями. Эти значения могут быть отрицательными, если агент уходит от цели.

Полученные результаты

Стандартный NEAT с вознаграждением только за расстояние плохо справился с этой задачей: шесть раз из десяти он потерпел неудачу. NEAT чрезвычайно полагается на ряд случайных мутаций на ранних этапах, чтобы найти правильный путь и решить проблему. Однако, когда ему это не удается, он застревает на локальном минимуме, где поднимается по платформам слева, но не может продвинуться дальше.

С другой стороны, NEAT с HER работает достаточно хорошо. Он решает проблему со средним значением 149 поколений (стандартное отклонение: 90) и ни разу не дает сбоя, хотя наихудшая попытка потребовала 415 поколений. Интересно, что NEAT с HER разворачивался как поиск новинки: поскольку предыдущие образцы становились все реже из-за метода назначения, агенты были вынуждены исследовать новые и труднодоступные области окружающей среды. Важно отметить, что целевая цель, казалось, была обнаружена случайно, хотя дополнительная подготовка могла бы научить агентов тому, как достигать любой точки окружающей среды, не запоминая последовательность шагов.

Однако важно не преувеличивать это достижение. Используя функцию вознаграждения, которая вознаграждает агентов на основе их значения y, стандартный NEAT решает эту проблему со средним значением 94 поколений (Stddev: 36) и меньшим временем оценки, но однажды происходит сбой.

Выводы

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