两只真实果蝇大脑在下五子棋:连接组仿真对弈系统的设计与实现
用 MaleCNS v1.0 真实连接组(166,700 神经元、2558 万突触)仿真两只果蝇大脑,在 3D 场景对弈五子棋:五层架构、LIF 仿真、三因子可塑性、双蝇个体化,附 67 局实测数据与开源部署方案。
本文介绍一个”连接组仿真 + 具身智能体 + 强化学习”的开源项目:两只果蝇各自驱动一副由 MaleCNS v1.0 真实连接组(166,700 个神经元、约 2,558 万条突触连接)构建的仿真大脑, 在 3D 场景里对弈五子棋。它们自己”看”棋盘、自己”想”落点、自己扇动翅膀飞过去拿起棋子放下, 并依靠多巴胺奖赏信号在蘑菇体 KC→MBON 突触上完成三因子可塑性学习。 文中所有数据均为本地对局实测,不涉及任何个人信息。

1. 系统总览:五层架构#
整个系统是一条从数据到画面的完整流水线:
| 层 | 内容 | 关键实现 |
|---|---|---|
| ① 数据层 | MaleCNS v1.0 平面连接组(feather 表) | 神经元注释、递质极性、连接权重、突触点坐标 |
| ② 模型层 | 单文件 npz 仿真包 | 166,700 神经元 / 25.58M 突触 CSR 矩阵 / 递质符号加权 |
| ③ 仿真层 | 双脑 LIF 仿真 + 可塑性 | 2ms 步长、三因子 KC→MBON 学习、双蝇个体化 |
| ④ 具身层 | 解剖级果蝇身体 + 真实运动神经元 | flybody 网格 + MJCF 关节、腿319/翅26/颈118 运动池 |
| ⑤ 呈现层 | three.js 3D 场景 | 真实解剖位置网络渲染、166,700 通道活动点云 |
对外接口只有一个:Python 起一个本地 HTTP 服务,前端是纯静态页面。 大脑推理由服务端完成(约 38–52 ms/tick),浏览器只负责渲染与操控,不需要 GPU。
2. 数据层:MaleCNS v1.0 连接组#
MaleCNS v1.0 是 Janelia FlyEM 团队发布的成年雄性果蝇全中枢神经系统连接组 (脑 + 腹神经索,约 16.7 万神经元),以 feather 表格式提供批量下载, 许可证为 CC BY 4.0——允许二次分发,只需署名。
本项目从中构建仿真包 flygo_data.npz:
- 神经元:166,700 个,其中 166,576 个(99.93%)使用真实突触点质心坐标——这是后面 “真实解剖位置渲染”的数据基础;
- 突触:保留 25,582,938 条连接,构建 166,700×166,700 稀疏 CSR 矩阵;
- 递质极性:按预测神经递质给每条边赋符号(乙酰胆碱 +1;GABA/谷氨酸/甘氨酸 −1), 未预测的神经元取 0.5 中性值;
- 功能池:多巴胺神经元 38、KC 4,064、MBON 97、视觉相关 105,265、下行神经元 1,314; 其中 KC→MBON 有 6,813 条真实突触被选为可塑子集。
prepare_data.py(只读源数据) ──► flygo_data.npz(仿真包)
神经元索引 / 递质符号 / 坐标 / CSR 连接矩阵 / 功能池索引text原始数据文件在本项目中只读,所有学习结果写入独立的 saves/ 目录,互不污染。
3. 仿真层:LIF 大脑与三因子可塑性#
3.1 神经动力学#
按突触后线性衰减积分的 LIF 变体(2ms 步长):
v ← v·0.905 + I·0.095 // 膜电位衰减 + 输入注入
发放阈值 vth ∈ [0.26, 0.40] // 每神经元固定异质阈值
发放率 = EMA(spike / dt) // 供读出与渲染text连接矩阵按行归一化,输入电流按”桶(bucket)“注入:64 个决策桶 × 24 个视觉输入神经元, 每个桶映射到 16 个下行神经元(DN)做群体读出——哪个桶的 DN 群体发放率最高, 哪个落点就是这只蝇的”决定”。
刻意把系统维持在刺激驱动区间:静息噪声底约 0.10,低于发放阈值。 曾试验过 0.22 的持续兴奋性输入,结果是全脑点火(63% 神经元同时发放、11.5Hz)—— 大脑失去了信息含量。这个失败试验被记录在代码注释里,作为”静息态必须安静”的证据。
3.2 三因子可塑性:多巴胺怎样改写突触#
蘑菇体是果蝇的学习中枢,本项目的学习规则是标准的三因子规则:
Δw ∝ (前因子:KC 活动) × (后因子:MBON 活动) × (调制因子:多巴胺脉冲)text- 资格痕迹:KC→MBON 突触上,走子前后各留一段活动痕迹;
- 多巴胺广播:外部评估器给出奖励 r 时,38 个 DAN 神经元群体爆发, 全局广播到所有符合条件的 KC→MBON 突触;
- 乘性增益:重塑作用于 MBON 读出增益 g ∈ [−0.9, 4],即”这棵 KC 对这个读出的票数权重”。
这套结构在学术上有坚实对应:KC 的稀疏高维编码相当于随机哈希式的特征展开 (每一手棋激活一小簇 KC),MBON 群体是线性读出器,DAN 是误差/教学信号广播—— 正是果蝇学习研究里的经典框架,也与现代三因子规则综述一致。
3.3 双蝇个体化:同一底座,两只不同的蝇#
两只蝇来自同一连接组底座,但对每只蝇做了三重独立化:
- 连接组抖动:W 的非零元逐条乘对数正态噪声(σ=0.15),再按行重归一化—— 相当于个体发育中的随机差异;
- 感觉增益:每个桶的注入电流乘 exp(N(0, 0.14²)) 增益——同一信号两只蝇听到的响度不同;
- 码本重配对:每只蝇的 KC 编码本从”突触到本桶 MBON 的 KC”里独立重抽—— 同一手棋在两只蝇的蘑菇体里点亮的是不同的 KC 组合。
3.4 独立性如何度量:两个相关系数#
双脑相关性必须拆成两个指标看,这也是本项目的一个方法论要点:
- 结构 r(原始发放向量相关):高是正常的(0.66–0.92),因为同一物种同一底座, 它只说明”接线方式一致”;
- 波动 r(逐样本变化量相关):这才是真实同步性检验。实测 −0.68 ~ −0.11, 即两只脑的动态是相互独立的。

