天天看點

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

SAST weekly 是由電子工程系學生科協推出的科技系列推送,内容涵蓋資訊領域技術科普、研究前沿熱點介紹、科技新聞跟進探索等多個方面,幫助同學們增長姿勢,開拓眼界,每周更新,歡迎關注!歡迎願意分享知識的同學投稿至 [email protected] , 期待你的作品!

  神經網絡的地位在當今的人工智能領域毋庸置疑,但凡想搞點什麼事情,比如做個圖像識别(尤其是媒認大作業),整個AlphaGo來下棋之類的,都是離不開神經網絡的。事實上,這裡的“神經網絡”,所指的主要是人工神經網絡(ANN)——當今最普遍的一類神經網絡。今天想講的,是另一類非常有潛力的神經網絡,即脈沖神經網絡(SNN)。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

01

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

人工神經網絡

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

  在講脈沖神經網絡之前,還是來對人工神經網絡做個概述友善之後進行對比。   

    人工神經網絡的範疇是非常廣泛的,許多耳熟能詳的名詞,什麼深度學習、卷積神經網絡、循環神經網絡等等,都可以歸屬于這一範疇内。

  而各種人工神經網絡的工作原理以及訓練方式也是大同小異的:

  大體上來說,就是用一層層的網絡堆積起來形成一個總體的網絡,每層網絡以某種方式獲得自己的輸入,并将這一輸入進行一些處理之後再發送給自己的下一層,直到最終到達輸出層。而每一層之間對資料進行的處理也是比較類似的,基本可以表述為

   y=f(Wx+b)

的形式,x為輸入,W是一個矩陣,f是一個非線性函數,總的來說就是一次線性變換+一次非線性變換,不同網絡之間的不同之處隻在于這個輸入“x”的來由,有些取上一層的輸出以及前幾層的輸出合起來作為輸入;有些取上一層的輸出和自己前一次的輸出作為輸入,等等。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

    神經網絡的本意就是模拟人腦神經工作原理的網絡,人工神經網絡是我們在這個方向上踏出的重要的一個步驟,可惜它在模拟人腦工作這一方面,仍做得并不完美。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

02

脈沖神經網絡

   我們将人工神經網絡中的每層中的每個節點都看作一個神經元,那麼這每個神經元在工作時都幹了些什麼呢?其實無非也是接收輸入→線性變換→非線性函數→輸出。但回想一下高中生物的知識,我們腦中的神經元是這樣工作的嗎?不是,我們的神經元不知道啥是非線性函數,也不會真的去做矩陣乘法運算,而是通過“興奮”機制進行工作的:每個神經元從前幾個神經元處擷取信号,這些信号能對這個神經元的電位産生影響,或提升或降低,當電位超過一定門檻值的時候神經元即産生“興奮”,而後對自己的“下家”發送電信号,在興奮一段時間之後,如果自己的上家沒有持續發送令自己興奮的信号,就會逐漸回歸抑制的狀态。

   于是,模仿這種興奮機制,今天的主角:脈沖神經網絡就随之産生了。相比于人工神經網絡,每個神經元進行的是由輸入到輸出的計算,在脈沖神經網絡中,每個神經元在接收輸入信号之後進行的是對自己電位狀态的運算(如圖)。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

 每個神經元在抑制狀态時具有一定的初始電位以及一個高于初始電位的門檻值。在受到刺激(前置神經元輸出1)之後,一般來說這個電位的值就會陡增,當自身電位超過門檻值之後,該神經元即興奮(輸出1),興奮一段時間,電位下降回到門檻值之下(輸出變為0),并最終回到初始電位。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

  于是,脈沖神經網絡與人工神經網絡的最大差别出現了:對于人工神經網絡,每個神經元接收與發出的是與同一時刻到達/發送的一批資料,而對于脈沖神經網絡,接收的是脈沖信号,信号改變電位,再根據自身電位同樣發出脈沖信号。

   如果單從對人類腦神經的模拟程度上來看,似乎這個脈沖神經網絡學得更加像一些?

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

