徐夢遙
(上海交通大學(xué)電子信息與電氣工程學(xué)院,上海 200240)
人工神經(jīng)網(wǎng)絡(luò)(artificial neural network,ANN)近年來迅猛發(fā)展并廣泛運(yùn)用于各行業(yè)[1]。ANN的一個(gè)計(jì)算單元包括多個(gè)加權(quán)輸入和一個(gè)連續(xù)可求導(dǎo)的激活函數(shù),可求導(dǎo)的激活函數(shù)使ANN易于通過沿梯度下降的方法進(jìn)行訓(xùn)練[2],這樣的計(jì)算單元也被稱為人工神經(jīng)元。但ANN與生物神經(jīng)網(wǎng)絡(luò)在結(jié)構(gòu),計(jì)算,信息傳遞機(jī)制上存在較大差異,且在很多任務(wù)場景中仍無法實(shí)現(xiàn)更智能的功能。與傳統(tǒng)人工神經(jīng)元相比,新一代脈沖神經(jīng)網(wǎng)絡(luò)(spiking neural network,SNN)神經(jīng)元在信息的表達(dá)和傳遞上更加接近生物神經(jīng)元[3-4],因此作為第三代神經(jīng)網(wǎng)絡(luò),有望處理更復(fù)雜的任務(wù)、實(shí)現(xiàn)更好的性能,因而受到學(xué)術(shù)界的廣泛研究。此外,對于規(guī)模更大的深度神經(jīng)網(wǎng)絡(luò)(deep neural net?work,DNN),脈沖神經(jīng)網(wǎng)絡(luò)的脈沖特性能夠?qū)崿F(xiàn)更好的能效比,占用更少的硬件資源。但由于脈沖神經(jīng)網(wǎng)絡(luò)不可求導(dǎo)的激活函數(shù)和離散的信息表達(dá)方式,現(xiàn)有的基于梯度下降的反向傳播算法難以被用于訓(xùn)練SNN[5],因此SNN尚且缺乏一個(gè)有效的訓(xùn)練方法,影響了它的廣泛應(yīng)用。
一個(gè)常見的訓(xùn)練SNN的方法是先訓(xùn)練ANN,然后將其轉(zhuǎn)換為SNN并進(jìn)行權(quán)重微調(diào)[7-9]。這樣的方法普遍存在的問題是會對ANN產(chǎn)生很多限制,例如不得使用偏差、批量歸一化和平均池化層。Sengupta團(tuán)隊(duì)[9]提出將SNN神經(jīng)元輸入的最大值設(shè)置為激活閾值,但脈沖時(shí)間序列的總長度達(dá)到2000—2500,導(dǎo)致整個(gè)網(wǎng)絡(luò)的計(jì)算時(shí)間非常長。Rueckauer團(tuán)隊(duì)[10]選擇輸入分布的某一個(gè)百分位作為閾值,在一定程度上降低了整個(gè)網(wǎng)絡(luò)的計(jì)算延遲并提高了魯棒性,但閾值的選擇缺乏有效的方法。Hu團(tuán)隊(duì)[11]提出的ANN到SNN的轉(zhuǎn)換算法是目前最成功的轉(zhuǎn)換方法,但其脈沖時(shí)間序列長度非常長,計(jì)算效率較低。
另一種訓(xùn)練SNN的方法是使用反向傳播進(jìn)行訓(xùn)練[12-13],最大的挑戰(zhàn)是脈沖神經(jīng)網(wǎng)絡(luò)激活函數(shù)和離散脈沖時(shí)間序列是不連續(xù)且不可求導(dǎo)的。Wu團(tuán)隊(duì)[14]第一次提出了利用空間和時(shí)間域上的反向傳播來訓(xùn)練SNN,并在MNIST數(shù)據(jù)集上達(dá)到了較好的準(zhǔn)確率。該方法的不足在于訓(xùn)練的計(jì)算量非常大,導(dǎo)致其難以被運(yùn)用在規(guī)模更大的網(wǎng)絡(luò)結(jié)構(gòu)上。Zenke 和 Ganguli[15]設(shè)計(jì)了基于膜電位的模擬梯度函數(shù)用于反向傳播,但此方法僅針對單一時(shí)刻的脈沖,難以運(yùn)用在脈沖時(shí)間序列上。Shrestha和Orchard團(tuán)隊(duì)[16]使用膜電位和閾值之間的差異計(jì)算梯度,但僅在MNIST數(shù)據(jù)集上訓(xùn)練了一個(gè)較小的淺層網(wǎng)絡(luò),沒有訓(xùn)練較大規(guī)模的網(wǎng)絡(luò)。
總結(jié)現(xiàn)有的訓(xùn)練方法,訓(xùn)練大型脈沖神經(jīng)網(wǎng)絡(luò)依然存在三個(gè)尚未解決的問題:①以脈沖作為輸入和輸出的神經(jīng)元模型是不可求導(dǎo)的,這阻礙了基于梯度下降的訓(xùn)練算法的實(shí)現(xiàn)。②離散的脈沖時(shí)間序列使得反向傳播難以實(shí)現(xiàn)。③由于使用類似二進(jìn)制的脈沖來表示數(shù)據(jù),相比較傳統(tǒng)神經(jīng)網(wǎng)絡(luò),脈沖神經(jīng)網(wǎng)絡(luò)對參數(shù)變化更敏感,訓(xùn)練過程中可能存在難以收斂的問題。本文針對這三個(gè)問題,分別提出了解決方案。針對不可求導(dǎo)的脈沖神經(jīng)元模型,本文設(shè)計(jì)了一種模擬神經(jīng)元模型的可求導(dǎo)激活函數(shù),這樣的激活函數(shù)可以保證訓(xùn)練得到合理的激活閾值,對應(yīng)圖1綠色部分。針對第二個(gè)離散時(shí)間序列問題,本文提出將時(shí)間維度轉(zhuǎn)換為空間維度方法,即訓(xùn)練時(shí),在空間維度上處理數(shù)據(jù)在時(shí)間維度中的相互關(guān)系。針對第三個(gè)問題,本文設(shè)計(jì)了不同的編碼與解碼層將圖片數(shù)據(jù)轉(zhuǎn)換為脈沖數(shù)據(jù),對應(yīng)圖1中藍(lán)色部分。同時(shí),筆者開發(fā)了一個(gè)基于Pytorch的訓(xùn)練深度脈沖神經(jīng)網(wǎng)絡(luò)的框架,對應(yīng)圖1整個(gè)訓(xùn)練階段(Train?ing Stage)。圖1中各部分的標(biāo)號代表在本文中的詳細(xì)介紹章節(jié)。訓(xùn)練階段結(jié)束后會將訓(xùn)練好的權(quán)重和閾值傳給測試階段,激活函數(shù)采用原始的脈沖神經(jīng)元模型進(jìn)行最終的準(zhǔn)確度測試,對應(yīng)圖1下半部分(Test Stage)。
圖1 論文主要工作和實(shí)驗(yàn)流程
與ANN相似,脈沖神經(jīng)網(wǎng)絡(luò)由相互連接的神經(jīng)元組成,每一個(gè)神經(jīng)元與上一層的若干個(gè)神經(jīng)元連接,這一層的輸出又作為下一層神經(jīng)元的輸入。不同于ANN輸入以數(shù)值的形式出現(xiàn),SNN神經(jīng)元的輸入則是脈沖時(shí)間序列,如圖2中的Prespikesx1,x2和x2表示的是一個(gè)神經(jīng)元的三個(gè)輸入,他們的脈沖數(shù)量都為3,橫坐標(biāo)為時(shí)間,表示每一個(gè)序列的三個(gè)脈沖都在不同的時(shí)刻到達(dá)神經(jīng)元。
圖2 脈沖神經(jīng)元示意圖
衰減-整合-發(fā)射(leaky-integrate-and-fire,LIF)神經(jīng)元模型是廣泛用于描述脈沖神經(jīng)網(wǎng)絡(luò)神經(jīng)元的模型,在此模型中,神經(jīng)元的行為類比的建模為由電容器和電阻器組成的并聯(lián)電路。
其中u是神經(jīng)元膜電位,τ是膜電位衰減的時(shí)間常數(shù)。輸入電流It定義為t時(shí)刻輸入脈沖的加權(quán)總和:
其中,nl表示前一層網(wǎng)絡(luò)中與當(dāng)前神經(jīng)元相連接的權(quán)重?cái)?shù)量,wi是前一層的第i個(gè)神經(jīng)元連接到當(dāng)前神經(jīng)元的權(quán)重。onl-1(t-tk)是第i個(gè)神經(jīng)元在tk時(shí)刻的脈沖值,可以用以下公式表示:
圖2中的LIF Neuron展現(xiàn)了LIF神經(jīng)元的內(nèi)部機(jī)制。每個(gè)脈沖oi-1(t-tk)通過相應(yīng)的權(quán)重wi進(jìn)行放大或縮小,以產(chǎn)生流入神經(jīng)元的電流。輸入電流累加到神經(jīng)元的膜電位u中,對應(yīng)衰減-整合-發(fā)射神經(jīng)元模型中的整合,但該電位隨時(shí)間常數(shù)τ隨時(shí)間呈指數(shù)減弱,對應(yīng)衰減。當(dāng)膜電位超過閾值Vth時(shí),神經(jīng)元會產(chǎn)生輸出脈沖,此時(shí)膜電位重置為ureset,否則,神經(jīng)元接收輸入脈沖后只會更新膜電位,并不會產(chǎn)生輸出脈沖。對應(yīng)衰減-整合-發(fā)射中的發(fā)射。描述以上脈沖神經(jīng)元(LIF)模型的差分表達(dá)式為:
本文設(shè)計(jì)的脈沖編碼層是整個(gè)SNN的第一層。編碼層采用二進(jìn)制編碼,將浮點(diǎn)數(shù)轉(zhuǎn)化為固定位數(shù)的二進(jìn)制定點(diǎn)數(shù),將初始數(shù)據(jù)壓縮至x∈(0,1),將小數(shù)點(diǎn)固定在二進(jìn)制數(shù)的最前端,即表示整數(shù)的位數(shù)為0,所有bit都用于表示小數(shù),例如將浮點(diǎn)數(shù)f=0.23224轉(zhuǎn)換為8位的二進(jìn)制數(shù)0.00111011,將小數(shù)點(diǎn)固定在定點(diǎn)數(shù)的最左端,相當(dāng)于把這個(gè)二進(jìn)制數(shù)左移8位,得到b=00111011,這個(gè)二進(jìn)制數(shù)就是編碼層產(chǎn)生的脈沖序列,t=0時(shí),最高位為0,代表此時(shí)沒有脈沖,t=2時(shí),第三高位為1,代表此時(shí)有脈沖,注意8位的二進(jìn)制數(shù)意味著T=8。
本文設(shè)計(jì)的解碼層作為SNN的最后一層。如果解碼層依然采用二進(jìn)制解碼,在反向傳播過程中,損失函數(shù)的導(dǎo)數(shù)通過這一個(gè)解碼層時(shí),會分別乘以20,21,…,27,導(dǎo)數(shù)值通過該層后會有指數(shù)倍的方差,使得訓(xùn)練過程中更新后的權(quán)重波動異常大而無法收斂。因此為了避免這一問題,本文在解碼層設(shè)計(jì)了一個(gè)全連接層進(jìn)行解碼,此過程如圖3所示。這個(gè)全連接層有T×1維的權(quán)重,且這個(gè)權(quán)重同其他全連接層一樣,是神經(jīng)網(wǎng)絡(luò)中可訓(xùn)練的參數(shù)。
圖3 全鏈接解碼層
對于單個(gè)脈沖神經(jīng)元,它的激活函數(shù)是一個(gè)階躍函數(shù):
u是該神經(jīng)元的膜電位,如圖4所示。
圖4 階躍函數(shù)
當(dāng)膜電位u超過閾值Vth時(shí),神經(jīng)元便會立刻產(chǎn)生一個(gè)脈沖傳遞到下一層的神經(jīng)元。假設(shè)Vth=0,階躍函數(shù)是不可導(dǎo)的函數(shù),因此無法運(yùn)用傳統(tǒng)的沿梯度下降訓(xùn)練算法,因而設(shè)計(jì)一種可求導(dǎo)的擬激活函數(shù)即可解決上述問題:
此處的c是一個(gè)壓縮常數(shù),當(dāng)c=1,Vth=0時(shí),這個(gè)擬激活函數(shù)就是Sigmoid函數(shù):
當(dāng)c=3,Vth=1時(shí),如圖5黑色函數(shù)曲線所示,激活函數(shù)在x方向上被壓縮。c越大,Θ(u)函數(shù)越接近階躍函數(shù),c越小,激活函數(shù)越平滑。
圖5 不同壓縮常數(shù)下的擬激活函數(shù)
在本實(shí)驗(yàn)中,脈沖神經(jīng)網(wǎng)絡(luò)的訓(xùn)練初期將c的初始值設(shè)置為1,隨著迭代次數(shù)的增加,將c的值線性緩慢增大,從而無限逼近階躍函數(shù),最終當(dāng)c=15時(shí),如圖5橘色函數(shù)曲線所示,平滑的激活函數(shù)已經(jīng)非常趨近其原始的階躍函數(shù),當(dāng)模型訓(xùn)練的損失不再減小時(shí),即得到我們所需的模型參數(shù),包括卷積層的卷積核權(quán)重,全鏈接層的權(quán)重和閾值Vth。激活函數(shù)對輸入u求導(dǎo)得到:
在實(shí)驗(yàn)過程中發(fā)現(xiàn),如果一層網(wǎng)絡(luò)的所有神經(jīng)元對應(yīng)不同的閾值,參數(shù)的個(gè)數(shù)會急劇增加,訓(xùn)練時(shí)長也會增大,并且通過實(shí)驗(yàn)結(jié)果分析得知,將每一層網(wǎng)絡(luò)同一個(gè)輸出通道(chanel)的神經(jīng)元使用相同的閾值時(shí)的訓(xùn)練結(jié)果,與使用各不相同的閾值的訓(xùn)練結(jié)果相比,并沒有明顯的準(zhǔn)確率下降。因此同一層同一個(gè)通道的神經(jīng)元使用一個(gè)共同的閾值Vth。
脈沖神經(jīng)元傳遞信息的機(jī)制可概括為LIF模型,在這個(gè)模型中,脈沖時(shí)間序列并沒有固定的時(shí)間間隔,本文設(shè)計(jì)的迭代模型改變了LIF的隨機(jī)性,加入固定時(shí)間步長的概念。并且具有時(shí)間維度的信息難以適應(yīng)現(xiàn)有的神經(jīng)網(wǎng)絡(luò)訓(xùn)練框架,因此我們設(shè)計(jì)了LIF模型的迭代表達(dá)式,將時(shí)間轉(zhuǎn)變?yōu)閿?shù)據(jù)的第一個(gè)維度,也就是將時(shí)間維度刻畫為空間維度,因而可以很好的適應(yīng)現(xiàn)有的神經(jīng)網(wǎng)絡(luò)計(jì)算框架,例如Pytorch和TensorFlow等。以下是具體的設(shè)計(jì)思路。
首先對已有LIF模型表達(dá)式使用歐拉方法求解一階微分方程,獲得一個(gè)迭代表達(dá)式:
接下來,將神經(jīng)元產(chǎn)生輸出脈沖信號和重置的機(jī)制加入到公式中,假設(shè)ureset=0,得到下面的狀態(tài)轉(zhuǎn)移公式:
其中,l(n)分別表示第n層的神經(jīng)元數(shù)量,wnij是從第n層的第j個(gè)神經(jīng)元到第n+1層的第i個(gè)神經(jīng)元的權(quán)重。Θ(?)是2.2中的激活函數(shù)。以上兩個(gè)表達(dá)式表明,ot,n+1是否產(chǎn)生輸出脈沖會影響下一個(gè)狀態(tài)ot+1,n+1。如果神經(jīng)元在時(shí)間t發(fā)出脈沖,在t+1時(shí)刻,通過(1-ot,n+1(i))這個(gè)系數(shù),將神經(jīng)元膜電位重置為0,如果t時(shí)刻未產(chǎn)生脈沖輸出,則將膜電位衰減成kτut,n+1。設(shè)kτut,n+1=0,即上一時(shí)刻的膜電位不會衰減后累積到下一時(shí)刻,則稱這樣的模型為整合-發(fā)射激活(IF Activa?tion)模型。
如圖6所示,t時(shí)刻,神經(jīng)元沒有產(chǎn)生輸出脈沖,膜電位為u,乘以時(shí)間衰減因子0.8之后,累加到下一時(shí)刻的膜電位上,并在下一個(gè)時(shí)刻經(jīng)過脈沖激活函數(shù),神經(jīng)元進(jìn)行下一時(shí)刻的脈沖輸出。
圖6 LIF模型的迭代示意圖
在SNN訓(xùn)練過程中,為了表示時(shí)間維t={1,2,…,T},我們將一個(gè)特征圖拆分為T個(gè)脈沖圖,第t個(gè)圖的任意位置(x,y)的值代表t時(shí)刻(x,y)位置的脈沖值bt(x,y),bt(x,y)∈{0,1}。如果bt(x,y)=1,則代表(x,y)位置有脈沖,若bt(x,y)=0,則代表沒有脈沖。例如,對同一個(gè)(30×30)的特征圖拆分成的T個(gè)(30×30)的脈沖圖,在卷積層都讓他們與相同的大小為3×3的卷積核進(jìn)行卷積操作,stride為1,即卷積核對每一個(gè)脈沖圖都進(jìn)行卷積操作。因此輸出是大小為(28×28)的T個(gè)特征圖。
全鏈接層可看為是卷積核為(1×1)的卷積層,因此全鏈接層是卷積層的一種特殊情況,類比于全鏈接層也進(jìn)行同樣的運(yùn)算。在Pytorch平臺的具體實(shí)現(xiàn)中,將脈沖序列的時(shí)間維轉(zhuǎn)換到批訓(xùn)練的batch維度,即可完成上述操作。例如原來的ANN訓(xùn)練中,設(shè)batch size=64,而訓(xùn)練脈沖神經(jīng)網(wǎng)絡(luò)時(shí),同一批數(shù)據(jù)由于采用脈沖的形式表達(dá),因此batch size=64×T。LIF迭代模型的具體實(shí)現(xiàn)框架如圖7所示。在每個(gè)時(shí)刻t,激活層對一個(gè)batch中所有圖的進(jìn)行迭代的狀態(tài)更新操作。
圖7 LIF神經(jīng)元擬激活層示意圖
實(shí)驗(yàn)分為兩個(gè)階段,在訓(xùn)練階段,對應(yīng)圖1中Training Stage,不斷增大壓縮常數(shù)直到擬脈沖神經(jīng)元激活函數(shù)趨于階躍函數(shù)并且訓(xùn)練的loss不再下降時(shí),將訓(xùn)練得到的權(quán)重和閾值傳遞給測試階段(Test Stage),則用脈沖神經(jīng)元LIF模型替代擬脈沖神經(jīng)元激活函數(shù),對應(yīng)圖1中下半部分,最終對測試集進(jìn)行準(zhǔn)確度測試。
第一個(gè)實(shí)驗(yàn)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)針對手寫數(shù)字?jǐn)?shù)據(jù)集(MNIST)而設(shè)計(jì),首先初始數(shù)據(jù)輸入后進(jìn)行編碼,編碼層將浮點(diǎn)數(shù)變?yōu)?個(gè)時(shí)間步長的連續(xù)脈沖時(shí)間序列,然后依次與16、32、32和16個(gè)大小均為3×3的卷積核卷積,注意每一個(gè)卷積層后都經(jīng)過一個(gè)批標(biāo)準(zhǔn)化層,然后再進(jìn)入LIF激活層。在最后一個(gè)全鏈接層之前經(jīng)過一個(gè)2.1中設(shè)計(jì)的全鏈接解碼層,輸出則恢復(fù)為浮點(diǎn)數(shù),然后經(jīng)過一個(gè)全鏈接層直至輸出,最終輸出結(jié)果。
3.1.1 訓(xùn)練結(jié)果準(zhǔn)確率分析
當(dāng)設(shè)置壓縮常數(shù)為2時(shí),圖8展示了整個(gè)訓(xùn)練過程中損失和在驗(yàn)證集上測試的準(zhǔn)確度變化曲線,a圖的橫坐標(biāo)為網(wǎng)絡(luò)訓(xùn)練迭代次數(shù),縱坐標(biāo)為損失。由圖中曲線可以看出,在訓(xùn)練的初始階段,loss下降非常明顯,從2.5下降到了0.5。到第50次迭代以后,訓(xùn)練的loss開始緩慢的下降,在到達(dá)第200次迭代以后,訓(xùn)練的loss不再明顯下降,收斂到了0.2左右。b圖的橫坐標(biāo)為epoch,縱坐標(biāo)為在驗(yàn)證集上測試的準(zhǔn)確度。在第1個(gè)epoch之后,準(zhǔn)確率就已經(jīng)達(dá)到了94%。在接下來的5個(gè)epoch之后,準(zhǔn)確率已經(jīng)達(dá)到了98%,最終在20個(gè)epoch之后之后,在驗(yàn)證集上的準(zhǔn)確率達(dá)到99.1%。
圖8 訓(xùn)練過程的損失和準(zhǔn)確度曲線
為避免訓(xùn)練初始階段就出現(xiàn)因壓縮常數(shù)較大而導(dǎo)致梯度消失的現(xiàn)象,先將壓縮常數(shù)設(shè)置為較小的數(shù),本實(shí)驗(yàn)初始壓縮常數(shù)設(shè)置為2。開始訓(xùn)練后,在loss到達(dá)一定的值而不再顯著下降時(shí),再逐步增加壓縮常數(shù)的值為4,6,9,直到設(shè)置為20時(shí)停止增大壓縮常數(shù),此時(shí)擬脈沖神經(jīng)元激活函數(shù)已經(jīng)非常接近LIF模型的階躍函數(shù),在每個(gè)壓縮常數(shù)下,訓(xùn)練完成后基于測試集的準(zhǔn)確率如圖9所示。隨著壓縮常數(shù)的增大準(zhǔn)確率呈略微下降的趨勢,但變化不明顯,均在98.7%附近。由此可以得出以下結(jié)論,即在MNIST數(shù)據(jù)集上,使用較小的壓縮常數(shù)訓(xùn)練之后的結(jié)果就已經(jīng)可以達(dá)到98%,不需要再使用更大的壓縮常數(shù)進(jìn)行反復(fù)的訓(xùn)練,可以大大降低訓(xùn)練的時(shí)間成本和能耗成本。由此可知本文提出的訓(xùn)練方法較為高效。
圖9 基于MNIST的脈沖神經(jīng)網(wǎng)絡(luò)在不同壓縮常數(shù)時(shí)的準(zhǔn)確度
將訓(xùn)練好的網(wǎng)絡(luò)參數(shù)運(yùn)用到第二階段上,最終的準(zhǔn)確率為98.81%。與其他脈沖神經(jīng)網(wǎng)絡(luò)在MNIST數(shù)據(jù)集上的結(jié)果比較如表2所示。相較于其他的SNN訓(xùn)練結(jié)果,提升了高達(dá)8.51%的準(zhǔn)確率。
表2 不同SNN在MNIST數(shù)據(jù)集上的準(zhǔn)確率
續(xù)表2
3.1.2 閾值分布分析
閾值的初始值均設(shè)置為0,在經(jīng)過上述不斷增大壓縮常數(shù)的訓(xùn)練過程后,壓縮常數(shù)固定在20時(shí),第一、二和四個(gè)卷積層后的LIF層閾值分布直方圖如圖10所示,此處為了使圖片顯示分布效果更好,僅展示了三個(gè)卷積層后的閾值分布。圖中各層的閾值分布方差較大,由此可以得出網(wǎng)絡(luò)經(jīng)過本文提出的訓(xùn)練方法訓(xùn)練過后,各個(gè)網(wǎng)絡(luò)層的閾值處于一個(gè)特定的分布,從而使網(wǎng)絡(luò)達(dá)到較好的分類結(jié)果。
圖10 基于MNIST的脈沖神經(jīng)網(wǎng)絡(luò)各層閾值分布直方圖
實(shí)驗(yàn)二采用的網(wǎng)絡(luò)結(jié)構(gòu)是基于CIFAR-10數(shù)據(jù)集的ResNet20[25]。本實(shí)驗(yàn)在ResNet20網(wǎng)絡(luò)結(jié)構(gòu)的框架上,設(shè)計(jì)的脈沖神經(jīng)網(wǎng)絡(luò)如圖11所示,與原本的ResNet20的差別在于,增加了編碼層作為第一層,每一個(gè)block中有兩個(gè)卷積層,僅第一個(gè)卷積層后采用擬激活函數(shù)LIF Activation,后一個(gè)卷積層接IF Activation。
圖11 20層殘差脈沖神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
每一批有64個(gè)樣本,動量(Momentum)設(shè)置為0.9,在每一個(gè)脈沖神經(jīng)元激活層之前采用Batch Normalization[26]。從 0.1 的學(xué)習(xí)率(Learning rate)開始,在損失(Loss)隨著迭代不再顯著下降時(shí)將其除以10,并在64000次迭代時(shí)終止訓(xùn)練,數(shù)據(jù)預(yù)處理[27]將原始圖像的四個(gè)邊填充4個(gè)像素,并且從填充圖像或其水平翻轉(zhuǎn)中隨機(jī)采樣并剪裁為32×32大小的圖片進(jìn)行訓(xùn)練。
3.2.1 訓(xùn)練結(jié)果準(zhǔn)確率分析
當(dāng)設(shè)置壓縮常數(shù)為2時(shí),圖12展示了整個(gè)訓(xùn)練過程中損失和在驗(yàn)證集上測試的準(zhǔn)確度變化曲線。
圖12 基于CIFAR-10的ResNet訓(xùn)練中的損失和準(zhǔn)確度曲線
圖(a)的橫坐標(biāo)為網(wǎng)絡(luò)訓(xùn)練迭代次數(shù),縱坐標(biāo)為損失。網(wǎng)絡(luò)在每一個(gè)epoch完成之后,利用驗(yàn)證集對網(wǎng)絡(luò)模型的效果進(jìn)行測試,從而可以評估脈沖神經(jīng)網(wǎng)絡(luò)訓(xùn)練算法的效果。在訓(xùn)練開始階段損失快速下降,到達(dá)500個(gè)迭代之后,損失在1.0附近波動。圖(b)橫坐標(biāo)為epoch,縱坐標(biāo)為在驗(yàn)證集上測試的準(zhǔn)確度。準(zhǔn)確率隨著epoch增加而逐步增大,最后維持在70%附近。
當(dāng)我們不斷增大壓縮常數(shù),得到的準(zhǔn)確率如圖13所示。隨著壓縮常數(shù)的增大準(zhǔn)確率呈略微下降的趨勢,符合我們的預(yù)期,即輸出數(shù)據(jù)隨著激活函數(shù)趨向階躍函數(shù)而越接近0或1,從而導(dǎo)致準(zhǔn)確率逐漸下降。
圖13 基于CIFAR-10的脈沖殘差神經(jīng)網(wǎng)絡(luò)訓(xùn)練準(zhǔn)確度
3.2.2 閾值分布分析
閾值的初始值均設(shè)置為0,在經(jīng)過上述不斷增大壓縮常數(shù)的訓(xùn)練過程后,壓縮常數(shù)固定在13時(shí),第1,3,11,17個(gè)卷積層后的LIF層閾值分布直方圖如圖14所示。
圖14 基于CIFAR10的脈沖神經(jīng)殘差網(wǎng)絡(luò)各層閾值分布直方圖
最終訓(xùn)練完成后,各層的閾值分布方差較大。此處為了使圖片顯示分布效果更好,僅展示了四個(gè)卷積層后的閾值分布。各個(gè)網(wǎng)絡(luò)層的閾值處于一個(gè)特定的分布,從而使網(wǎng)絡(luò)達(dá)到較好的分類結(jié)果。
傳統(tǒng)ANN中的浮點(diǎn)數(shù)(floating point)乘累加(multiply-accumulate,MAC)操作被SNN中的浮點(diǎn)數(shù)加法操作取代。與加法操作(0.9 pJ)相比,乘累加操作的功耗(4.6 pJ)是加法操作的5.1倍[28]。以下方程用于計(jì)算ANN中某一層網(wǎng)絡(luò)的乘累加操作數(shù)量:
其中kw代表卷積核的寬度,kh代表卷積核的高度,cin是輸入通道數(shù),cout是輸出通道數(shù),hout和wout是輸出特征圖的高度和寬度,nin是全鏈接層的輸入神經(jīng)元個(gè)數(shù),nout是全鏈接層輸出的神經(jīng)元個(gè)數(shù)。對于相同結(jié)構(gòu)的脈沖神經(jīng)網(wǎng)絡(luò)層,加法操作的數(shù)量與脈沖個(gè)數(shù)#spikes相關(guān):
圖15是脈沖神經(jīng)網(wǎng)絡(luò)和傳統(tǒng)人工神經(jīng)網(wǎng)絡(luò)在相同的網(wǎng)絡(luò)結(jié)構(gòu)下,基于上述功耗計(jì)算公式而得出的每一層網(wǎng)絡(luò)的功耗對比。對于基于MNIST的脈沖卷積網(wǎng)絡(luò),傳統(tǒng)人工神經(jīng)網(wǎng)絡(luò)的能耗為395673.60 nJ,脈沖神經(jīng)網(wǎng)絡(luò)的能耗為307930.5 nJ,與傳統(tǒng)人工神經(jīng)網(wǎng)絡(luò)相比減少了22.18%,對于基于CIFAR-10的脈沖殘差神經(jīng)網(wǎng)絡(luò),傳統(tǒng)人工神經(jīng)網(wǎng)絡(luò)的能耗為233238.4 nJ,脈沖神經(jīng)網(wǎng)絡(luò)的能耗為173525.39 nJ,傳統(tǒng)人工神經(jīng)網(wǎng)絡(luò)相比減少了25.61%。
圖15 脈沖神經(jīng)網(wǎng)絡(luò)各層能耗與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)對比
脈沖神經(jīng)網(wǎng)絡(luò)使用脈沖時(shí)間序列來傳輸數(shù)據(jù),而脈沖神經(jīng)網(wǎng)絡(luò)的功耗又與脈沖時(shí)間序列的時(shí)間長度和脈沖頻率息息相關(guān),脈沖時(shí)間序列的時(shí)間長度越短,脈沖頻率越低,整個(gè)網(wǎng)絡(luò)計(jì)算的時(shí)間和功耗都會有所降低。表3列舉了近年來各種的脈沖神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)中脈沖時(shí)間序列的時(shí)間步長,為更公平有效的橫向?qū)Ρ?,此處均列舉的是針對CIFAR-10數(shù)據(jù)集的脈沖神經(jīng)網(wǎng)絡(luò)。
表3 不同SNN的脈沖時(shí)間序列長度
從表3中可以看出,本論文提出的訓(xùn)練算法中,脈沖時(shí)間序列的時(shí)間步長僅僅為8個(gè)時(shí)間步長,對比Hunsberger團(tuán)隊(duì)提出的時(shí)間序列長度為6000的SNN,本論文提出的SNN僅需要時(shí)間長度為8脈沖時(shí)間序列,達(dá)到了750倍的加速。相較于Garg團(tuán)隊(duì)的實(shí)驗(yàn)結(jié)果,即時(shí)間步長為48的脈沖時(shí)間序步,本文的脈沖時(shí)間序列也達(dá)到了6倍的加速。假設(shè)經(jīng)過各個(gè)網(wǎng)絡(luò)的脈沖時(shí)間序列頻率相同,則功耗也會以同等比例降低。
本文設(shè)計(jì)一種新的脈沖神經(jīng)元信息傳遞模型,實(shí)現(xiàn)了一種新的基于梯度下降的脈沖神經(jīng)網(wǎng)絡(luò)訓(xùn)練算法,提供了一種與Pytoch兼容的訓(xùn)練框架。在神經(jīng)網(wǎng)絡(luò)的常見訓(xùn)練集上實(shí)現(xiàn)了較高的準(zhǔn)確率,同時(shí)相較于傳統(tǒng)的人工神經(jīng)網(wǎng)絡(luò)保證了較低的能耗。接下來的工作將會著眼于更高效的編碼和解碼方法設(shè)計(jì)。