4. 具身层:身体是解剖级的,运动神经元是真的#
果蝇身体使用 DeepMind 开源 flybody 的解剖级网格 + MJCF 关节层级(MuJoCo 装配), 翅、六足、头颈都可动。运动绑定用的是 MaleCNS 注释里的真实运动神经元 (按出口神经分类):
| 运动池 | 神经元数 | 绑定行为 |
|---|---|---|
| 腿(前/中/后) | 319 | 步行、抓握、梳理、起跳 |
| 翅 | 26 | 飞行振动、振颤、甩翅 |
| 颈 | 118 | 头部注视棋盘 |
| 后足/腹 | 360 | 后足够翅、腹部姿态 |
飞行时服务端实时读取该蝇的自身神经活动做运动映射:左右半球发放不对称 → 偏航、 背腹不对称 → 升力、总发放 → 推力。因此每一次航线都不同——同一只蝇同一个落点, 两次飞行的轨迹不会重合。
自主三重阶梯#
功能组件的自主性被明确分为三档,界面可切换:
- 第一重·闭环:脑决定落点;抓子/飞行/落子由代码执行(tool-call 式)。 到达、抓取、放置全部有保底,另设看门狗(任一步 18 秒无进展即安全收尾), 对局永不卡死;
- 第二重·神经主导:归航项减弱到 0.35 倍、神经偏航全程保留;抓子与放子只认
该蝇自己的腿部运动爆发信号,不爆发就拉起重新进近,4 次失败才降级到一重兜底;
- 此模式下能观察到它”反复起落”——那是它自己的运动信号没到时机;
- 第三重(规划中):完全物理交互,用自己的肢体完成拾取与放置。

