Я делаю простую обучающую симуляцию, где на экране присутствуют несколько организмов. Они должны научиться питаться, используя свои простые нейронные сети. У них есть 4 нейрона, и каждый нейрон активирует движение в одном направлении (это 2D-плоскость, рассматриваемая с точки зрения птицы, поэтому есть только четыре направления, поэтому требуется четыре выхода). Их единственный вход - четыре "глаза". Только один глаз может быть активным в то время, и он в основном служит указателем на ближайший объект (зеленый блок питания или другой организм).
Таким образом, сеть можно представить так:
И организм выглядит так (как в теории, так и в реальной симуляции, где они действительно красные блоки с их глазами):
И вот как все выглядит (это старая версия, где глаза все еще не работают, но похоже):
Теперь, когда я описал свою общую идею, позвольте мне понять суть проблемы...
-
Initialization | Во-первых, я создаю некоторые организмы и пищу. Затем все 16 весов в их нейронных сетях устанавливаются на случайные значения, например: weight = random.random() * threshold * 2. Порог - это глобальное значение, которое описывает, сколько вводить каждый нейрон для активации ( "огонь" ). Обычно он устанавливается в 1.
-
Обучение | По умолчанию веса в нейронных сетях снижаются на 1% на каждом шаге. Но, если какой-то организм действительно может что-то съесть, связь между последним активным входом и выходом усиливается.
Но есть большая проблема. Я думаю, что это не очень хороший подход, потому что они на самом деле ничего не узнают! Только те, у кого были первоначальные веса, случайным образом настроенные на то, чтобы быть полезными, получат шанс что-нибудь съесть, и тогда только у них будет усиление их веса! Как насчет тех, у кого были проблемы с подключением? Они просто умрут, а не учатся.
Как мне избежать этого? Единственное решение, которое приходит на ум, - это случайное увеличение/уменьшение веса, так что, в конечном итоге, кто-то получит правильную конфигурацию и что-нибудь случайно найдет. Но я считаю это решение очень грубым и уродливым. У вас есть идеи?
EDIT: Спасибо за ответ! Каждый из них был очень полезен, некоторые из них были более актуальны. Я решил использовать следующий подход:
- Установите все веса в случайные числа.
- Уменьшить вес с течением времени.
- Иногда случайное увеличение или уменьшение веса. Чем успешнее устройство, тем меньше его веса будут изменены. NEW
- Когда организм что-то ест, увеличьте вес между соответствующим входом и выходом.