SNN初探(2)──SNN架構
因為某些原因,本系列為斷尾文章,請自行斟酌內容的正確性。期望有人能從中獲得啟發
上一篇我們提到SNN的編碼與解碼方式,但卻沒怎麼提到SNN的架構。事實上,SNN的架構示意圖跟encode/decode的說明一樣難找。我不了解這是一種什麼樣的現象,導致學者只願意放誤差隨時間下降、準確率隨時間上升這種大家都看到煩的圖,然後架構圖都不願意放。大概是不希望有人實作出來然後被打臉吧,看看最近reddit上發明PNN然後被發現誇大準確率的那位中國學生。
以下我說明的SNN架構,只是眾多模型中的其中一種。如前篇所述,這是一個新的領域,沒有人知道怎麼做會最好,因此想出了各種千奇百怪的架構來解決neuron不發spike=沒輸出訊號的問題。
首先,SNN是一種為仿生而生的網路,意思就是它的結構比起ANN,會更具有一些生物神經連接上的特性。所有可能有些SNN網路上的架構,聽起來不是這麼的容易理解為何要這樣做,因為它就是為了模擬神經訊號真正的傳遞方式,所以難免會不夠直觀。
其次,SNN跟ANN其實很像(其實所有類神經網路的大整體外觀都是一樣的)。對ANN有基礎的人來說,ANN就像是一堆神經元互相連接,訊號由輸入層向輸出層傳遞(況且不論同層互相影響互相抑制的,這又可以是另一種SNN的結構,我們稱為winner-take-all架構)。即使是全連接層(fully-connected layer),前後層兩個neuron間也只會有一條線連接(就是前後兩個neuron之間只會有一種權重)。
SNN就不太一樣了,前後兩個神經元之間可以有很多權重連接,這樣的設定來自於觀察生物體神經傳導的現象,兩個神經元之間可以有很多突觸連接、每個突觸各自傳遞不同的時間delay。這是SNN跟一般ANN不太一樣的地方,因為它多了更多的delay延遲選項。甚至,在通過neuron時也可以設定延遲。
生物體的神經訊號傳導
下圖出自上一篇曾提到的論文。我主要會以該篇做講解。
下圖展示的是在生物體中,神經元是如何傳遞訊息的架構。這張圖並不難,你可以想像現在有個脈衝序列訊號(spike train)從圖左上角的dendrites(樹突)進來、通過神經元、然後從右下角樹枝狀傳出去。
整個訊號的傳遞順序:樹突→Presynaptic neuron(前突觸神經元)→Axon(軸突)→Synapses(突觸)→Postsynaptic neuron(後突觸神經元)。一般的ANN就是被這種架構所啟發,但由於普通NN(MLP)不包含時間延遲資訊,因此兩個neuron之間也就不需要這麼多突觸連接。

在上一篇我們提到,SNN吃的是spike train,可以把spike train想像成是一個只有0和1的時間序列訊號。1出現的時候就是spike放電的時候。當一般ANN的訊號通過neuron時,不會有延遲。但SNN是時間訊號,一個spike train包含了許多spike發生的時間點,這些spike會按指定的時間通過多個synapse,spike的發生時間會加上synapse上的延遲,然後傳遞到下顆neuron。
作個統整:
- ANN:兩個neuron之間只用一個突觸(一條線)連接,只有一個權重。沒有延遲。
- SNN:兩個neuron之間有多個突觸(多條線)連接,有多個權重。每個突觸上有各自的時間delay、也有各自的權重大小。
只考慮前一層2顆neuron連接到下一層1顆neuron,我們可以畫個ANN與SNN架構的比較圖。從下圖就可輕易看出SNN擁有多時間延遲的特性。而且多個synapses不只影響延遲,還能藉由權重影響spike電壓的大小、進而控制下顆neuron的spike觸發的時間。

比較生物神經結構與SNN
很可能看了上圖還是覺得似懂非懂,這很正常,之後回過頭來看時會比較容易理解。我之後的解說如果一直在強調某些觀念、重複某些字句,表示希望讀者看這個概念看久了就能記起來。
我們要再次強調,spike train其實只是一個簡化的二值化時間序列,能讓我們方便看出spike發生的初始時間點。實際上神經訊號是以隨時間變化的電壓的形式傳輸,而非單純的數位0與1。我們稱這些電壓訊號為動作電位AP(action potential)。spike發生的時間點,就是電壓訊號AP隨時間開始傳遞的初始點。
還記得我們說過的訊號傳遞順序,我們可以把生物體的神經結構與SNN做個比較:

是不是有一種結構很相似的感覺?spike train造成的AP(動作電位)通過多個synapses、造成不同的延遲後,產生後突觸電位PSP(post-synaptic potential)。將這些PSP隨時間的變化相加起來,表現的是神經元內電位隨時間變化的內部狀態(internal state)。當內部電壓達到一定的threshold時,後面這層神經元就會fire、放出新的spike、將訊號向下一層神經元傳播。
PSP有分EPSP(excitatory postsynaptic potential,興奮型後突觸電位),讓internal state電壓上升而促進神經元提早fire。還有電壓是負值的IPSP(inhibitory postsynaptic potential,抑制型後突觸電位),讓internal state電壓下降而抑制或延遲神經元fire。我們其實可以將IPSP視為是EPSP乘上負號的結果。
而internal state就像一般ANN的激勵函數(或稱活化函數: activation function,像是sigmoid)。但請注意ANN的活化函數是連續可微分的,因此在倒傳遞上沒有任何問題,但用sigmoid這種數學上定義的式子明顯不夠仿生。而SNN的internal state則是不可微的(因為只有在到達threshold才會fire,其他時間函數都是不被觸發的),卻是最接近生物體放出spike的方式(有或全無)。之後會提到的SpikeProp就用了一個特殊的方法去近似微分。
下圖解釋了AP與PSP的關係。我們發現AP其實就像一個impulse function、幾乎只在那一個時間點有值,因此做這樣的近似也是合理的。AP經過不同的突觸,會形成不同型態的PSP。
A是AP造成的無延遲PSP隨時間的電壓變化。
B中的虛線代表AP和PSP起始的時間有延遲(因為synapse會造成不同的時間延遲)。
C是乘上了不同權重、有不同最大電壓大小的EPSP與IPSP。
D是時間常數變長的EPSP(稍後會提到EPSP的模型中,可以調整時間常數tau讓訊號時間延長)。

你可能仍對於AP(之後我們都稱為spike)與PSP的關係感到疑惑,請先記住這段解釋:
前一層neuron放出的spike,經過突觸後,產生了隨時間變化的電壓,稱為PSP。
許多PSP進入後一層neuron內疊加,一但到達threshold,neuron就放出spike,向下傳遞。
spike產生PSP,PSP產生spike (周而復始)
PSP在生理與數學上的模型
PSP後突觸電位開始於前一層neuron觸發spike之時,並向後一層傳遞,電壓值在後突觸neuron內進行疊加運算,當internal state超過threshold時就會觸發spike。由於目前實驗上觀察到的PSP型態各不相同,大家對於PSP的外型跟算式也沒有一個共識,因此會有各種數學模型去近似PSP。模擬的模型很多,包括LIF(leaky integrate-and-fire)、SRM(spike response model)、 Tempotron等等。選哪種PSP模型都取決於你。
我們在這篇中舉例的是一個被稱為alpha function的PSP模型。他的時間常數tau是可以被更改的,所以訓練效果好壞可能也跟tau有關。tau越大,電壓衰減的時間越長。