5. 渲染层:真实解剖位置的神经网络可视化#
脑图不是示意图——每个节点的坐标就是该神经元在 CNS 中的真实突触质心, 连线是真实存在的突触。所有元素合并成极少量 DrawCall,浏览器端流畅渲染:
- 全脑点云:166,700 个神经元逐点渲染,活动驱动逐点白闪—— 相当于 166,700 通道的实时活动示波器。飞行时可以看到胸腹段运动神经元池亮起;
- 决策回路:1,799 个节点(我们刺激与读出的真实神经元)+ 6,500 条突触管线, 按类别着色(金=KC、橙=MBON、绿=DAN、蓝=感觉输入…);
- 光脉冲:每脑 72 个光点沿突触连线运动,优先在活跃通路上生成—— “信号包”沿正在思考的通路流动;
- 白热激活:发放强的神经元胀大、变白、带辉光 sprite;DAN 奖赏时绿色爆发 (下图右侧果蝇刚获得 r=+1.00 的多巴胺脉冲)。

一个值得一提的工程教训:早期无论怎么调亮度,脑图都又暗又糊。最终发现根源不在渲染, 而在 CSS——画布被一个 88% 不透明 + 4px 背景模糊的半透明面板盖住了。 改为独立子画布渲染后,此前的”参数问题”一夜消失。先排查合成层,再调参数。
6. 关键问题:两脑反应为什么仍然部分相似#
这是当前系统最诚实的一个缺陷。每一步落子,两只蝇的脑活动存在可测的相似成分。
根因#
两只蝇的输入不是各自”看”到的,而是同一个全局函数算出来的: 棋盘状态 → 候选点 → 按”桶”编码成注入电流。这个编码函数对双方完全相同。 个体化(3.3 节)只是给同一信号加了独立噪声与不同码本,信号本身是同一份—— 所以表征空间天然相关。
修复路线:让每只蝇用自己的眼睛看#
- 每蝇独立投影(短期):给每只蝇自己的候选→神经元映射、自己的棋盘坐标系 (两只蝇本来就坐在棋盘两侧,视角旋转 180°)、独立的思考节拍偏移。 预期能显著去相关,工程量一天;
- 视网膜层(中期,核心):为每只蝇构建六角小眼晶格视网膜(约 700 小眼 × 6 感杆), 从它的身体位姿渲染棋盘,经 视叶→蘑菇体 通路进入决策回路。落点不再是”编码进去的”, 而是”视网膜上成像的”——两只蝇看同一棋盘的像素都不同(视角、偏心距、锐度衰减);
- 具身视觉(长期):接入 flygym 一类的身体仿真,视觉输入随头部姿态实时变化, 真正做到”它看到的决定它想的”。
7. 评分器与多巴胺奖赏:学术定位与正确性#
7.1 评分器怎么做的#
外部五子棋评估器是经典棋型引擎(无 GPU、无训练、确定性):
棋型等级:成五(1.0) > 活四(0.86) > 冲四(0.62) > 双活三(0.62) > 活三(0.38) > 眠三(0.18)
Q = max(己方棋型价值, 0.88 × 对方棋型价值) # 0.92 特判:挡住对方即胜手
奖励映射:r = clip((Q − 0.2) × 2.5, −1, +1)
成五/必挡 → +1.0;活三 → +0.45;中立 → 0;废着 → −0.50;终局胜 ±1.0textmax(q_own, q_blk) 的设计使”进攻价值”与”必须防守价值”取大——
这是五子棋引擎里标准的威胁空间(threat-space)启发式。
7.2 学术上怎么定位它#
严格地说,这套系统是外部奖励模型 + 脑内三因子学习的双层结构:
| 组件 | 学术对应物 | 说明 |
|---|---|---|
| 棋型评估器 Q | 奖励模型 / reward shaping | 它不是脑的一部分,是”环境适应度”的可微替代 |
| r = f(Q) | 标量奖赏信号 | 动物实验中的糖水/电击对应物 |
| DAN 广播 | 多巴胺教学信号 | 果蝇嗅觉学习中奖惩信号的生物学对应 |
| 资格痕迹 × 广播 | 三因子规则 | eligibility × neuromodulator 的标准形式 |
| KC 稀疏编码 | 随机特征哈希 | 高维稀疏化 → 信用分配天然局部化 |
| MBON 群体读出 | 线性价值读出 | 群体向量决定行为 |
7.3 已知的偏差(诚实清单)#
0.88防守折扣与0.92必挡特判是手工超参,不是势函数(potential function), 因此不保证 Ng 等人意义下”保持最优策略不变”的 shaping 性质;- 评估器零阶建模对手(不含对手应手搜索),Q 是”这一手”的静态质量而非胜率—— 局末 TD(λ) 回溯(规划中的 L4)会把终局胜负传导回中盘,弥补这一点;
- 每手即时奖励 + 局末 ±1 的混合方案存在时间信用分配问题, 路线图里的 RPE 化(L2:用”实际 Q − 预期 Q”替代绝对 Q 作奖励)是学术上更严格的版本。
结论:作为”果蝇学习的环境信号源”,这套设计是学术上站得住的; 作为棋力评估器它是启发式的。两者在文档中被明确分开,不混为一谈。
8. 对局数据#
一次 67 局连续训练(训练档,含持久化重塑状态)的实测:
| 指标 | 果蝇0(黑) | 果蝇1(白) |
|---|---|---|
| 胜场 | 46 | 21 |
| 胜率 | 68.7% | 31.3% |
| 多巴胺事件 | 1,655 | 1,632 |
| 重塑事件 | 1,645 | 1,621 |
| 被重塑突触(累计) | 3,466,062 | 3,478,482 |
| Σ|Δw| | 85,682 | 71,268 |
| 发放率均值 | 0.69 Hz | 0.067 Hz |
- 两蝇多巴胺事件几乎相等(对局对称,奖惩机会均等),但胜场悬殊—— 说明差异来自可塑性的累积方向,而不是输入机会;
- 发放率均值差一个数量级(0.69 vs 0.067 Hz),两只脑的”性格”已经明显分化;
- 结构 r 0.66–0.92(同底座,正常),波动 r −0.68 ~ −0.11(动态独立);
- 仿真成本:38–52 ms/tick,单步思考约 6.5–9 秒(120 tick 档),无 GPU。

