1. 程式人生 > >Spiking-YOLO : 前沿性研究,脈衝神經網路在目標檢測的首次嘗試 | AAAI 2020

Spiking-YOLO : 前沿性研究,脈衝神經網路在目標檢測的首次嘗試 | AAAI 2020

> 論文提出Spiking-YOLO,是脈衝神經網路在目標檢測領域的首次成功嘗試,實現了與卷積神經網路相當的效能,而能源消耗極低。論文內容新穎,比較前沿,推薦給大家閱讀   來源:曉飛的演算法工程筆記 公眾號 **論文: Spiking-YOLO: Spiking Neural Network for Energy-Efficient Object Detection** ![](https://upload-images.jianshu.io/upload_images/20428708-947fd2dff1a8bb47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * **論文地址:[https://arxiv.org/abs/1903.06530](https://arxiv.org/abs/1903.06530)** # Introduction ***   脈衝神經網路(Spiking neural network, SNN)將脈衝神經元作為計算單元,能夠模仿人類大腦的資訊編碼和處理過程。不同於CNN使用具體的值(continuous)進行資訊傳遞,SNN通過脈衝序列(discrete)中每個脈衝發射時間(temporal)進行資訊的傳遞,能夠提供稀疏但強大的計算能力。脈衝神經元將輸入累積到膜電壓,當達到具體閾值時進行脈衝發射,能夠進行事件驅動式計算。由於脈衝事件的稀疏性以及事件驅動的計算形式,SNN能提供卓越的能源利用效率,是神經形態結構的首選神經網路   儘管SNN有很多好處,但目前僅能處理相對簡單的任務,由於神經元複雜的動態性以及不可導的操作,暫時沒有一個可擴充套件的訓練方法。DNN-to-SNN是近期廣泛的SNN訓練方法,該方法將目標DNN轉化成SNN的中間DNN網路進行訓練,然後轉成SNN並複用其訓練的引數,在小資料集分類上能達到不錯的效能,但是在大資料集上分類結果不太理想   論文打算使用DNN-to-SNN轉化方法將SNN應用到更復雜的目標檢測領域中,圖片分類只需要選擇分類就好,而目標檢測則需要神經網路進行高度準確的數字預測,難很多。在深入分析後,論文實現YOLO的轉換主要面臨以下兩個問題: * 常用的SNN歸一化方法過於低效,導致脈衝發射頻率過低。由於SNN需要設定閾值進行脈衝發射,所以要對權值進行歸一化,這樣有利於閾值的設定,而常用的SNN歸一化方法在目標檢測中顯得過於低效,後面會詳細闡述 * 在SNN領域,沒有高效leaky-ReLU的實現,因為要將YOLO轉換為SNN,YOLO中包含大量leaky-ReLU,這是很重要的結構,但目前還沒有高效的轉換方法   為此,論文使用channel-wise歸一化(Channel-wise normalization)和閾值不平衡的有符號神經元(signed neuron with imbalanced threshold)來分別解決以上問題,搭建了基於SNN的目標檢測模型Spiking-YOLO,論文的貢獻總結如下: * 深度SNN在目標檢測領域的第一次嘗試 * channel-wise歸一化,深度SNN的細粒度歸一化方法,使得多個神經元更高但仍然合適的頻率發射脈衝,進而讓SNN資訊傳遞更快且更準確 * 閾值不平衡的有符號神經元,提出leaky-ReLU在SNN領域的高效實現,在神經晶片上也能夠輕量級整合 # SNN神經元簡述 *** ![](https://upload-images.jianshu.io/upload_images/20428708-593ca19b5c21ed23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   SNN使用脈衝序列進行神經元間的資訊傳遞,IF(integrate-and-fire)神經元累積輸入$z$到膜電壓$V_{mem}$ ![](https://upload-images.jianshu.io/upload_images/20428708-b645c42b82ef0592.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   第$l$層的第$j$個神經元的膜電壓計算如公式1,$\Theta_j^l(t)$為脈衝,$V_{th}$為臨界電壓,$z_k^l(t)$為神經元的輸入 ![](https://upload-images.jianshu.io/upload_images/20428708-3ab6824d1a3baf72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   $z_k^l(t)$由多個輸入累加,$w$和$b$為權重和偏置 ![](https://upload-images.jianshu.io/upload_images/20428708-2fd707a26cc26586.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   當膜電壓$V_{mem}$大於臨界電壓$V_{th}$時產生脈衝$\Theta$,$U$為單位階躍函式(unit step function),滿足輸出1,不滿足則輸出0。由於SNN是事件驅動的,能源利用率相當高,但難以訓練是SNN在所有應用上的主要障礙 # Methods ***   論文直接使用DNN-to-SNN轉換方法將SNN應用到目標檢測中,發現效能下降得十分嚴重,在分析效能下降原因後,得出兩個主要原因:a) 大量神經元的脈衝發射頻率過低 b) SNN缺少leaky-ReLU的高效實現 ### Channel-wise data-based normalization * ##### Conventional normalization methods   在SNN中,根據輸入的幅度產生脈衝序列進行無損的內容傳遞是極為重要的。但在固定時間,啟用過度或啟用不足的神經元內將可能導致內容損失,這和臨界電壓$V_{th}$的設定有關。設定過高,神經元需要累積很長時間的電壓才能發射脈衝,相反則會過多地發射脈衝。發射頻率通常定義為$\frac{N}{T}$,$N$為$T$個timestep的脈衝發射總數,最大的發射率為100%,即每個timestep都發射脈衝 ![](https://upload-images.jianshu.io/upload_images/20428708-05b7c339df4fd3e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   為了防止神經元的啟用過度和啟用不足,權值和臨界電壓都需要精心地選擇。為此,很多研究提出了歸一化的方法,比如常用的Layer-wise normalization(layer-norm)。該方法通過該層的最大化啟用值來歸一化層的權值,如公式4,$w$和$b$為權重,$\lambda$為輸出特徵圖最大值。經過歸一化後,神經元的輸出就歸一到$[0,1]$,方便設定臨界電壓。由於最大啟用值$\lambda$從訓練集得到的,所以測試集和訓練集需要有相同的分佈,但論文實驗發現這種常規的歸一化方法在目標檢測任務上會導致明顯的效能下降 * ##### Analysis of layer-norm limitation ![](https://upload-images.jianshu.io/upload_images/20428708-8b4a177af98c6ef2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   圖1展示了通過layer-norm後的各層每個channel的最大啟用值,藍色和紅色的線分別為每層的平均啟用值和最小啟用值。可以看到每層的歸一化後的啟用值偏差較大,總體而言,layer-norm使得神經元的channel偏向啟用不足,這在僅需選擇分類的圖片分類任務是不被察覺的,但對於需要預測準確值的檢測任務的迴歸則不一樣。比如傳遞0.7,則需要在10個timestep脈衝7次,0.007則需要在1000timestep脈衝7次。當tempstep本身就很少時,過低的發射率可能會因發射不到足夠的脈衝而導致資訊丟失 * ##### Proposed normalization method   論文提出更細力度的歸一化方法,channel-wise normalization(channel-norm),該方法在每層的channel維度上,使用最大啟用值對權值進行歸一化 ![](https://upload-images.jianshu.io/upload_images/20428708-f3e4b6c9782b1b8b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   channel-wise歸一化方法如公式5,$i$和$j$為維度下標,$l$層權值$w$通過在每個channel使用最大啟用值$\lambda_j^l$進行歸一化,該值依然是從訓練集計算的。對於非首層中,歸一化的啟用值必須乘上$\lambda_i^{l-1}$來將輸入還原為上一層歸一化前的值,再進行本層的歸一化,不然傳遞的資訊會越來越小 ![](https://upload-images.jianshu.io/upload_images/20428708-d21dc5ee4ebe6b5d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![](https://upload-images.jianshu.io/upload_images/20428708-85f54db3af8b8e0c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   具體的邏輯如圖2和演算法1,channel-wise的歸一化方法能夠消除啟用值特別小的問題,即得到更高但合適的發射頻率,在短時間內也能準確地傳遞資訊 * ##### Analysis of the improved firing rate ![](https://upload-images.jianshu.io/upload_images/20428708-97e8f10f18fc50b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   如圖3所示,對於channel-norm,大多數的神經元能接近80%的發射率,而對於layer-norm,大多數的神經元的發射率在0到3.5%之間,這明顯表明channel-norm避免了過小的啟用值使得更多神經發射頻率更高且合適 ![](https://upload-images.jianshu.io/upload_images/20428708-92bfff29d6efefa8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   另外從圖4可以看出,channel-norm在大多數的channel上能產生更高的發射頻率,特別在channel 2 ![](https://upload-images.jianshu.io/upload_images/20428708-f6eb4bfc26b618db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   圖5則隨機取樣了20個神經元,記錄其脈衝活動,使用channel-norm使得大多數神經元能夠更有規律地發射脈衝   從上面的分析可以看出,channle-norm能夠避免過小的歸一化啟用值,從而保持較高的脈衝發射頻率,使得神經元能夠在短時間內準確地傳遞資訊,是深度SNN在解決更高階的機器學習問題的一種可行解決方案 ### Signed neuron featuring imbalanced threshold * ##### Limitation of leaky-ReLU implementation in SNNs   ReLU是最常用的啟用函式,保留正值而去掉所有的負值,目前的DNN-to-SNN方法都專注於IF神經元與ReLU間的轉換,忽略了啟用函式中的負值,而在Tiny-YOLO中,負值啟用佔了51%。leaky-ReLU是目前最常用的啟用,通過leakage項來保留負值$f(x)=\alpha x$,$\alpha$一般為0.01,但目前還沒有準確且高效的SNN實現方法。此前有研究提出負臨界電壓(-1),使得可以存在正負啟用,然後在這基礎乘以$\alpha$來轉換leaky-ReLU,但這違背了生物學(脈衝是離散訊號),而在神經晶片上也需額外的模組進行浮點運算 * ##### The notion of imbalanced threshold ![](https://upload-images.jianshu.io/upload_images/20428708-041f376b161e5688.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   論文提出閾值不平衡的有符號神經元(IBT),在負值區域使用臨界電壓$V_{th,neg}=-\frac{V_{th}}{\alpha}$,不僅可以傳遞正負啟用值,保持離散型,還可以高效和準確地仿照leaky-ReLU的leakage項 ![](https://upload-images.jianshu.io/upload_images/20428708-255bfacd93dae24e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   如圖6所示,假設$V_{th,pos}=1V$,在$\alpha=0.1$時,$V_{th,neg}=-10V$,膜電壓需要積累多10倍來發射負啟用,類似於leaky-ReLU # Evaluation *** ### Spiking-YOLO detection results ![](https://upload-images.jianshu.io/upload_images/20428708-adda30b605aa0304.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   實驗的目的是無損地將Tiny-YOLO的轉移為SNN,結果如圖7所示,使用channel-norm和IBT能有效地提升效能,且使用的timestep更少 ![](https://upload-images.jianshu.io/upload_images/20428708-614796e91134262f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   論文嘗試了不同的解碼方式,分別為膜電壓$V_{mem}$和脈衝數$V_{mem}/V_{th}$,由於脈衝數的餘數要捨棄,這會帶來誤差和資訊損失,所以基於膜電壓進行解壓會更準確 ![](https://upload-images.jianshu.io/upload_images/20428708-58d62852e1324553.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### Spiking-YOLO energy efficiency ![](https://upload-images.jianshu.io/upload_images/20428708-0fcb41c46fa02f8b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   DNN主要使用相乘累積(multiply-accumulate , MAC)操作,而SNN則主要是累積操作(accumulate, AC),因為脈衝是二值的(1或-1),當接受到脈衝時,不用實時乘權重就可以知道結果。32-bit浮點型MAC和AC分別需要3.6pJ和0.9pJ,而32-bit整數型MAC和AC分別為3.2pJ和0.1pJ。如圖9所示,不管使用哪種歸一化方法,Spiking-YOLO的計算耗能僅為Tiny-YOLO的1/2000倍,能源利用十分高效 ![](https://upload-images.jianshu.io/upload_images/20428708-003c9fca44f6dc0b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)   論文在實際裝置上對比了Spiking-YOLO(TrueNorth chip)和Tiny-YOLO(Titan V100),因為channel-norm的發射率較高且合適,所以使用了更少的timestep,能源消耗最少 # Conclusion ***   論文提出Spiking-YOLO,是脈衝神經網路在目標檢測領域的首次成功嘗試,實現了與卷積神經網路相當的效能,而能源消耗極低。論文內容新穎,比較前沿,推薦給大家閱讀   ### 參考內容 * Towards spike-based machine intelligence with neuromorphic computing (https://www.nature.com/articles/s41586-019-1677-2) * Spiking Deep Convolutional Neural Networks for Energy-Efficient Object Recognition (https://link.springer.com/article/10.1007/s11263-014-0788-3)       > 如果本文對你有幫助,麻煩點個贊或在看唄~ 更多內容請關注 微信公眾號【曉飛的演算法工程筆記】 ![work-life balance.](https://upload-images.jianshu.io/upload_images/20428708-7156c0e4a2f49bd6.png?imageMogr2/auto-orient/strip%7CimageView2/2