1. 程式人生 > >脈衝神經網路之Tempotron簡介(一)

脈衝神經網路之Tempotron簡介(一)

脈衝神經網路之Tempotron簡介

       脈衝神經網路(SNN)這個概念在上個世紀就被提出,現在也不算什麼新的模型。但它和傳統BP神經網路還是很不一樣的,最近加入的實驗室做的就是這個方向,因此一直在學這個東西。這篇文章就由本人用來記錄些學習過的內容,同時也作分享用,有理解錯的地方希望有大佬能來指正吐舌頭

       脈衝神經網路比傳統人工神經網路更能模仿生物神經元之間的連線與通訊,能夠進行復雜的時空資訊的處理。但SNN模仿的脈衝具有不連續和非線性的特徵,因此在構建對該神經網路的監督學習演算法上比較困難。根據SNN實現的特徵可以將監督學習的演算法分為線上/離線、單脈衝/多脈衝、多層/單層的學習演算法。這裡要介紹的Tempotron就是單脈衝輸出的監督學習演算法。

        該演算法在論文《The tempotron : a neuron that learns spike timing based decisions》被詳細地闡述。這一篇部落格中先之闡述在該論文中提出的監督演算法的基本概念,有時間再寫一篇從程式碼的角度詳細闡述具體實現方法。

        脈衝神經網路神經元的基本模型是:對於一個神經元,接受來自前端突觸(上一層的脈衝輸入)之後膜電位(membrane voltage)升高,當膜電位升高到一個閾值(V threshold)之上時,該神經元就發出一個脈衝作為輸出,之後立刻shut所有與該神經元連線的前端突觸不再接受脈衝,此時膜電位回落到復位電壓並維持一段時間,之後才重新接受脈衝輸入。知道了神經元基本的工作方式,我們如何用SNN去處理一個分類問題?第一步,我們要考慮如何將樣本編碼為和時間相關的脈衝序列,比如如何將影象中(255,255,255)這樣的資料轉換成脈衝神經網路可以理解的脈衝序列;第二步,如何構建一個神經元的模型,這個就是剛才說的那個基本模型;第三步,要求確定一個學習演算法,從而對神經網路進行訓練,這裡就採用Temptron監督方法。

        Temptron方法提出:神經元后突觸膜電位(PSPs, Postsynaptic Potentials)是所有與之相連的上一層脈衝輸入的加權和。膜電位的計算公式:

                                                            

       從公式中可以看出,膜電位是將每個前端突觸輸入的脈衝在當前時間的大小K(t - ti)加權(乘wi)再求和,最後加上覆位電壓(Vrest)。其中K代表kernel,是介於0~1之間的數值,代表了在t時間下ti時間點傳入的脈衝的貢獻,K的計算公式如下:

K(t - t[i]) = V0(exp(- (t - t[i]) / taum) - exp( - (t - t[i]) / taus))

       畫成影象基本上是這個樣子:

                                                                              

       從公式中可以看出,K在脈衝發出的ti時間點處數值最高,在其他點數值相對下降,表示前端突觸在這個時間點有最大的脈衝輸入(afferent),隨著t-t[i]增大,該突觸貢獻的脈衝輸入減小。taum和taus是控制整個K(t)影象大致形狀的引數,在我們構建脈衝神經網路時就是超引數。V0在K的公式中作用在於將K normalize到0~1的範圍內。當ti > t時,K是不存在(vanishing)的,因為不存在在當前時間之後的脈衝數值。在一個時間視窗中,如果V(t)達到了V threshold,那麼該神經元就輸出脈衝(fire)並迅速返回復位電壓,並在一段時間內不再接受輸入(稱為不應期)。

       既然輸出神經元僅有輸出1和不輸出0兩個狀態,當應用於分類任務時如何輸出多個類別?這裡可以採用二進位制編碼的方式輸出不同類別。以MNIST資料集為例,輸出的類別一共有26種,如果用二進位制編碼,26個類別在16(2^4)和32(2^5)之間,因此可以採用5位二進位制數表示26個類別,因此脈衝神經網路有5個輸出節點,輸出類如00000表示A ,而00001表示B,以此類推。

     回顧一下我們訓練脈衝神經網路的目標,即是通過訓練使得該神經網路輸出神經元對對應的樣本產生正確的膜電位。通俗來說,比如只有一個輸出神經元,我們期望能夠識別是否輸入了A這個字母,那麼當輸入A時,該輸出神經元輸出脈衝,當輸入其他字母時該神經元抑制輸出。因此假設對每一個輸出神經元,當輸出類別要求該神經元不傳送脈衝(輸出0)時,如果輸出神經元發出了脈衝(可理解為事與願違),該批訓練(epoch)就更新與該神經元相連的上一層神經元的權重,更新的目的就是抑制該輸出神經元的膜電位,於是更新權重時所有與該輸出層神經元連線的輸入層神經元的連線權重會減小,減小的數值是:

                                                                     

其中K是和上面同樣的函式,數值在0~1之間,於是λ就定義了每次更新權重時更新數值的幅度(或許可以理解為類似學習率的東西)。tmax表示在一個時間視窗(0,T)內該輸出層神經元達到電壓最大值Vmax的時間。同理,當該輸出層神經元輸出為0(未發放脈衝),但目標是輸出1時,此次更新就會對每個權重增加一個上面的數值,結果就是增大了輸出層神經元的膜電位,最終達到發放脈衝的目的。

                                                                      上圖為訓練過後的輸出層神經元的膜電位在一個時間視窗內的變化。從上圖可以看出,所有符合輸出(圖中黑線+)脈衝被刺激,所有輸出與結果不符的(途中灰色-)脈衝被抑制。最終符合樣本分類結果的脈衝被輸出,模型達到了預期效果。         學習的過程中麻煩了學長很多。。先寫到這裡待更吧。