The Jerusalem PostA dangerous habit: Legislating hatred one step at a time - opinionESPN'No way this guy's a backup': How Malik Willis prepared for his second chanceRTP DesportoMundial de Hóquei. Seleção feminina bate ColômbiaESPN DeportesVinícius, Brahim y otros convocados ya se entrenan con Real MadridBollywood HungamaNeil Bhoopalam wants to work with Rajkumar Hirani to explore family-oriented films: “It would be a good shift for me”Daily MaverickSOCCER INTEGRITY: Senegal vs Morocco Afcon final saga set to be heard in Swiss courtPunch2027: INEC lists states with most registered votersZDF heuteEntdecken Sie das ZDF-NachrichtenstudioSCMP ChinaUS firm to make battle-tested drones in Taiwan, boosting supply chain resilienceBillboardBillboard Latin Music Week 2026 Adds Rubén Blades, Anthony Ramos, Lenny Tavárez, Tito Nieves & More to LineupThe Hollywood ReporterEmmy Awards Enter Streaming Era: Prime Video, TV Academy Ink Six-Year DealThe RegisterZombie instructions on carefully constructed web pages could trick GitHub Copilot CLI into sharing secrets
The Daily Newsstand · Free, Always
Tuesday, October 6, 2026

Каков предел обучения мухи? Разбираюсь на практике

Translate

В какой‑то момент после того, как в открытый доступ выложили отсканированный мозг мухи дрозофилы, начали появляться видео о том, как муха играет в DOOM, водит машину, играет в азартные игры и ещё много чего. Поначалу это выглядело занимательно, но потом этих видео стало так много, что начало складываться ощущение, будто мозг мухи способен на что угодно, а в естественной среде она такая неловкая только потому, что её никто ничему не учит.

Насколько я могу судить, во многих случаях не вся информация обрабатывается мухой. Готовые импульсы, связанные с движением, могут считываться компьютером как сигналы к действию. Например, мухе подаётся картинка из DOOM, зрительное ориентирование у неё развито, поэтому особого обучения не требуется, а желание идти вперёд или в сторону превращается в нажатие кнопки в игре. Я не говорю, что это обман, просто по короткому видео нельзя понять, какую часть работы делает именно муха, а какую разработчик.

Поэтому главный вопрос этой статьи такой:

Насколько хорошо коннектом способен самостоятельно осваивать новые задачи через подкрепление и где находятся его реальные ограничения?

В этой статье я не пытаюсь выяснить, насколько мозг мухи похож на человеческий интеллект. Меня интересует более практический вопрос: если взять обучаемую часть коннектома и последовательно давать ей задачи разной сложности, где именно она начнёт ломаться и почему.

Имея довольно смутное представление о том, как всё это работает, я решил сам провести серию простых экспериментов и попробовать нащупать границы того, насколько далеко муха может зайти сама, используя метод проб и ошибок, вознаграждения и наказания. И насколько хорошо она с этим справляется по сравнению с обычными алгоритмами: табличным Q‑learning и маленькой нейросетью (MLP)?

Дисклеймер: я не нейробиолог и не специалист по reinforcement learning. Всё, что описано ниже — личные наблюдения по ходу самостоятельных экспериментов, сделанных из любопытства. Часть выводов может быть неточной или вовсе ошибочной с точки зрения специалиста — буду рад поправкам в комментариях.

Также стоит добавить, что сравнение мухи с другими алгоритмами и определение, кто справился лучше, применимо только в пределах самих экспериментов. Нельзя сказать, что кто‑то объективно хуже или лучше: например, у мухи должно быть врождённое преимущество в ориентировании в пространстве по сравнению с необученными алгоритмами, но, как мы узнаем из эксперимента, играть в крестики‑нолики это ей не поможет.

Что вообще используется

Я использую открытую библиотеку onnxaa/fly‑brain — это данные коннектома дрозофилы, примерно 138 тысяч нейронов и 15 миллионов синапсов с готовым API, который можно использовать для обучения. Коннектом — это полная карта нервной системы: все нейроны и связи между ними. Для мухи такую карту сделали FlyWire, разрезали мозг мухи дрозофилы на тончайшие пласты, отсканировали их и в точности воссоздали модель на компьютере. Для большей части экспериментов использовался не весь мозг, а только одна его часть — грибовидное тело (mushroom body, MB), это около 6300 нейронов. Причина проста: именно грибовидное тело у насекомых отвечает за ассоциативное обучение, и эта часть мозга просчитывается намного быстрее, чем цельный мозг.

Как это работает на практике:

  • step(odor=...) — подать на вход «запах» (на деле — просто вектор чисел, подающих сигнал на определённые нейроны) и посмотреть на выходе значение предпочтения (условно: «нравится / не нравится»).

  • train(reward=..., punish=...) — подкрепить или наказать текущий стимул, изменив веса связей.

Тут возникла первая неожиданность и проявилась она не сразу. Всё дело в том, как именно происходит тренировка запаха: train() — это не «насколько сильно поощрить», это бинарный переключатель. Либо сработали дофаминовые нейроны (тогда происходит обучение фиксированного размера, условно ~15% сдвига весов), либо нет. Передать «награду 100 вместо награды 1» и получить в 100 раз более сильное обучение не получится. Это принципиально отличается от того, как работает, например, Q‑learning, где размер обновления можно явно регулировать (learning rate) и он естественным образом затухает по мере накопления опыта.

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