03

SNN的優劣

  SNN比之ANN更接近人腦的工作機制,自然也就帶來了相應的優勢,其中最重要的一點就是對時間資訊的利用。

  很多人工神經網絡對時間資訊都是沒有涉獵的,比如卷積神經網絡等,其輸出僅取決于目前輸入。在我的有所了解的網絡結構中,有循環神經網絡(RNN)對時間資訊有所利用——将前一時刻的輸出作為下一時刻的輸入,使得網絡多了一些記憶性。

  而SNN對時間的利用顯得更為的自然,是以神經元電位狀态的形式對前一時刻的資訊進行儲存的,目前時刻的狀态由前置神經元給出的刺激信号和前一時刻的電位狀态決定,而目前輸出由目前狀态決定。這種方式從感覺上比較類似于狀态機的工作方式,無疑比之RNN對時間資訊利用地更為自然(如下圖,受到刺激後,電位提高,在之後逐漸随時間衰減,再受到刺激時,電位變化累加在目前狀态上,直到電位超過門檻值後進入興奮狀态)。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

  然而,脈沖神經網絡如今卻并沒有普及,人工神經網絡仍然是神經網絡中的主流,這是因為脈沖神經網絡仍有其缺點,最重要的缺點在于其訓練過程——由于脈沖神經網絡中輸入、輸出都是脈沖信号,而脈沖信号本質上可看成二進制比特流,這東西理論上是無法求導的,也就沒法直接套用ANN使用的BP算法進行訓練。

 而時至今日,還沒有專為SNN開發的算法讓它能夠進行監督學習。如今已有的訓練方式,如STDP算法,都是無監督訓練的算法。目前來說,對脈沖神經網絡進行監督訓練,一種途徑是,對脈沖神經網絡進行适當的改變,使其具有一些ANN的特性,進而能夠進行求導并應用BP算法。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

04

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

實戰訓練

  最後,我們來嘗試通過SNN來完成一些比較簡單的任務——比如通過MNIST資料集訓練手寫數字識别。

   訓練一個網絡,最重要幾個因素,無非是網絡結構、激活函數、損失函數等。

(注:以下代碼來源于我上學期上過的一門課“類腦計算系統技術”)

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

    網絡采用較簡單的三層結構(784-512-10)。

  首先将輸入的模拟信号(圖像的灰階,取值範圍為0-1)轉化為脈沖信号(采用占空比的形式,如灰階0.3,即在一段時間中輸出30%的1和70%的0),用脈沖信号取刺激第一層的神經元,第一層神經元輸出對應的脈沖信号,繼續刺激第二層的神經元,第二層神經元再輸出脈沖信号即傳到輸出端口。而對于每個神經元,都首先根據刺激更新電位狀态,而後根據狀态進行輸出(輸出同樣為脈沖信号,按照占空比轉化為具體數值)。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

     如圖即為激活函數,激活函數是是的SNN能夠套用BP算法的關鍵,标準的激活函數應當為一個階躍函數(超過門檻值為1,不到則為0),但這樣其導數将是一個δ函數,難以進行誤差反向傳播,于是,這裡對激活函數做如下圖的近似:

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

    這樣,可以進行求導了,也就可以應用BP算法了。

   有了以上的網絡結構,就可以開始訓練了,選取損失函數為均方誤差nn.MSELoss(),優化器選擇Adam,在mnist上訓練的效果如下:

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

 從上至下依次為測試集準确率、訓練集Loss、測試集Loss(mnist較簡單,隻訓了10個epoch意思意思)。

    來看看識别效果:

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡
脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡
脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡
脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

(下面是手寫數字圖檔,上面的标題為識别出的數字,做得比較簡陋)

對SNN的基本介紹差不多就到這裡,希望能幫助大家認識這種新型的,與衆不同的神經網絡。

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

撰稿:鄒俊泓

稽核:孫志堯

脈沖神經網絡_SAST Weekly | 初識脈沖神經網絡

繼續閱讀