fly-plays · MaleCNS v1.0
Whole-Brain Connectome × Reinforcement · 阴性结果结题

果蝇全脑连接组玩 Pong
9 轮诚实迭代的完整记录

用 MaleCNS v1.0 全脑连接组(166,700 神经元 / 2,558 万突触,Janelia & Google 2026-09-03 发布)驱动模拟果蝇玩 Gymnasium Pong。可塑性通路可及行为已证实,但突触级信用分配的 6 种变体全部阴性或破坏性——本项目以诚实的阴性结果结题。

166,700
神经元
25.58M
聚合突触
33.8 ms/tick
仿真延迟(30fps 预算的 1/3)
9
正式迭代轮次
6/6
信用分配变体阴性

01终局判定

预注册判读兑现:off vs winadv 无可测效应;off vs capture 高度显著负效应。三条机制结论是本项目真正的产出。

阳性 · 结论 1

可塑性通路可及行为

visual→DN 33,832 突触的可塑性确实改变行为(v4 首证,首次行为分离)。学习回路是通的,「接线无效」不是瓶颈。

阴性 · 结论 2

突触级信用分配系统失败

dense / 点级 / 均值保持 / 点级+探索 / 窗口反事实 / capture 事件——6 种 trace-gated RPE 变体全部零效应或破坏性。核心病理:败局误差主要由球速造成,trace 却把它记到携带感觉表示的突触头上。惩罚的恰是信号本身。

阴性 · 结论 3

正奖励结构性不可达

冻结算子停泊误差 45–90px,20 局 0 次 capture、404 次 miss。capture shaping 的 +1 奖励事件在行为基线够不到的地方,可塑性输入退化为纯负 RPE → scale 贴界 → 拍子钉墙。先有能触达奖励的基线,shaping 才有意义。

02真实对局回放

以下不是演示动画。每局由真实仿真管线(FlyBrain 全连接组 + Retina 视网膜拓扑编码 + v4 冻结算子解码器 + v9 状态机)逐帧录制。off = 干净基线;capture = v9b 可塑臂(观察「拍子钉墙」病理)。

fly-plays replay
选择对局后按播放 · 逐帧来自真实连接组仿真
我方拍子(脑驱动) 对手拍子 球进我方半场时的追踪误差 err=|pad_y−ball_y|

039 轮迭代时间线

全部数字可溯源到 runs/ 原始文件。R8.5 的基线污染审计是全程最重要的一次自我纠错。

R1
KC→MBON 门控可塑性:占 DN 入权重 0.09%,全幅饱和只推 turn 1.3e-4,零行为影响。靶点注定无效。
R2
换靶 visual→DN:learn-on/off 逐帧完全相同。z 读出对 DN 活动不敏感,「顶死签名」确认读出符号反了。
R2.5
控制实验三连:sign-flip 复现顶死;静止基线 err 41.4 击败可塑臂;解码器混入拍子位置 → 动作 93% LEFT。
R3
冻结算子 A/B 框架:ridge 解码器病态插值(p=1314 共线特征 vs n=223 OOS 帧)。不是信息不在,是拟合方法病了。
R4
双解码器 + 首次行为分离:ball_y OOS R²=1.000——信息一直都在。可塑性确实改变行为,但方向破坏性:败局 dense RPE 全负 → scale 压向下限 → 表示塌缩。25.6M 边表改 CSC 根治 OOM。
R5
均值保持可塑性:3 种子全部 scale 双侧贴界,比 v4 更稳定地坏。机制定位:差分反 Hebb 漂移。
R6
点级反事实 bandit:30 帧无 flip 概率 0.12%,propose 窗口永远凑不满,n_win=0 全线。反事实机制从未被测试。没测成 ≠ 证伪。
R7
窗口掷签 + signbandit:30 帧不间断窗口在 Pong 结构上不可完成。signbandit 出现「第一条正向信号」——后被推翻。
R8
终判:累计窗口机制真实运行仍贴界——突触级信用分配 5 变体正式判死。signbandit 与 off 逐帧一致 = 同 RNG 流的翻转调度,证伪。
R8.5
基线污染审计:v8 的 sign flip 对所有模式生效——off 臂照常随机翻拍。v7 的正向信号与 v8 的证伪是同一 artifact 的两面。对照从没干净过。修复后重跑。
R9
干净 A/B 终判:off vs winadv p=0.43 无可测效应(MDE=12.15px);off vs capture +23.8px 显著变差(p=0.0006)。20 局 0 capture / 404 miss。六变体全阴性。

04方法论教训

比结论更通用的部分。每一条都是花了真金白银的迭代换来的。

