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);