論文名:Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image Classification
中文名:將連續值深度網絡轉換爲高效的事件驅動SNN做圖像分類
1. 摘要
脈衝神經網絡(SNN)可能提供了一種高效的推理方法,因爲網絡中的神經元是稀疏激活的,並且計算是事件驅動型。之前的工作已經展示了簡單的連續值CNN可以轉換爲精確的脈衝等價物。這些網絡不包含像最大池化、softmax、batch-normalization和Inception模塊這種常見的操作。本篇論文將會展示這些操作等價的脈衝操作,它幾乎可以轉換任意結構的CNN網絡。我們展示了流行的CNN架構(包括VGG-16和Inception-v3)轉換爲SNN之後的最好的性能結果(在MNIST、CIFAR-10、ImageNet數據集上)。SNN在分類的錯誤率和操作的數量上做了一個權衡,從LeNet(MNIST)和BinaryNet(CIFAR-10)的例子來看,我們轉換之後的錯誤率高了一點點,但是SNN的操作相比於原始的CNN減少了2倍。這凸顯了SNN的潛能,尤其是當在嵌入式平臺上部署高能效的脈衝神經芯片時。
2. 方法
2.1 ANN轉換到SNN的理論
從ANN到SNN的轉換最基本的原則就是脈衝神經元的發放頻率應該和ANN裏面的模擬激活值相匹配。Cao等人首次提出了一種轉換ReLU層的機制,但是這個工作的理論部分很缺乏,在這裏我們展示了一種近似的分析解釋,並且在它的基礎上提出了對脈衝發放後的reset機制提出了一個簡單的修改,這使得每個SNN神經元轉換成對目標函數的無偏置的近似。
我們假設在每個SNN單元和ANN單元之間存在一一映射,即使每個ANN單元對應一組脈衝神經元是有可能的。對於一個L層的網絡,我們讓表示從層到層的權重矩陣,偏置爲。第層的神經元個數爲。那麼第層的連續值神經元通過ReLU層的計算如下:
考慮,x表示歸一化後的輸入,其中。第SNN神經元在t時刻的膜電位用表示,每個time step下的輸入電位爲:
在這裏的是閾值電位,指示着 時刻脈衝的產生與否:
時間窗口爲T,每個time step size爲,那麼脈衝發射率最高爲。第一層輸入的發射率和常量的像素值或者說是RGB通道值有關,我們每個SNN神經元i的發射率爲:,這裏的,即爲直到t時刻爲止發射脈衝的個數。
ANN-to-SNN的原理正如Cao等人介紹的那樣,提出了發射率和原始ANN的激活值正相關,在接下來,我們會對兩者之間的關係作公式化的表述。
2.1.1. 膜方程
神經元在時刻的輸入爲,此時的膜電位是要在原來的基礎上加上得到,只有膜電位超過閾值時纔會產生脈衝。一旦脈衝被產生,膜電位就被複位。現在我們討論下兩種復位的機制:reset to zero(將膜電位復位到一個基準值,通常是0)和 reset by subtraction(給現在的膜電位減去一個閾值):
從這兩個膜方程來看,我們可以得出略有不同的近似屬性。在本節中,我們分析了第一個隱藏層並在2.1.2節將其擴展到更高層。我們假設輸入電位 ,這個假設在2.2.4節有證明。對於第一層神經元的輸入(2)式可以通過和ANN的激活值(1)式聯繫起來。爲了將ANN的激活值和SNN的脈衝發射率關聯起來,我們得到了下面的膜方程(4a)和(4b):
關於上面方程的推導本來是在補充材料裏給出的,下面我們來看一下推導過程:
2.1.1.1 Reset to zero
我們的目標是得到脈衝發射率和ANN激活值之間的關係。未來簡化標記,我們去掉了層和神經元的索引,現在開始推導,仿真時間t內的平均發射率求和可以簡化爲:
我們之前已經做了一個假設——對於第一個隱藏層而言輸入z是一個模擬常量(2.2.4節中有證明),並且使用,同時,我們可以得到:
將帶入上式,得:
又因爲,帶入上式得到:
非1即0,S4的最後一項是對脈衝發放之前的膜電位求和,在reset-to-zero、constant input、constant threshold、no leak的情況下,從1到t-1的階段,而每次膜電位都會增加一個相同的輸入z,所以可以得到,進而有:
將S5代入S4中,可以得到:
我們現在定義殘差爲t時刻膜電位超過閾值的部分,即
將其代入S6式中,平均的脈衝發射率爲:
最後,我們確保第一個隱藏層的輸入爲常量,即,讓,S8式可以轉換爲(5a):
2.1.1.2 Reset by subtraction
先對(4b)求和,再取平均值,有:
而,且,所以有,省略下標,進而得到:
將代入S10中,得到:
令,S11變成了(5b)式。
————————————————————————————————————分界線
到這裏對(5a)和(5b)的推到就結束了,我們來看看結果。正如我們在2.1節最後所期望的那樣,脈衝發射率和ANN的激活值成比例,但是這個比例被一個額外的誤差項減小了。在reset to zero的情況下,增加了一個乘法誤差項,同時輸入一直都是常量,對於同一個神經元 i 來說time steps 也是常量,膜電位超過閾值的那部分,在reset to zero時這個誤差項最後被丟棄了,這將會導致發射率的減小從而造成信息損失。對於淺層網絡和如MNIST這樣的小數據集而言,這個誤差項只是一個小問題,但是我們發現在深層中近似誤差會累加從而降低分類錯誤率。我們也可以從等式(5a)觀察到一個更大的或者更小的輸入可以改進近似結果。又,我們發現近似誤差被上面的輸入而限制,這個視角解釋了爲什麼Diehl等人的權重歸一化可以提高表現:通過保證ANN的激活值足夠小而不足以在single time step就可以使得膜電位大於閾值,我們保持,因此很小,另一種改進近似的明顯的方法就是減小來降低誤差項,但是這會增加single time step內的計算成本。
reset by subtraction 機制改進了近似,這種方案更加適合深層網絡,多餘的電位在reset時沒有被丟棄,並用於下一次脈衝發射。因此,由於引起的發射率誤差在等式(5b)中消失了,相反,第一個隱藏層的發射率最終會收斂在,唯一的由於離散採樣誤差引起的近似誤差也會隨着時間消失。我們在3.1節通過實驗仿真驗證了這個機制的確導致了比Cao等人提出的轉換更好的近似精度,尤其是在深層網絡中 。
2.1.2. 更高層的發射率
之前的結果都建立在一個基礎上——神經元在仿真時間內接受到的輸入z是一個常量。當隱藏層的神經元發射脈衝時,這個條件僅對第一個隱藏層成立,並且我們用模擬電位的形式取代脈衝序列。在reset-by-subtraction這種條件下,我們分析得出近似誤差是怎麼在深層中傳播的。爲此,我們將SNN的輸入的表達式等式(2)插入到(4b)所示的膜等式(4b)中(針對層),又,故得到:
等式描述了第l層神經元的發射率被之前層的發射率的權重和所決定,正如等式(5b)中減去了一個隨時間衰減的誤差項一樣,這個關係反應了每一層都要對權重和之前層的近似誤差項乘積求和,然後再加上自己的近似誤差項。將之前層的發射率迭代代入(6)式,其中 第一層的發射率用(5b)計算:
其中。因此,第l層的神經元i接受一個輸入脈衝序列,可以觀察到越往後的層由於之前層神經元量化誤差的存在逐漸減小。這些誤差逐層累加,這也解釋了爲什麼實現與人工神經網絡激活值高相關性的發射率需要更長的時間,和爲什麼SNN發射率在高層會惡化的原因。
2.2. ANN操作的脈衝實現
在本節中,我們介紹一些新方法改善深度SNN的分類錯誤率,這些方法將會允許一個更寬範圍ANN的轉換,也會減少SNN的近似誤差。
2.2.1. Converting Biases
偏置在ANN中是一種標準結構,但是它在以前的ANN到SNN的轉換方法中是明確排除在外的。在脈衝神經網絡中,偏置可以簡單地用一個和偏置符號相同的常量輸入電位來實現。另外,Neftci等人之前也提到過可用額外常量脈衝(其發射率和ANN偏置大小成比例),儘管有時當偏置爲負時需要反轉脈衝的符號,2.1節介紹的理論也可以用到帶偏置的神經元上,並且之後在2.2.2節中要介紹的參數歸一化也將應用到偏置上。
2.2.2. Parameter Normalization
近似誤差的來源之一就是在模擬SNN時的時間步長,神經元的發射率被限制在一個區間 ,然而ANN通常不會有這樣的約束。權重歸一化是被Diehl等人引入作爲一種避免由於太高或太低的發射率而造成的近似誤差的方法。通過使用一種“data-based weight normalization mechanism”的方法展示了將ANN轉換爲SNN時性能上的提升,我們將這個方法擴展到帶有偏置的神經元上,提出了一種方法使得歸一化過程對異常值更加穩健。
2.2.2.1. Normalization with biases
data-based權重歸一化機制是基於用於ANN中的ReLU單元的線性度,它可以簡單地擴展到偏置,通過線性的縮放所有的偏置和權重以使得ANN的激活值(正如等式(1)計算出來的值)對於所有的訓練樣本都小於1。爲了保留一個層內編碼的信息,一個層的參數需要聯合縮放。定義,對權重的歸一化可以通過來完成。
2.2.2. Robust normalization
儘管權重歸一化避免了SNN中的發射率飽和問題,但是它可能會導致非常低的發射率,因此需要增加信息到達更高層的延遲(即增大)。我們參考了之前提到的“max-norm”算法,因爲歸一化因子被設置爲一個層內ANN激活值的最大值,通常激活值也是參考了訓練數據中的一個大的子集。這是一個非常保守的方法,它確保了SNN的發射率很大可能不會超過最大的發射率,缺點是這個過程很容易被單個異常樣本所影響,從而導致較高的激活值,但對於大多數樣本來說,發射率是在最大發射率之下的。
正如Figure 1A所示,這些的異常並不少見,Figure 1A中描述了對於16666個CIFAR 10的採樣樣本第一個卷積層中非零激活值的log-scale的分佈,可以觀察到最大的激活值要比處在所有激活值中99.9%處對應的激活值大三倍。Figure 1B展示了對於16666個採樣樣本同一層中所有ANN單元最大激活值的分佈情況,反應了數據集之間比較大的方差,尖峯是遠離絕對最大值的,這個分佈解釋了爲什麼通過最大值歸一化會導致SNN有一個比較差的分類表現。對於大多數輸入樣本,一個層內最大激活值是遠遠低於被選擇的歸一化因子的,這將會導致驅動高層時發射率太低的問題,進而會導致比較差的分類結果。
我們提出了一個更加穩健的替代方案——將設置爲第l層所有激活值分佈中比例爲p處對應的激活值(p在[0, 100]之間),這個選擇丟棄了額外的異常值,增加了一部分樣本的SNN發射率,可能的缺點就是很小比例的神經元會飽和,所以選擇歸一化因子就是在飽和和不充分的發射率之間權衡。在接下來,我們將p定義爲歸一化尺度,並且"max-norm"對應p=100,表現比較好的典型p值的範圍爲[99.0, 99.999]。通常來講,一小部分神經元飽和導致的分類錯誤率比要比發射率過低這種情況小很多,這種方法也可以在訓練期間和BN層相結合,對每一層進行歸一化,因此會使得異常值少很多。
2.2.3. BN層的轉換
BN層減少了ANN中內部協變量的偏移,因此可以加速訓練進程。BN層引入了額外的仿射變換,使得數據變成0均值、1方差。輸入x經過BN層要做的變換爲,這裏的都是訓練獲得的參數。在訓練之後,這些變換可以被集成到權重向量中,因此保留了BN的影響,但是消除了BN層進行歸一化的計算需求。特別地,我們設置。這使得將BN層轉換爲SNN很簡單,因爲在將BN層折算進前層後,不需要對BN層進行額外的轉換了,我們發現這個轉換過程是零損失的,優勢在於當BN層用於訓練時得到的網絡性能更好。
2.2.4. Analog Input to First Hidden Layer
因爲基於事件的基準測試集很少見,傳統的frame-based的圖像數據集(比如MNIST或CIFAR)已經用於對轉換後的SNN的分類錯誤率做評估。之前的方法經常將模擬的輸入激活值、灰度值或RGB值轉換爲泊松發射率,但是這種轉換對網絡的發射引入了可變性,一定程度上損害了性能。
在這裏,我們將模擬的輸入激活值看作常量電位,遵從等式(2),對於第一個隱藏層的神經元來說,輸入就是可以通過相關核和圖片的模擬輸入x相乘得到:
對於每一個神經元i,是常量,以後的每個time step膜電位都會加一個。我們發現這個在低激活值方案中非常有效,但對於脈衝神經元的下采樣提出了挑戰。
2.2.5. Spiking Softmax
softmax通常用在深度ANN的輸出,它會有一個歸一化的效果,並且使得輸出像是類別概率。之前的ANN-to-SNN轉換的方法不會轉換softmax層,而是通過在仿真期間神經元的脈衝發射率來確定預測的輸出類別的,但是這個方法當最後一層接受的都是負輸入時會失敗,因爲沒有脈衝發射。
我們有三種方法來轉換softmax層:
- 第一種是基於Nessler等人提出的機制,輸出脈衝是由固定發射率的額外的泊松生成器觸發的,脈衝神經元自己不發射,只是簡單的累加它們的輸入,脈衝是否發射由額外的生成器產生,softmax competition根據累加的膜電位觸發;
- 第二種脈衝softmax函數是類似的,但是不依賴額外的時鐘,爲了確定神經元是否發射脈衝,我們需要計算脈衝電位的softmax輸出,使得輸出值在[0,1]之間,這兩種方法的最終分類結果都是根據仿真時間內發射率最高神經元索引決定的。我們傾向於選擇第二種方法,因爲這種方法僅依賴於一個超參數;
- 第三種方法是基於我們只需要根據softmax層的輸入膜電位就可以確定最終的分類結果,這個簡化可以加速推斷時間,也可以通過減少隨機性來提高精度。這種方法在不需要堅持純粹的脈衝網絡時是很有吸引力的。
2.2.6. Spiking Max-Pooling Layers
在這裏,我們提出了一個簡單的轉換max-pooling機制,輸出單元包含一個門控功能,它只會讓最大值發射率神經元通過,而丟棄其他神經元,門控功能通過計算前突觸發射率的估計值來控制。
2.3. Counting Operations
先來定義幾個標記符號:
:一個神經元輸入的連接關係,比如在卷積層,就是2維卷積核的尺寸乘以前層的通道數得到的,在卷積層就是前層的神經元個數;
:神經元和下層的連接關係,比如在卷積層,後面緊跟着第個卷積層,通常由第個卷積層的步長決定,假如stride爲1,簡單地由第個卷積層的二維卷積核的尺寸乘以其通道數得到的。
在ANN中,一張圖片做分類的整體浮點操作總量爲:
其中爲第層神經元的個數,因子2是由於每個操作都是乘加運算,+1是由於需要加上偏置,這裏沒有考慮池化操作。
在SNN中,當神經元狀態更新時只需要加法,那麼在仿真時間T內SNN的總操作量爲:
代表在t時刻第l層神經元發射的脈衝數量。
在ANN中,要對一張圖片做分類,前向傳播的成本是一個常量。在SNN中,圖片在仿真週期內被呈現給網絡,網絡在每個time step都有一個預測輸出,爲了在每個time step衡量分類錯誤率和操作量,我們展示了SNN的錯誤率是如何隨着操作量的增加而減小的。
兩種不同的操作模式——single forward pass in ANN vs. continuous simulation in the SNN,一個衆所周知的事實就是SNN只需要做加法的成本要比ANN中乘加運算的成本低很多,舉個例子,Global Foundry 28nm進程展示了執行32-bit的浮點加法的成本要比MAC操作的成本低14x,相關的芯片區域面積也小了21x。同時也展示了內存訪問要比計算的能耗高兩個數量級。在ANN中,讀卷積核的權重、內存中的神經元狀態、將狀態寫回內存中在單個樣本的前向傳播過程中都只進行一次,相反,SNN中的內存訪問是不可預測的,可能對於單個神經元要訪問多次(這和對應的發射率有關),如果SNN需要的操作量比ANN低,那麼等價地SNN在內存訪問上也會有減少。直接在脈衝硬件平臺如SpiNNaker或TrueNorth上的實現留待將來的工作,而且將其與在傳統的ANN硬件加速器如Eyeriss上實現ANN的能耗成本做對比也是很有必要的。
3. Results
我們有兩種方法來改善轉換爲SNN後的分類錯誤率:
- 在轉換之前訓練一個更好的ANN;
- 通過消除SNN的近似誤差改善轉換;
接下來在3.1和3.2節我們使用CIFAR-10數據集評估影響,在3.3節將SNN轉換方法擴展到ImageNet數據集,在3.4節我們展示了SNN的精度和操作量之間的權衡,在給定的計算力預算下允許微調網絡的性能。
3.1. Contribution of Improved ANN Architectures
在第二節提出的方法允許被轉換的CNN有偏置、softmax、batch-normalization、max-pooling層,這些提高了ANN的分類精度。我們的CIFAR-10上的網絡結構爲:4個卷積層(32 3x3 - 32 3x3 - 64 3x3 - 64 3x3),ReLU激活值,batch-normalization,2x2 max-pooling(在第2個和第4個卷積層之後),之後緊跟兩個全連接層(512個神經元和10個神經元)和一個softmax輸出。Table 1顯示了ANN實現了12.14%的錯誤率,將偏置約束到0使得錯誤率增加爲12.27%,用average-pooling進一步取代max-pooling時錯誤率爲12.31%,消除softmax只使用ReLU會導致錯誤率變爲30.56%。使用我們的新方法可以獲得比之前ANN更好的性能。
3.2. Contribution of Improved SNN Conversion Methods
- —:ANN的錯誤率;
- default:no normalization、Poisson spike train input、reset-to-zero;
- 可以看出來,red bar的轉換結果接近無損;
- accuracy-latency trade-off;
- ANN以每幀2.35MOps的計算量實現了1.04%的錯誤率;
- spiking model將計算量減小了2x,同時錯誤率只上升了1%(2.07%的錯誤率,1.07MOps/frame);
- 在1.47MOps時,SNN錯誤率爲1.13%;
3.3. ImageNet
VGG和GoogLeNet被用來處理ImageNet數據集。
3.3.1. 瞬態動力學和電壓鉗位
section 2中提到的轉換流水線對於MNIST和CIFAR-10數據集來說可以實現和ANN相當的錯誤率,但對於轉換後的Iception-V3來說最初和ANN的錯誤率相差很大,主要原因有兩點:
- 由於一些神經元的偏置或輸入權重過大,神經元在仿真開始階段經歷了瞬態,在開始的幾個time steps,發射脈衝之前都會累加輸入脈衝,在第一層的神經元的發射率需要幾個time steps就可以收斂到一個穩定的發射率,並且這個收斂時間在接受了瞬時變化輸入的高層會增加,收斂時間在集成了高頻輸入的神經元會減少,但是在集成了低頻脈衝的神經元會增加;
- 另外一個原因就是1x1的卷積層會造成一個大的瞬時響應,在這些層中,對於單個神經元的突觸輸入是前層的單列元素(長度爲通道數),因此神經元的偏置或者強烈偏離的突觸輸入會決定輸出範圍。而隨着核尺寸的增大,更多的脈衝會被聚集,會超多大偏置的影響;
爲了克服神經元動態的瞬態負面影響,我們嘗試了許多可能的解決方法,包括神經元狀態的初始化、不同的reset機制和偏置放鬆方案。我們發現最成功的方法還是在最開始的N個time steps將膜電位鉗位到0,N隨着層深線性增加:,斜率d代表時間延遲,d越長,就意味着下一層集成前層的輸出之前,前層收斂到穩態的時間越長。
修正SNN狀態變量的最簡單的方法就是移除掉瞬態響應(如Figure S1所示,在補充材料中),膜電位鉗位了10個time steps。
3.4. Combination with low-Precision Models
脈衝網絡中神經元發射脈衝的頻率與對應的ANN單元的激活值成正比,低精度目標激活值可以更快更準確地使用少量的脈衝事件來近似,舉個例子,當激活值被量化爲{0, 0.1, 0.2, 0.3,…,0.9, 1.0},脈衝神經元可以完美的在10個time steps內表達每一個值,另一方面,爲了近似16位精度的浮點數,最壞情況下神經元需要在65536個time steps下保持激活。
爲了展示在將給定模型轉換爲脈衝網絡中低精度激活值的好處,我們應用2.2節中BinaryNet的方法,權重和激活值都約束到{0,+1}或者{-1,+1}。分別採用的是Heaviside(階躍函數)和sign函數。爲了解釋BinaryNet中的負激活值,我們添加了第二個閾值-1,如果神經元閾值小於-1就發射一個幅度爲-1的脈衝。
憑藉着量化激活值,這兩種SNN都可以在很少的操作內就近似達到ANN的錯誤率(如下圖Figure 4所示)。BinaryNet SNN已經展示了和ANN目標錯誤率接近的錯誤率,像規範,在全精度模型中,ANN和SNN的錯誤率在操作量很小時相差較大,是隨着計算量增加逐漸減小的。