01
先排除拟合病理,再下「信息不在」的结论。一次「DN 无垂直信息」的判定被推翻过:p≫n 共线特征的病态插值被误读为信息缺失,多策略混合数据 + on-policy refit 后 R²≈1.0。
02
对照不干净时,正反两面的「证据」都可能是 artifact。v7/v8 的 signbandit 正向信号与证伪是同一 RNG 调度的两面。
03
预注册判读是全程唯一防住「事后择优叙述」的机制。先写判据后跑实验,它兑现了两次(winadv 判死、signbandit 证伪)。
04
没测成 ≠ 证伪。v6 的反事实机制从未运行。诚实记录「没测成」比含糊地报「阴性」更有科学价值。
05
在行为基线够到奖励事件之前,任何 shaping 都是纯惩罚。这是本项目最贵的一课。重启前置路径已预注册:最小可学习任务(单球拦截 binary)+ teacher forcing 校准。

05完整结题报告

全部数字来自 runs/*.json|log 原始文件,终局统计已用 final_stats_check.py 独立复算核实(2026-09-15)。

0. 一句话结论

我们建造了一个 166,700 神经元、2558 万突触的果蝇脑,教会了它一件确定的事:在这个任务设定下,突触级 trace-gated 可塑性的每一种合理变体都学不到任何东西——而且我们精确知道为什么。

阴性不等于失败。9 轮迭代把"为什么学不到"从模糊的怀疑压缩成了三个明确的机制结论(§5),这是本项目真正的产出。


1. 项目背景与立项

2026-09 初,DOOMFLY / Minecraft / Beat Saber 等连接组打游戏 demo 病毒式传播。jonatasperaza 的 Pong 复现审计证明没有一个 demo 真正"学会"——全是刺激-反应硬接线,非习得行为。

Andy 拍板:"那样试试搞" → 全量 166k 复刻 + 诚实可塑性实验:不在接线层面宣称成功,用 learn-on/off A/B 对照说话。

数据与规模

项目 数值 验证方式
神经元 166,700(排除 Glia,superclass 已分配) nodes.parquet
聚合突触 25,582,938 与 DOOMFLY 官方 25.58M 完全一致
光感受器 6,091(R1-R6 3,377 / R7+R8 ~2,700) body-annotations
下行神经元 DN 1,314 body-annotations
运动神经元 815 body-annotations
数据源 Janelia GCS flyem-male-cns/v1.0,3 feather 文件 1.1GB connectome_data/malecns_v1/

仿真核心

  • 全图 rate-based(非脉冲):CSR 稀疏 spmv,leak + tanh,突触符号按前突触递质共识
  • 视网膜拓扑编码器:assignedOlHex1/2 柱坐标 → 真实视网膜拓扑采样(5895/6091 PR 有映射)
  • 运动读出:DN 群体左右差 → turn;多策略混合数据 ridge 解码器 → ball_y/pad_y
  • 可塑性:多巴胺门控 trace-gated RPE,作用于 visual→DN 33,832 突触(CSC searchsorted 全映射)
  • 速度:33.8 ms/tick(p95 34.4),实时 30fps 预算的 1/3

诚实门控(建脑之前先验证接线)

  • G1 结构可达性:PR→DN 6 跳内 1299/1314 ✓
  • G2-D 模式分辨:F=24.2 PASS;G2-L 眼侧转向:左眼 −0.012 / 右眼 +0.016,Δ=0.029(310σ)稳定反号 ✓
  • shuffled 对照被判为错误 gate(真连接组 GABA 抑制让 DN 活动低于随机图——这不是缺陷,是结构)

2. 九轮迭代时间线(全部原始数据可溯源)

R1 — v1:KC→MBON 多巴胺门控可塑性(runs/plasticity_pilot.json)

  • 靶点:KC→MBON 61,210 突触对(仿 DOOMFLY v6)
  • 结果:learn-on/off 全部 0:21 全败,scale 收敛 0.760 后冻结,零行为影响
  • 诊断(diagnose_mb_pathway.py):KC→MBON 仅占 DN 入权重 0.09%,全幅饱和只推 turn 1.3e-4(比眼驱动信号低 200 倍)
  • 判:靶点注定无效——不是可塑性坏了,是根本没接到行为上

R2 — v2:换靶 visual→DN(runs/plasticity_v2.json + train_v2.log)

  • 靶点:visual_projection/centrifugal→DN(~6.8% DN 入权重)
  • 结果:learn-on/off 逐帧完全相同(err 105.4 / react 1.0 / 0:21 × 4 局)——坐实 z 读出对 DN 活动不敏感
  • "顶死签名"确认:err_mean 105.4 + react=1.0 = 拍子恒在墙边

R2.5 — 控制实验三连(signflip / static_baseline / telemetry_aligned)

  • ALE 方向校准:RIGHT=上移(顶墙 y≈36.5),LEFT=下移(底墙 y≈191.5)
  • sign-flip:minus 臂精确复现顶死签名(err 106.1 / pinned 0.68)——顶死 = 读出符号反了
  • 静止基线:NOOP 全程不动 err 41.4 < plus 臂 47.5 → DN 垂直读出当时是负资产
  • 对齐遥测:corr(dy_hat, ball_y)=−0.83 但 corr(dy_hat, pad_y)=−0.76(解码器混入拍子位置)→ 动作 93% LEFT,拍子停泊底部,err≈45 是停泊误差
  • 当时判定:冻结算子路线对垂直控制不可行——此判定后来被 R4 推翻(详见 §5 教训 1)

R3 — v3:冻结算子 A/B 框架(decoder_v3.npz)

  • 设计:ridge decoder 一次 fit,两臂共享,可塑性只能经连接组自身突触起作用
  • 诊断(diagnose_decoder.py):p=1314 共线特征 vs n=223 OOS 帧,lam 太小 → 病态插值(|w|max 7×10⁷)
  • 判:不是信息不在,是拟合方法病了

R4 — v4:双解码器 + 首次行为分离(runs/ab_v4.json, plastic_sanity.log)

  • 重大反转:多策略混合数据(noop+turn+random 池化)+ on-policy refit 后,ball_y OOS R²=1.000、pad_y R²=0.999、dy corr +0.999,预检 err 43.4 ≈ 静止基线 41.4——信息一直都在
  • 首次行为分离(4 局/臂单种子):off err 75.0±13.9 得 3 分;on err 48.6±1.8 0 分,scale 收敛 0.748[0.50,1.00] 后到不动点
  • 可塑性确实改变行为——但方向是破坏性的
  • 破坏机制:败局 dense RPE 几乎全负 → visual→DN scale 全体压向 0.5 下限 → pad_y 表示先塌缩(corr_pad→nan)→ 控制器开环化 → 停泊 err 49.6 永不截球。归因错误:败局 err 增长主要由球速造成,却惩罚了携带感觉表示的突触全体
  • 判:剩余瓶颈是信用分配,不是表示、不是可读出性
  • 工程修复:25.6M 边 Python dict → CSC searchsorted(OOM 根治);dense RPE 块边界越界修复

R5 — v5:均值保持可塑性(runs/ab_v5.json)

  • 改造:mean_preserve(更新后 scale /= mean(scale))+ 负步长减半 + 动作条件化 dense RPE
  • 结果:3 种子全部 err 99.7-100.4、0 分、scale 双侧贴界 [0.50,1.50]——比 v4 更稳定地坏
  • 机制定位:eligibility gate(活动 TOP 30%)选中的恰是信号携带突触 → trace 越大负步越大 → 均值恢复等比抬升未被罚者 = 差分反 Hebb 漂移 → 读数变错号 dy → 拍子钉顶墙 → err 冻结 → RPE 沉默 → 稳定错号平衡态
  • 阴性,但机制定位精确

R6 — v6:点级反事实 bandit(runs/ab_v6.json)

  • 设计缺陷(诚实记录):eps-greedy flip 逐帧掷,30 帧无 flip 概率 0.8³⁰≈0.12% → propose 窗口永远凑不满,n_win=0 全线,反事实机制从未被测试
  • bandit 臂实际 = 点级 RPE + 探索:err 87.6 vs eps0 72.9 vs off 70.3(12 局池化)
  • 没测成 ≠ 证伪——这是本项目诚实原则的第一次自我执行

R7 — v7:窗口起点掷签 + 强制平衡调度(runs/ab_v7.json)

  • winadv 的 30 帧不间断窗口在 Pong 结构上不可完成(球过半场 <30 帧)→ wins=0 → 点级 RPE 第四次复现(err 100.3)
  • signbandit 首条正向信号:err 66.1±4.2 vs off 75.0±13.9,方差小 3 倍——当时判为"第一条正向方向的行为变化"

R8 — v8:终判 + 预注册判读兑现(runs/ab_v8.json)

  • winadv 累计窗口版机制真实运行(n_win≈9/局)但池化 err 70.3 vs off 67.5、scale 贴界——突触级信用分配 5 变体正式判死
  • signbandit 3 种子行为与 off 逐帧完全相同(sign 恒 +1 未翻转)→ v7 正向信号是单局 advantage 短窗混淆(球速主导),证伪
  • 预注册判读全部兑现——先写判据后跑实验,在这轮第一次完整执行

R8.5 — 基线污染审计(scripts/contamination_matrix.py, confirm_flip.py)— 项目最重要的一次自我纠错

  • 发现:v9 干净 off 与 v8 off 同 seed 行为不一致(s100 ep0 0:21/824 vs 0:17/900)。逐层二分定位到 train_v8.py L71 sign flip 对所有模式生效:off 臂的 bandit else 分支照常运行,eps-greedy 20% 选 flip → off 臂随机翻拍动作(ep0 内实测 sign 翻转 3 次)
  • 连带解释:v8 signbandit 与 off "逐帧一致"并非 sign 未翻转,而是同 seed → 同 RNG 流 → 完全相同的翻转调度。v7 的正向信号与 v8 的证伪是同一 artifact 的两面——对照从没干净过
  • 影响范围:v7/v8 全部 A/B 判读无效;v4/v5/v6(无 sign 机制)不受影响
  • 污染矩阵实验(contamination_matrix.py):fresh/reuse 四象限复跑,确认 env/brain 状态复用是第二污染源(first action divergence 仅出现在 reuse 象限)
  • 修复:flip 守卫改为 (learn_syn or sign_learn),重跑干净 A/B

R9 — v9/v9b:干净 A/B 终判(runs/ab_v9b.json, v9c_capture.log, scripts/paired_v9a.py)

设计(预注册): - v9a 跨局配对统计:同 seed 同 ep 配对差分,n=20 对(s100-500 × ep0-3),Wilcoxon + paired t + MDE - v9b capture shaping:触拍瞬间二元 RPE——capture +1 / miss −1 / 对手得分 r=+1 不产生更新(修复 v4-v8 把一半 point-end RPE 错配给对手行为的结构性污染);trace 在 approach 开启时清零(更紧的信用窗口)

终判数据(已独立复算核实):

n 池化 err 我方总得分 scale 终态
off(干净基线) 20 72.7 ± 20.0 14
winadv 20 69.2 ± 6.0 0
capture 20 96.5 ± 13.4 0 [0.50, 1.51] 贴界
  • off vs winadv:paired d −3.50±19.40,CI95 [−12.58, +5.58],p=0.43(t 与 Wilcoxon 一致)——不显著。MDE=12.15px(α=.05, power=.8),即本设计对 <12px 的效应无功效。"可塑性=负效应"既未被证实也未被证伪,是无可测效应(v8 报的 +2.8px"破坏"差值比 CI 下界还小,属噪声)
  • off vs capture:paired d +23.80px,CI95 [+11.60, +36.00],p=0.0006(t)/ 0.0007(Wilcoxon),capture 更差 16/20 局——高度显著的负效应
  • 事件质量:20 局 0 次 capture / 404 次 miss——+1 奖励信号天然稀疏,可塑性实际只见 −1 RPE → 退化为纯惩罚 → scale 贴界 [0.50,1.51] → 拍子钉墙(capture 臂 err 96.5±13.4,5 个 seed 逐 seed 差值 +15.9 ~ +36.6 全部为正)
  • 干净 off 基线:err 72.7±20.0,20 局得 14 分(逐 seed:3/4/1/2/4)——翻拍污染版 v8 off 低估了基线水平
  • 跨进程确定性检查:v9 s100 off 与 v8 s100 off 非逐位一致(预期内——v8 off 本身被污染)

3. 判定总表

迭代 变体 结果 状态
R1 v1 KC→MBON 门控 零行为影响 靶点无效(0.09% 入权重)
R2 v2 visual→DN 冻结 z 读出 逐帧相同 读出不敏感
R2.5 sign-flip / static / telemetry 顶死 = 符号反 控制实验
R3 v3 冻结 ridge 解码器 病态插值 拟合方法问题
R4 v4 dense RPE 破坏性(首次行为分离) 信用分配错误
R5 v5 mean_preserve 破坏性(3 种子贴界) 差分反 Hebb 漂移
R6 v6 点级反事实 n_win=0 未测成 诚实疑点保留
R7 v7 窗口反事实 + signbandit wins=0;signbandit"正向" 后被推翻
R8 v8 累计窗口反事实 破坏性第 5 次 突触级判死
R8.5 v7/v8 基线污染 判读全部作废
R9 v9b capture 二元 RPE +23.8px 显著变差(p=0.0006) 正奖励不可达

突触级 trace-gated RPE 六变体终局:dense / 点级 / 均值保持 / 点级+探索 / 窗口反事实 / capture 事件——全部阴性或破坏性。


4. 数据资产清单(归档内容)

~/fly-plays/  (1.6G)
├── connectome_data/malecns_v1/   1.1G  Janelia GCS 官方 3 feather(可重下)
├── models/                        83M  edges.npz (25.58M 突触) + nodes.parquet
│                                       (166,700 神经元) + decoder_v3/v4.npz
├── src/          30 py           仿真核心 + 9 代 train_v*.py + 7 门控测试
├── scripts/      30 py           审计/二分/配对统计/确定性探针
├── runs/        2.3M             47 个原始数据文件(9 轮全部 JSON/log/npy)
├── REPORT.md                     本报告
└── .venv         422M            可重建(pyarrow/pandas/numpy/scipy/gymnasium/ale-py)

关键数据文件:ab_v4..v9b.json(各轮 A/B)、paired_v9a.py(终局配对统计)、final_stats_check.py(独立复算)、contam_matrix.log(污染审计)、signflip/static_baseline/telemetry_aligned.json(控制实验三连)。


5. 三条机制结论(本项目的真正产出)

结论 1:可塑性通路可及行为(阳性结果)。 visual→DN 33,832 突触的可塑性确实改变行为(v4 首证)。学习回路是通的,"接线无效"不是瓶颈。

结论 2:突触级 trace-gated RPE 的信用分配在本任务上系统失败(六变体全阴性)。 dense / 点级 / 均值保持 / 点级+探索 / 窗口反事实 / capture 事件,六种变体要么零效应要么破坏性。核心病理:败局的误差增长主要由球速/方向造成,trace-gated 资格迹却把它记到携带感觉表示的突触头上——惩罚的恰是信号本身。均值保持改造会进一步演化为差分反 Hebb 漂移(v5 机制定位)。

结论 3:正奖励在本设定下结构性不可达,shaping 退化为纯惩罚(v9b 终判)。 冻结算子的停泊误差(err≈45-90px)意味着拍子从不截球——20 局 0 次 capture、404 次 miss。capture shaping 的 +1 奖励事件在行为基线够不到的地方,可塑性输入退化为纯负 RPE → scale 贴界 → 拍子钉墙 → 更差。这不是奖励设计问题,是层级错位:必须先有能触达奖励事件的行为基线,shaping 才有意义。

方法论教训(比结论更通用)

  1. 一次"信息不存在"的判定被推翻过一次(R2.5 → R4):病态插值(p≫n 共线特征)曾被误判为"DN 无垂直信息"。多策略混合数据 + on-policy refit 后 R²≈1.0。先排除拟合病理,再下"信息不在"的结论。
  2. v7/v8 的 signbandit 正向信号是同一 RNG artifact 的两面:同 seed → 同翻转调度 → off 与实验臂逐帧一致被误读成"sign 无影响";短窗 advantage 被球速污染。对照不干净时,正反两面的"证据"都可能是 artifact。
  3. 预注册判读从 v8 起强制执行(先写判据,跑完再读数)——它兑现了两次(winadv 判死、signbandit 证伪),是全程唯一防住"事后择优叙述"的机制。
  4. 没测成 ≠ 证伪(v6 反事实从未运行)——诚实记录"没测成"比含糊地报"阴性"更有科学价值。
  5. 工程陷阱存档:Hermes 后台 worker 4GB 内存硬 cap(>4G 任务需 systemd-run --user --scope --property MemoryMax=6G 绕开);25.6M 边表禁用 Python dict(CSC searchsorted);A/B 管道 tee 会被会话回收杀进程(用 nohup+重定向);ALE 侧 Pong RIGHT=上移/LEFT=下移需 calib 校准而非想当然。

6. 结题处置

  • 本报告 + 全部原始 runs 数据 + 全部源码(src/ 30 文件、scripts/ 30 文件、共 ~5,400 行)保留于 ~/fly-plays/
  • git 快照归档(排除 .venv 与 1.1G 连接组原始数据——后者可从 Janelia GCS 重下)
  • Wiki:项目页结题块 + 本 session 归档
  • 参考与致谢:MaleCNS v1.0(Janelia/Google)、DOOMFLY(github.com/nftechie/doomfly,其 v6 失败自曝是本项目诚实原则的模板)、jonatasperaza 的 Pong 复现审计(立项依据)

如果未来重启,wiki 已预注册两条前置路径:(a) 最小可学习任务(单球拦截 binary,先证明 capture 通路可触发);(b) teacher forcing 校准。在行为基线够到奖励事件之前,任何 shaping 都是纯惩罚——这是本项目最贵的一课。