English interface selected · this article is currently written in Chinese.
它会学习,但随机连线反而更好:果蝇和蚁群的觅食实验
English overview →配合仿真与实验探针的假设探索,等待更多证据或边界检验。
数字花园
🌿 什么是数字花园与思想演进?
遵循 Maggie Appleton 与 Andy Matuschak 的常青笔记理念:这里不是按时间沉底的流水账,而是持续修剪打磨的知识生态。文章按成熟度经历:
- 🌱 萌芽 (Seedling): 发散灵感、读书摘录、开放猜想
- 🌿 演进 (Budding): 结构渐明、初步代码推导、积极修正
- 🌳 常青 (Evergreen): 逻辑闭环、持久经得起检验的基石
- 🔬 实验待证 (Speculative): 结合沙盒与仿真探针的理论探索
项目代码与全部实验记录:https://github.com/meiluosi/fly-connectome-study
可以玩的版本:交互页面(发布时把这里换成可分享的链接)
把真实的蘑菇体放进一个虚拟世界找吃的,旁边放一群蚂蚁一起比。页面上可以换大脑、换通信方式、立即反转奖励,甚至“损毁”某几个神经元。
结论:它会学,在会变的世界里比不学习多赚很多;但真实连线没有显出特殊之处,随机稀疏连线反而更好。
1. 实验设计:世界与奖励反转
一个 100×100 的平面里放 6 个食物源,分成两个气味家族,A 家族三个(A、A′、A″),B 家族三个。变体和原型共享 6 个嗅觉小球里的 4 个,所以它们“闻起来像”。气味向外按指数衰减,果蝇用左右两根触角比较浓度,然后转向。
奖励故意设计成会变:吃到好的 +1,吃到坏的 −1。跑到第 3000 步(共 6000 步)的时候,所有家族的奖励同时反转,原来好吃的变成有害,反过来也一样。
世界有两种:
- 相似气味同奖励:A 家族大家同号,B 家族相反。学到 A 好,闻到 A′ 也该觉得好,泛化是有用的。
- 相似气味奖励相反:A 和 A′ 符号相反。光靠“长得像”会学错,泛化反而有害。
这两种放在一起,是想看学习器到底是在泛化,还是只是在死记。
2. 参与者:三个主角和对照
果蝇用的是第 1 篇讲过的回路:气味激活小球,经过真实的小球→KC 连线变成稀疏编码,再经 KC→MBON 读出一个价值,吃到东西后用预测误差更新。价值变成行动的规则是手写的:转向的力度与(先天吸引 + 学到的价值)成正比。
蚁群不会闻气味。蚂蚁在一个网格上走,找到食物就带回巢,路上留信息素,后来的蚂蚁倾向于走信息素浓的地方。碰到有害的食物,扣分并被送回巢。
对照:打乱连线、随机稀疏连线、线性学习器,还有一个什么都不学的果蝇。
读结果时要注意两点:
- 记账不对等。 果蝇吃到就拿分,蚂蚁要把食物搬回巢才算分,对蚂蚁不利;蚂蚁的规则也是手写的。蚁群在这里是并排演示,不是严格的对手。
- 先天成分不赚分。 果蝇的转向里有一个手写的、趋向气味的先天成分;“不学习”的果蝇净奖励只有 +0.5,说明赚到的分要靠学。
所有参数都在单独的“调参世界”上选好,测试用的是全新的世界。
3. 单只果蝇:结果与可信度
结果
200 个新世界、6000 步的平均净奖励:
| 大脑 | 相似气味同奖励 | 相似气味奖励相反 |
|---|---|---|
| 真实连线 | +44.0 | +35.9 |
| 打乱连线 | +44.4 | +32.4 |
| 随机稀疏连线 | +50.9 | +44.1 |
| 线性学习器 | +46.2 | +31.5 |
| 不学习 | +0.5 | +0.9 |
几条读法:
- 会学:真实连线比不学习多赚 35 到 44。哪怕奖励中途整个反转,它也能重新学过来。
- 真实 ≈ 打乱:把每个 KC 接哪几个小球随机换掉,成绩几乎不变(−0.4,区间 [−3.6, +2.8])。
- 随机稀疏更好:多 6.9 到 8.3,两种世界里都是,区间都在 0 的一侧。
- 线性学习器也不差:在“相似气味同奖励”的世界里和蘑菇体差不多,在“相反”的世界里略差(真实比它好 +4.3)。
蘑菇体的稀疏扩展没有让它在“泛化有用”的世界里明显占优,只在“泛化有害”的世界里略稳一些,幅度不大。
排除实现假象:随机连线真的更好吗?
随机稀疏连线下,每个 KC 的输入分数只可能是 0 到 6 的整数,截止线上约有 152 个 KC 并列(真实连线约 10 个)。argpartition 在并列时的选择是实现细节,若偏向某些索引,随机连线就会占便宜。
排查:被选中的索引平均在 990 左右,前半部分占 51%,看不出偏向。仍改成显式随机打破(加极小的随机抖动)并全部重跑,随机稀疏仍然更好。
另一个候选解释是“真实连线的输入强度参差不齐”。对照:保留真实拓扑、把所有突触数置 1,结果比真实连线略好(+3.3,区间 [+0.1, +6.4] 和 [−0.1, +6.7]),不确定,只算未证实的线索。
4. 果蝇群:通信方式与结果
四种通信方式,用大白话讲
先说清楚一件事:真实的果蝇不会互相“传话”。这里的“通信”是我设计的几种让同伴影响彼此的假设,用来看信息共享有多大价值。
接下来让 20 只果蝇同时在一个世界里觅食。每只有自己的蘑菇体,各自学各自的,但吃的是同一批食物:一个食物源被吃过之后 30 步内不再给奖励,所以大家会互相抢。四种方式的区别,只在于“别的果蝇吃到东西,对我有没有影响”:
| 方式 | 大白话 | 具体怎么做 | 是不是真实的生物行为 |
|---|---|---|---|
| 独立 | 20 个互不认识的人,各自摸索 | 每只果蝇只从自己吃到的东西里学 | 是(最接近真实) |
| 聚在一起 | 跟着人群走,但不交换任何信息 | 选方向时,除了气味,还会被同伴所在的方向吸引;只影响走位,不影响学习 | 我写的假设 |
| 观察学习 | 看到邻居吃到好东西,我也跟着学一点 | 一只果蝇吃到东西时,20 个距离单位以内的果蝇,用自己学习强度的一半更新蘑菇体,好像自己也吃了一口 | 我写的假设 |
| 广播 | 20 个人共用一本笔记,谁吃到都记在同一本上 | 任何一只吃到,所有 20 只都用一半的强度学一遍,不管距离 | 不是生物做法,只是共享信息的上限 |
蚁群是另一种思路:蚂蚁不交换学到的东西,而是在路上留下信息素,后来的蚂蚁闻着走。
结果
100 个新世界,相似气味同奖励的世界里,20 只的总净奖励:
| 群体 | 总量 | 每只 |
|---|---|---|
| 独立 | +274.2 | +13.7 |
| 手写:聚在一起 | +211.0 | +10.5 |
| 观察学习 | +353.5 | +17.7 |
| 广播 | +411.6 | +20.6 |
| 蚁群 | +187.9 | +9.4 |
| 单只果蝇 | +42.9 | +42.9 |
- 共享信息越多越好:观察学习比独立多 +79.3,广播又比观察学习多 +58.1。我的解释(没有单独检验过)是:食物源很少,一只果蝇自己撞到一次食物要花很久,奖励反转之后,要重新学一遍;如果邻居吃到的经验也算自己的,大家重新学会的速度就快得多。
- 聚在一起反而有害(−63.2):这种方式只让大家靠拢,没有给任何信息,结果大家挤到同一个食物源附近,互相抢,而被吃过的食物源 30 步内没有奖励。
- 独立的果蝇群总量高于蚁群(+86.3,区间 [+78.0, +94.3]),但前面说了,蚂蚁在记账上吃亏,这个数字别拿来当“果蝇赢了蚂蚁”。
- 拥挤是真实的成本:独立模式下,一只果蝇平均赚 41.7;5 只时每只 32.9,20 只时每只只剩 13.8,到 40 只时每只 6.7,总量甚至从 275.6 掉到 267.6。人多不等于总量成比例增加。
5. 可信度与边界
- 数字来源: 页面上的“实测数据”都来自先登记后运行的 200 个新世界(果蝇群为 100 个)。网页模拟是 Python 版的逐行移植,在 Node 里通过 37 项检查,统计上与 Python 的 200 个世界一致(真实连线 44.1 对 44.0,不学习 0.6 对 0.5);两边随机数不同,只比统计量。
- 探索性数字要重跑: 最早 20 个世界里“真实连线略强”的迹象,在重跑中消失(同一批世界仅因智能体随机数不同,净奖励波动约 5)。
- 结论的边界: “随机稀疏更好”只说明在这个模型和任务里,这套真实连线编码没有优势;不能说明真实蘑菇体次优,因为这里没有建模效价专门化的隔间、多巴胺的时序和更真实的气味统计。
6. 下一篇
第 4 篇:持续学习审计。
文件位置:fly-foraging/forage.py(世界、果蝇、蚁群)、fly-foraging/swarm.py(果蝇群)、fly-foraging/RESULTS_forage_eval.md、RESULTS_swarm_eval.md、web/(交互页面)。图由 blog/figures/make_figures.py 生成。
文章概念网络
从章节进入正文概念。实线表示所属层级,虚线连接跨章节重复出现的概念,不代表因果关系。
35 / 54 个节点 · 正文标记术语与关键词概念
它会学习,但随机连线反而更好:果蝇和蚁群的觅食实验
回到原文 ↗最后更新于 2026-10-21
引用本文
@article{2026-10-21-fly-connectome-03-foraging-and-swarm,
author = {枫语},
title = {它会学习,但随机连线反而更好:果蝇和蚁群的觅食实验},
journal = {枫语},
year = {2026},
month = {oct},
url = {https://meiluosi.github.io/posts/2026-10-21-fly-connectome-03-foraging-and-swarm/}
}