Второй важный момент: запах — это просто вектор чисел, стимулирующих определённые входные нейроны. Значит, его можно использовать для чего угодно, будь то клетки лабиринта, ход в крестики‑нолики, или число. Именно этот трюк лежит в основе почти всех экспериментов ниже.

Эксперимент 1. Многорукий бандит

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

Вот итоговый результат: усреднённая награда и накопленный regret (regret — насколько меньше награды агент получил по сравнению с идеальным выбором, чем меньше число, тем лучше) за 300 ходов.

Усреднённая награда:

trial

connectome

mlp

qlearning

20

0.583

0.583

0.583

60

0.667

0.667

0.667

100

0.650

0.600

0.650

160

0.683

0.683

0.683

200

0.667

0.650

0.667

240

0.700

0.650

0.700

280

0.617

0.617

0.617

Накопленный regret:

trial

connectome

mlp

qlearning

20

2.70

2.70

2.70

60

4.03

4.37

4.03

100

5.03

6.70

5.03

160

7.03

8.37

7.03

200

9.70

11.70

9.70

240

9.70

13.37

9.70

280

11.03

14.70

11.03

Самое заметное здесь — это полное совпадение колонок connectome и qlearning, они сразу понимают, какая кнопка лучше и дальше нажимают только её. MLP же немного отстаёт и его финальный regret примерно на треть выше (14.70 против 11.03).

Усреднённые результаты после нескольких прогонов

агент

итоговая награда

итоговый regret

connectome

198.33 ± 15.82

11.67 ± 15.82

qlearning

198.33 ± 15.82

11.67 ± 15.82

mlp

194.00 ± 16.82

16.00 ± 16.82

Как видно, все агенты справились и особых трудностей ни у кого не возникло. Но стоит заметить, что изначально у connectome было встроенное предпочтение запаха A (шанс награды 30%) перед запахом B (шанс награды 70%), из‑за чего при первом проходе он всегда выбирал запах А и получал худший результат. Чтобы убрать любые предпочтения из системы, пришлось ввести принудительное количество нажатий на каждую кнопку min_pulls=10, чтобы он в равной степени с ними ознакомился. Два других агента также получили это условие, чтобы у connectome не было преимущества.

На самой простой задаче никаких фундаментальных ограничений не проявляется. Коннектом показывает результат на уровне классических методов и выглядит вполне конкурентоспособно.

А что если исследовать меньше? Разбор по min_pulls

Чтобы узнать, сколько именно принудительных нажатий нужно, чтобы побороть предвзятость, я прогнал тот же эксперимент, меняя это число.

Итоговая награда, по min_pulls:

min_pulls

connectome

mlp

qlearning

2

153.0

194.8

195.8

5

176.8

190.6

195.6

8

195.8

187.6

195.6

10

196.0

192.2

196.0

15

192.8

186.6

192.8

20

190.4

179.8

190.4

30

187.8

182.8

187.8

Итоговый regret и разброс по сидам, по min_pulls:

min_pulls

regret connectome

regret mlp

regret qlearning

std connectome

std mlp

std qlearning

2

57.0

15.2

14.2

51.3

17.7

13.9

5

33.2

19.4

14.4

52.9

11.7

14.4

8

14.2

22.4

14.4

15.0

11.9

14.7

10

14.0

17.8

14.0

14.2

13.9

14.2

15

17.2

23.4

17.2

12.9

8.8

12.9

20

19.6

30.2

19.6

13.0

16.9

13.0

30

22.2

27.2

22.2

15.0

16.9

15.0

Здесь видна чёткая граница. При малом числе принудительных проб (min_pulls=2) коннектом заметно проигрывает обоим другим агентам — regret 57.0 против 14.2 у Q‑learning, да ещё и с огромным разбросом по сидам (std 51.3 против 13.9), скорее всего, он не успевает преодолеть врождённую предвзятость к одному из запахов. А начиная примерно с min_pulls=8–10 числа для connectome и qlearning становятся идентичными на каждом следующем значении — 10, 15, 20, 30. То есть при достаточном принудительном исследовании коннектом ведёт себя как точная копия Q‑learning на этой задаче, а вот без него — заметно хуже и куда менее стабильно от прогона к прогону. MLP всё это время держится особняком — не проседает так же резко на малых min_pulls, но и не выходит на тот же уровень, что и два других агента, на больших min_pulls.

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

Вторая находка: во время разбора, почему всё работает не совсем так, как надо, обнаружилось, что обучение одному запаху ощутимо подсаживает реакцию на другие запахи, хотя логически связи с ними никак не менялись. Это следствие того, что обучение здесь не локальное (поменялся один вес — задет один путь), а затрагивает более широкую часть сети.

Вывод: на самой простой одношаговой задаче коннектом не просто не хуже классики — при достаточном принудительном исследовании (начиная примерно с 8–10 обязательных проб на кнопку) он даёт результат, неотличимый от табличного Q‑learning.

Эксперимент 2. Сравнение чисел

Следующий шаг — сравнение чисел, пока что без зрительного ввода, а через запах. Два числа подаются как интенсивность сигнала на двух независимых входных группах — чем больше число, тем сильнее сигнал. Проверил на нескольких диапазонах чисел (n_max = 9, 19, 49, 99):

диапазон (n_max)

точность обученного connectome

linear

mlp

9, без обучения (контроль)

0.650

0.583