說明了PSP的電壓模型,接下來我們必須了解PSP是如何影響後突觸neuron的internal state。下面展示了兩種不同的spike train、對於後突觸電位發出spike時間點的效果。可以發現,當兩個neuron都向同一個後突觸neuron傳送spike時,由於在相鄰的時間內多了幾個spike,因此會讓後突觸neuron發spike的時間提早。我們也可以發現不同的spike間是會互相影響後續fire的時間點,圖C中,後突觸neuron因為internal state到達threshold而發了兩個spike輸出,且這兩個輸出spike與原本各自輸入spike train觸發的時間差,都有些微的改變。
在這裡必須強調PSP與spike數學模型的不同:
當PSP造成的internal state還沒達到threshold時,電壓在後突觸neuron內隨時間的變化就等於好幾個PSP的疊加。
但只要PSP造成的internal state一達到threshold,該時間點後的電壓模型就會轉換為接下來會提到的spike數學模型。
spike在生理與數學上的模型
當許多PSP接二連三抵達後突觸neuron,使得internal state的電壓到達threshold時,neuron產生了放電反應,造成電壓在短時間內急遽上升、又急遽下降,我們稱這段變化很大的電壓區間為spike。
spike的模型其實包含了去極化(depolarization)、再極化(repolarization)、過極化(hyperpolarization)等過程。在這裡我們必須定義靜止膜電位(resting membrane potential),由於在生物體中觀察到,假設細胞外的電壓是0 V,則在無接受刺激時內部電壓是-70mV左右。在這邊為了運算方便,我們一律將resting potential設為0,但電壓隨時間變化的特性是一樣的。resting potential代表了不管中間膜電壓怎麼改變、最後都會回到這個電壓基準點。
由於細胞內靜止時的電位<0 V,我們稱這種電荷分離的現象叫極化(電荷分開在膜內膜外兩邊形成電容)。
去極化表示細胞受外界刺激、造成膜內外的電壓差逐漸上升接近0、甚至高於0。
再極化代表細胞膜電位再次下降、將要回到原本極化的狀態。
過極化則表示當電壓回到resting potential的過程時,會有段時間低於resting potential(我們可以稱這種現象叫overshoot,電壓的變化就像來不及煞車衝過頭一樣),低於resting potential表示要觸發下一個spike的話,可能要再等一段時間。我們稱這段期間為不反應期(refractory period)。有點像LOL的技能冷卻時間。
不反應期又分為絕對不反應與相對不反應期,有興趣可以去查查,觀念都很簡單,在此略過。加不加這個特性取決於你想要SNN仿生到甚麼程度。
另一種比喻:可以想像細胞膜就像一個平時都在通著電的電磁鐵,電磁鐵會因為通電而被極化,表示兩端各擁有了N與S極;沒通電則失去極性、失去磁性。
一個平時都在通著電的電磁鐵是被極化的狀態,突然某位調皮的藍同學轉了電源供應器的電壓旋鈕,造成磁鐵的外接電壓逐漸減為0(去極化)。此時某位梁同學見義勇為把電壓再次慢慢的調回來(再極化),但因為太氣藍同學而不小心調得太過頭了(過極化)。幸好及時發現而進行修正,因此電磁鐵最終得以回到一開始的resting potential。
我比喻的不好我去面壁
下面這張圖是當PSP到達threshold時,spike的電壓隨時間的變化,也很清楚的展示了何謂不反應期。最下方的圖則是嘗試用數學去近似上面這個模型。可以發現,其實我們在模擬spike的時候,只考慮去極化、還有過極化區間的電壓變化。


不反應期的數學模型如下。可以直接用程式實現。然後tau值也是可以變的。

SNN架構
聽完了spike與PSP的模型後,相信大家已經頭昏腦脹了。我們離訓練網路只差最後一步:SNN的架構。但其實只需要一張圖就解決了。
為何筆者要先講解spike跟PSP的模型?筆者認為先丟出SNN的架構、再逐一解釋spike與PSP,可能會讓人產生一種:跟一般的NN很像、輸入跟傳遞的方式又不太一樣,而有似懂非懂的感覺。筆者習慣從最初的定義下手,因為spike跟PSP是建立SNN model前需要被事先定義的函數。寫程式語言也是如此,把輸入輸出訊號定義好、再談架構,純屬個人習慣。
其實,我們在談spike跟PSP的過程中,已經描繪出SNN的雛形了。如果讀者有認真看spike跟PSP的說明,下圖SNN的結構可能會覺得只是上面的延伸而已。

這張圖涵蓋了之前講的所有概念:
1.SNN跟ANN長的超級像,差別在於兩個neuron中間,其實有多條線連接
2.兩個neuron中間有多個突觸(多條線),每個突觸會造成不同的delay、不同的權重會讓PSP的電壓最大值改變
3.從不同neuron、不同突觸產生的PSP,疊加起來達到threshold,則會觸發下一層neuron在特定時間放出spike
4.突觸上星星狀的圖示代表權重大小,可發現權重越大,產生的PSP最大電壓越高
5.從presynaptic neuron到權重間這條長度的線、和從權重到postsynaptic neuron間的長度是一樣的,線代表時間軸,我們稱這條時間軸為模擬時間(simulation time),所有編碼解碼都在這條時間軸上進行。我們曾經提到不同的突觸會有不同的時間delay,所以spike在不同的突觸時間軸上會有相對應的時間位移、產生了PSP也有相對應的移動。所以這個圖這樣畫是有道理的、而非隨意找個位置放上spike。
下一章將會進到針對SNN的監督式學習:SpikeProp與其延伸的演算法。同時也會嘗試去探討,如果要用程式實現,參數該如何設置與其困難點。
參考資料
Improved spiking neural networks for EEG classification and epilepsy and seizure
detection(2007)
A new supervised learning algorithm for multiple spiking neural networks with
application in epilepsy and seizure detection(2009)
Like my work? Don't forget to support and clap, let me know that you are with me on the road of creation. Keep this enthusiasm together!