PyNN:神經網絡模擬器的通用接口
PyNN:神經網絡模擬器的通用接口
計算神經科學已經產生了用於模擬神經元網絡的多樣化軟件,同時具有消極和積極的後果。一方面,每個模擬器都使用自己的編程或配置語言,導致將模型從一個模擬器移植到另一個模擬器相當困難。這妨礙了調查人員之間的交流,使得難以復制和建立他人的工作。另一方面,仿真結果可以在不同的仿真器之間進行交叉檢查,對其正確性給予更大的信心,並且每個仿真器具有不同的優化,因此可以為給定的建模任務選擇最合適的仿真器。對多個模擬器的通用編程接口將減少或消除模擬器多樣性的問題,同時保留好處。 PyNN就是這樣的一個接口,可以使用Python編程語言編寫一次仿真腳本,並在任何支持的仿真器(目前NEURON,NEST,PCSIM,Brian和Heidelberg VLSI神經形態硬件)上進行修改。 PyNN通過提供高級抽象,通過促進代碼共享和重用以及為模擬器不可知的分析,可視化和數據管理工具提供基礎來提高神經元網絡建模的生產力。 PyNN通過使得在多個模擬器上檢查結果變得更容易,提高了建模研究的可靠性。 PyNN是開源軟件,可從
介紹
科學依賴於公開交流的三大支柱,結果的可重復性和建立在以前的基礎之上。 在這些方面,計算神經科學應該處於一個很好的位置,因為計算機通過設計擅長重復同樣的任務而沒有變化,所需的次數:計算結果的再現性應該是一項微不足道的任務。 類似地,互聯網使實驗室之間幾乎可以即時傳輸研究材料,即源代碼。
然而,在實踐中,這種重復性和溝通的理論上的簡易性很少在單個實驗室以及幾個月或幾年的時間範圍之外實現。雖然某個科學家可能很容易就能夠再現幾個月前所獲得的結果,但是正確地再現幾年前獲得的結果可能會更加困難,而一般的經驗似乎是再現別人的結果是困難的耗時:很多已發表的論文缺乏足夠的細節從頭開始重建模型,印刷錯誤是常見的。
可用的模型的源代碼大大改善了這種情況,但是在這裏仍然有許多障礙重復性和建立在以前發表的模型。一個是隨著計算機體系結構,編譯器標準和模擬器的發展,源代碼可能會快速過時。另一個原因是模型源代碼通常不是在考慮重用和擴展的情況下編寫的,因此需要對模塊化代碼進行大量的重寫。可能最重要的障礙是為一個模擬器編寫的代碼與任何其他模擬器不兼容。
盡管神經科學中的許多計算模型是從一開始就用通用編程語言(如C ++或Fortran)編寫的,但大多數人可能使用一種特殊目的的模擬器,使模型可以用神經科學特定的概念來表示,如神經元,離子通道,突觸;模擬器負責將這些概念轉化為方程組和數值求解方程組。大多數這樣的模擬器是可用的(在Brette等人,2007中進行了評論),大多數是開源軟件,並且各自具有其自己的編程語言,配置語法和/或圖形界面,這在將模型翻譯一個模擬器到另一個模擬器,或者甚至理解別人的代碼,對於調查人員之間的溝通,他人模型的再現性以及在現有模型上的構建都有明顯的負面影響。
然而,模擬器的多樣性也帶來了一些積極的後果:(1)它允許交叉檢查 - 兩個不同模擬器具有相同錯誤或隱藏假設的概率非常小; (ii)每個仿真器在效率(仿真運行的速度),靈活性(添加新功能的容易程度,可模擬的模型的範圍),可擴展性(並行,群集上的分布式計算或超級計算機)和易用性,所以可以選擇最適合的任務。
解決與多個模擬器生態系統相關的問題同時保留好處將極大地增加神經科學中計算模型的重現性,從而更容易驗證已發表模型的有效性並構建以前的工作。
至少有兩種可能的(和相輔相成的)方法。一個是在不同的模擬器之間進行直接高效的通信,允許在不同的模擬器上模擬模型的不同部分(Ekeberg and Djurfeldt,2008)。這種方法解決了從不同組件構建模型的問題,但仍然留下不得不使用不同編程語言的問題,並且不能直接進行交叉檢查。另一種方法是開發一個模擬器獨立的模型規範系統。那麽翻譯只需要為每個模擬器完成一次,而不是每個模型一次。
在這裏,我們可以利用Python編程語言最近迅速的出現,作為幾個更廣泛使用的模擬器的替代接口。因此,例如,NEURON和NEST都可以通過原始的本地解釋器(分別是Hoc和SLI)或者通過Python來控制。最近的模擬器(例如PCSIM,Brian)將Python作為唯一可用的腳本語言。 Python的廣泛采用可能是由於許多因素造成的,包括強大的數據結構,清晰和表達的語法,豐富的庫,用於數值分析和可視化的工具的成熟度(允許使用單一語言來模擬整個工作流程分析到圖形化),以及Python作為一種粘合語言的易用性,允許在低級語言(如C)中編寫的計算密集型代碼在高級Python代碼中被透明地訪問。
Python本身並沒有解決翻譯問題(盡管它確實使翻譯過程更容易,因為至少簡單的數據結構,如列表和數組,對於每個模擬器是相同的),因為神經科學特定的概念仍然表達不同。 然而,現在可以為神經網絡模擬器定義一個與模擬器無關的Python接口,並實現自動翻譯到任何支持Python的模擬器。 我們設計和實現了這樣一個接口,PyNN(發音為“松”)。 在本文中,我們描述其設計,概念,實施和使用。 我們不試圖在這裏提供一個完整的用戶指南 - 這可以在網上找到http://neuralensemble.org/PNNN。
設計目標
在設計和實現一個通用的模擬器接口時,應該考慮以下目標。這些是我們在設計和實現PyNN接口時一直牢記的目標,但是它們同樣適用於任何其他這樣的接口。
一次編寫一個模型的代碼,在任何支持的模擬器或硬件設備上運行,無需修改。這是PyNN的主要設計目標。
支持高層次的抽象。例如,處理代表神經元群體的單個對象通常比直接處理所有單個神經元更好。必要時可以訪問每個單個神經元,但在許多情況下,人口是更有用的抽象。這種方法的優點是:(i)保持模型的概念性思想比較容易,而不會被實施細節分散註意力;(ii)對象的內部實現可以針對速度,並行化或存儲器需求進行優化改變呈現給用戶的界面。
支持至少兩個支持的模擬器提供的任何功能。目標是在支持所有模擬器的所有特性(不可行)和僅支持所有模擬器共有的特性子集(過度限制)之間取得平衡。
允許混合PyNN和本地模擬器代碼。 PyNN不應限制可執行模型的範圍。遵循上面的兩個模擬器規則,在一個模擬器中將會有可能的事情,而不是任何其他事情。盡管由100%PyNN組成的模型實現是在多個模擬器上運行的最佳場景,但是具有50%PyNN代碼的實現將比在沒有PyNN代碼的模擬器之間轉換更容易。
便於在模擬器之間移植模型。 PyNN改變了在模擬器之間移植模型的過程,從完全或者完全沒有,在翻譯完成之前翻譯模型的有效性不能被測試到增量的方法,其中本地代碼逐漸被模擬器取代獨立的代碼。在每個階段,混合代碼仍然是可運行的,因此可以直接驗證模型行為沒有改變。
最大限度地減少依賴關系,盡可能簡化安裝並最大限度地提高靈活性。 PyNN沒有內置的可視化和少量的數據分析工具,這意味著用戶可以使用任何他們想要的工具。
在輸出和輸入上呈現一致的界面。用於模擬輸出的格式在模擬器後端是一致的,使其成為建立更復雜的模擬控制,數據分析和可視化系統的穩定基礎。
優先考慮兼容性,但允許通過慎重選擇用戶選擇兼容性中斷優化(例如,各種print()方法的compatible_output標誌默認為True,但可以設置為False以獲得可能更快的寫入的數據到文件)。
API版本。隨著時間的推移,PyNN API將不可避免地演化,因為支持更多的模擬器並考慮用戶社區的偏好。為了確保向後兼容性,應該對API進行版本化,以便用戶可以指出哪個版本用於特定的實現。請註意,本文中給出的示例使用API??的0.4版本。
透明的並行化。在單個處理器上運行的代碼應該可以在多個處理器(使用MPI)上運行而不用更改。
其中一些目標有點矛盾:例如,抽象程度高,移植簡單。調和這對特定的目標導致PyNN中出現了一個高級的,面向對象的接口和一個與許多現有模擬器的接口更相似的低級過程接口。這些將在下面進一步討論。
使用例子
在詳細描述PyNN接口的基本概念之前,我們將通過一些在實踐中使用它的例子來進行工作:首先是一個簡單的例子,使用低級的過程接口,然後是使用高級對象的更復雜的例子 面向界面。
舉個簡單的例子,我們將建立一個網絡,由一個單一的集成和火災(IF)單元接收來自泊松過程的尖峰輸入。
首先,我們通過從PyNN導入相關模塊來選擇使用哪個模擬器:
如果我們想要使用PCSIM,我們只需要導入pyNN.pcsim等。無論我們使用哪個模擬器後端,下面的代碼都不會改變。
接下來我們設置模擬器的全局參數:
現在我們創建兩個細胞:帶有突觸的IF神經元,對突觸作出響應,突觸傳導逐步增加,然後呈指數衰減;“尖峰源”是一個在預定時間發射尖峰但不能接收輸入尖峰的簡單細胞。
在這種情況下,create()函數將標準PyNN模型名稱IF_cond_exp轉換為模擬器使用的模型名稱,standard_IF用於NEURON,iaf_cond_exp用於NEST,還將參數名稱和單位轉換為模擬器 - 具體的名稱和單位。 舉一個例子,i_offset參數表示註入到單元中的恒定電流的幅度,並且以毫安表示。 NEST iaf_cond_exp模型的等價參數名稱為I_e,單位為picoamps,因此在使用NEST運行時,PyNN都會轉換名稱並將數字值乘以1000。 標準單元模型和自動翻譯將在下一節詳細討論。
create()函數返回一個ID對象,它提供對單元模型參數的訪問,例如:
創建細胞後,我們用connect()函數連接它們:
現在我們告訴系統記錄哪些變量或變量,運行模擬並完成。
運行上述模型的結果如圖1所示,其中還顯示了對於這樣一個簡單的網絡,不同模擬器之間可獲得的再現性程度。
圖1.文中給出的第一個例子的運行結果,NEURON,NEST和PCSIM作為後端模擬器。 (A)積分時間步0.1 ms的整個膜電位曲線。 (B)放大跡線的較小區域,顯示不同模擬器的結果之間的小的數字差異。 (C)積分時間步長為0.01ms的仿真結果顯示數值差異大大減小。
使用create(),connect()和record()函數的低級過程接口對於簡單模型或移植使用創建/連接方式的不同語言編寫的現有模型時非常有用。對於更大,更復雜的網絡,我們發現具有更高抽象層次的面向對象方法更為有效,因為它通過隱藏實現細節來澄清模型的概念結構,場景優化。
為了說明高級的,面向對象的界面,我們現在從一些簡單的例子,從一些神經元轉變為一個更復雜的例子:一個由數千個興奮和抑制神經元組成的網絡,顯示自我維持的活動(基於“CUBA” Vogels和Abbott(2005)模型,再現了Brette等人(2007)使用的基準模型)。這仍然不是一個特別復雜的網絡,因為它只有兩種細胞類型,沒有空間結構,沒有神經元或連接特性的異質性,但是在演示如何使用PyNN構建這樣的網絡變得微不足道的時候,我們希望說服讀者,真正建設復雜,結構化和異構化的網絡變得易於管理。
再次,我們從選擇使用哪個模擬器開始。我們還從PyNN的隨機模塊導入了一些類。
我們接下來指定神經元模型的參數(相同的模型和相同的參數用於興奮性神經元和抑制性神經元)。
參數的電壓值是毫伏,時間以毫秒為單位,電容為毫法。 單位公約將在下一節進一步討論。
我們現在初始化模擬,這次接受全局參數的默認值。
現在,不是分別創建每個細胞,而是為每個不同類型的細胞創建一個Population對象:
默認情況下,給定Population的所有細胞都使用相同的參數創建,但可以隨後進行更改。 這裏我們希望在模擬開始時將膜電位的值隨機化至-50和-70 mV之間的值。
andomInit()是隨機化初始膜電位的一種方便的方法。 對於隨機化任何單元格參數的更一般情況,請使用rset()。
正如單個神經元被封裝在群體中,神經元之間的連接被封裝在投影中。 要創建一個Projection對象,我們需要指定神經元如何連接,或者通過一個算法,或者通過一個明確的列表。 不同的算法封裝在不同的連接器類中,例如FixedProbabilityConnector,AllToAllConnector。 連接的顯式列表可以通過FromListConnector或FromFileConnector提供。
請註意,權重以微西門子(導電度單位)和毫秒延遲。 在沒有指定延遲的情況下,使用setup()函數中指定的全局最小延遲。 在這裏,我們將投影的所有權重和延遲設置為相同的值,但同樣可以將構造函數傳遞給RandomDistribution對象,就像我們上面為初始膜電位所做的那樣,或者是一個明確的值列表。
要創建投影,我們需要指定突觸前和突觸後Population,連接器對象和突觸類型。 標準IF細胞各自具有兩種突觸類型,“興奮性”和“抑制性”。 用戶定義的模型可以使用任意名稱,例如 “AMPA”,“NMDA”。
構建了網絡之後,我們現在需要使用Population對象的record()(用於記錄尖峰)和record_v()(膜電位)方法來對其進行檢測。 在這裏,我們選擇記錄1000個興奮性神經元(隨機選擇)和所有抑制性神經元的峰值,並記錄兩個特定興奮性神經元的膜電位。 然後,我們運行1000毫秒的模擬。
運行仿真後,我們可以訪問結果或寫入文件。
圖2顯示了使用兩個不同的仿真器後端運行上述網絡的仿真結果。
圖2.運行本文第二個例子的結果,NEURON和NEST作為後端模擬器。 請註意,在這兩種情況下,網絡連接和初始條件是相同的。 (A)兩個興奮性神經元的膜電位曲線。 請註意,NEST和NEURON曲線在開始的50毫秒內非常相似,但在此之後,由於網絡活動的影響而快速發散,從而放大了較小的數值積分差異。 (B)興奮性(黑色)和抑制性(綠色)神經元的刺激活動。 每個點代表一個尖峰,每一行點都是不同的神經元。 顯示了所有5000個神經元。 (C)興奮性和抑制性神經元的匯集間刺激間隔(ISI)的分布。 (D)ISI變異系數[CV(ISI)]的神經元分布。
主要概念
為了實現“一次編寫模型的代碼,在任何支持的模擬器上運行而不需要修改”的目標,需要(i)通用接口,(ii)跨模擬器標準化的神經元和突觸模型,(iii) (iv)一致處理(偽)隨機數。 為了實現支持高級抽象和便於在模擬器之間移植模型的雙重目標,需要面向對象和過程接口。 所有這些要求的實施將在下面進行更深入的描述。 我們還通過描述對多分區模型的支持來說明PyNN和本地模擬器代碼的混合,以及PyNN如何支持僅在單個模擬器後端找到的功能。
標準細胞模型
PyNN中的一個基本概念是細胞類型 - 一個給定的神經元模型,可由一組方程表示,並包括亞閾值行為,尖峰機制和突觸後響應。細胞類型的公共接口主要由其參數定義。相同細胞類型的不同神經元如果具有不同的參數值,則可能具有非常不同的行為。例如,Izhikevich模型(Izhikevich,2003)可以重現各種各樣的尖峰模式,從快速跳動到正常尖峰到多種類型的爆發,取決於所選的參數值。因此細胞類型是模型類型而不是生物學定義的細胞類型(例如,“層V錐體神經元”)。
當使用給定的模擬器後端時,PyNN可以使用該模擬器支持的任何單元類型。在這種情況下,單元類型通常由一個字符串表示,保持對該模擬器有意義的模型名稱,例如, “iaf_neuron”在NEST。
當然,這種細胞類型只能與一個模擬器一起工作。要創建一個可以在不同模擬器上運行的模型,需要使用PyNN內置的標準單元模型,每個模型都由StandardCell類的子類表示。由PyNN提供的模型包括各種簡單的IF模型,Izhikevich自適應指數IF模型(Brette和Gerstner,2005),霍奇金 - 赫胥黎鈉和鉀通道的單室神經元,以及各種模型,到泊松過程),但不能接收它們。
StandardCell類包含用於在PyNN標準化值和模擬器特定值之間轉換模型名稱,參數名稱和參數單位的機器。當基礎模擬器使用不同的單位系統或相同方程組的不同參數化時,這是特別有用的。當一個模擬器期望膜時間常數和另一個膜滲漏電導。表1給出了由PyNN執行的翻譯的一個例子。
目前,所有的標準細胞類型都是單室或點神經元模型,因為PyNN目前僅支持一個用於多分區模型(NEURON)的模擬器。 下面給出了有關PyNN的NEURON後端使用多分區模型的更多細節。 我們計劃在將來允許使用NeuroML描述來指定多隔室細胞類型(Crook等,2005)。
單位
從前面的部分可以清楚地看出,每個模擬器後端都有自己的約定,哪個單位使用哪個物理量。 Brian的例外情況是,它有一個明確指定單位和檢查方程式在維度上一致的系統。今後,我們打算采用Brian的PyNN系統,但是現在我們選擇了一個與NEURON和NEST類似的慣例,因為這些單元是那些傾向於被實驗生理學家使用的單元。 PCSIM(也是GENESIS模擬器)使用純SI單位而沒有前綴的一個替代方案是另一種選擇。後一種慣例的優點是不需要檢查尺寸一致性的方程式。缺點是這種系統中的數值通常非常大或很小,因此人們對於合理和不合理的參數值的直覺大部分都會丟失。
考慮不同慣例的優點,最重要的是PyNN現在提供了一個在模擬器中有效的單一約定。具體來說,約定如下:電壓 - mV,電流 - nA,電導 - μS,時間 - ms,電容 - nF。
標準突觸模型
在PyNN中,初級突觸後電流或電導變化響應於突觸前峰值的形狀和時間過程被認為是突觸後神經元模型的一部分,而突觸連接的所有其他性質,特別是其重量(突觸響應的峰值電流或電導),延遲(對於點模型,這隱含地包括軸突傳播,化學傳遞和樹突傳播;更多形態學和/或生物物理學詳細模型可以明確地模擬這些源的一些或全部延遲)以及短期和長期的可塑性被認為取決於突觸前和突觸後神經元,因此被封裝在與上述“細胞類型”相反的“突觸類型”的概念中。
PyNN中默認的突觸連接類型是靜態的,具有固定的突觸權重。為了對動態突觸進行建模,突觸權重(以及可能的其他特性,如上升時間)取決於最近的突觸後活動史和/或突觸前活動的變化,我們使用與神經元相同的思想,命名模型在模擬器中具有相同的接口和行為,即使底層的實現可能會有很大的不同。
動態突觸的方法不同於神經元的方法是我們嘗試更大程度的組合性,即我們將模型分解成多個分量,例如短期和長期動力學,或時間依賴性和STDP規則的權重依賴,然後可以以不同方式組成。
這樣做的好處是,如果我們有組件A的n個不同的模型和組件B的m個模型,那麽我們只需要n + m模型而不是n×m,這在代碼簡單性和模型名稱短。缺點是並不是所有的組合都可能存在,如果底層模擬器實現復合模型而不是自己使用組件:在這種情況下,PyNN檢查一個給定的模擬器是否存在給定的復合模型AB,如果不存在,則引發異常。根據復合突觸模型的經驗,復合方法可能會擴展到未來PyNN接口版本的神經元模型。
目前在PyNN中只有一個模型存在於短期可塑性組分Tsodyks-Markram模型(Markram等,1998)。對於長期可塑性,有一個尖峰時間相關的可塑性STDP分量,它本身是由獨立的時序依賴和重量依賴分量組成的。
低級程序接口
我們將程序界面稱為“低級”,因為它涉及的是一個較低級別的抽象 - 個體神經元和個體突觸 - 而不是面向對象的界面。過程接口由函數create(),connect(),set(),record()(用於記錄尖峰)和record_v()(用於記錄膜電位)組成。這些功能中的每一個對單個單元ID對象或這些對象的列表進行操作或返回。正如使用示例部分所述,以及作為參數傳遞,ID對象可以用於訪問/修改單個神經元的參數,並使用上述的StandardCell機制來處理參數轉換。
在一定程度上可以混合低級和高級接口。例如,可以訪問Population中的單個神經元作為ID對象,然後使用connect()函數來連接它們,而不是使用Projection對象。
為什麽同時擁有低級和高級界面?兩者都是用戶混淆的潛在來源,絕對是開發人員的維護負擔。主要原因是支持使用PyNN作為移植工具。使用現有模擬器的大多數神經元網絡模型使用程序方法,因此如果PyNN支持相同的方法,則向PyNN的轉換更容易。另外,當為仿真器或神經形態硬件開發PyNN接口時,主要處理單個單元和突觸連接,因為只能實現低級接口,所以更容易實現,因為高級接口可以建立在它上面。
高級的,面向對象的接口
面向對象程序設計作為一種降低程序復雜度的方法已經在計算機科學中使用了多年。由於計算神經科學的限制因素變成了程序員的生產力,而不是計算機的能力,所以隨著大規模,生物詳細的神經元網絡建模的雄心和範圍的增加,降低程序復雜性將變得越來越重要(Wilson, 2006)。正因為如此,PyNN開發新模型的首選接口是面向對象的接口。
面向對象的接口建立在三個主要的類上:
人口 - 所有具有相同細胞類型(模型類型)的一組細胞。通常認為,總體中的細胞應該全部代表相同的生物細胞類型,即雖然參數值可以在組中的細胞之間變化,但是所有細胞應當具有定性的相同的反應。這不是強制執行的,但是對於產生可理解的代碼是一個很好的指導原則。人口類消除繁瑣的叠代在神經元列表,並使神經元屬性更有效的,基於數組的管理。
投影 - 兩個人群之間給定突觸類型的連接集合。創建投影需要指定突觸前和突觸後的種群,突觸類型以及用於確定哪些神經元與哪些神經元連接的算法。
連接器 - 用於創建投影的連接算法的封裝。這種算法的簡單例子是“全部到全部”,“一對一”和“連接每個事件之前和之後的突觸 - 細胞 - 固定概率”。也可以提供哪個單元將被連接到哪個單元的明確列表。每個算法都是在Connector類的子類中定義的。 PyNN包含許多這樣的類,但用戶定義自己的算法是相當簡單的。
在PyNN的未來發展中,我們計劃將界面擴展到更高層次的抽象,如圖層,皮質柱,大腦區域和區域間預測。我們還打算使用高級界面作為扣人心弦的網絡模型和不代表單個神經元的抽象模型(如平均場模型)之間的聯系。
隨機數字
中樞神經系統包含許多噪聲源,活動模式往往足夠復雜,可能是混沌的,使隨機表示成為一個合理的模型。
當比較在不同模擬器上運行的給定模型的行為時,這可能成為問題,因為隨機差異可能模糊模型的實現之間的實際不一致。同樣,在並行計算機上執行分布式計算時,模型行為不應該取決於所使用的處理器的數量(Morrison等,2005),隨機差異可以隱藏並行和串行實現之間的實際差異。
由於這些原因,能夠在不同的仿真器中使用相同的隨機數序列是重要的,並且在程序執行中的特定點處使用的隨機數獨立於它在哪個處理器上運行。
另一個考慮是大多數情況下的模擬只使用偽隨機序列,低質量的隨機數發生器(RNG)可能在序列的不同元素之間存在相關性,這可能會顯著影響網絡的定性行為。因此,有必要能夠用不同的RNG測試模擬。
PyNN支持與模擬器無關的RNG,並使用不同的生成器 - 目前,可以使用numpy軟件包或GNU Scientific Library(GSL)提供的任何生成器。
這是通過將numpy和GSL RNGs包裝在具有通用接口的類中來完成的。 PyNN的隨機模塊包含NumpyRNG和GSLRNG類,它們都有一個方法,next(n,distribution,參數),它從帶有參數參數的類型分布分布返回n個隨機數。
由於所有使用隨機數的PyNN代碼只能通過next()方法訪問RNG類,所以用戶可以簡單地用這種方法定義一個包裝類來代替它們自己的RNG。
由於通常希望重復使用相同的隨機分布,而不是每次改變分布,所以隨機模塊也提供RandomDistribution類,該類使用分布名稱和參數初始化,然後簡化next()方法 一個參數,從分布中抽取的值的數量,例如,
請註意,NumpyRNG和GSLRNG分布可能不具有相同的名稱,例如 NumpyRNG的“正常”和GSLRNG的“高斯”,參數也可能不同。 我們未來的計劃之一是擴展隨機模塊,以便跨RNG協調名稱。
多分區模型
PyNN目前僅支持單個模擬器NEURON,它適用於多室模型。由於支持模擬器獨立的原則僅適用於至少兩個支持的模擬器共享的特性,並且PyNN專註於網絡建模,PyNN不提供用於指定模擬器獨立的多分區模型的API。這是一個可能的未來發展 - 在MOIN模擬器的一個PyNN接口上已經做了初步的工作(Ray和Bhalla,2008),但更可能的路徑是使用NeuroML標準來指定多分區模型。在這種情況下,指定單個單元格類型的NeuroML 2級文件的文件名將作為單元類參數傳遞給PyNN create()函數或Population構造函數。
但是,由於本地和PyNN代碼可以混合,pyNN.neuron模塊已經支持多分區模型的模擬。可以使用Projection構造函數的源參數和目標參數指定的突觸後機制來指定電壓被註視以觸發突觸傳遞(例如,軸突終端)的突觸前隔室。
調試
如果在PyNN模擬中出現錯誤,首先要在另一個模擬器的後端重新運行,特別是將問題的源頭縮小到一個後端。 盡管如此,PyNN提供的附加抽象層有時使得追蹤錯誤來源變得更加困難。 為了平衡這一點,PyNN捕捉來自模擬器核心的錯誤,並采用Python的內省功能來提供關於錯誤上下文的附加信息。 例如,如果向神經元模型提供了無效的參數名稱,則錯誤消息會列出該模型的所有有效參數名稱。 此外,可以通過pyNN.utility模塊中的init_logging()函數來開啟日誌記錄功能,以便詳細了解系統正在寫入文件的內容,這是追蹤錯誤的寶貴資源。
實現
PyNN既是通用模擬器接口的定義,又是每個支持模擬器的接口實現。 PyNN被實現為一個Python包,其中包含一個通用模塊,該模塊定義了API,並包含所有模擬器後端通用的功能,隨機模塊(如上所述)以及每個模擬器後端的模塊,如圖3所示。 每個模擬器模塊都分別實現了API,盡管它可以使用很多共享代碼。 在大多數情況下,模擬器模塊已經由模擬器開發者或與之密切合作實施。
圖3. PyNN的體系結構
PyNN目前完全支持以下模擬器:NEURON(Carnevale和Hines,2006; Hines和Carnevale,1997; Hines等,2008),NEST(Eppler等,2008; Gewaltig和Diesmann,2007),PCSIM 和Brian(Goodman和Brette,2008)。 目前正在開發支持MOOSE(Ray和Bhalla,2008年)和以NeuroML格式出口(Crook等,2005年)。
PyNN也支持海德堡神經形態硬件系統(Schemmel et al。,2007)。 這說明了一個共同的神經元仿真接口存在的主要好處:新穎的仿真或仿真系統不需要開發他們自己的編程接口,但可以從現有的保證與現有工具的互操作性的現有益處。 使用PyNN作為神經形態硬件系統的接口提供了縮小數值模擬和物理仿真兩個領域之間的差距的可能性,迄今為止,這兩個領域已經相互獨立
重復性的限制
對於具有給定參數集的給定模型,在給定模擬器的給定版本上運行,應該可以精確地再現模擬結果,而不依賴於計算機體系結構(除了影響浮點表示的精度的情況外)或者操作系統。對於並行系統,結果也應該與計算中使用多少個線程或進程無關,盡管這裏精確的定量再現很難實現。如果指定了用於生成給定結果的精確版本,則給定仿真器的不同版本之間的重現性不是必需的,但是當然是非常可取的。在不同的模擬器上運行模型時,除了在簡單的情況下,由於浮點計算中的舍入誤差,無法實現準確的再現。因此,在通過在兩個或多個仿真器上運行模型來驗證模型實現時,可達到的重現性水平如何,我們如何判斷是否有任何差異是由於舍入誤差或實現錯誤?
為了初步處理這個問題,我們將兩個模擬器之間的模型活動的差異與同一個模擬器的兩個不同初始條件的差異進行了比較。
我們的測試案例是基於Vogels和Abbott(2005)的平衡隨機網絡,其實現如上所示。這個網絡的活動模式對初始條件非常敏感(混沌或接近混沌),所以我們不能使用精確尖峰模式的差異來衡量重復性:我們更關心活動的統計特性,所以我們已經選擇興奮性神經元的刺激間期(ISI)的分布(見圖2C)作為網絡活動的量度。
為了測量來自兩個不同運行的分布之間的差異,我們使用Kolmogorov-Smirnov雙樣本測試。我們運行了模擬十次,每次用不同的種子用於產生初始膜電位分布的RNG,同時使用NEURON和NEST後端。這給出了Kolmogorov-Smirnov D-統計量在0.008和0.026之間(n是19000)的平均值為0.015,相關聯的p值(兩個分布相同的概率)在6.3×10-5和0.68之間意味著0.15。
然後,我們在NEURON上運行20次模擬,每次使用不同的RNG種子,給出10對分布。在這種情況下,D值在0.007-0.026的範圍內,平均值為0.015,在2.8×10-5至0.77的範圍內的p值平均為0.20。
總而言之,由於不同模擬器的差異與由於不同的初始條件而產生的差異幾乎完全相同,這表明模擬器之間的差異確實是由於四舍五入誤差造成的,因此不存在任何實現錯誤在這種情況下。
值得註意的是,在大多數情況下,支持零假設,即分布是相同的,但是對於一些初始條件,ISI分布之間存在非常顯著的差異。因此,在這種情況下,ISI分布可能不是重現性的最佳措施。
討論
在本文中,我們介紹了PyNN,一個基於Python的通用模擬器接口,它允許模擬器無關的模型規範。 PyNN已經在許多研究小組中使用,並且一直是一個關鍵技術,使得泛歐合作項目中的實驗室之間的溝通更加順暢,並且成為建模和神經形態硬件開發的主要組成部分(FACETS項目:http:// www.facets-project.org)。
通過提供一個標準的模擬平臺,PyNN也有可能成為其他仿真器不可知的基礎,但是神經科學專用的工具,如分析,可視化和數據管理軟件。
PyNN不是解決與模擬器無關的模型規範和模擬器互操作性的唯一項目(Cannon等,2007)。 neuroConstruct(Gleeson et al。,2007)是一種使用圖形用戶界面(GUI)開發形態細節神經元網絡的工具,可以為NEURON和GENESIS模擬器生成代碼。對PyNN的一個限制是,由於它使用的是代碼生成而不是直接的界面,neuroConstruct不能從模擬器接收信息,除非通過讀取生成的數據文件。第二個限制是通過GUI不可用的功能不能被包含在模型中。 NeuroML標準(Crook等人,2005,http://www.neuroml.org)旨在以模擬器獨立的方式提供用於在組之間交換模型規範的基礎結構。它們的範圍包括更詳細的建模級別,例如膜離子通道和詳細的樹突形態,比PyNN支持。與PyNN相比,它們具有獨立於語言的優勢,因為規範是用XML編寫的,對於這些工具,所有主要編程語言都存在這些工具。純聲明性規範的主要缺點是缺乏靈活性:如果標準中沒有定義一個概念或實體,就不可能指定使用它的模型,而使用程序性/命令性或混合的聲明性 - 程序性規範,如用PyNN可以實現任意規格。
盡管我們在這裏強調GUI,純聲明和編程接口方法與模擬器無關的模型規範之間的差異,事實上它們是高度互補的。圖形界面對於初學者,教學,系統高層概述,以及集成分析和可視化工具特別有用。例如,除了NEURON和GENESIS的代碼之外,neuroConstruct能夠生成PyNN代碼是非常有用的。聲明性規範達到了最高級別的系統獨立性,支持的概念範圍。它們也特別適合轉換成人類可讀格式和自動生成GUI。因此,它們似乎最適合於建模方法相當穩定的領域,例如用於描述神經元形態或非隨機離子通道模型。在PyNN中,我們計劃使用NeuroML支持與模擬器無關的多分區模型:在這種情況下,將在NeuroML中指定單元模型,而PyNN將用於網絡規範和模擬設置和控制。
PyNN未來發展的主要優先事項是增加支持的模擬器的數量(模擬器開發者如果對模擬器的PyNN支持感興趣,請與我們聯系),改進對多分區建模的支持,並將接口向更高水平的抽象,如皮質列和更抽象的建模方法。 PyNN是開源軟件(CeCILL許可證,http://www.cecill.info),並有一個開放的開發模式:任何人誰願意貢獻是受歡迎的,並邀請這樣做。
參考文獻:https://www.frontiersin.org/articles/10.3389/neuro.11.011.2008/full
PyNN:神經網絡模擬器的通用接口