0.417

9

1.000

0.700

1.000

19

1.000

0.900

1.000

49

1.000

0.900

1.000

99

0.950

0.900

0.900

Результат хороший, но с важной оговоркой: даже без всякого обучения точность уже заметно выше случайной (0.627 против ожидаемых 0.5 при чистом угадывании) — значит на каком‑то базовом уровне connectome уже понимает, что один сигнал сильнее другого, и, не понимая сути задачи, он может сразу выдавать, что здесь сигнал ощущается сильнее. После обучения точность держится на уровне ~0.98–1.00 практически по всему проверенному диапазону и остаётся такой даже при расширении диапазона в 10 раз (до 99), заметно обгоняя обе классические модели.

Результат выглядит впечатляюще, но пока остаётся вопрос, не использует ли коннектом встроенную чувствительность к интенсивности сигнала вместо понимания самой структуры задачи.

Способ Б — настоящая позиционная запись

Здесь я решил разбить числа на разряды: десятки и единицы каждого числа кодируются отдельно, в одном и том же масштабе 0–9. Теперь числа вроде 47 и 74 создают одинаковый суммарный сигнал — различить их можно только реально поняв, что разряд десятков весит в 10 раз больше разряда единиц. Проверялись числа из 2, 3, 4, 5 и 9 цифр.

цифр в числе

connectome (до обучения / последние 20)

linear (до обучения / последние 20)

mlp (до обучения / последние 20)

2

0.617 / 0.950

0.483 / 0.900

0.017 / 0.950

3

0.417 / 0.850

0.483 / 0.650

0.050 / 1.000

4

0.433 / 1.000

0.483 / 0.600

0.050 / 1.000

5

0.433 / 0.900

0.483 / 0.600

0.050 / 1.000

9

0.600 / 0.800

0.533 / 0.500

0.117 / 1.000

С ростом числа разрядов видно, что коннектом начинает деградировать, но всё ещё держится на приемлемом уровне, в то время как линейная модель лишь слегка превышает случайный порог в 0.500, а MLP уверенно остаётся на высоте, несмотря на количество разрядов.

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

Эксперимент 3. Лабиринт

После успеха на простых задачах хочется проверить, что произойдёт, если агенту придётся запоминать большое количество состояний и принимать решения последовательно, а не в рамках одного шага. Задача понятнее некуда: агент должен дойти из точки старта до цели, у него 4 действия — вверх/вниз/влево/вправо.

Всего в статье четыре лабиринта, дальше я буду называть их так:

название

размер

проходимых клеток

пар (клетка, действие)

малый

10×6

26

104

средний

15×11

72

288

большой

19×13

113

452

самый большой

31×21

316

1264

Первое ограничение, о котором я вообще не подумал заранее: сколько в мозге есть свободных «каналов»

Для того чтобы научить connectome ориентироваться в лабиринте я попробовал закодировать отдельно пары (клетка, действие) как один запах. Для этого им выделялся отдельный канал входного сигнала (ALPN‑нейроны — это входной слой грибовидного тела, куда приходит уже обработанный обонятельный сигнал). Оказалось, что таких каналов меньше чем кажется на первый взгляд: из 685 ALPN‑нейронов при глубине прохода сигнала в один шаг (hops=1) ненулевую реакцию проявляют только 302, до остальных сигнал просто не успевает дойти за один шаг. При глубине в два шага (hops=2) живых каналов больше — 468, но на то, чтобы просчитать дополнительный шаг между взаимосвязанными нейронами уходит намного больше времени.

Как уже было сказано, такой подход вводит эксперимент в некие рамки: число пар (клетка, действие) не может превышать число живых каналов. Для маленького лабиринта (26 клеток × 4 действия = 104 пары) и среднего (72 × 4 = 288 пар) это ещё укладывается в 302 доступных канала при глубине hops=1, но при таких размерах все агенты достигают примерно одинакового результата, а я хочу найти лимит коннектома мухи. Для лабиринта на 113 клеток нужно уже 452 пары — больше чем 302 канала при hops=1. Пришлось поднять глубину до hops=2, чтобы хотя бы посмотреть, как connectome будет себя вести при большей сложности, хотя такой подход и займёт больше времени как из‑за глубины, так и из‑за размера самого лабиринта.

Маленький и средний лабиринт

Прогон на двух лабиринтах — маленьком (26 проходимых клеток, «original_26») и среднем (72 клетки, «medium_72»), оба при hops=1, по 300 эпизодов, 3 сида:

Общий процент успешных прохождений:

лабиринт

connectome

mlp

qlearning

original_26

0.993

0.979

0.993

medium_72

0.990

0.922

0.993

Средняя длина успешного пути (шагов):

лабиринт

connectome

mlp

qlearning

original_26

9.5 ± 4.9

9.7 ± 3.4

9.7 ± 6.1

medium_72

30.2 ± 14.3

37.2 ± 27.6

29.3 ± 8.0

Эпизод первого устойчивого успеха (скользящее окно ≥ 90%), по трём сидам:

лабиринт

connectome

mlp

qlearning

original_26

10 / 10 / 10

13 / 13 / 13

10 / 10 / 10

medium_72

10 / 10 / 18

50 / 22 / 15

10 / 10 / 10

Здесь все три агента ведут себя практически одинаково хорошо — коннектом даже чуть быстрее MLP выходит на устойчивый успех на среднем лабиринте.

