即使在芝麻粒大小的果蝇脑袋里,信号也沿着固定的路线前进。触角和复眼把世界变成电信号,神经把这些信号整理后传送出去,大脑则察觉到“这是食物”“有危险”。而这些判断的规则并不是谁事先规定好的,而是通过经验学来的。沿着这条路走下去,人工神经网络如何从超简单模型成长为多层深度学习,就会自然而然地呈现在眼前。
人脑太大,计算机里的神经网络又太抽象。果蝇的大小恰好介于两者之间。从感觉器官到行为的整条通路一目了然,而且这条通路上的每一个神经元都可以真正地打开、关闭来做实验。
2024年,包含果蝇全脑神经元及其连接的接线图(连接组)绘制完成。用神经网络来比喻,就相当于可以完整地看到模型的结构和连接。
闻到气味就靠近,看到逼近的阴影就起飞。感觉 → 神经 → 大脑 → 行为的路径很短,很适合一步一步地追踪。
利用遗传工具,可以让特定神经元停止工作。这就像在神经网络里删掉一个单元,看看性能会如何变化的实验。
光是光子,气味是分子,声音是空气的振动,味道是溶于水的物质。它们都是不同种类的刺激,但到达大脑时,全都变成了同一种形式——神经元膜上的电压变化和电脉冲(脉冲,spike)。
受光照的分子改变形状,这种变化打开离子通道,从而改变细胞的电压。
气味分子与受体结合后,离子进出使电压升高,一旦超过阈值就发放脉冲。
触角末端一振动,里面的机械感觉神经元就被拉伸,产生电信号。
果蝇用腿也能尝味道。碰到糖或苦味物质时,味觉神经元就会发出电信号。
也有例外。像复眼的光感受器这样只在短距离内传送信号的神经元,不发放脉冲,而是让电压连续地升降来传递信息。选择“光”来看看其中的区别吧。
就像用荧光染色拍摄的显微照片一样,用点来表示大脑的各个区域。粉色点是神经组织,红色点是感觉器官,绿光是正在流动的信号。这是示意模型,并非真实的解剖数据。各区域的前后、左右关系是准确的,但大小和形状做了简化。
果蝇的四个阶段与神经网络的基本结构一一对应。下面阶梯上的所有模型,讲的都是在这个框架内层数逐渐增加的故事。
触角的嗅觉受体神经元对气味分子作出反应,复眼的小眼对光作出反应。反应强度就是数字。
触角叶和视板汇集传入的信号,调整强度,并把它们变成“变亮”“变暗”这样便于使用的形式。
蘑菇体、侧角和小叶从中提取出“这种气味是食物”“这个阴影是逼近的天敌”之类的含义。
靠近、躲开,还是起飞?比较多个信号的分数,胜出的那一个就成为行为。
让计算机做事有两种方法:由人一条一条地写好规则(基于规则),或者只给出例子和结果,让它自己找出规则(基于学习)。深度学习属于第二种,而果蝇的大脑里两种方法都有。
规则一目了然,容易理解。但必须事先知道世界上的所有情况,环境一变,写规则的一方就得亲自修改。遇到规则里没有的情况,就束手无策了。
在果蝇中:侧角的先天反应。写下规则的是进化,一只果蝇一辈子都改不了这些规则。
不直接写规则,而是按照“预测错了多少”来修改权重。反复这样做,规则就会自然而然地出现在权重里。即使环境变了,也能重新学习。
在果蝇中:蘑菇体。当惩罚或奖励到来时,多巴胺神经元发出信号,改变 Kenyon 细胞 → 输出神经元的连接。这个信号是否像“结果 − 预测”那样计算预测误差,目前仍在研究中;这里为了便于理解,简化成了预测误差规则。
两只果蝇一开始都喜欢果香 A。但在这个房间里,A 那边有电击,B 那边有糖。左边的果蝇只按规则行动,右边的果蝇则根据结果来学习。点击“改变环境”,换一换危险的一侧吧。
右边那只果蝇的“规则”并没有以文字的形式写在任何地方,它的全部只是两个“靠近值”,也就是两个权重。深度学习模型也一样:几百万、几十亿个权重本身就是规则,所以性能虽好,却很难用人类的语言说出“为什么这样判断”。基于规则容易解释,基于学习容易适应。果蝇把两者结合起来:遇到第一次见的情况时靠先天规则撑住,积累经验后再用学到的规则加以修正。
每往上爬一级,就多一种能在果蝇身上看到的能力。在每一级亲手操作模型,遇到这个模型解决不了的问题后,再进入下一级。
模型:y = w × x果蝇:回避二氧化碳
果蝇的触角上有专门只感知二氧化碳的感觉神经元。这个信号汇聚到触角叶的一个嗅小球,果蝇不用学习就会躲开二氧化碳。这里把这条通路大大简化为“一个传感器 → 一个连接 → 行为”来看。
这是最小的模型:输入 x 乘以权重 w,结果超过阈值 θ 就输出 1,否则输出 0。权重表示“对这个输入听得有多认真”,阈值表示“有多容易作出反应”。
在这个模型里,“学习”就是把 w 和 θ 调到合适的值。果蝇生来就带着经过进化调好的这些值。w 调大,淡淡的二氧化碳也会让它逃走;w 调小,浓度很高时才会逃。
局限也很明显:这个模型只看一个输入。果蝇实际面对的问题,比如“果香和醋味一起飘来,能不能吃?”这种需要同时权衡多个信号的问题,它就解决不了。所以要增加输入。
模型:y = σ(w₁x₁ + w₂x₂ + b)果蝇:判断食物气味
熟透的水果会同时散发果香(酯类)和醋味(乙酸)。假设一个神经元接收两个嗅小球的信号,来判断“这是不是食物的气味”。它给两个信号不同的分量,相加后再作判断。
把多个输入各自乘以权重后相加,再加上偏置 b,然后用 Sigmoid 函数 σ 转换为 0~1 之间的概率。这个模型能画出的边界,只是右侧平面上的一条直线。
选择“困难问题”来训练看看。真实的果蝇会靠近淡淡的醋味,却会躲开太浓的醋味。食物区域变成了两条线之间的带状,而一条直线没法把这条带切出来。无论学多久,准确率都会停在某个水平上。这就是必须进入下一级的原因。
模型:输入 2 → 隐藏 H → 输出 1果蝇:蘑菇体回路
触角叶的信号会扩散到蘑菇体的几千个 Kenyon 细胞。每个 Kenyon 细胞挑选几个嗅小球接收信号,对自己独有的“气味组合”作出反应。输出神经元汇总这些反应,决定是靠近还是躲开。学习主要发生在 Kenyon 细胞 → 输出神经元的连接上。
在输入和输出之间插入一个“隐藏层”。每个隐藏神经元在平面上各画一条线,输出神经元把这些线组合起来,就能做出弯曲的或带状的边界。这就是多层感知机(MLP)。
提前看过考题再复习的学生,就算那次考试拿了 100 分,也证明不了真实水平。模型也一样。所以要把数据分成两份:只用训练数据(实心点)来修改权重,用学习中从未用过的验证数据(空心点)来评分。真正的实力看验证分数。
防止过拟合的常见方法有:增加数据;在验证损失重新开始上升时停止学习(早停);不要把模型做得比需要的更大。果蝇也会遇到类似的问题:为了不把一次偶然的经历过度泛化,需要经过反复训练才能形成持久的记忆。在实际的深度学习中,除了验证数据,有时还会另外留出一份只在最后使用一次的测试数据。
这是一种把输出端产生的误差,按照“是谁的责任”反向分配下去的计算。与输出神经元连接越强的隐藏神经元,以及当时被激活得越强的隐藏神经元,承担的责任就越大。责任确定后,连同输入 → 隐藏的连接也一起修改。
果蝇不做这种反向分配。通向 Kenyon 细胞的连接几乎是随机确定的,而且不会改变;多巴胺只修改最后一段连接(Kenyon 细胞 → 输出神经元)。选择“果蝇方式”试试:隐藏神经元少时效果不好,但把数量增加到 30~60 个,仅凭随机的线也能把带状区域切出来。由此可以推想,果蝇为什么要拥有约2,000个 Kenyon 细胞。
模型:像卷积神经网络一样层层堆叠果蝇:复眼 → 视板 → 髓质 → 小叶 → 巨纤维
苍蝇拍一逼近,果蝇转眼就飞走了。复眼的小眼测量亮度,视板区分变亮与变暗,髓质和小叶板中的 T4·T5 神经元计算运动方向,小叶的 LPLC2 神经元察觉“向四面八方扩散的运动”,也就是正在逼近的物体。这个信号经过巨纤维神经元,变成起跳行为。
这与卷积神经网络(CNN)的结构相同。每一层都只看一个小区域,并在所有位置重复同样的计算(权重共享);层次越高,看到的范围越大,特征也越复杂。亮度 → 亮度变化 → 运动方向 → 逼近。每一层都很简单,堆叠起来却能做出困难的判断。
这是为了讲解而简化的计算模型。小眼数量从约800个减少到169个,运动方向直接由物体边缘的速度算出。真实的 T4·T5 神经元是通过比较相邻小眼信号的时间差来判断方向的。
很难写出一条规则,直接从小眼的亮度值一步判断出“逼近的物体”。因为物体可能是暗的也可能是亮的,可能在右边也可能在左边。于是把问题拆成简单的小块,每一层负责一块。
“从旁边经过的物体”一侧边缘向外移动,另一侧却向内移动,无法同时满足四个方向。所以即使它又大又快,果蝇也不会起跳。从照片中认出猫的 CNN 也是这样,按线条 → 边角 → 局部 → 整体形状一层层堆叠起来的。
点击按钮,切换六种结构的示意图。绿线是会被学习的连接,虚线是固定的连接,橙色箭头是跨越时间的记忆。所有示意图都只是展示原理的简图。
灰色条 = 全部连接,彩色条 = 可学习连接。深度学习模型的连接全部参与学习,果蝇模型则大部分是固定连接。下面的训练器和公共部分 A 的代码 2 统计的是同样的数字。
最后一行的证据等级:真实回路·测量 模型照搬了真实回路 · 结构相似 指连接形态相似,并不能证明在做同样的计算 · 宽松的类比 · 纯粹的比喻 只是帮助说明的说法,没有生物学依据。
特别篇①页面中的阶梯(超简单 → 多层)讲的是 MLP 和 CNN 那一路。果蝇方式则在旁边给出了另一种答案:“隐藏层即使不学习,只要做得又宽又稀疏,效果也相当不错。”在机器学习中,随机特征、极限学习机(ELM)、储备池计算都是同样的思路。果蝇大脑里也有像 RNN·LSTM 那样处理时间的回路(中央复合体),但本页的模型属于一次性作出判断的那一类。
像 Teachable Machine 一样,用示例走一遍这个过程:① 为每个类别收集示例图,② 进行训练,③ 用从没见过的图来检验。用同样的图像数据,并排训练了果蝇方式(只训练输出层)和深度学习 MLP(训练所有层)。这些图是加入抖动、仿佛手绘的 16×16 图像。
每个类别制作 30 张图,24 张用于训练,6 张(共 18 张)用于验证。训练过程中从不展示验证图。
绿色 = 果蝇方式 · 蓝色 = MLP · 虚线 = 训练准确率,实线 = 验证准确率
| 圆圈 | 叉号 | 横线 | |
|---|---|---|---|
| 圆圈 | 4 | 2 | 0 |
| 叉号 | 0 | 6 | 0 |
| 横线 | 0 | 1 | 5 |
| 圆圈 | 叉号 | 横线 | |
|---|---|---|---|
| 圆圈 | 4 | 2 | 0 |
| 叉号 | 0 | 6 | 0 |
| 横线 | 0 | 0 | 6 |
两个模型在训练图上都达到了 100% 正确,但在验证图上,果蝇方式为 83%,MLP 为 89%。这个差距(训练与验证之间的落差)反映了过拟合的程度。果蝇方式的可学习连接只有 MLP 的约 36%,验证准确率却并没有落后太多。两个模型都把 6 张验证用圆圈图中的 2 张认成了叉号(见下方混淆矩阵)。每个类别只有 24 张训练图时,就会出现这样的错误。想用自己画的图试一试,就在 Colab 中运行公共部分 A 的代码 2。
建立类别 → 收集示例 → 训练 → 对新输入做出判断,流程完全一样。
Teachable Machine 是在大型图像模型(MobileNet)预先学好的特征之上,只训练一个小分类器(迁移学习)。本例则让两个模型从零开始学习 16×16 的图画。因此它适合简单的形状,不适合照片这类复杂的输入。
级别越高,模型的连接越多,能画出的边界越复杂,能识别的含义也越深。果蝇的感觉 → 神经 → 大脑 → 行为,把所有这些阶段集于一身。
| 级别 | 模型结构 | 果蝇的例子 | 新获得的能力 | 仍存在的局限 |
|---|---|---|---|---|
| ① 超简单 | 1 个输入 → 1 个输出 y = 阈值(w·x) | 二氧化碳 → 回避 | 信号强就做出反应 | 只看一个输入 |
| ② 简单 | 多个输入 → 1 个神经元 感知机 | 果香 + 醋味 → 判断是否为食物 | 权衡多个信号,根据误差学习 | 只有一条直的边界线 |
| ③ 一般 | 输入 → 隐藏层 → 输出 多层感知机 | 触角叶 → 蘑菇体 → 输出神经元 | 弯曲、带状的边界,识别组合 | 输入又大又复杂时,需要极多的隐藏神经元 |
| ④ 多层 | 堆叠许多层 类似卷积神经网络 | 复眼 → 视板 → 髓质 → 小叶 → 巨纤维 | 层层叠加简单特征,识别出“正在逼近”这样的含义 | 层越深,训练所需的数据和计算越多 |
通过学习而改变的值。抑制性突触对应负权重。
必须越过阈值才会发出信号。正是这个“拐点”让堆叠多层变得有意义。
告诉系统哪里错了。果蝇不是逐层反向传递,而是直接洒向特定的连接。
整个大脑的接线图。谁和谁连接、连接有多强,本身就是模型的结构。
下一页:揭示蘑菇体(学习)与侧角(本能)的信号究竟在哪里汇合的论文——Dolan 等(2018)Neuron 图解。
第三页:用真实的果蝇接线图整体运行、驱动 Minecraft 生物的项目,并与前两页做比较——Minecraft 里的果蝇大脑 —— 仅靠接线图运转的神经系统。
两段代码都只使用 Colab 默认安装的库。点“下载笔记本(.ipynb)”后,在 Colab 中用文件 → 上传笔记本打开;也可以复制后粘贴到新笔记本的单元格里。
建立 1,000 个 Kenyon 细胞的固定连接,在只点亮前 8% 的稀疏编码之上,用 delta 规则只训练一个输出层。想换成自己的数据,替换 X(样本 × 256)和 Y(正确答案编号)即可。
让 MLP、CNN、RNN、GRU、LSTM 和三种果蝇模型在相同的图画数据、相同的划分上训练,比较连接数和准确率。这段代码把“训练器示例”的计算放到更大的数据(4 类共 160 张)上亲手做一遍。
| 项目 | 代码 1(果蝇方式) | 常规深度学习代码 |
|---|---|---|
| 学习发生在哪里 | 只有输出层(3,000 个) | 所有层(16,643 个) |
| 梯度计算 | 不需要:误差 × 输入 | loss.backward() 用链式法则逐层计算 |
| 隐藏表示 | 出生时随机固定 | 根据数据学习 |
| 隐藏层形态 | 宽而稀疏(1,000 个中只有 8% 点亮) | 窄而稠密(64 个全都有值) |
| 核心一行 | W_out += lr * np.outer(y − p, k) | opt.step() |
| 所需工具 | 只需 NumPy | PyTorch(自动微分) |
| 在机器学习中的名称 | 随机特征、极限学习机、储备池计算 | 多层感知机(MLP) |
这是可以粘贴到 ChatGPT、Qwen、Claude 等 AI 助手里的提示词。点“复制”时,所选的代码会一起附在提示词后面。把〔 〕里的内容换成你自己的情况即可。
AI 的回答只是起点。它提出的论文、数值和库函数一定要对照原文和官方文档核实。如果在竞赛或论文中借助了 AI,请按照主办方和期刊的规定,说明使用的事实和范围。
与正文中黄色虚线下划线对应的同一部词典。把鼠标指向或点按下划线,会出现相同的说明。
类比是理解的第一步,但也可能是误解的种子。果蝇·大脑类比标注了强度:直接 有证据表明确实做着同样的事 · 部分 只有部分性质相似 · 无 尚未发现对应物
| 概念 | 日常类比 | 果蝇·大脑类比 | 类比出错的地方 |
|---|---|---|---|
| 感知机 | 给多个人的意见打分并相加,总分超过标准就做决定 | 部分 神经元汇集输入,越过阈值就放电 | 真实神经元的输入会随时间累积又泄漏。感知机里没有时间(参见特别篇 3 的泄漏积分发放) |
| 隐藏层 | 公司的中层管理者:汇总一线报告,再整理成摘要交给老板 | 部分 蘑菇体的 Kenyon 细胞把气味信号重新展开成更宽的表示 | Kenyon 细胞的输入连接是随机确定的,不会学习。深度学习的隐藏层则是学出来的 |
| 权重学习 | 把做错的题记进错题本,下次改正 | 直接 多巴胺改变蘑菇体输出连接的强度,把气味和结果配对 | 果蝇的多巴胺信号是否在计算“预测误差”仍在研究中。本篇的学习规则为便于讲解做了简化 |
| 反向传播 | 结果不好时,从流水线末端往回分摊责任 | 无 | 尚无证据表明大脑会逐层把精确的梯度反向传递 |
| 多层视觉通路 | 工厂装配线:每道工序做出稍复杂一点的零件 | 部分 从复眼 → 视板 → 髓质 → 小叶,越往后越能分辨复杂的运动 | ④ 中的滤波器是为讲解而手工设定的。CNN 则会学习滤波器 |
| 把输入变成数字 | 把各国货币都兑换成同一种货币 | 直接 感觉神经元把光、气味、味道转换成电信号 | 真实的信号是脉冲(spike)的频率和时机。本篇中的放电频率数字只是示例值 |
E-1 作者介绍 · E-2 学术参考文献 · E-3 图片参考资料
| 编号 | 内容 | 数值 | 出处 |
|---|---|---|---|
| [1] | 果蝇全脑神经元数、突触数 | 约14万、约5000万 | FlyWire 联盟(2024)Nature —— 成体全脑连接组 |
| [2] | 单侧复眼的小眼数 | 约 750~800 | 果蝇视觉系统的教科书数值(因个体、品系而异) |
| [3] | 嗅觉受体神经元种类 / 触角叶嗅小球数 | 约 50 种 / 约 50 个 | 果蝇嗅觉系统研究中的常用数值(例:Couto 等 2005,Curr Biol) |
| [4] | 单侧蘑菇体的 Kenyon 细胞数、输出神经元种类 | 约 2,000 / 21 种 | Aso 等(2014)eLife —— 蘑菇体回路解剖 |
| [5] | 人脑的神经元数 | 约860亿 | Azevedo 等(2009)J Comp Neurol |
| [6] | 二氧化碳回避;随醋浓度变化的趋近·回避 | — | Suh 等(2004)Nature · Semmelhack & Wang(2009)Nature |
| [7] | T4·T5 运动方向检测,LPLC2 逼近检测 | — | Maisak 等(2013)Nature · Klapoetke 等(2017)Nature |
这是给讲师、企业在岗培训(OJT)负责人和辅导老师的教学指南。时间为估计值,请根据实际课堂调整。
| 对象 | 初学深度学习的大学生、职场人士。无需生物学知识 |
|---|---|
| 先修知识 | 加法、乘法,会看图表。只有 Colab 实践需要 Python |
| 学习目标 | ① 把感觉 → 神经 → 大脑 → 行为对应到输入 → 隐藏层 → 输出 ② 解释感知机为什么解不了带状问题、隐藏层为什么能解 ③ 比较训练分数与验证分数,识别过拟合 |
| 预计时间 | 阅读 50~60 分钟 · 动画演示 25 分钟 · Colab 实践 30 分钟(代码 1 10 分钟,代码 2 运行 2 分钟 + 解读 15 分钟) |
导入 5 分钟(为什么是果蝇)→ 感觉→神经→大脑对应表 10 分钟 → 规则 vs 学习 10 分钟 → ①②③ 阶梯 20 分钟 → 练习题 5 分钟。
规则 vs 学习实验场 20 分钟(与工作中的规则系统比较)→ ②③ 过拟合 20 分钟 → 用训练器示例读混淆矩阵 20 分钟 → 代码 2 运行·解读 30 分钟。
入门者只做“规则 vs 学习”和 ①②。中级者在 ③ 中改变隐藏神经元数,亲手制造过拟合,并对照代码 1 与训练器示例中被训练的连接数(3,003 个)。
| 部分 | 停下来提问 | 操作提示 |
|---|---|---|
| 为什么是果蝇 | “14 万个神经元,算多还是算少?” | 与人脑的 860 亿相比 |
| 电信号 | “为什么要把气味和光换成同一种单位?” | 改变刺激强度,看放电频率是否跟着变化 |
| 规则 vs 学习 | “环境变了,谁会先适应?” | 点“改变环境”,比较两只果蝇的成功率 |
| ② 感知机 | “一条直线能把带状区域分开吗?” | 在带状问题上运行训练,看准确率停在哪里 |
| ③ 隐藏层 | “隐藏神经元越多就一定越好吗?” | 用少量数据 + 40 个隐藏神经元,观察训练分数与验证分数的差距 |
| ④ 多层 | “为什么对路过的物体不会起跳?” | 依次点击“逼近”“路过”“远离” |
| 实践:训练器示例 | “两个模型都答错的图,为什么会让它们混淆?” | 依次点击测试图按钮,并与混淆矩阵对照 |
| 误解 | 正确解释 | 要展示的画面 |
|---|---|---|
| 果蝇大脑和深度学习的运作方式完全一样 | 只是层级结构和连接强度的学习相似,反向传播和没有时间的计算都与大脑不同 | 类比合集 D 中的“反向传播”一行 |
| 隐藏神经元越多越好 | 数据少时,模型会背下训练数据,验证分数反而下降(过拟合) | ③ 的少量数据设置 |
| 规则写得好就不需要学习 | 环境一变,规则就会一直出错,而学习能重新调整过来 | “规则 vs 学习”中的改变环境 |
| 准确率高就是好模型 | 用训练数据测出的准确率不可靠,要用单独留出的验证数据来测 | 训练器示例的训练·验证曲线(训练 100%,验证 83~89%) |
| 果蝇方式不如深度学习 | 被训练的连接只有四分之一,却在同样的图画问题上取得了相近的准确率(代码 2) | 代码 2 的结果表 |
总和 = 1×0.8 + 0×(−0.5) = 0.8。因为 0.8 ≥ 0.5,所以输出 1。
感知机只能用一条直线(一个平面)来划分。带状区域两侧需要两条边界,一条直线分不开。隐藏层可以造出多条边界再把它们组合起来。
过拟合:模型背下了训练数据。对策:收集更多数据、减少隐藏神经元、提前停止训练,任选两种。
固定:投射神经元 → Kenyon 细胞(随机稀疏连接)。训练:Kenyon 细胞 → 输出神经元(由多巴胺改变)。
仅凭宽而稀疏的固定表示,简单的图画问题只需训练输出层就足以解决。但由于无法改进表示本身,在困难问题上会有局限。
在代码 1 中把 TOP(点亮比例)从 0.08 改为 0.5,报告训练准确率和被点亮的 Kenyon 细胞数如何变化,并用两句话写出稀疏性为什么有用。
把代码 2 中 MLP 的隐藏层大小改为 8、64、512,用两个种子比较验证准确率。结合学习曲线(第 7 个单元格)解读是否出现过拟合。
| 入门者 | 第 ④ 部分和“结构比较”中的 GRU·LSTM 可以跳过,不影响整体思路。先把“规则 vs 学习”和 ②③ 吃透 |
|---|---|
| 进阶 | 让学生比较果蝇方式与机器学习中的随机特征·极限学习机(ELM)并做报告。查到的论文要核对原文 |
| 延伸学习 | Sangsun Ahn,《面向商业的数据科学》讲义(数据科学概论,韩文)· STEP [K-Digital] 人工智能自然语言处理 · STEP [K-Digital] 金融科技数据分析基础 |
| 讲师用资料 | 练习题的评分标准和作业参考答案见教师用答案页面(特别篇 1) |
你已经读完了《特别篇 1 果蝇大脑探索》。实验室的伙伴们来各说一句,帮你总结一下。