Даю агентам «мозг», случайный шум и защиту от «везунчиков» (AI-Evolution #5)

Добро пожаловать на следующую страницу разработки моей песочницы. В прошлый раз я оставил статью с вопросом: «Писать ли нейросети или реализовать цепочку хищник-травоядное-трава?». И все-таки решил заняться тем, ради чего проект и затевался.

Поколение зеро.

Поэтому начал писать «мозг» агентам. Максимально простой, который на входе принимает информацию о том, что у агента есть перед собой в зоне видимости. И хотя теорию вычисления нейросетей я примерно знаю, с построением возникли некоторые вопросы.

Написал первый мозг: 3 входа, скрытый слой на 4 нейрона, 2 выхода. Теперь можно было избавиться от логики поиска ближайшего куста, которая была до этого. Сейчас агенты стали заметно глупее, пока что бьются в углы карты и в большинстве своем ничего не делают. Первое, на что обратил внимание с новым «мозгом»: если в зоне видимости нет ни одного куста, мозг «спит», никак не реагирует на окружение, и агенты просто движутся прямо. Такое поведение недопустимо. И что же я сделал? Просто добавил еще один нейрон на вход, который назвал «шумом». Каждый тик программы при передвижении туда передается случайное значение, которое заставляет агента повернуться — может быть, на пару градусов, а может сразу на 90. Теперь поведение неплохо имитирует поиск еды.

Добавил "шум". Пока также тупят, но хотя бы время от времени пытаются повернуться.

Теперь стоит рассказать про то, как мои водомерки будут эволюционировать. Есть много подходов для обучения ИИ, и описывать, какие есть и почему я выбрал именно свой — это материал для отдельного поста. Расскажу основное. Для механизма эволюции я выбрал алгоритм генетического отбора. В двух словах: создается несколько особей (в идеале не меньше сотни), они живут и умирают. Но как же происходит эволюция? Тут вступает в дело фитнес-функция. Как говаривал Чарльз наш Дарвин, «выживает сильнейший» — эта фраза всем знакома. Забавная историческая справка: на самом деле эту фразу придумал британский философ и социолог Герберт Спенсер в 1864 году, когда прочитал книгу Дарвина и нашел аналогию со своими экономическими теориями. Чарльзу Дарвину так понравилось это выражение, что он добавил его в 5-е издание своей книги «Происхождение видов» в 1869 году.

Отношения к текущей теме это не имеет, просто показался забавным такой своеобразный «круговорот идей». Но не все знают, что в оригинале фраза звучит как “Survival of the fittest”, что правильнее перевести как «выживает наиболее приспособленный». Поэтому и фитнес-фактор.

Даю агентам «мозг», случайный шум и защиту от «везунчиков» (AI-Evolution #5)

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

Я также рассказал другу про эту систему и услышал от него такой вопрос: «А что если выживут те особи, которым просто повезло народиться на поляне, богатой кустами?» Действительно, если так, то выживут особи, которым просто повезло, а не у которых лучше остальных развита реакция на окружение. Это является хорошим вопросом и недосмотром с моей стороны. Я почитал подробнее про алгоритмы генетического отбора и узнал, что существует довольно много способов решения этой проблемы. Подробно я их все объяснять не буду, тем более без практики я сам не до конца в них разобрался)

Я интуитивно пришел к способу (и планирую его использовать для мутаций), который называется «Эксплуатация и Исследование» (Exploitation and Exploration). Объясню подробнее: выпускаю на поле сотню агентов, они бегают, едят кусты, в конце цикла отбирают 10–20 лучших особей, и на основе их «мозга» создается потомство c небольшими мутациями (Exploitation). Но чего я не учел в теории — что им действительно может просто повезти при жизни, и их «мозг» не будет отражать лучшую приспособленность. Поэтому чем дальше от первого места особь берется для размножения, тем сильнее для нее добавляется мутация (Exploration). Получается, чтобы исключить заполнение генофонда «везунчиками», я каждое поколение планирую разбавлять популяцию «свежей кровью» в примерном соотношении 70 на 30.

Даю агентам «мозг», случайный шум и защиту от «везунчиков» (AI-Evolution #5)

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

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

Даю агентам «мозг», случайный шум и защиту от «везунчиков» (AI-Evolution #5)

При написании этой статьи ни одна водомерка не пострадала (хотя сотни из них стёрли свои пиксельные лбы о границы экрана). Жду вас в комментариях!