Подтвердить что ты не робот

Как заставить виртуальные организмы учиться с помощью нейронных сетей?

Я делаю простую обучающую симуляцию, где на экране присутствуют несколько организмов. Они должны научиться питаться, используя свои простые нейронные сети. У них есть 4 нейрона, и каждый нейрон активирует движение в одном направлении (это 2D-плоскость, рассматриваемая с точки зрения птицы, поэтому есть только четыре направления, поэтому требуется четыре выхода). Их единственный вход - четыре "глаза". Только один глаз может быть активным в то время, и он в основном служит указателем на ближайший объект (зеленый блок питания или другой организм).

Таким образом, сеть можно представить так: enter image description here

И организм выглядит так (как в теории, так и в реальной симуляции, где они действительно красные блоки с их глазами):

enter image description here

И вот как все выглядит (это старая версия, где глаза все еще не работают, но похоже):

enter image description here

Теперь, когда я описал свою общую идею, позвольте мне понять суть проблемы...

  • Initialization | Во-первых, я создаю некоторые организмы и пищу. Затем все 16 весов в их нейронных сетях устанавливаются на случайные значения, например: weight = random.random() * threshold * 2. Порог - это глобальное значение, которое описывает, сколько вводить каждый нейрон для активации ( "огонь" ). Обычно он устанавливается в 1.

  • Обучение | По умолчанию веса в нейронных сетях снижаются на 1% на каждом шаге. Но, если какой-то организм действительно может что-то съесть, связь между последним активным входом и выходом усиливается.

Но есть большая проблема. Я думаю, что это не очень хороший подход, потому что они на самом деле ничего не узнают! Только те, у кого были первоначальные веса, случайным образом настроенные на то, чтобы быть полезными, получат шанс что-нибудь съесть, и тогда только у них будет усиление их веса! Как насчет тех, у кого были проблемы с подключением? Они просто умрут, а не учатся.

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

EDIT: Спасибо за ответ! Каждый из них был очень полезен, некоторые из них были более актуальны. Я решил использовать следующий подход:

  • Установите все веса в случайные числа.
  • Уменьшить вес с течением времени.
  • Иногда случайное увеличение или уменьшение веса. Чем успешнее устройство, тем меньше его веса будут изменены. NEW
  • Когда организм что-то ест, увеличьте вес между соответствующим входом и выходом.
4b9b3361

Ответ 1

Это похоже на проблемы с попыткой найти глобальный минимум, где легко застрять в локальном минимуме. Попробуйте найти глобальный минимум для профиля ниже: вы размещаете мяч в разных местах и ​​следуете ему, когда он спускается вниз по склону до минимума, но в зависимости от того, где вы его разместите, вы можете застрять в локальном провале. enter image description here

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

Ответ 2

Как упоминалось Микой Фишер, это похоже на проблемы с искусственной жизнью, так что вы можете смотреть на один из проспектов.

Это также похоже на то, что вы пытаетесь изобрести Укрепление обучения. Я бы рекомендовал прочитать Укрепление обучения: введение, которое свободно доступно в форме HTML на этом веб-сайте или приобретается в формате мертвого дерева. Пример кода и решения также представлены на этой странице.

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

Ответ 3

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

Позвольте моделировать это как горячее и холодное. В настоящее время все возвращается обратно "холодно", за исключением случаев, когда организм находится прямо на пищу. Таким образом, единственная возможность учиться - это случайная работа над едой. Вы можете затянуть этот цикл, чтобы обеспечить более постоянную обратную связь, если хотите. Обратная связь теплее, если есть движение к пище, холод, если отходит.

Теперь недостатком этого является то, что для чего-либо еще нет ввода. У вас есть методика обучения еду. Если вы хотите, чтобы ваши организмы находили баланс между голодом и чем-то другим (скажем, избеганием переполненности, спариванием и т.д.), Весь механизм, вероятно, необходимо передумать.

Ответ 4

Существует несколько алгоритмов, которые можно использовать для оптимизации весов в нейронной сети, наиболее распространенным из которых является алгоритм backpropogation.

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

Однако я думаю, что может возникнуть несколько проблем с дизайном вашей сети. Во-первых, если в любой момент активен только один глаз, было бы разумнее иметь только один вход node и отслеживать ориентацию другим способом (если я правильно понимаю). Просто, если есть только один активный глаз и четыре возможных действия (вперед, назад, влево, вправо), то входы от неактивных глаз (предположительно нуль) не будут иметь никакого отношения к решению вывода, на самом деле я подозреваю, что веса для каждого вход ко всем выходам будет сходиться, по существу дублируя одну и ту же функцию. Кроме того, он излишне увеличивает сложность сети и увеличивает время обучения. Во-вторых, вам не нужно, чтобы многие выходные нейроны представляли все возможные действия. Как вы там описали, ваш результат будет {1,0,0,0} = right, {0,1,0,0} = left и т.д. В зависимости от типа моделируемого нейрона это может быть сделано с 2 или даже 1 выходным нейроном. Если вы используете бинарный нейрон (каждый вывод равен 1 или 0), тогда сделайте что-то вроде {0,0} = back, {1,1} = forward, {1,0} = left, {0,1} = right, Используя нейронов сигмоидальной функции (выход может быть действительным числом от 0..1), вы можете сделать {0} = назад, {0.33} = left, {0.66} = right, {1} = вперед.

Ответ 5

Я вижу кучу потенциальных проблем.

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

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

Кроме того, если ваша сетевая диаграмма является точной, она, вероятно, не достаточна. Вы действительно хотите иметь скрытый слой (по крайней мере один) между датчиками и исполнительными механизмами, если вы используете что-то, что связано с обратным распространением. За этим высказыванием есть подробная математика, но это сводится к следующему: "Скрытые слои позволят хорошим решениям больше проблем".

Теперь обратите внимание, что многие мои комментарии говорят об архитектуре сети, но только в общих чертах, не сказав конкретно: "Это будет работать" или "это будет работать". Это потому, что я тоже не знаю (хотя я думаю, что предложение Kwatford по усилению обучения очень хорошее.) Иногда вы можете развить параметры сети, а также сетевые экземпляры. Одним из таких методов является нейроэволюция дополняющих топологий или "NEAT". Возможно, стоит посмотреть.

Ответ 6

Я думаю, что более сложный пример того, что вы делаете, представлен Polyworld.

Вы также можете увидеть презентацию Google Tech Talks с 2007 года: http://www.youtube.com/watch?v=_m97_kL4ox0

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