创新工场 / 开发说明

苍蝇拍来的那一刻

苍蝇拍压下来的那一秒,果蝇大脑里发生了什么。52,496 个真实神经元的逐帧回放:复眼上的暗斑、层层传下去的信号,以及巨纤维发出的逃生指令。

开始玩

作品简介与玩法

《苍蝇拍来的那一刻》不是游戏,是一次真实仿真的逐帧回放。一只果蝇停着不动,苍蝇拍压下来,页面同时给出三样东西:拍子在视野里变大的过程、果蝇复眼上 2,181 个小眼的明暗变化,以及大脑里从 lamina 到巨纤维逐层的反应。

三个按钮切换三种情况——拍子压下来、什么都不动、拍子收回去;进度条可以逐帧拖动,暂停后细看任意时刻。没有人告诉这些神经元“拍子来了”,它们收到的只有每个小眼的亮度。

依据:swatter/index.html、swatter/data/swatter.json。

制作工具与技术栈

  • 数据:MaleCNS v1.0,雄性果蝇完整中枢连接组(Berg 等,Cell 2026,CC-BY 4.0)。从 Google Cloud 公开下载,无需登录。
  • 仿真:Python + NumPy + SciPy 稀疏矩阵,在 Mac 本地运行;神经元参数取自 Shiu 等(Nature 2024)。
  • 页面:原生 JavaScript + Canvas,无框架、无构建步骤、无外部脚本;字体用 Google Fonts,数据单独放在 data/swatter.json。
  • 编排:Claude Code 负责下载数据、建模、调试失败、录制回放与制作页面。

制作步骤

这是真实的制作过程,包含四次失败。

  1. 把视网膜接进去。数据里每个视叶神经元带有六边形视柱坐标,2,181 个光感受器可由连接反推出自己的视柱。明暗直接打在光感受器上,不挑选任何“特征神经元”。
  2. 第一次失败:脉冲模型在第一个突触就断了。光感受器放电 50.5 Hz,L1、Mi1、T4、T5 全是 0。原因是光感受器释放的组胺是抑制性递质,而真实的 L1、L2 静息时处于去极化状态,靠“被压下去”传信号——脉冲模型里一个从不放电的神经元,再抑制也还是零。
  3. 第二、三次失败:方向选择性恒为 0。换成连续膜电位后信号通了,但统一时间常数让系统变成线性的,而线性系统对移动光栅的平均响应必然与方向无关。加上分类时间常数后仍为 0,查出是我自己的问题:静息基线让网络始终停在正值区间,整流从未生效。
  4. 第四次失败:非死即爆。让信号真正跨越零点后,网络要么下游全部归零,要么正反馈失控(Mi1 冲到 1043)。缺的是增益控制。
  5. 混合模型成功。按生理学分界:47,448 个不放电的神经元(lamina、medulla)用连续电位加 tanh 饱和,5,048 个会放电的(视觉投射、中枢、下行)用漏积分发放模型,步长 0.1 毫秒。两层之间用泊松发放率衔接。逼近时 DNp01 是静止时的 3.12 倍。
  6. 录制回放。三种情况各跑 3 秒脑时间,前 1 秒为静息基线,每 50 毫秒记一帧,存成 JSON 供页面播放。
# 本地查看
cd swatter && python3 -m http.server 8000

关键实现要点

  • 页面不跑仿真。一秒脑时间在 Mac 上要算几十秒,所以页面播放的是录好的数据。每一帧的数值都来自 data/swatter.json,可逐条核对。
  • 复眼是真坐标。2,181 个小眼的位置直接用数据里的视柱坐标,经标准化后映射到画布;某个小眼变暗,是因为它在仿真里确实落进了暗斑范围。
  • 性能上踩过一个坑。初版在每个六边形里调用 getComputedStyle 读颜色,每帧触发 2,181 次样式重算,页面卡顿。改为主题色只读一次、并把小眼合并成两条 Path2D 一次性填充后,每帧绘制从卡顿降到 1.75 毫秒,稳定 61 fps。
  • 切到后台自动暂停。用 requestAnimationFrame 驱动并检查 document.hidden,标签页不可见时不做无用绘制。

依据:swatter/index.html 中的 draw() 与 boot()。

局限说明

  • 它不会躲。把这套大脑接进闭环竞技场后,500 帧里有 192 帧撞在障碍上。检测得到威胁,不等于能操控身体避开。
  • 转向神经元不放电。DNa01 与 DNa02 全程 0 Hz。它们由中央复合体驱动,而那需要自身运动信息,本实验没有提供。
  • 两个参数是人定的。分级层增益 2.0、分级转脉冲的平均 30 Hz。换成 80 Hz 时所有条件都饱和到 150 Hz 左右,选择性消失。连接组不提供这两个值。
  • “拍子收回去”这条对照不干净。它从静息的小点直接跳到最大再缩小,跳变本身就是强刺激,前半段的高反应不能算数。这条保留展示,但不作为证据。
  • 结论是模型预测,没有湿实验验证;模型不含电突触、神经调质与可塑性。

给 AI 的需求示例

下面是这个作品在建模阶段的核心要求,可以照着改成自己的实验。

用 MaleCNS v1.0 连接组做视觉通路仿真,要求:
1. 输入只打在光感受器上,按真实视柱坐标决定每个光感受器收到的明暗,
   不许挑选“特征神经元”,也不许写任何“看见什么就该怎样”的规则。
2. 按生理学分界建模:不放电的神经元用连续电位 + tanh 饱和,
   会放电的用漏积分发放(阈值 −45 mV、复位 −52 mV、不应期 2.2 ms)。
3. 时间常数按细胞类型给:快通路 20–35 ms,慢通路 150–250 ms。
4. 判据先写死:DNp01 在逼近条件下必须显著高于静止条件,否则算失败。
5. 失败的过程要如实记录,不许调参调到好看为止。

小练习

打开 data/swatter.json,把 loom 与 static 两组的 LC4 数列取出来,找到二者开始分离的那一帧,记下它的 t 和 rad。再对照 DNp01:它比 LC4 晚多少毫秒才拉开差距?想一想,这个延迟是通路上多了一级突触造成的,还是巨纤维本身的阈值造成的——并说说你打算用什么实验来区分这两种可能。