【CARLsim和脉冲神经网络】神经元、突触、组

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脉冲神经元。

使用函数createSpikeGeneratorGroupcreateGroup可以创建从一维到三维的神经元组。

微分方程可以由forward-Euler法或Runge-Kutta法实现。

1.1 Izhikevich神经元(4参数模型)

Izhikevich是一个动力学系统模型,可以由以下二阶常微分方程描述:

dvdt=0.04v2+5v+140u+I\begin{array}{l} \frac{{dv}}{{dt}} = 0.04{v^2} + 5v + 140 - u + I\\ \end{array}

dudt=a(bvu)\begin{array}{l} \frac{{du}}{{dt}} = a(bv - u) \end{array}

第一个公式描述了给定电流II的膜电位vv,其中II是所有突触和外部电流之和( I=isyn+IextI = {i_{syn}} + {I_{ext}});

第二个式子表述了恢复变量uuaa是恢复变量的速率常数;bb描述了恢复变量对于膜电位阈值下波动的敏感性;两个公式的变量都是无量纲的,但是第一个公式的vvmVmV级的,ttmsms级的。

和其他简单的模型(如LIF)不同,Izhikevich神经元可以自行生成上行脉冲,因此电压在峰值(vcutoff=+30{v_{cutoff}} = + 30)复位,而不是在阈值。
vv达到峰值截断时,动作电位下行通过瞬时膜电位复位建模,并加上回复变量的步进(这句话很拗口,但是看了下面的公式,就能秒懂),具体由下面的公式描述:

v(v>30)=c\begin{array}{l} v(v > 30) = c \end{array}

u(v>30)=u+d\begin{array}{l} u(v > 30) = u + d \end{array}

不同的神经元abcd取值不同,如
规则脉冲(RS)取值a=0.02a=0.02b=0.2b=0.2c=65c=-65d=8d=8
快速脉冲(FS)取值a=0.1a=0.1b=0.2b=0.2c=65c=-65d=2d=2

1.2 Izhikevich神经元(9参数模型)

对于9参数Izhikevich模型定电流II的膜电位vv,如下式:

dvdt=(k(vvr)(vvt)u+I)/C\frac{{dv}}{{dt}} = (k(v - vr)(v - vt) - u + I)/C

其中,KK是膜电位的速度常量,由神经元的输入电阻和基强度(rheobase,足引起刺激的最小强度),vrvr是静止膜电位,vtvt是瞬时阈电位(threshold potential),CC是膜容。

对于恢复变量uu,如下式:
dvdt=a(b(vvr)u)\frac{{dv}}{{dt}} = a(b(v - vr) - u)

对于动作电位下行建模如下:
v(v>vpeak)=c\begin{array}{l} v(v > vpeak) = c \end{array}

u(v>vpeak)=u+d\begin{array}{l} u(v > vpeak) = u + d \end{array}
所谓的九变量是指:CCkkvrvrvtvtaabbvpeakvpeakccdd
RS神经元:C=100C=100k=0.7k=0.7vr=60vr=-60vt=40vt=-40a=0.03a=0.03b=2.0b=-2.0vpeak=35vpeak=35c=50c=-50d=100d=100
FS神经元:C=20C=20k=1k=1vr=55vr=-55v=40v=-40a=0.15a=0.15b=8b=8vpeak=25vpeak=25c=50c=-50d=200d=200
一般在九参数的Izhikevich模型中,使用Runge-Kutta而不是forward-Euler。

1.3 Multi-Compartment神经元

使用CARLsim::setCompartmentParameters函数将一组神经元拓展到多个单元,使用 CARLsim::connectCompartments连接Compartment。

这时,总电流II被进一步扩展,包含了树突电流,即:

I=isyn+idendr+iextI=i_{syn}+i_{dendr}+i_{ext}

每个单元的树突电流来自(down,mother)下单元和(up,daughter)上单元:

idendr=Gdown(vvdown)+upGup(vvup){i_{dendr}} = {G_{down}}(v - {v_{down}}) + \sum\limits_{up} {{G_{up}}} (v - {v_{up}})

电导率GdownG_{down}GupG_{up}CARLsim::setCompartmentParameters确定。

同样的,这里推荐使用Runge-Kutta而不是forward-Euler。

这一段直接翻译了CARlsim的文档, 我根本就没有就看懂在讲什么,Multi-Compartment是什么鬼,下图附一个轴突、树突图来大胆猜想

轴突和树突

突触

脉冲神经网络使用突触传递信息。生物学中,突触通过化学信号在神经元之间传递信息,(电突触也是存在的,但是Carlsim没有实现)。

通常来说,突触传递信息是单项的。

突触分为两中,一种在神经元发送信息(前突触神经元),另一种在神经元接受信息(突触后神经元)。

这两种神经元被突出间隔隔开。突触前神经元释放神经递质和突触后神经元受体结合,产生电流。当多个突触的产生的电流之和大于阈值电压,则产生脉冲。

下图为高中生物中介绍的突触结构:
高中生物

CARLsim支持两种突触模型,基于电流的模型(CUBA)只考虑突触电流;基于电导的模型使用更复杂的电导方程计算每个突触受体电流。

CUBA和COBA都受突触权重的影响。

接下来将详细讨论这两个模型。

2.1 CUBA

