C# — Моделирование «разумной» жизни на базе нейронных сетей Программирование*, Ненормальное программирование*, Машинное обучение*, Занимательные задачки, C#* Данная статья посвящена исследованию возможностей нейронных сетей при их использовании в качестве основы для индивидуального разума моделируемого объекта.
Цель: показать, способна ли нейронная сеть (или ее данная реализация) воспринимать «окружающий» мир, самостоятельно обучаться и на основе собственного опыта принимать решения, которые можно считать относительно разумными.
Задачи
Описать и построить информационную модель. Реализовать модель и объекты на языке программирования Реализовать основные свойства, присущие разумным созданиям. Реализовать мыслительный аппарат и механизмы «восприятия» объектом модели окружающего мира Реализовать механизм взаимодействия объекта модели с окружающим миром и другими объектами
-
Информационная модель Для описания информационной модели нужно понять какие основные характеристики объекта мы хотим увидеть, в качестве «основных» характеристик разумного существа я выделил следующие: Наличие механизмов восприятия окружающего мира; Наличие механизма взаимодействия с окружающим миром; Наличие памяти; Наличие мыслительных систем (какие бы они ни были); Возможность принимать решения о взаимодействии с окружающим миром на основе информации, которая воспринимается и опыта. Под окружающим миром примем пространство в плоскости с эвклидовой метрикой, с некоторым конечным количеством моделируемых объектов. Механизмы восприятия в пространстве могут быть различны, в данной модели такими механизмами приму 4 сенсора, объекта, которые могут дать информацию о окружающем мире. Под информацией об окружающем мире будет подразумеваться некое значение, пропорциональное расстоянию до ближайшего другого объекта. Так как 4 сенсора будут смещены относительно «центра» объекта он получит представление о том, где находится ближайший объект (в теории). Механизм взаимодействия в модели примем следующий: 4 «движителя», каждый из которых представляет то, насколько быстро объект стремится двигаться в том или ином направлении. 4 «движителя» позволят свободно перемещаться в пределах плоскости. Взаимодействием в таком случае будет возможность двигаться в пространстве. Наличие памяти возможно реализовать следующим образом: объекту будет сохранять информацию о данных с сенсоров и текущих «ускорениях» в движителях, таким образом имея массив из подобной информации можно составить полную информацию о том, что происходило с объектом. Под мыслительной системой будет подразумеваться нейронная сеть в той или иной конфигурации. Возможность принимать решения обусловлена архитектурой нейронной сети, опыт и воспринимаемая информация предоставляется памятью и сенсорами. Для того, чтобы решения имели какой либо смысл примем «стремления» для объектов:
-
«Съесть» другой объект (в нашем случае объект будет «съеден» другим в случае, если приблизится на достаточное расстояние и будет «достаточно силен»).
-
«Не быть съеденным», в нашем случае стараться не позволить другим объектам приблизиться к себе, чтобы не дать им возможности себя «съесть». Для принятия решения о «силе» ближайшего объекта примем еще 1 канал информации, который будет сообщать «сильнее ли ближайший объект». Таким образом, описанная модель объекта удовлетворяет всем поставленным требованиям.
-
Реализация модели Для реализации модели будет использоваться язык программирования C#. В качестве реализации нейронной сети будет применяться Encog Machine Learning Framework. Он очень гибкий и быстрый, не говоря уже о простоте использования. Код модели достаточно простой, это не единственная возможная его реализация, данную модель может дополнить и изменить каждый. Функционирование объекта в данной реализации модели построено вокруг функции DoLive(), в которой поочередно происходят следующие жизненные этапы объекта: RefreshSense — обновление данных сенсоров (огляделся вокруг); Move — сделал шаг (переместился в пространстве); SaveToMemory — обновил память, запомнил текущую обстановку; Train — «обучился», проанализировал память; Compute — принял решение о положении движителей на основе опыта и информации о ближайшем объекте; Output — задал параметры движителей на основе принятого решения: Таким образом, протекает каждый жизненный цикл всех объектов на протяжении всего их существования.
-
Проверка модели
Для просмотра результата моделирования потребуется каким либо образом извлечь информацию о текущем состоянии модели на каждом ее этапе, т.к. модель динамическая наиболее эффективным будет использование видеозаписи. Для реализации вывода в видео файл воспользуемся библиотекой AForge.Video.FFMPEG.
Пример 1. Без информации о силе ближайшего объекта (нет стремления избежать гибели): https://youtu.be/U4WHV2ut2h8
Пример 2. Высокая «инертность» мышления (реже останавливается поразмышлять о окружающем его мире и проанализировать опыт): https://youtu.be/nICAufwTXys
Пример 3. Конечный вариант реализации https://youtu.be/HQfK_hFbQGI
Пример 4. С функциями «размножения» и «охоты» https://youtu.be/G-39Zy3sHRQ
Пример 5. Расширенная модель, «генетическое» наследование «удачных» генов, мутации генов при наследовании, большее генетическое разнообразие (16 видов активации нейронов, различное число и конфигурация слоев) https://youtu.be/Rc-B62smeao
Пример 6. Расширение возможностей восприятия, объекты воспринимают не только ближайший объект, но и другие объекты также. https://youtu.be/ba6R-Yzkk74
Пример 7. Частичное наследование памяти от «родителя». https://youtu.be/U0fYdXymqOY
- Выводы Объектам подавалось минимум информации, не было никаких правил относительно движения или управления движителями, только информация об окружающем пространстве, объектах и обратная связь о своем состоянии. Этой информации оказалось достаточно, чтобы объекты "научились" самостоятельно находить и «поедать» «слабых» и «убегать» от «сильных». В целом нейронная сеть может использоваться для моделирования действий, достаточно разумных. Применение нейронных сетей в моделировании может иметь и прикладное значение, например в управлении игровыми объектами, достаточно описать "возможности", далее объекты будут «жить» своей жизнью, используя доступные возможности для своей выгоды. Принцип показанный в статье может найти применение в робототехнике, достаточно дать программе доступ к сенсорным системам, системам управления и поставить цель, благодаря памяти и нейронной сети устройство может самостоятельно "научиться" управлять доступными системами так, чтобы поставленная цель была достигнута. Все материалы, исходные коды бесплатны и доступны всем желающим. Надеюсь данная статья поможет тем, кто хочет научиться использовать нейронные сети.