До этого момента картина остаётся оптимистичной. Коннектом практически не уступает классическим алгоритмам и никаких серьёзных признаков деградации пока не видно.

Большой лабиринт (113 клеток)

На первом же честном прогоне на 113-клеточном лабиринте (без всяких доработок, просто тот же подход, что сработал на малых лабиринтах, но с hops=2) — коннектом за 93 из 400 запланированных эпизодов скатился к практически нулевому успеху (0.032 общий success rate, против 0.965 у MLP и 0.995 у Q‑learning), а единственные три успешных прохождения заняли в среднем 295 шагов вместо ожидаемых 30–40. На этом моменте я решил не гонять зря симуляцию и начал думать над альтернативным подходом.

Первая рабочая гипотеза была: раз проблема появилась одновременно с ростом лабиринта и с ростом глубины прохода сигнала (hops), нужно сначала разделить эти два фактора и понять, кто виноват.

Разделяю два фактора: другое кодирование, чтобы остаться на hops=1

Решение — не выделять каждой паре свой собственный канал, а использовать разреженное («k‑hot») кодирование: каждой паре (клетка, действие) достаётся случайный небольшой набор из k=6 каналов (с ограничением на то, насколько сильно наборы разных пар могут пересекаться). Так как пары теперь могут делить каналы между собой, а не требовать каждая свой собственный, 452 пары легко укладываются в 302 канала при hops=1 — глубину прохода сигнала больше не нужно трогать, победа.

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

Одного кодирования оказалось мало — и вот тут я нашёл более глубокую причину

На саму способность к обучению кодирование никак не повлияло, и большой лабиринт всё равно проваливался. Чтобы понять, виноват лабиринт или сам процесс обучения, я убрал лабиринт совсем. Взял все 452 пары (клетка, действие), для каждой заранее знал правильный ответ («этот ход приближает к цели» или «не приближает») и просто гонял обучение по кругу: показал все пары по одному разу — это один проход, потом второй, и так далее. После каждого прохода проверял, какую долю клеток агент теперь проходит правильно.

Результат оказался неожиданным. Уже после первого прохода точность достигла пика в 0.62, но потом, хотя агенту продолжали показывать только правильные ответы, она стала падать и к 30-му проходу дошла до 0.39. То есть дело не в случайных блужданиях по лабиринту и не в форме награды: обучение мухи само по себе портит уже выученное, если продолжать его без остановки.

Тогда возник контрольный вопрос: а может, схема просто не способна удержать столько информации? Проверил. Взял те же самые «отпечатки» и обучил поверх них обычный линейный классификатор без всякого мозга мухи. Он выучил всё безошибочно (точность 1.00), причём на всех размерах лабиринта, включая 113 клеток, и всего за 16 проходов. Значит, информации в «отпечатках» хватает с запасом. Ломает всё именно встроенное правило обучения, а не то, что мозг не видит задачу.

Гейт: не учить то, что уже выучено

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

вариант

пик точности

точность в конце (60-й проход)

сколько раз вызывалось обучение

всегда обучать

0.62

0.39

~13 400

гейт по собственной ошибке

0.70

0.51

~8 150

гейт по рангу, запас 0.5

0.83

0.58

~4 240

гейт по рангу, запас 0.15

0.95

0.73

~4 820

гейт по рангу, запас 0.1

0.93

0.82

~3 450

гейт по рангу, запас 0.05

0.96

0.90

~2 640

гейт по рангу, запас 0.02

0.94

0.93

~2 120

Чем меньше запас, тем лучше сохраняется выученное, и при этом обучение вызывается реже, а не чаще. Значение 0.05 я взял как основное для дальнейших опытов. Получается парадоксальный результат: система начинает работать лучше именно тогда, когда ей позволяют обучаться реже.

Результат на настоящем лабиринте: почти как у Q‑learning

Стартовая клетка фиксирована, 113 клеток, 3 запуска, по 150 эпизодов. Кратчайший путь — 30 шагов.

агент

доля успешных прохождений

когда впервые стабильно ≥ 90%

эффективность пути (1.00 — идеальный)

сколько раз вызывалось обучение

Q‑learning

0.99

эпизод 20

0.99

-

коннектом, разреженное кодирование + гейт по рангу

0.99

эпизод 20

0.99

~148

MLP (без подбора настроек)

0.86

эпизод 44

0.94

-

коннектом, без гейта

0.14

никогда

~0.10

~49 800

коннектом, гейт по числу посещений

0.08

никогда

~0.10

~4 400

С правильным гейтом коннектом сравнялся с Q‑learning почти по всем показателям. При этом обучение он вызывал примерно в 300 раз реже версии без гейта и отработал примерно в 200 раз быстрее (около 3 секунд на запуск против ~580). Все варианты без гейта провалились полностью.

Более честная проверка: старт из случайной клетки

Есть подвох. Если старт всегда одинаковый, агент по сути ходит по одному и тому же маршруту и посещает лишь около 35 клеток из 113. Значит, он выучил дорогу, а не карту всего лабиринта. Чтобы проверить именно карту, я сделал так, чтобы каждый эпизод начинался из случайной клетки.

запуск

успех за последние 20 эпизодов

запуск 1

0.90

запуск 2

0.80

запуск 3

0.55

в среднем

0.75