9. 如何部署复现#
参考 flyvis / flygym 等同类项目的分发模式(代码进仓库,数据脚本化获取):
# 1) 环境:Python 3.10+,依赖极轻
pip install numpy scipy pyarrow # 构建/仿真
pip install mujoco # 仅构建身体模型时需要
# 2) 数据(二选一)
# a. 直接使用仓库自带的 flygo_data.npz(MaleCNS 衍生,CC BY 4.0 署名随附)
# b. 从 male-cns.janelia.org 下载 4 张 feather 表,运行:
python prepare_data.py # 构建 npz 仿真包
python build_fly_model.py # 从 flybody 构建 MJCF 身体模型
# 3) 对弈
python server.py # http://127.0.0.1:8765bash打开浏览器即得本文截图中的完整场景。训练档/零训练档分离, 零训练档可随时对比”未经多巴胺学习的原始突触”的行为差异。
10. 许可与二次分发#
| 资产 | 许可证 | 二次分发 |
|---|---|---|
| MaleCNS v1.0 数据(含本项目衍生的 npz) | CC BY 4.0(Janelia FlyEM 等) | ✅ 允许,需署名 + 声明修改 |
| three.js (r128) | MIT | ✅ 需保留版权声明 |
| MuJoCo | Apache-2.0 | ✅ |
| flybody(身体网格/MJCF) | Apache-2.0(DeepMind) | ✅ 需保留声明 |
| 本项目代码 | 待定(建议 Apache-2.0) | — |
署名条目应包含:MaleCNS 连接组的引用文献与发布页(male-cns.janelia.org), 并注明”基于 CC BY 4.0 授权数据修改/衍生”。
11. 路线图#
- L0–L1 感知校准与定位练习(已具备框架)
- L2 RPE 化奖赏(预期差替代绝对分)
- L3 全盘信用分配 + 资格痕迹
- L4 终局 TD(λ) 回溯
- L5 每蝇视网膜 + 具身闭环(解决第 6 节的相似性问题)
- 第三重自主:完全物理交互的拾取与放置
本文所有实验数据来自本地对局实测;项目代码与数据将按第 10 节许可证开源。