【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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章