Тут гейт уже не спас полностью. Первые ~100 эпизодов коннектом идёт вровень с Q‑learning (оба около 90–100% успеха), а потом начинает деградировать: успех за последние 20 эпизодов в среднем падает до 0.75 (по разным запускам — от 0.55 до 0.90). У Q‑learning и MLP он всё это время держится на 1.00. Интересно, что во второй половине прогона обучение вызывается всё чаще: около 65 раз за 20 эпизодов ближе к середине и почти 2900 раз к концу, хотя точность к этому моменту уже вышла на плато около 0.80 и дальше не растёт, то есть агент переучивается без пользы. Оказалось, что 10 самых популярных пар из 452 забирают 76–83% всех обучений, а одну конкретную пару переучивали больше 4700 раз за прогон. Если ограничить число обучений на одну пару, эта концентрация исчезает, но поздняя деградация остаётся. Гейт помогает бороться с перезаписью памяти, но полностью проблему не устраняет.

А если учить не мозгом, а обычным способом?

Осталось понять: узкое место — это отпечатки, которые строит мозг мухи, или его собственное правило обучения? Чтобы разделить эти два фактора, я попробовал третий способ обучения: взял готовые отпечатки от настоящей схемы, но обучал поверх них не встроенным механизмом, а обычным способом из Q‑learning. Для честности сделал и контрольный вариант: те же правила обучения, но поверх случайных отпечатков того же размера, вообще не связанных с мозгом мухи. Так можно проверить, даёт ли настоящая анатомия мухи хоть какое‑то преимущество.

На 113 клетках (3 запуска, 300 эпизодов, случайный старт): настоящие отпечатки — 0.98 успеха, почти как у Q‑learning и MLP. Но случайные отпечатки дали 0.99, то есть не хуже, а даже чуть лучше. Вывод: на этом масштабе реальная анатомия мухи не даёт измеримого преимущества — важна не биологическая структура сама по себе, а способность различать состояния.

Самый большой лабиринт (316 клеток): здесь ломается уже сама проводка

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

На самом большом лабиринте эта картина ломается. Сначала решил проверить сам процесс обучения на таком масштабе, коннектом мухи стал работать хуже случайного шума той же формы: 0.41–0.45 успеха против 0.69–0.73. То есть на определённом масштабе сама анатомия мухи начинает мешать больше, чем обычный случайный набор чисел той же размерности.

вариант

успех за весь прогон

успех в конце

Q‑learning

0.99

1.00

случайные отпечатки + обычное правило

0.69

0.73

настоящие отпечатки мухи + обычное правило

0.41

0.45

Я пробовал разные шаги обучения, разную «строгость» выходного сигнала: разрыв сокращался, но не закрывался ни разу.

Попробовал прогнать этот лабиринт с собственным обучением коннектома и гейтом, как и на лабиринте в 113 клеток, чтобы посмотреть, насколько всё плохо. Как и ожидалось, без помощи гейта успех был 0%, а с гейтом он сначала достиг пика в 60%, а затем благополучно упал до нуля в течение 100 эпизодов. То есть на большем масштабе всё произошло ещё быстрее и катастрофичнее, чем при предыдущих запусках.

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

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

Общий вывод по лабиринту:

  1. Малые размеры (26 клеток) — успех, коннектом на уровне классики.

  2. Средние размеры (72 клетки) — успех, то же самое.

  3. Большие размеры (113 клеток) — работает только с внешней помощью: без гейта, который останавливает обучение, выученное перезаписывается из‑за отсутствия затухания шага обучения; и даже с гейтом при случайном старте начинается деградация.

  4. Очень большие размеры (316 клеток) — архитектурный предел подтверждается дважды: урезанный тест (только отпечатки мухи + внешнее правило, без её собственного обучения) работает хуже случайного шума (0.41–0.45 против 0.69–0.73), а настоящий коннектом со своим гейтом не просто не справляется, а разваливается быстрее и катострофичнее, чем на 113 клетках.

Эксперимент 4. Крестики‑нолики

Теперь задача с противником. Здесь всё интереснее, потому что чисто клеточных комбинаций уже 4520, и просто запомнить их не получится. Для решения этой проблемы доска кодируется частями: 9 клеток — 9 групп каналов, каждая может хранить своё значение (свой знак / знак противника / пусто).

В этот раз три яруса сравнения — честный без доработок (Tier 1), с оптимизацией и симметрией доски (Tier 1-opt) и с дополнительным гейтом поверх этого только для коннектома (Tier 2), так как у Q‑learning шаг обучения уже затухает с числом посещений, а у MLP обновление и так пропорционально ошибке, поэтому явный гейт у них дублировал бы то, что там уже есть.

Против случайного противника (win rate):

агент

Tier 1 (честный)

Tier 1-opt (симметрия)

Tier 2 (симметрия+гейт)

qlearning

0.478

0.448

-

mlp

0.530

0.466

-

connectome

0.404

0.418

error: 0.410 / visit: 0.414

Против «умного» (эвристического) противника (win rate):

агент

Tier 1

Tier 1-opt

Tier 2

qlearning

0.092 (last-100: 0.21)

0.000

-

mlp

0.002

0.000

-

connectome

0.004

0.000

error: 0.000 / visit: 0.000

В самоигре (selfplay):

агент

overall win

last-100

пик за 100

коллапс

дрейф весов,%

qlearning (Tier 1)

0.468

0.46

0.63

нет

-

mlp (Tier 1)

0.432

0.52

0.59

нет

-