使用CUBA模型时,不考虑电导。产生的电流强度和突触权重成正比。

突触后神经元产生的电流IjsynI_j^{syn}由突触前神经元产生脉冲时给出:

Ijsyn=i=1NsijwijI_j^{syn} = \sum\limits_{i = 1}^N {{s_{ij}}} {w_{ij}}

上式中,Sij=1S_{ij}=1意味着神经元产生了脉冲,Sij=0S_{ij}=0则没有;wijw_{ij}表示突触后神经元jj和突触前神经元ii之间的权值;NN是突触前神经元和突触后神经元jj产生的连接数量。

基于电流的突触模型是CARLsim的默认模型,目前CARLsim不支持COBA模型和其他模型混用。

基于电流的神经元模型电流是一次性产生的,而基于电导的神经元模型的突触电流随时间衰减。

由于COBA模型产生的电流要大得多,当从CUBA模型转换到COBA时,需要用户去减少突触权重。

2.2 COBA

当使用COBA模型时,存在指数衰减的电导(电导,表示某一种导体传输电流能力强弱程度)。如果突触连接是兴奋的,则使用AMPA和NMDA衰减。如果突出连接是抑制的,则使用GABA A和GABA B连接。

总电流既可以来自兴奋区(ie{i_e}),也来自抑制区(ie{i_e})。

ie=iNMDA+iAMPA{i_e} = {i_{NMDA}} + {i_{AMPA}}
ii=iGABAA+iGABAB{i_i} = {i_{GAB{A_A}}} + {i_{GAB{A_B}}}

兴奋电流由NMDA电流(iNMDAi_{NMDA})和AMPA电流(iAMPA{i_{AMPA}} )组成:

iAMPA=gAMPA(vvAMPArev){i_{AMPA}} = {g_{AMPA}}(v - v_{AMPA}^{rev})

iNMDA=gNMDA[v+8060]21+[v+8060]2(vvNMDArev){i_{NMDA}} = {g_{NMDA}}\frac{{{{[\frac{{v + 80}}{{60}}]}^2}}}{{1 + {{[\frac{{v + 80}}{{60}}]}^2}}}(v - v_{NMDA}^{rev})

上式中gg是电导,vv是突触后神经元电压, vrevvrev是逆转电位,ggvrevvrev都是针对特定的离子通道和受体;

抑制神经元通道由GABA A和GABA B电流组成:

iGABAA=gGABAA(vvGABAArev)\begin{array}{l} {i_{GAB{A_A}}} = {g_{GAB{A_A}}}(v - v_{GAB{A_A}}^{rev})\end{array}

iGABAB=gGABAB(vvGABABrev)\begin{array}{l} {i_{GAB{A_B}}} = {g_{GAB{A_B}}}(v - v_{GAB{A_B}}^{rev}) \end{array}

每一个粒子通道或受体kk的电导gg,由下式给出:

gk=fettf/τΘ(ttf){g_k} = \sum\limits_f {{e^{t - {t_f}/\tau }}} \Theta (t - {t_f})

上式中ff指一个脉冲事件,tftf是脉冲时间的时间,ThetaTheta指Heaviside函数。

函数sim.setConductances(true)表示使用COBA模式,该模式默认参数:tdAMPA=5mstdAMPA=5mstdNMDA=150mstdNMDA=150mstdGABAa=6mstdGABAa=6mstdGABAb=150mstdGABAb=150ms(瞬时上升时间)

也可以自定义参数:

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神经元的aabbccdd参数。

创建一组脉冲生成器(名称、大小、类型)

int gIn = sim.createSpikeGeneratorGroup("input", 10, EXCITATORY_NEURON);

3.1 Topography

Grid3D结构体可以将一组神经元排列三维网格(以三维结构的中心为原点),并根据通过CARLsim::connect连接神经元。这允许创建具有复杂空间结构的网络。

具体的排列规则如下:

在这里插入图片描述

Grid3D(Nx,Ny,Nz)表示座标范围[(Nx1)/2,(Nx1)/2][-(Nx-1)/2, (Nx-1)/2][(Ny1)/2,(Ny1)/2][-(Ny-1)/2, (Ny-1)/2],和 [(Nz1)/2,(Nz1)/2][-(Nz-1)/2, (Nz-1)/2]

Grid3D(1,1,1)在位置$ (0,0,0)$创建一个神经元

Grid3D(2,1,1)创建两个神经元, 第一个 (ID 0) 在$ (-0.5,0,0)$, 第二个 (ID 1) 在 (0.5,0,0)(0.5,0,0).

Grid3D(1,1,2) 创建两个神经元, 第一个 (ID 0) 在 (0,0,0.5)(0,0,-0.5), 第二个 (ID 1) 在 (0,0,0.5)(0,0,0.5).

Grid3D(2,2,2)创建八个神经元, 第一个 (ID 0) 在(0.5,0.5,0.5)(-0.5,-0.5,-0.5), 第二个 (0.5,0.5,0.5)(0.5,-0.5,-0.5), 第三个 (0.5,0.5,0.5)(-0.5,0.5,-0.5), 以此类推,如上图

Grid3D(3,3,3)创建 3x3x3=273x3x3=27 个神经元,$ (-1,-1,-1),,,(0,-1,-1)(1,-1,-1)$, (1,0,1)(-1,0,-1),…,最后一个是(1,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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章