CARLsim4:http://uci-carl.github.io/CARLsim4/index.html
CARLsim4代码:https://github.com/UCI-CARL/CARLsim4
前言
CARLsim4是一个高效、易用的、基于GPU加速的大规模脉冲神经网络仿真系统。由“[Cognitive Anteater Robotics Laboratory]
这一节主要介绍脉冲神经网络的几个核心概念——神经元、连接、突触。脉冲神经网络的一大特点就是生物学概念还原的很好,而传统的神经网络已经是高度抽象的结果。
Cognitive Anteater Robotics Laboratory
开源,C++编写,支持windows和linux平台。
即将入坑SNN,新开一个关于CARLsim的主题,主要的内容都是基于CARLsim4文档和源码,记录自己的理解、总结、翻译和搬运。
神经元
CARLsim目前支持基于电流和基于电导的Izhikevich脉冲神经元。
使用函数createSpikeGeneratorGroup
和createGroup
可以创建从一维到三维的神经元组。
微分方程可以由forward-Euler法或Runge-Kutta法实现。
1.1 Izhikevich神经元(4参数模型)
Izhikevich是一个动力学系统模型,可以由以下二阶常微分方程描述:
第一个公式描述了给定电流的膜电位,其中是所有突触和外部电流之和( );
第二个式子表述了恢复变量;是恢复变量的速率常数;描述了恢复变量对于膜电位阈值下波动的敏感性;两个公式的变量都是无量纲的,但是第一个公式的是的,是级的。
和其他简单的模型(如LIF)不同,Izhikevich神经元可以自行生成上行脉冲,因此电压在峰值()复位,而不是在阈值。
当达到峰值截断时,动作电位下行通过瞬时膜电位复位建模,并加上回复变量的步进(这句话很拗口,但是看了下面的公式,就能秒懂),具体由下面的公式描述:
不同的神经元abcd取值不同,如
规则脉冲(RS)取值,,,;
快速脉冲(FS)取值,,,。
1.2 Izhikevich神经元(9参数模型)
对于9参数Izhikevich模型定电流的膜电位,如下式:
其中,是膜电位的速度常量,由神经元的输入电阻和基强度(rheobase,足引起刺激的最小强度),是静止膜电位,是瞬时阈电位(threshold potential),是膜容。
对于恢复变量,如下式:
对于动作电位下行建模如下:
所谓的九变量是指:,,,,,,,,
RS神经元:,,,,,,,,
FS神经元:,,,,,,,,
一般在九参数的Izhikevich模型中,使用Runge-Kutta而不是forward-Euler。
1.3 Multi-Compartment神经元
使用CARLsim::setCompartmentParameters
函数将一组神经元拓展到多个单元,使用 CARLsim::connectCompartments
连接Compartment。
这时,总电流被进一步扩展,包含了树突电流,即:
,
每个单元的树突电流来自(down,mother)下单元和(up,daughter)上单元:
电导率和由CARLsim::setCompartmentParameters
确定。
同样的,这里推荐使用Runge-Kutta而不是forward-Euler。
这一段直接翻译了CARlsim的文档, 我根本就没有就看懂在讲什么,Multi-Compartment是什么鬼,下图附一个轴突、树突图来大胆猜想
突触
脉冲神经网络使用突触传递信息。生物学中,突触通过化学信号在神经元之间传递信息,(电突触也是存在的,但是Carlsim没有实现)。
通常来说,突触传递信息是单项的。
突触分为两中,一种在神经元发送信息(前突触神经元),另一种在神经元接受信息(突触后神经元)。
这两种神经元被突出间隔隔开。突触前神经元释放神经递质和突触后神经元受体结合,产生电流。当多个突触的产生的电流之和大于阈值电压,则产生脉冲。
下图为高中生物中介绍的突触结构:
CARLsim支持两种突触模型,基于电流的模型(CUBA)只考虑突触电流;基于电导的模型使用更复杂的电导方程计算每个突触受体电流。
CUBA和COBA都受突触权重的影响。
接下来将详细讨论这两个模型。
2.1 CUBA
使用CUBA模型时,不考虑电导。产生的电流强度和突触权重成正比。
突触后神经元产生的电流由突触前神经元产生脉冲时给出:
上式中,意味着神经元产生了脉冲,则没有;表示突触后神经元和突触前神经元之间的权值;是突触前神经元和突触后神经元产生的连接数量。
基于电流的突触模型是CARLsim的默认模型,目前CARLsim不支持COBA模型和其他模型混用。
基于电流的神经元模型电流是一次性产生的,而基于电导的神经元模型的突触电流随时间衰减。
由于COBA模型产生的电流要大得多,当从CUBA模型转换到COBA时,需要用户去减少突触权重。
2.2 COBA
当使用COBA模型时,存在指数衰减的电导(电导,表示某一种导体传输电流能力强弱程度)。如果突触连接是兴奋的,则使用AMPA和NMDA衰减。如果突出连接是抑制的,则使用GABA A和GABA B连接。
总电流既可以来自兴奋区(),也来自抑制区()。
兴奋电流由NMDA电流()和AMPA电流( )组成:
上式中是电导,是突触后神经元电压, 是逆转电位,和都是针对特定的离子通道和受体;
抑制神经元通道由GABA A和GABA B电流组成:
每一个粒子通道或受体的电导,由下式给出:
上式中指一个脉冲事件,是脉冲时间的时间,指Heaviside函数。
函数sim.setConductances(true)
表示使用COBA模式,该模式默认参数:,,,(瞬时上升时间)
也可以自定义参数:
sim.setConductances(true,tdAMPA,tdNMDA,tdGABAa,tdGABAb);
还可以自定义下降时间常数(我不知道是啥),上升时间常数(默认为0):
sim.setConductances(true,tdAMPA,tdNMDA,trNMDA,tdGABAa,tdGABAb,trGABAb)
也可以修改默认电导时间常数:
sim.setDefaultConductanceTimeConstants(tdAMPA,tdNMDA,trNMDA,tdGABAa,tdGABAb,trGABAb);
组(group)
要创建一个Izhikevich神经元组,需要参数:名字(如output),神经元数量(如100):
int gOut = sim.createGroup("output", 100, EXCITATORY_NEURON);
EXCITATORY_NEURON
:组中神经元是谷氨酸能的
INHIBITORY_NEURON
:GABAergic突触神经元
返回组号gOut
给Izhikevich设置参数,举一个列子,给第一类兴奋神经元(规则神经元)设置参数:
sim.setNeuronParameters(gOut, 0.02f, 0.2f, -65.0f, 8.0f);
分别对应前面介绍的四参数Izhikevich神经元的,,,参数。
创建一组脉冲生成器(名称、大小、类型)
int gIn = sim.createSpikeGeneratorGroup("input", 10, EXCITATORY_NEURON);
3.1 Topography
Grid3D结构体可以将一组神经元排列三维网格(以三维结构的中心为原点),并根据通过CARLsim::connect
连接神经元。这允许创建具有复杂空间结构的网络。
具体的排列规则如下:
Grid3D(Nx,Ny,Nz)
表示座标范围,,和 。
Grid3D(1,1,1)
在位置$ (0,0,0)$创建一个神经元
Grid3D(2,1,1)
创建两个神经元, 第一个 (ID 0) 在$ (-0.5,0,0)$, 第二个 (ID 1) 在 .
Grid3D(1,1,2)
创建两个神经元, 第一个 (ID 0) 在 , 第二个 (ID 1) 在 .
Grid3D(2,2,2)
创建八个神经元, 第一个 (ID 0) 在, 第二个 , 第三个 , 以此类推,如上图
Grid3D(3,3,3)
创建 个神经元,$ (-1,-1,-1)(0,-1,-1)(1,-1,-1)$, ,…,最后一个是.
神经元的3D位置可以用CARLsim::getNeuronLocation3D
函数查询。
创建一个有500个神经元的3D神经元组
int gOut = sim.createGroup("output", Grid3D(10,10,5), EXCITATORY_NEURON);
以下两行代码等价
int gOut = sim.createGroup("output", N, EXCITATORY_NEURON);
int gOut = sim.createGroup("output", Grid3D(N,1,1), EXCITATORY_NEURON);