connectome (Tier 1, честно)

0.146

0.01

0.52

да

19.6

qlearning_sym (Tier 1-opt)

0.455

0.40

0.56

нет

-

mlp_sym (Tier 1-opt)

0.416

0.47

0.53

нет

-

connectome_sym_cache (Tier 1-opt)

0.444

0.47

0.60

нет

18.5

connectome_t2_error (Tier 2)

0.423

0.42

0.56

нет

15.7

connectome_t2_visit (Tier 2)

0.418

0.33

0.55

нет

17.8

Против «умного» противника все три агента показывают близкий к нулю win rate — это, по‑видимому, общая слабость всей связки (задача «не проиграть детерминированному оппоненту» тяжёлая сама по себе). А вот в самоигре именно коннектом (и только он) в честном варианте катастрофически разваливается — win rate падает почти до нуля к концу прогона при заметном накопленном дрейфе весов (19.6%). Симметрия и гейт частично решают эту проблему, но connectome остаётся самым слабым из трёх агентов.

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

Симметрия доски — то, что реально сработало

У доски крестиков‑ноликов есть 8 равнозначных ориентаций (повороты и отражения) — с точки зрения игры — это одна и та же позиция. Если схлопнуть все повороты/отражения в одно каноническое представление, число различных позиций падает примерно в 6 раз (с ~4500 до ~765).

Именно это решение (столбец «Tier 1-opt» в таблице выше) имело наибольший эффект, win rate в самоигре вырос с почти нулевого до вполне рабочего 0.47, при этом суммарный дрейф весов почти не изменился. Это объясняется не тем, что connectome начал лучше обучаться, а тем, что конфликтующей информации стало меньше, и это упростило задачу.

Гейт поверх симметрии (Tier 2) снизил дрейф ещё сильнее (до 15.7–17.8%), но при этом итоговый win rate в самоигре не улучшился, а местами даже чуть просел (0.42 и 0.33 против 0.47) — интересный момент: меньший дрейф весов не гарантирует лучший результат, если задача уже не разваливалась и без него.

Обучение с подсказкой (имитация)

Отдельно попробовал не учить через метод проб и ошибок, а напрямую показать коннектому оптимальный ход для каждой из 4520 возможных позиций.

вариант

точность (full‑coverage)

верно / всего

без доработок (базовый)

54.0%

2441 / 4520

+ перемешивание порядка обучения

53.9%

2437 / 4520

+ периодический «сон» каждые 500 состояний

54.7%

2471 / 4520

+ симметрия доски

61.0%

2759 / 4520

+ симметрия и перемешивание вместе

61.6%

2783 / 4520

Необученная связка выдаёт около 54.0% (то есть почти всё дообучение просто стирает само себя и не даёт прироста над случайным/необученным уровнем), единственное исключение — симметрия, которая даёт достаточно заметный прирост.

Вывод: коннектом — единственный из трёх агентов, кто вообще показывает катастрофический саморазвал в честном варианте. Это частично лечится облегчением задачи при помощи симметрии. Второй раз подряд ограничение возникает не из‑за нехватки данных, а из‑за необходимости различать большое количество похожих состояний. Отдельная, не связанная с этим проблема — общая слабость против осмысленного противника есть у всех трёх агентов, но connectome среди них всё равно остаётся самым слабым.

Эксперимент 5. Зрение

До этого момента все задачи использовали искусственно созданные сигналы. Теперь можно проверить, что произойдёт при работе через настоящий зрительный тракт коннектома. Библиотека умеет принимать изображение напрямую на настоящие фоторецепторы. Стало любопытно: сможет ли коннектом распознавать цифры?

Цифры

Пять цифр (0–4), 400 раундов обучения:

connectome

linear

mlp

точность (последние 20)

0.450

1.000

1.000

Коннектом не просто хуже — он не улучшается вообще: по блокам в 20 раундов точность болтается в диапазоне 0.30–0.65 без всякой тенденции к росту на всём протяжении обучения (обе классические модели тем временем быстро выходят на 100%). Дрейф весов по всему мозгу вырос лишь до 0.035%, но это мало о чём говорит: при таком обучении меняются только несколько сотен связей из ~15 миллионов, и среднее по всему мозгу их просто не видит.

Матрица ошибок коннектома объясняет, почему:

факт \ предсказано

0

1

2

3

4

0

63

1

0

1

12

1

1

27

0

5

32

2

2

0

2

0

79

3

5

0

0

0

75

4

1

0

0

0

94

Цифры 2 и 3 почти никогда не распознаются как сами себя — они предсказываются как «4» в 79 и 75 случаях из ~80 соответственно. Цифра 1 тоже заметно утекает в 4 (32 раза из ~65). По сути, коннектом выучил один устойчивый ответ «4» и выдаёт его в большинстве непонятных случаев. Разобрался, в чём дело, с помощью простого диагностического приёма: посмотрел, какой именно внутренний «код» (какие нейроны грибовидного тела активны) вызывает каждая цифра, и коды для разных цифр оказались почти идентичны. Даже для нарочно выбранного набора максимально непохожих друг на друга цифр (0, 1, 7, 8) пересечение кодов держится на уровне 0.77–0.84 (из 1.0 максимум), то есть сигнал попросту не доходит до места, где принимается решение, в разделимом виде. Попытка увеличить глубину прохода сигнала и изменение разрешения картинки не помогли.

