FlyBrain: босс, которым управляет мозг мухи

· 3 мин · BadRabbit

Пока все обсуждают, как подключить коннектом мухи к Doom, я сделал наоборот: написал игру под муху. FlyBrain — это босс в аркадном файтинге, которым в реальном времени управляет биофизическая симуляция всей центральной нервной системы дрозофилы.

Не дерево поведения и не политика, обученная обучением с подкреплением, а 164 506 нейронов из открытого датасета MaleCNS v1.0 (Janelia/FlyEM). Каждый нейрон — простая модель «накопил заряд, протёк, выстрелил» (leaky integrate-and-fire), соединённая с соседями ровно так, как они соединены у настоящей мухи.

Почему не Doom

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

  • Движок боя написан на Rust как чистая функция. Никакого ввода-вывода, глобального состояния и неконтролируемого рандома. Одна точка входа:
pub fn step(w: &mut World, input: PlayerInput, action: BossAction) -> StepEvents
  • Детерминизм до бита: в Python через PyO3 движок выдаёт больше миллиона шагов в секунду, а в браузере тот же код, собранный в WebAssembly, повторяет бой кадр в кадр при 60 FPS.
  • Вход мухи — 43 числа в её собственной системе координат: 16 лучей до препятствий, положение и скорость противника, своё здоровье и кулдауны и отдельный сигнал looming, то есть скорость, с которой на неё что-то надвигается.

Что уже умеет муха

ДействиеКакой контур мозгаСтатус
УклонениеLC4 + LPLC2 → гигантское волокно DNp01работает, отклик в 30–70 раз сильнее контроля
Ходьба381 мотонейрон ног в вентральной нервной цепочкеработает, плюс рефлекс «не врезаться в стену»
Выпадферомон соперника → клетки Кеньона → MBONтестируется
Награда и наказаниедофаминовые PAM и PPL1измерено

Самое красивое — уклонение. Когда на муху летит снаряд, его изображение на сетчатке расширяется. Это расширение возбуждает нейроны LC4 и LPLC2, они синхронно бьют в гигантский нисходящий нейрон, и босс отпрыгивает. Мне не пришлось программировать эту реакцию: она уже была в проводке мозга.

Рефлекс уклонения, который муха принесла с собой из эволюции.
Рефлекс уклонения, который муха принесла с собой из эволюции.

Глаз мухи

В браузере есть отдельный экран: 1442 омматидия, шестиугольные «пиксели» фасеточного глаза, на которые проецируется арена. Видно, что именно видит муха перед тем, как принять решение. Рядом лежит Neuro-Lab: можно вручную возбуждать группы нейронов, например «лунную походку» MDN, и смотреть, как дёргаются ноги 3D-модели.

Что я понял

  1. Биология лучше любых моих эвристик там, где задача похожа на ту, что решала эволюция: увернуться, убежать, атаковать соперника.
  2. Чтобы такие эксперименты были возможны, движок должен быть детерминированным. Если один и тот же бой нельзя воспроизвести бит в бит, невозможно понять, муха поменяла решение или сломалась физика.
  3. Rust + WASM — отличная пара для научных игрушек: одна кодовая база для обучения и для демо.

Следующие пару дней я буду разбирать статьи, на которых этот проект стоит: сам коннектом FlyWire, модель мозга на LIF-нейронах и виртуальную муху NeuroMechFly.