SNN初探(1)──編碼與解碼
由於某些因素,本系列後續為斷尾文章,請自行判斷內容的正確性。解說皆為作者之個人理解,對於理論正確性不負任何責任
Spiking neural network簡稱SNN,號稱是最有希望的新一代NN。但一堆故事型論文、只會放準確率、卻連半點參數跟架構都不寫出來,真的很像是一場馬扁局。
編碼與解碼
我把SNN的架構放在最後面,因為實用派的大家最關心SNN怎麼編碼跟解碼。Encode跟decode是在使用SNN時最基礎的一步,缺少這一步、提SNN架構只是霧裡看花,很多論文連怎麼把現實中的資料放進去都沒解釋。我認為原因是編碼方式百百種,再加上SNN不太好訓練、極有可能遇到某種編碼方式跟某種訓練方式完全不相容/無法訓練。
用一張圖解釋encode和decode:
SNN的輸入跟輸出是一種稱為spike train的時間序列訊號。就如上圖右方一堆桿子,他們是spike(即是神經脈衝,神經元透過突觸傳輸的訊號,你可以想像身體上的行為,如手臂移動、觸覺等都是透過這些spike訊號傳輸給予指令的)在時間上出現的序列。spike train的序列長度、最小間隔都可以自訂。當然,自訂有時候是根據不斷的試誤法得到的。
你可以想像神經元會固定在這些指定的秒數上放出電、藉此傳達訊號(摩斯電碼?)。實際上spike train只是一種簡易的示意圖,但至少現在先理解一個基本的spike在時間上放電的概念就好。
由於SNN的輸入與輸出都是以spike train的形式出現,而非如NN般的實際數字,因此需要將實際數字編碼(encode)成spike train,輸出後的spike train再解碼(decode)回去。這就是為什麼比起一般NN,SNN會比較接近人腦在處理資料的方式。
我說的是理論上。實際上沒人知道人腦是怎麼確切編碼跟解碼的。不過那不重要,反正NN不像神經元都能直接拿來用了,SNN打著仿生為名、倒不如說能用比較重要。
目前SNN主要有兩種主流編碼方式,分別為 Rate coding跟 Temporal coding 。
Rate coding
Rate coding最常被使用,跟算神經放電頻率的firing rate方法非常相似,也就是計算在固定時間內發出的spike次數,進而對應現實中的物理量數字。
將spike train用rate coding解碼操作方式如下(解碼區間是可調整的):
將spike decode成數字很容易,只要算spike的數目就好。但要將真實數字編碼成spike train時,就存在一個需要解決的問題(類似函數一對多)。
我們可以很明顯從圖上看到:spike train包含的資訊量明顯比firing rate來的多。如果在固定時間區間內些微移動幾個spike觸發的時間(ex: 1ms),只要不超過各自的解碼區間(ex: 1s),解出來的firing rate數值仍是一樣的。這是一個不可逆的過程。
如果我們要將數字4編碼成spike train,只要在1s解碼區間內隨機產生4個spike,都可以符合需求。雖然有些論文沒有明說做法,但我推測應該是可以透過「在固定時間內隨機發固定數量spike的方式」來產生spike train,因為這方法最簡單。
Rate coding有幾個優點,像是算起來比較簡單、訓練速度會比較快、訓練的方法也比較不那麼複雜(訓練之前先算該層spike train的firing rate,然後透過一般NN的倒傳遞進行firing rate數值偏微分,失去很多時間上的資訊基本上就是披著SNN架構的NN…)等等,幾個可能缺點如下:
- 會失去一些spike在時間軸上的資訊。如果spike提前/晚觸發的時間小於解碼區間,解出來的firing rate數值還是一樣的。很有可能會失去SNN比起其他NN在時間資訊保留上的優勢。
- 對有小數點的數字還需要額外的編碼解碼方式。當要算輸入/輸出的spike train有幾個spike時,當然不會出現1.5這種數字。目前大多數SNN論文都是用在分類問題,輸出幾類就用幾個輸出neuron(分類問題不在乎精確數值、只要比較輸出neuron的firing rate數值越大就屬該類)、輸出數值也不會出現小數點(像是mnist這種輸入數值只會有0–255整數的,編碼時不需考慮小數點問題)。
- 需要固定一個解碼區間(像是圖中的1s就有點久)。解碼區間就如同短時傅立葉轉換的window,會失去一些瞬態型訊號在該window裡面變化的資訊。解碼區間的大小也會影響訓練的效果
不管是哪種coding方式都需要編碼,因此列出一些可能的編/解碼方式:
- 把小數點直接去掉(乘以10的多次方),全部當成整數看待(可以直接當作firing rate轉成spike train)。輸出的spike train可以直接換回小數(除以10的多次方)。比起下面的兩種方式,這種方式是數字跟spike train完全一對一對應,數值資訊不會流失。
- 根據輸入的數值範圍,用多個gaussian normal distribution去解出更多的input spike time。有點像是擴充特徵的感覺(也可以解釋成用資料空間換運算時間,比如說將40拆成10,7,2,10,訓練時就可以平行處理、而不是只算一個要到40ms的時候才出現的資料,同樣10,7,2,10也可以解回原數值,但有可能不會是40而是41或39…),會有點數值誤差(可以透過增加高斯函數的覆蓋數目解決,但相對要處理的特徵也會暴增)。這種方法主要是在Temporal coding中使用。(這篇有詳細解釋編碼的實作方式,公式也有給,至於其他篇的圖跟解釋都很隨便:Improved spiking neural networks for EEG classification and epilepsy and seizure detection (by Samanwoy Ghosh-Dastidara and Hojjat Adeli)https://www.researchgate.net/publication/262350118_Improved_spiking_neural_networks_for_EEG_classification_and_epilepsy_and_seizure_detection)
- 改成二進制編碼,把4換成0100、7換成0111類似基因演算法GA的編碼方式。二進制的位元數取決於要多精確,但要減少多種數字多對一的情形,位元數勢必要增加。
雖然Rate coding看起來會失去一些時間上的資訊,但它也是目前最有生物理論根據的實作方式。實驗已經證實神經元在某種動作進行或接受到某些刺激時,有很大機率會大量放電,因此計算Firing rate已被用來作為神經放電一項重要的特徵。Rate coding簡單來說就是我們想以一個訊號在某個區間出現的 頻率 ,去模擬神經訊號的傳播與放電。
Temporal coding
Rate coding簡單來講就是算spike出現的頻率,Temporal coding則是算spike確切出現的時間點。Temporal coding的依據來自另一種神經訊號解碼的理論:Time-to-first-spike、Inner-spike-interval(ISI)。如下圖,Time-to-first-spike意思是第一個出現的spike時間點會帶有最多的訊息(像是11ms就可以被認為是一項重要的放電特徵)、ISI則是認為同一個神經元放出spike之間的時間間隔可能帶有訊息(如1,1,4,2就是四種特徵)。
這兩種說法都有一個共同點:比起Rate coding,他們都不再需要設定一個解碼時間間隔。就像短時傅立葉(STFT)一樣,只要有一個固定的window做取樣,就等於是捨棄某些時間上瞬態性的資訊。如果要強調SNN在時間上擁有精確的處理能力,用Temporal coding顯然更具說服力。Temporal coding在資訊保留上有優勢:
不須再前置encode轉換,可以直接放小數點數字進去、當作某個spike出現的時間點。因為Temporal coding在乎的是spike出現的時間點,因此只要時間解析度夠大(需要放小數點以下6位精確度的數字就設定最小間隔為us),任何小數點資訊都能保留進去。輸出的spike也一樣,因為不用數spike的數目,因此可以直接看最後一層第幾秒(如10.55秒)發出spike,就可將spike出現的時間點轉換為數字
實際上沒有那麼簡單,請看如下說明
它的缺點:
- 因為spike出現確切時間就代表訊號的值,因此解析度上要求要很精準。高解析度的時間序列=超長的時間矩陣=超大記憶體空間,因此訓練時間比較長,甚至極有可能會不收斂而訓練失敗。不收斂的原因跟編碼、訓練方式有關,所以放得進小數點是一回事,就像NN選了不同活化函數就會失敗一樣沒那麼簡單
- 編碼方式、訓練方式、甚至是正規化錯誤導致的Silent neuron problem。某些neuron就是永遠不打spike出來、某些要不就是一直瘋狂放電。為了解決這些問題,許多論文想出各種方法,neuron不放電就加bias neuron讓他強制一開始放電、兩個neuron之間的突觸如果興奮型跟抑制型交替出現的話會訓練失敗(這個結論還被後來實作的打臉,雖然我也不知道誰說得對…)、作法稀奇古怪。
不過讓我對SNN持懷疑態度的莫過於忽略穩定性、只追求準確度的現象。之後會提到,在訓練某些SNN的過程中,有一些機率會訓練成功且有高準確率、但也有更大機率是會收斂失敗的(有點像GAN?)。
下一篇SNN的架構跟訓練方式完之後,大概就沒啥好寫的了吧,除非我搞懂STDP在幹嘛(?
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!