Проблема выглядит значительно серьёзнее, чем в лабиринте: здесь система не просто забывает информацию, а изначально получает почти неразличимые внутренние представления.

Кружки

Задача попроще: посчитать число кружков на картинке (0–4). Как и до этого три яруса обучения:

ярус

точность

последние 20

средняя ошибка

Tier 1: обычное обучение (коннектом)

0.200

0.200

1.89

Tier 1: линейная модель

0.870

0.950

0.155

Tier 1: MLP

0.820

1.000

0.393

Tier 2: усиленное («enforced») дообучение (коннектом)

0.210

0.200

1.833

Tier 3: имитация, held‑out оценка (коннектом), необученный старт

0.400

-

0.920

Tier 3: имитация, после обучения

0.210

-

1.960

Здесь ситуация оказалась любопытнее: если посмотреть на сырой сигнал в зрительной зоне (ещё до грибовидного тела), он отлично коррелирует с реальным числом кружков (корреляция 0.977 — почти идеально). То есть информация в принципе есть и она «правильная». Но ни один из трёх опробованных способов обучения не смог превратить этот сигнал в рабочий счётный выход. В Tier 3 обучение даже ухудшило результат относительно необученного состояния (0.400 → 0.210 точности), а собственный дрейф именно этого выхода (не всего мозга, а только новых связей выхода) при этом составил 50–72%, то есть обучение было отнюдь не слабым, оно просто било мимо цели.

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

Эксперимент 6. Сложение — неожиданный провал

Вернёмся к числам: логичным продолжением будет попробовать сложение. Даны два числа A и B и кандидат в ответы C; нужно ответить, верно ли C = A + B. Три яруса обучения (обычное / с гейтом по собственной ошибке / имитация на фиксированном наборе примеров), однозначные и двузначные (с переносом через разряд) числа, 5 сидов на вариант:

Однозначные числа, финальная проверка (среднее ± 95% доверительный интервал по 5 сидам):

ярус

connectome

linear

mlp

Tier 1 (обычное)

0.583 ± 0.013

0.719 ± 0.075

0.863 ± 0.056

Tier 2 (гейт)

0.656 ± 0.030

0.719 ± 0.075

0.863 ± 0.056

Tier 3 (имитация)

0.583 ± 0.012

0.691 ± 0.041

0.801 ± 0.111

Двузначные числа (с переносом через разряд):

ярус

connectome

linear

mlp

Tier 1

0.548 ± 0.026

0.755 ± 0.030

0.576 ± 0.039

Tier 2

0.584 ± 0.018

0.755 ± 0.030

0.576 ± 0.039

Tier 3

0.543 ± 0.029

0.743 ± 0.013

0.575 ± 0.040

Результат неожиданно слабый: даже в самом простом однозначном варианте (без переноса разрядов) коннектом застревает на точности около 0.58–0.66, тогда как линейная модель и MLP уходят к 0.72–0.86. В двузначном варианте коннектом вообще не отрывается от случайного уровня, причём здесь линейная модель тоже опережает MLP — но это может объясняться и тем, что в признаки линейной модели заранее заложена подсказка про перенос через разряд, которой не было ни у MLP, ни у коннектома.

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

Чтобы понять причину, повторил тот же трюк с проверкой внутренних кодов, что и для цифр: посмотрел, насколько похож код (какие нейроны грибовидного тела активны) у правильной тройки чисел и у почти правильной (сумма ошиблась на 1, 2 или 3).

разница с правильной суммой

перекрытие кода

0 (сама с собой)

1.000

±1

0.841 / 0.795

±2

0.723 / 0.663

±3

0.641 / 0.563

Двузначные числа, случайный фон: 0.172 (p95 0.470)

разница

перекрытие кода

0

1.000

±1

0.772 / 0.822

±2

0.605 / 0.499

±3

0.498 / 0.361

То есть у «правильного» и «неправильного на единицу» ответа внутри мозга буквально почти одна и та же картина активности (0.8 против фонового 0.17–0.21) — дополнительное обучение, гейтинг или повторение здесь физически не могут помочь, потому что на входе просто негде закодировать разницу.

Вывод: это не проблема нехватки обучения — это ещё один пример архитектурного потолка, просто более мягкого, чем у распознавания цифр (там пересечение кодов было буквально 1.0, здесь — 0.8).

Важная оговорка про то, что вообще проверяют эти эксперименты

Хочу отдельно проговорить один момент, чтобы не вводить читателя в заблуждение.

Всё, что я тестировал — это способность мозгового ядра, отвечающего за ассоциативную память (грибовидное тело), выучивать новые, произвольные связи «стимул — ценность»: конкретные клетки лабиринта, конкретные ходы в крестики‑нолики, конкретные числа. Это задачи, для которых у мухи в ходе эволюции никакого готового механизма не было и не могло быть.

Но у настоящей мухи уже есть развитая пространственная ориентация — она отлично летает, огибает препятствия, ориентируется в пространстве по зрению и осязанию (вибрации, поток воздуха на антеннах). Это не то, чему муха учится с нуля каждый раз — это во многом уже вшито природой в отдельную систему (в первую очередь центральный комплекс / эллипсоидное тело, отвечающие за интеграцию пути), а не в грибовидное тело, которое я в основном и тестировал.

