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 才有意义。
方法论教训(比结论更通用)
- 一次"信息不存在"的判定被推翻过一次(R2.5 → R4):病态插值(p≫n 共线特征)曾被误判为"DN 无垂直信息"。多策略混合数据 + on-policy refit 后 R²≈1.0。先排除拟合病理,再下"信息不在"的结论。
- v7/v8 的 signbandit 正向信号是同一 RNG artifact 的两面:同 seed → 同翻转调度 → off 与实验臂逐帧一致被误读成"sign 无影响";短窗 advantage 被球速污染。对照不干净时,正反两面的"证据"都可能是 artifact。
- 预注册判读从 v8 起强制执行(先写判据,跑完再读数)——它兑现了两次(winadv 判死、signbandit 证伪),是全程唯一防住"事后择优叙述"的机制。
- 没测成 ≠ 证伪(v6 反事实从未运行)——诚实记录"没测成"比含糊地报"阴性"更有科学价值。
- 工程陷阱存档: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 都是纯惩罚——这是本项目最贵的一课。