1. 为什么是突触:从大模型的“答题机器”说起
过去几年我在做认知计算相关的项目,一个越来越明显的感触是:我们手里那些动辄千亿参数的大模型,本质上还是一个概率统计模型。它能把一句话接得行云流水,能写诗、能编程、能做数学题,但你让它做一件稍微需要“举一反三”的事情——比如从两个不同的例子中归纳出一条规律,再迁移到一个全新场景里——它立刻就露馅了。这不是调参、加数据量能解决的问题,是架构层面的天花板。
2023年末我开始重新翻神经科学的老文献,越看越觉得:人脑处理信息的方式和大模型有本质差异。大模型靠的是海量参数和暴力计算,把“预测下一个词”做到极致;而人脑的算力基础只有大约860亿个神经元,却能在极低的功耗下完成识别、推理、决策、情感判断这些复杂任务。差异的核心在哪里?就在突触。
单个神经元做的事情极其简单:接收输入、累积电位、超过阈值就放电。真正复杂的、承载记忆和学习能力的是神经元之间的连接——突触。人脑里大约有百万亿个突触,每个突触的权重都在动态变化,有短期可塑性,有长期增强和抑制,还有神经调质在全局调控。CogniBrain这个系统的出发点就是:不在“神经元数量”上做文章,而是把重心放在突触层面的仿真上,尝试构造一个真正具备“认知”基础的思考系统。
先说结论:CogniBrain不是一个用来刷榜的深度学习框架,它的目标是验证一条路径——能不能通过突触动力学的仿真,让机器自发地涌现出类似人类的认知行为。本文会从突触的核心机制讲起,拆开系统架构、信息处理路径、工程实现中踩过的坑,最后聊一聊这套方案现在的边界面在哪里。
2. 突触到底仿真什么:CogniBrain的微观核心机制
要理解CogniBrain,得先忘掉Transformer,回到神经科学的基本事实。突触不是一个静态的连接点,它有一套非常完整的工作机制。仿真突触,本质上是在仿真以下五个层面的动力学过程。
2.1 突触传递:不只是“加权求和”
传统人工神经网络里,一个连接就是一个权重w,前向计算就是乘一下再加起来。但真实突触的传递过程复杂得多。动作电位到达突触前末梢,触发神经递质释放,递给突触后膜上的受体,产生突触后电位。这个过程不是瞬时的,它有一个时间常数。CogniBrain在实现时,把每个突触建模为带有短时程动力学模块的传递单元——递质释放概率、释放后的衰减速度、受体的脱敏状态都被纳入计算。
具体来说,当一个突触收到脉冲信号时,系统会更新三个内部状态变量:可用递质池的比例、释放效率、受体敏感度。这直接决定了这个突触在接下来几毫秒内的传递效率。这样做的一个直接好处是:系统天然支持基于时间的编码,而不是仅仅基于频率或平均发放率。曾经有同行问我,直接用一个低通滤波器模拟突触后电位不行吗?行,但那就丢掉了短时程增强(STP)这个重要的时间信息源。
2.2 突触可塑性:认知的物理载体
突触能学习和记忆,靠的是可塑性机制。CogniBrain主要实现了三类:
Spike-Timing-Dependent Plasticity(STDP):如果突触前神经元先放电、突触后神经元随后放电,突触就会增强;反过来,如果突触后先放电、突触前才放电,突触就会减弱。STDP是目前公认的、在生物体上被广泛验证的学习规则。
稳态可塑性(Homeostatic Plasticity):神经元不能无限兴奋下去,系统需要一个负反馈机制来维持电活动稳定。CogniBrain每过一段时间就会检查神经元的平均发放率,如果过高就整体下调它所有突触的权重,如果过低则上调。
调质调制(Neuromodulation):多巴胺、乙酰胆碱这类神经调质并不直接传递信息,而是改变整个脑区的可塑性强度。这是“注意力”和“奖赏”机制的重要基础。系统引入一个全局调制信号,在训练时动态调整STDP的学习率。
2.3 突触的物理结构仿真:树突计算
真实神经元不是只有一个求和点。树突上存在大量的离子通道,不同区段的输入可以局部整合,甚至产生树突本身的电位事件。CogniBrain在做突触仿真时,给每个神经元分配了若干“树突分支”,每个分支有自己的局部电位和阈值。远端的突触输入和近端的突触输入,对胞体的影响程度是不同的——远端信号衰减得更厉害。这个设计很关键,因为它打破了“所有输入平等求和”的传统假设,让不同空间位置的输入带上了空间语义。
比如在一个模式识别任务里,来自不同模态(视觉、听觉)的输入被投射到同一神经元的不同树突分支上。如果两个分支在时间上靠近,胞体更容易达到阈值放电;如果只有一个分支激活,则要困难得多。这在效果上类似于“多模态联合触发”,但不是靠人工设计的注意力机制实现的,而是从神经元物理特性中涌现出来的。
3. CogniBrain系统架构:从突触到认知的逐层组织
这套系统的最简可运行版本,用C++和CUDA实现,Python负责实验编排。整个架构分五层,每一层解决一个具体的问题。
| 层级 | 名称 | 核心职责 | 典型规模 |
|---|---|---|---|
| L1 | 突触动力学引擎 | 模拟递质释放、受体动力学、STP和STDP更新 | 千万级突触/GPU卡 |
| L2 | 神经元池 | 整合树突分支信号,管理阈下电位与发放事件 | 百万级神经元 |
| L3 | 脑区结构 | 组织神经元池为功能区域,定义区域间长程投射 | 几十个脑区 |
| L4 | 认知模块 | 在工作记忆、注意力调制、决策评估等层面提供接口 | 依据任务定义 |
| L5 | 任务交互层 | 接收外部传感器的流式输入,输出行为或决策 | 与API接口绑定 |
3.1 事件驱动:打破逐帧同步的算力魔咒
如果按时间步长逐帧更新所有神经元,百万神经元网络很快就跑不动了。CogniBrain用的是事件驱动机制——只有产生发放事件(spike)的神经元才会触发计算,其他神经元保持空闲。一个神经元的一次发放,只触发与它相连的突触集合进行传递更新。在稀疏性比较高的大脑类网络中,这种方式能把无效计算量直接砍掉九成以上。
实现上使用了一个全局事件队列,每个事件包含时间戳、源神经元ID、目标突触列表。GPU端按事件批次处理突触更新,CPU端负责调度和シミュレーション控制。这个设计让我想起游戏引擎里的渲染管线——CPU准备数据,GPU批量执行,事件提交按批次对齐。
3.2 脑区的长程连接设计
全脑连接全是稠密的,这在百万神经元规模下不可能做到。CogniBrain采用“局部稠密、全局稀疏”的布线策略。脑区内部神经元之间按高斯概率建立连接,相邻神经元之间的连接概率更高;脑区之间则由一个有向矩阵定义投射关系,表示“前额叶区域接收来自视觉皮层区域的输入,但反过来不成立”。
布线这一步看起来不起眼,但几乎是整个系统认知能力的地基。我调试中发现,如果连接密度过高,整个网络会陷入癫痫式的同步振荡;连接密度过低,信号又传不动。最后靠经验确定了一个范围:局部连接概率取0.05到0.15之间,长程投射用1比100到1比1000的缩放系数。不同任务类型对这些参数极为敏感,后面专门说调试方法。
4. 认知是怎么从突触“长”出来的:信息处理路径拆解
系统的宏观目标不是模拟单个神经元,而是让“认知”从突触层的运转中自然涌现。这里拆解一条典型的信息处理路径,看你给CogniBrain一个任务时,内部发生了什么。
4.1 工作记忆:不需要显式存储嵌套循环
考虑一个序列预测任务:给系统一串数字1, 2, 3, ..., 让它在看到第8个数字时预测下一个。传统神经网络会用LSTM或者Transformer的位置编码来建模序列关系。但CogniBrain的工作记忆实现完全不同——它利用神经元群体的持续放电(persistent firing)来暂存信息。
系统设置了一组“工作记忆神经元池”,当输入数字“3”到来时,对应的神经元群被激活;数字“4”到来时,另一群被激活,同时对“3”的神经元群施加一个抑制信号以避免覆盖。这个过程不需要在任何地方显式写一个循环计数器,但突触的延迟和抑制连接让系统能够天然地维持一个“当前状态”的表示。
刚开始我根本不相信这套机制能跑通序列任务。实验结果打脸了——它不仅跑通了,还表现出一个很有意思的特性:对时间间隔很敏感。如果两个输入之间的间隔被拉长到训练时的三倍,系统的预测准确率会明显下降。这恰恰是生物大脑的特点:工作记忆是有容量的,也是会衰退的,而传统深度学习模型不会有这种“生理性”的限制。这个特点反而成为优势——在处理长尾分布数据时,系统不会在无关的历史输入上花费大量记忆资源。
4.2 注意力选择的突触实现
注意力机制在Transformer里是一个显式计算模块,长度、位置、查询键值三件套。而CogniBrain的注意力是基于神经调质系统的。
系统里设计了一个“注意调控单元(AU)”,它根据当前任务的紧迫度和外部输入的新颖度,计算出两种调质信号:一种增强目标相关脑区的突触增益;另一种抑制背景噪音区域的增益。这个信号再作用到全脑所有突触的传递系数上——目标区域的突触传递效率提高约20%,背景区域的降低约30%。
这个设计的妙处在于:注意力不是一个单独的计算步骤,而是一个持续施加的全局状态。“是否被注意”直接影响了突触的STDP更新强度——被注意的信息学得快,不被注意的信息几乎不学。任务结束后想“复习”也可以,重复呈现刺激时,系统的学习效果会远好于一次呈现。这和人脑的学习规律非常接近。
4.3 决策与评估:没有反向传播,如何知道好坏
这是CogniBrain和深度学习框架分歧最大的地方。深度神经网络靠损失函数和反向传播来调整权重;CogniBrain用的是基于调质的强化学习式可塑性——三因子学习规则(three-factor learning rule)。每次行为结果产生“好”或“坏”的评估信号,由全局调质系统广播到所有突触。如果某个突触的活动在决策前与最终结果存在时间上的因果关联,并且结果反馈为“好”,那么这个突触的权重就被加强;结果反馈为“坏”,权重被削弱。
这里有一个技术细节:STDP是两因子的,而三因子规则引入了一个额外的全局信号参与权重更新。实现的时候就是计算局部STDP窗口内的突触前/突触后活动相关性,再乘以全局调质浓度。如果相关性为正且调质浓度为正,权重增加;相关性为正但调质浓度为负,权重减少。
用这套机制训练一个简单的导航任务(让一个智能体学会走向目标点),大约需要300步的随机探索才能看到明显进步。比Q-learning慢,但它学到的突触模式非常鲁棒,换一个新的地图环境,迁移衰减远小于传统强化学习。我个人的推测是:突触层面的分布式表示比集中式的价值网络更抗环境扰动。
5. 工程现实:规模、精度与仿真速度的三难取舍
纸上谈兵的架构说完了,实际工程实现里全是坑。这一节聊我在搭建CogniBrain过程中遇到的几个关键工程问题和取舍,其中有三个坑最有代表性。
5.1 仿真时间步长:毫秒精度与计算成本的对赌
生物突触的时间常数在1到100毫秒跨度内,如果想保留STDP的时间精度,仿真步长理想情况下应该小于1毫秒。但步长越短,每一秒仿真需要计算的时间步就越多,CPU调度打点成本也急剧上升。
初期我把步长设为0.5毫秒,仿真1秒脑活动需要大约4千多个时间步,训练一个小任务就要跑几天。后来改成1毫秒步长,STDP的时间窗口做近似补偿。准确率损失不到2%,但仿真速度快了接近一倍。这个取舍是值得的。更激进的做法是自适应步长——根据事件密度动态调整精度,低活动时段用2毫秒步长,高活动时段回到1毫秒。
5.2 随机性与可复现性的斗争
生物系统自带大量噪声源,比如递质释放的随机性、膜电位涨落。这些噪声对探索和学习很重要,但它在算法调试阶段是噩梦。同一个实验跑两次,结果可能差20%。
我的做法是把随机数发生器加上一个实验级种子,每次实验开始时重置,但种子不只一个——每个神经元池分配一个独立子生成器。复盘实验时,只要种子序列一致,结果就可复现。实验做完发布的时候,公布主种子和最核心的几个子系统种子,其他部分用不同的偏移来自动生成。这个方案经历了三个月调试期后稳定下来,后续论文的数据回放全靠它。
5.3 多GPU训练的同步冲突
当突触数量超过单卡承载后,必须要走多卡并行。但事件驱动模型天然不适合像深度学习那样按层切分。CogniBrain选择的是按脑区划分:视觉脑区放GPU0,前额叶-运动规划区放GPU1。跨GPU的突触投射通过NVLink异步传输。
这个方案第一次跑就遇到严重的“幽灵事件”问题——GPU0上的神经元发出了发放事件,但GPU1上的目标突触更新延迟了整整一个时间步窗口。原本毫秒级的信号传递变成了几百毫秒的延迟,整个网络的时序关系全部错乱。我的解决办法是引入“时间戳补偿”:每个跨卡事件打包时带上源时间戳,接收端在更新突触时,不是直接按键值查入,而是按时间戳重新对齐到对应的时间窗口。这相当于给整个网络加了一层“时钟同步”。效果立竿见影,同步误差从毫秒级降到微秒级。
提示:如果你也想实现类似的分布式突触仿真,建议先在单机多卡上把跨节点通信的延迟基准测出来,再决定是否需要时间戳补偿。不同厂商的互联延迟差异很大,不要直接抄别人的同步参数。
6. 调试一个仿真大脑:验证链路与参数盲区
传统深度学习调试起来相对直接:loss下降了吗?ACC涨了吗?而CogniBrain这类系统最难的地方在于——你不知道哪里错了,因为没有一个单一的数字能告诉你“大脑工作正常”。
6.1 观测“神经状态”,而不是只看任务指标
我做了一套诊断工具链,包括三件套:
发放率热力图(raster plot):全局所有神经元的发放时间点,一眼能看出是否出现异常同步振荡。
突触权重分布演化图:定期取全脑突触权重做成直方图。健康的网络权重分布会向两端(增强/抑制)分化;如果权重全部挤在中间位置,说明网络没有学到任何东西。
区域间信息流互信息矩阵:计算每两个脑区的发放序列之间的互信息,用来观察信号有没有在预期的时间窗口内传递到预期区域。
这套工具链最关键的是一个判断准则:任务做得差不一定代表系统坏了,可能是参数设定让网络陷入某种病理状态,比如超同步振荡或全脑静默。先看神经前言活动状态,再去看任务表现,逻辑顺序不能反。
6.2 最折磨人的三个参数盲区
调试半年下来,有三个参数调一次折磨一次:
突触后电位幅度(EPSP amplitude):如果设得太小,信号传几层就衰减没了;设得太大,小小扰动就触发连锁发放,学东西学过头,不用的记忆也强化了。经验值一般从神经元阈值电位的5%开始调,然后上下扫。基准设对了,网络基本能保持在一个有信噪比的状态。
STDP时间窗口宽度:窗口太窄,要精确的毫秒级对齐才能触发学习;窗口太宽,所有时序关联都变成正相关,学不出选择性。我的建议是从τ=20ms起步,配合仿真步长一起对调。
稳态可塑性的检查周期:检查太频繁,网络刚形成强连接就被重置了,学习永远走不远;检查太稀疏,神经元过度兴奋,权重爆炸。目前用的是每仿真10秒检查一次,这也是在多次实验后选出来的折中值。
6.3 什么才算“认知出现了”
这个问题困扰了我很久。如果你训练一个深度强化学习模型,看它的reward曲线就能判断有没有学;但CogniBrain不是用奖励函数驱动的,即使任务表现上去了,你怎么确定它不是通过某种捷径(比如单纯放大输出层的偏置)达成的?
我最终定下三个严格判据,全部满足才认为系统出现了“认知行为”:
多任务迁移:在任务A上学到的突触模式,在任务B上不做任何微调也能带来性能提升,而且提升幅度大于随机初始化模型。
表征重用度:计算两组神经元的表征相似度矩阵。如果学到的突触模式里,同一脑区有超过40%的神经元在应对相似输入时发放模式重合,说明系统在形成抽象表征,而不是死记硬背。
扰动鲁棒性:故意删掉一波神经元(模拟脑损伤),系统性能应平缓下降而不是突然崩溃。我试过随机删掉20%的神经元,任务准确率从0.9掉到0.57左右,但依然远高于随机水平。
拿这三个判据去测CogniBrain在“视觉-运动映射”任务上的表现,前两条都过了,第三条勉强过线。这说明系统确实形成了一定的分布式表征,而不是靠少数几个关键神经元硬扛。
7. 现在的局限与下一步:这条路还长
说了一大堆成效,必须坦白这套方案现在的短板,否则就是对读者不负责。
第一,规模上限。目前跑通的规模是大约500万神经元、27亿突触,在多卡服务器上训练一个中等复杂度任务需要一周以上。想逼近人脑百万亿突触的规模,还需要数量级上的硬件突破。英伟达的最新一代加速卡在突触矩阵运算上做了面向稀疏化事件的优化,但距离“人人可跑”的普及阶段还有距离。
第二,缺乏可解释的存取接口。传统深度学习可以导出注意力权重、特征图,可视化很成熟。CogniBrain的认知表征分散在数百万突触权重的细微变化中,想抽取出一个可解释的“概念”还很难。目前只能靠中心性分析和子图匹配来近似的识别,精度有限。
第三,任务谱系还很窄。现在系统能胜任的包括序列预测、简单导航、多模态模式识别、基本的工作记忆任务,但在语言理解和复杂推理层面的能力几乎为零。有人可能觉得这是缺陷,但我更愿意把它理解为这套框架的独特性所在——它不需要在语言上堆参数也能具备一些认知行为;真正的测试在于未来能不能支持“具身智能”——让系统接入真实传感器,在和物理世界的持续交互中发展出更复杂的认知能力。
下一步我计划把工作重心放在两个方向:一个是在突触动力学中引入更多真实生物细节,比如突触和树突棘的体积可塑性变化;另一个是将CogniBrain的认知模块接入一个机器人仿真环境,让系统真正在“感知-行动”闭环中学习。如果这个闭环能跑通,CogniBrain就不再仅是一个脑仿真器,而是一个可落地的认知架构。这条路肯定还很长,但从突触起步做认知系统,目前来看是值得继续走下去的方向。