Из этого следует довольно важная вещь: идея «подключить коннектом дрозофилы к дрону или машине, чтобы он сам научился объезжать препятствия» выглядит сложной задачей, но на самом деле, скорее всего, заметно проще (в плане обучения самой мухи), чем то, что я тестировал здесь. Просто потому, что бо́льшая часть нужной проводки для избежания препятствий и ориентации в пространстве у мухи уже есть готовой, отработанной эволюцией, и её не нужно заново выучивать через reward/punishment — её нужно только правильно подключить к входам и выходам. Собственно, это и объясняет, почему демки в духе «муха играет в Doom» (то есть по сути управляет движением и обходит стены) выглядят так убедительно без всякого обучения: это как раз то, для чего эта часть мозга изначально была спроектирована.

Мои же эксперименты были устроены наоборот: я намеренно пытался заставить мозг мухи заниматься тем, для чего он никогда не предназначался — считать, сравнивать позиции на доске 3×3, запоминать абстрактные комбинации. Поэтому результаты этой статьи не про «пределы возможностей мозга дрозофилы вообще», а именно про то, насколько ассоциативная память мухи годится для произвольных, а не врождённых задач.

Общий результат по всем экспериментам

Эксперимент

Механизм

Результат

Бандит

step/train

на уровне классики

Сравнение чисел, «сила сигнала»

step/train

сильный успех (с оговоркой на врождённый сдвиг)

Сравнение чисел, позиционное (разряды)

step/train

сильный успех, без врождённого среза

Лабиринт (26/72 клетки)

step/train

на уровне классики

Лабиринт (113 клеток), честный вариант

step/train

коллапс (успех → ~0)

Лабиринт (113), своё обучение + k‑hot + гейт, фиксированный старт

step/train + внешний гейт

на уровне классики (0.99 против 0.99)

Лабиринт (113), то же, случайный старт

step/train + внешний гейт

деградация после ~100 эпизодов (в конце 0.75 против 1.00)

Лабиринт (316), отпечатки мухи + обычное правило

внешнее правило на коде мухи

хуже случайного кода (0.41–0.45 против 0.69–0.73), Q‑learning 0.99

Лабиринт (316), своё обучение + гейт

step/train + внешний гейт

пик ~0.6, затем коллапс до 0

Крестики‑нолики, честный вариант

step/train

коллапс в самоигре, слабо против «умного» противника

Крестики‑нолики + симметрия доски

step/train

коллапс устранён, но против «умного» противника не помогает

Распознавание цифр (зрение)

x_teach_output

провал, представленческий потолок (коды почти идентичны)

Счёт кружков (зрение)

x_teach_output

провал, сигнал есть, но не обучается

Сложение (однозначное и двузначное)

step/train

провал даже в «плавной» форме, представленческий потолок

Если посмотреть на все эксперименты вместе, начинает просматриваться единый паттерн. Коннектом хорошо работает там, где задача похожа на ассоциативное обучение и не требует различать огромное число похожих состояний. Чем сильнее задача начинает напоминать хранение сложной структуры или композиционную логику, тем заметнее становятся ограничения.

Что я в итоге для себя понял

  • Обучающееся ядро мухи (грибовидное тело) неплохо справляется с простыми линейными задачами «один стимул — одна ценность».

  • Оно заметно хуже справляется с задачами, где нужно распознать комбинацию нескольких независимых признаков как единое целое — доска в крестики‑нолики, форма цифры, сложение с переносом.

  • Само правило обучения (train() как бинарный переключатель без затухающего шага) создаёт отдельную проблему устойчивости на задачах покрупнее. Из‑за этого продолжительное обучение стирает уже выученную полезную информацию, и даже попытка помочь извне при помощи гейта не решает проблему полностью.

Код и модели

Все скрипты, агенты и результаты экспериментов выложены в репозитории: ссылка на GitHub.

Все файлы лежат в папке my_fly_experiment/ внутри репозитория fly-brain. Скрипты можно запускать из самой папки my_fly_experiment/.

git clone https://github.com/onnxaa/fly-brain.git 
cd fly-brain 
python3 -m venv .venv 
source .venv/bin/activate
git clone https://github.com/Nnnnest/my\\_fly\\_experiment.git
cd my_fly_experiment
  • agents/ — агенты, разложенные по задачам: bandit/, gridworld/, tictactoe/, shared/. В каждой папке есть версия для Q‑learning, MLP и коннектома.

  • envs/ — среды: бандит, лабиринт, крестики‑нолики, генератор лабиринтов.

  • encoders/ — кодирование для разных задач.

  • opponents/ — случайный и эвристический противник для крестиков‑ноликов.

  • scripts/ — запуск экспериментов: bandit/, gridworld/, tictactoe/, addition/ и diagnostics/ (проверки перекрытия кодов и подобные).

  • results/ — результаты в CSV, по задачам (bandit/, gridworld/, tictactoe/, addition/), картинки в results/plots/, скрипты просмотра в results/analysis/.

  • models/tictactoe/ — сохранённые веса обученных агентов.

Примеры запуска скриптов (из папки my_fly_experiment/):

python results/analysis/view_bandit.py
python results/analysis/view_gridworld.py
python scripts/comparison/run_comparison.py

Отдельно: для крестиков‑ноликов есть скрипт scripts/tictactoe/play_tictactoe.py, позволяющий сыграть самому против любого из обученных агентов (Q‑learning / MLP / коннектом, включая разные варианты обучения) прямо в терминале, если интересно пощупать разницу между ними не по таблицам, а вживую.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.