Приветствую, дорогие друзья! Хочу рассказать о своём проекте. Моё хобби это исследование нервной системы и мозга в целом и попытки провести реверс‑инжиниринг этих систем. Этому собственно и посвящены мои статьи на habr. И сейчас я пришел к идее, что мне нужно разработать некий инструмент, который бы упростил работу над моими поисками и изысканиями, и сделал бы их более доступными. Да, существует множество фреймворков на эту тему, но мне всё это не подходит, во‑первых, у меня сложился несколько альтернативный взгляд на проблему, во‑вторых, мне кажется я смогу сделать лучше и доступней.)  Более шести лет назад я презентовал статьёй на habr свой проект OpenTadpole. Это был редактор коннектома некой спайковой нейронной сети которая управляла телом головастика лягушки в симуляции среды. Этот проект показывает возможность формировать с помощью достаточно простых нейронов сложное рефлекторное поведение. Тут речь идёт конечно только о безусловных рефлексах, без какого либо обучения. Интересным моментом для меня стало то, что многие интересовались есть ли web версия (это же проект сделанный на unity) или есть ли версия для Mac, linux. По существу, даже людям которым тема проекта была интересна и были обладателями windows не спешили что‑то скачивать, распаковывать, пробовать. И это понятно, куда удобнее просто пройти по ссылке и получить нужный опыт работы с редактором. К сожалению, web версию я не мог представить, так как использовал для симуляции жидкости сторонние плагины которые конфликтовали с компилятором под WebGL unity, ну очень уж капризный этот компилятор. С того момента зародилось идея сделать подобный редактор и делать его еще более доступным.  Более того пришло понимание того как простой редактор коннектома масштабировать, ведь изначально проект OpenTadpole был весьма ограничен и отсутствием механики обучения, и возможностью работать с большим массивом нейронов. Важно рассматривать нервную систему со множества сторон и не мало важный фактор это её эволюционное развитие. Используя законы и правила по которым функционирует нервная система, если мы их правильно понимаем, должны давать возможность описывать нервную деятельность как самых простых животных, так и высоко когнитивную деятельность. Отсюда рождается идеология того, что используя одни и те же базовые элементы — нейроны, можно строить как простые нервные системы, так и нейронные системы выполняющие когнитивные функции.  Итак, я задался целью создать доступный, веб редактор коннектома на котором будет возможно создавать как простую управляющую схему для виртуального животного или робота, а также расширить возможности этой схемы и добавив различные когнитивные функции, обучение, распознавание образов, речевых команд и т. д. Задача не из простых, поэтому на неё потребуется много времени и мотивации. Что есть лучший источник мотивации? — Это Ваша поддержка, мои дорогие друзья! Редактор далёк от завершения, но все же в нём реализованы некоторые важные механики. Открытый исходный код (пусть не профессиональный, неструктурированный), работает в браузере, доступен по ссылке. Редактор коннектома: https://belkinandrey.github.io/ Исходник:  https://github.com/BelkinAndrey/belkinandrey.github.io По мере добавления функционала в редактор, я буду делиться о том, как это работает, своего рода дневник разработчика с погружением в теорию реверс‑инжиниринга мозга. Изначально стояла задача повторить функционал который уже был отработан в OpenTadpole, простой редактор позволяющий создавать нервные схемы безусловных рефлексов, но с упором на универсальность и производительность. Производительность в подобных системах конечно решается использованием вычислительных ресурсов GPU. Пришлось по ходу работы изучать для себя новый стек ( web, javaScript, html, css), благо сейчас появились всякие GPT‑помощники, которым можно без стеснения задавать самые глупые и наивные вопросы, им деваться некуда всё равно будут отвечать. Сначала честно пытался заставить написать ИИ‑чат редактор за меня, но быстро понял, что ИИ совсем не хочет забирать у меня эту работу. Первая реализация всё таки столкнула меня с вопросом оптимизации, хоть и логика вычислений была реализована на GPU. Изначально я использовал очень удобную библиотеку GPU.js, но в целях оптимизации даже переписал на более низкоуровневый WebGPU. В итоге слабым местом в оптимизации стал интерфейс, в моих принципах стремиться максимально всё визуализировать, я хотел видеть и активность нейронов и спайки. В принципе, спайковые сети требуют высокой производительности. Назрела идея пересмотреть концепцию.  Спайковые сети в машинном обучении стоят неким особняком, есть целый пласт научных трудов посвященных им, множество апологетов и идеологов. Многие называют это направление очень перспективным, крупными компаниями разрабатываются специальные чипы и процессоры. Хотя, пока, сами такие сети не показывают каких либо выдающихся результатов. В сравнении с классическими искусственными нейронными сетями спайковые сети находятся на уровне задач типа MNIST. Но, перспективность их рассматривается в разрезе энергоэффективности и близости к биологическому аналогу. По существу все сводится к тезису: “Как только мы найдем алгоритм позволяющий добиваться такого же высокого качества как бэкпроп (ведь мозг работает на спайковый сетях), то в сочетании с высокоэффективностью и параллелизмом спаковые сети станут прорывом, на специализированном железе, конечно”. Еще одним фактором в пользу спайковых сетей является идея того, что в спайковых сетях присутствуют механизмы приближающие их к биологическим сетям. Мы пока достоверно не можем сказать по каким принципам работает мозг, и опуская такую вещественную механику как импульсность передачи сигналов между нейронами, создавая модели мы можем упустить важную составляющую принципов работы мозга. При моделировании такой сложной системы как мозг, мы можем выделять условные уровни детализации. К примеру, самый высокий уровень детализации это моделирование вплоть до отдельных молекулярных механизмов и детальной топологии тела нейрона, спайки описывать подробной моделью Ходжкина-Хаксли. Более низкий уровень детализации это принять тело нейрона условным, но учитывать спайковсть, виды нейромедиаторов (которых около 200-т), какие-то аспекты метаболизма. Еще более низкий уровень, учитывать не отдельные импульсы, а задавать характеристику их частоты, тип синаптической передачи разделяется только функционально (побудительное, тормозящее, модулирующее). Ещё более низкий уровень - моделировать на уровне взаимодействия различных областей мозга. Любой уровень детализации может в полной мере отражать реальные процессы протекающее в системе. Но, чем выше детализация тем она сложнее в реализации и затратнее в ресурсах. Всегда есть возможность взяться за реализацию модели на низком уровне детализации, но в этом случае нам нужно очень хорошо представлять какие процессы на более высоком уровне оказывают ключевое значение. Долгое время я строил свои модели с учетом импульсности передачи сигналов между нейронами, но я не вижу в спайковости ключевой значимости для построения когнитивных систем. Импульсность сама по себе накладывает некоторые ограничения и дополнительные затраты в вопросе управления. К примеру, время спайка в биологической системе составляет примерно 1 мс, еще 1 мс необходима на рефрактерный период, то есть максимально возможно около 50 импульсов в секунду для отдельного нейрона, если мы захотим управлять каким либо параметром с градацией 1024, то нам потребуется либо учесть задержку в управлении в более чем 21 с (1024 / 50 = 20,48), либо управляющий сигнал должен одновременно сниматься с 21 нейрона и каким-то образом суммироваться. Наши мышцы имеют очень точную и плавную работу не только из-за управления частотой приходящих импульсов, но и  благодаря наличию большого количества моторных единиц (нейрон + управляемая им группа мышечных волокон), а также большого количества нейронов участвующих в самом управлении. Для точных задач управления требуется большое количество нейронов в спайковых сетях. Если вызвать функцию setInterval() javaScript (указанная функция в аргументе будет вызываться с заданным интервалом времени) с параметром времени 0, то браузер сможет совершать некоторые события не чаще чем раз в 4 мс, учесть, что расчеты сети могут быть нагружены это время легко увеличится. Получается для достаточно точного управления каким-либо параметром в редакторе потребуется строить схему из очень большого количества нейронов - это неудобно и излишне нагружено. В моей исследовательской работе уже был опыт (Искусственные и биологические нейронные сети), когда свойства которые казалось бы проявлялись только за счёт импульсивности нейронной сети, я перенес на более простой алгоритм с применением тонических нейронов выход которых выражается вещественным числом. Более того некоторые аспекты данных свойств стали более понятными.   Суммируя все вышесказанное в отношении редактора было решено отказаться от спайковости и перейти на тонические нейроны, выход которых определялся вещественным числом от 0 до 1, но при этом нужно было сохранить динамику и некоторые важные аспекты работы спайкового нейроэлемента. И мне кажется у меня получилось придумать действительно универсальный элемент с помощью которого можно создавать любые схемы управления. Спайковая версия редактора работающая на WebGPU доступна  по адресу: https://belkinandrey.github.io/spike/ В редакторе реализованы три элемента или узла: нейрон (круг), сенсор (пятиугольник) и актуатор (квадрат). Эти узлы могут быть связаны направленными ребрами или связями, которых в редакторе представлено четыре типа (мы рассмотрим сейчас только два). Первый тип — это синапсы прямого действия, они хранят в себе значение веса, который может быть положительным (побуждающим, зелёный цвет) или отрицательным (тормозящим, синий цвет). Второй тип связи — это модулирующий чувствительность (sensitivity) нейрона обозначен серым цветом. Тонический нейроэлемент очень похож на математический нейрон Мак‑Каллока — Питтса. С его помощью можно в редакторе свободно составлять нервные схемы. Все веса синапсов прямого действия умноженные на значение активности соответствующих нейронов приходящих связей суммируются. Затем полученная сумма будет умножена на характеристику чувствительности (sensitivity) нейрона. Эта характеристика может изменяться под воздействием модулирующей связи, но не может быть менее нуля. Полученный результат будет проходить через аналог пороговой функции, который определяется двумя настраиваемыми параметрами — это нижний уровень (lower‑level) и верхний уровень (top‑level). Нижний уровень (lower‑level) — это значение до которого выход нейрона будет равен строго нулю. Соответственно, верхний уровень (top‑level) — это значение суммы выше которого нейрон будет иметь значение строго равное единице. Значения суммы между этими уровнями, будет выдавать соответствующее значение в интервале от 0 до 1.  Нейроэлемент может иметь замкнутую на самого себя связь прямого действия. Узел в редакторе с такой связью будет обозначен символом ⟲. Благодаря такой обратной связи нейроэлемент способен самостоятельно поддерживать постоянный уровень активности, также есть возможность настроить эту связь так, чтобы возбуждение постепенно разгоралось, либо постепенно затухало.  Этого достаточно чтобы создавать различные логические схемы. Банально возможно создание подобие транзистора где коллектором будет являться связь прямого действия, базой — связь модулирующая чувствительность нейроэлента и эмиттер — это выходное значение нейрона. Что говорит о теоретической возможности описать с помощью этих элементов любую схему управления. Схемы мы уже можем создавать, но нужно, чтобы была возможность применять эти схемы. Чтобы сделать это максимально универсальным, было решено, что редактор будет работать в отдельной вкладке браузера, а в соседней вкладке будет симуляция. Связующим звеном между редактором и разного рода симуляциями являются сенсоры и актуаторы. В редакторе можно указать id этих элементов. Вкладки браузера в моей реализации общаются через Local Storage — это несколько топорно, но прекрасно работает и позволяет обойтись без создания серверов, что в свою очередь упрощает работу с кодом редактора. Код страницы управляемой вкладки может быть любым, главное правильно использовать Local Storage. Симуляцию робота‑гексапода я сделал на Unity с компиляцией на WebGL. Здесь актуаторы управляют виртуальными приводами робота которых 18 штук. 0 и 1 на актуаторе задают крайнее положение виртуальных приводов. Сенсоры необходимы только для управления с клавиатуры.   В основе нервной схемы гексапода лежит Генератор Периодической Активности — это замкнутая цепочка последовательно соединенных нейронов. Каждый нейрон в цепочке фактически обозначает конкретное действие в такте локомоции, например, «поднять ноги 1, 4, 5», «опустить ноги 2, 3, 6», «передвинуть назад ноги 1, 4, 5» и так далее.  Вида аллюра два: прогулка — фактически при ходьбе подняты только две лапы, и бег — при перемещении подняты три лапы. На каждый вид аллюра свой Генератор Периодической Активности, управляя ими, мы управляем локомоцией гексапода. Перед актуаторами ответственными за перемещение ноги вперед/назад сформирована схема инверсии команд, которую можно активировать на левую и правую стороны по отдельности, что добавляет в перемещение возможность поворачивать роботу влево или вправо. Червь нематода c.elegans одно из самых известных модельных животных в нейробиологии. Это первое животное чей коннектом состоящий 302 нейронов был полностью составлен. Также было создано немало различного рода симуляции этого червя. И еще это гештальт который мне нужно было закрыть.  Известно, что в нервной схеме локомоции c.elegans участвуют обратные связи от рецепторов растяжения стенок тела червя. Поэтому в симуляцию я добавил рецепторы которые реагируют на сжатие, чтобы была возможность поэкспериментировать и собрать схему локомоции с обратной связью. И есть отдельный рецептор который реагирует на касание головы червя стенок «аквариума» или предмета, чтобы добавить к нервной схеме рефлекс попятного движения.  При разработке симуляции среды, мне казалось что волнообразного движения червя достаточно для его перемещения, но выяснилось, что на простой плоской поверхности червь в этом случае просто брыкается и направленного движения нет. В природе c.elegans двигается в тонком слое так называемого агара — желеподобном веществе, в котором под действием тела формирует желобок, а стенки этого желобка создают дополнительную силу при отталкивании от них, тут и будут работать волнообразные движения. Поначалу я пытался повторить физику этого агара, что не очень у меня вышло. Решением стало применить к каждому сегменту, их в модели 25, отельную силу противоположную перемещению сегмента поперёк тела, что имитировало силу возникающую от стенок желобка в агаре.  Многие уже наслышаны о том, что такое когнитивные карты, о клетках места и клетках сетки в гиппокампе. И конечно, факт того, что в мозге есть некоторого рода мини‑карта планарного вида с отметкой фактического положения субъекта на ней удивляет. И заставляет задуматься о том, как получить такую карту. У меня есть свой вариант. Всё начинается с клеток ориентации поворота в пространстве. Недалеко от клеток места выявлены клетки поворота головы, я думаю клеткам поворота ориентации в пространстве тоже есть место. Каждый раз когда мозг посылает команды на поворот тела в пространстве, он дублирует эти команды специальной сети нейронов которая регулирует работу нейронов ориентации в пространстве. Это могут быть всего два типа команд, «поворот влево» и «поворот вправо», но при этом значение нейронов будут меняться исходя из текущего положения. Такую схему легко составить.   Значение клеток ориентации в пространстве будут работать совместно с ментальной картой. Также мозг при формировании команд на перемещения вперед будет передавать эту команду и нашей ментальной карте. Логика схемы ментальной карты достаточно проста, клетка ориентации в пространстве «вверх» воздействует на все планарно расположенные ячейки ментальной карты с воздействием стремящемся распространять возбуждение вверх. Но этого воздействия недостаточно, нужно чтобы была активна команда на перемещение вперед и в ячейке карты была активна клетка текущего положения (клетка мета), только в этом случае будет предано возбуждение на ячейку выше. Далее предыдущая ячейка подавляется, чтобы на ментальной карте была активна только одна ячейка/клетка места.  Собственно воздействие на все ячейки/клетки места для разных направлений и обуславливают необходимость наличия клеток сетки.  Это самая простая модель когнитивной карты из существующих. Нейронная схема возникшая на очень раннем этапе эволюции должна обладать очень простой логикой.  Это очень упрощенная модель когнитивной карты, она не включает в себя образы места полученные от органов чувств. Дело в том, что когнитивная карта гиппокампа в какой‑то степени относительна, это будут всё те же клетки места, но в разных локациях они будут обозначать разные места. Образ места по сути включает в себя совокупность ощущений получаемых в данном месте и привязку к какой‑нибудь клетке места на ментальной карте. При перемещении на местности меняются наши ощущения окружения, а также происходят оговоренные изменения в ментальной карте, это всё сопоставляется и объединяется в единый сложный образ, по которому можно «путешествовать» ментально. Ну а, что будет если к этому добавить клетки времени, которые также обнаруживаются в гиппокампе? — Возможность манипулировать ментально не только пространством… FLUX (fluxengine.ai) Делясь своими наблюдениями и наработками на страницах habr, я получаю обратную связь от людей которым интересны мои идеи. Это вдохновляет и бывают весьма продуктивные знакомства. Благодаря вышеупомянутой статье о проекте OpenTadpole у меня завязалось общение с Альбертом Кайгородовым. Он профессиональный программист и его очень вдохновил этот симулятор головастика. Он продвигал идею сделать что‑то подобное, но на более глобальном уровне, создать некую веб среду разработки искусственных нервных систем. Скажу честно я изначально не думал работать в этом направлении, но со временем упорство Альберта и развитие моей работы убедили меня, что это очень удачный путь. В какой‑то момент я увидел как это может работать, как это облегчит мои поиски и сделает результаты исследований доступными. Уже сейчас проект можно рассматривать как инструмент визуального программирования. Есть возможность написать код страницы для управления любой периферии и использовать редактор коннектома для создания управляющих схем.  В своем открытом проекте cogFlux я реализую основную логику, думаю мой уровень программирования не позволит мне сделать достаточно мощную систему с большим функционалом. Но есть проект FLUX (fluxengine.ai), который изначально разрабатывается как очень производительная и функциональная среда на должном техническом уровне.  И конечно разработка такой среды требует времени, она ведётся на личных инициативах. В качестве демонстрации возможностей мы разрабатываем робота‑гексапода. У нас нет опыта в робототехнике, поэтому пока работа над роботом идёт с переменным успехом. Значимыми результатами работы, я как всегда буду делиться с Вами мои дорогие читатели habr. А также существует ненавязчивый телеграмм-канал (https://t.me/neuro_cyber) и группа в ВК (https://vk.com/club137626673). Редактор коннектома: https://belkinandrey.github.io/ Исходник:  https://github.com/BelkinAndrey/belkinandrey.github.io