如何看待第三代神经网络SNN?详解脉冲神经网络的架构原理、数据集和训练方法 原创
作者丨科技猛獸
編輯丨極市平臺
本文首發于極市平臺公眾號,轉載請獲得授權并標明出處。
本文目錄
1 脈沖神經網絡簡介
2 脈沖神經網絡原理
3 脈沖神經網絡數據集
4 脈沖神經網絡訓練方法
5 脈沖神經網絡評價指標
1 脈沖神經網絡簡介
脈沖神經網絡 (SNN) 屬于第三代神經網絡模型,實現了更高級的生物神經模擬水平。除了神經元和突觸狀態之外,SNN 還將時間概念納入了其操作之中,是一種模擬大腦神經元動力學的一類很有前途的模型。
那么什么是第一代和第二代神經網絡模型呢?
第一代神經網絡
第一代神經網絡又稱為感知器,在1950年左右被提出來,它的算法只有兩層,輸入層輸出層,主要是線性結構。它不能解決線性不可分的問題,對稍微復雜一些的函數都無能為力,如異或操作。
第二代神經網絡:BP 神經網絡
為了解決第一代神經網絡的缺陷,在1980年左右 Rumelhart、Williams 等人提出第二代神經網絡多層感知器 (MLP)。和第一代神經網絡相比,第二代在輸入層之間有多個隱含層的感知機,可以引入一些非線性的結構,解決了之前無法模擬異或邏輯的缺陷。
第二代神經網絡讓科學家們發現神經網絡的層數直接決定了它對現實的表達能力,但是隨著層數的增加,優化函數愈發容易出現局部最優解的現象,由于存在梯度消失的問題,深層網絡往往難以訓練,效果還不如淺層網絡。
所有對目前機器學習有所了解的人都聽說過這樣一個事實:目前的人工神經網絡是第二代神經網絡。它們通常是全連接的,接收連續的值,輸出連續的值。盡管當代神經網絡已經讓我們在很多領域中實現了突破,但它們在生物學上是不精確的,其實并不能模仿生物大腦神經元的運作機制。
第三代神經網絡:脈沖神經網絡
第三代神經網絡,脈沖神經網絡 (Spiking Neural Network,SNN) ,旨在彌合神經科學和機器學習之間的差距,**使用最擬合生物神經元機制的模型來進行計算,更接近生物神經元機制。**脈沖神經網絡與目前流行的神經網絡和機器學習方法有著根本上的不同。SNN 使用脈沖——這是一種發生在時間點上的離散事件——而非常見的連續值。每個峰值由代表生物過程的微分方程表示出來,其中最重要的是神經元的膜電位。本質上,一旦神經元達到了某一電位,脈沖就會出現,隨后達到電位的神經元會被重置。對此,最常見的模型是 Leaky Integrate-And-Fire (LIF) 模型。此外,SNN 通常是稀疏連接的,并會利用特殊的網絡拓撲。
然而,關于 SNN 作為人工智能和神經形態計算機群體中的計算工具的實用價值,長期以來一直存在爭論。尤其是和人工神經網絡 (ANN) 相比。在過去的幾年里,這些懷疑減緩了神經形態計算 (neuromorphic computing ) 的發展,而隨著深度學習的快速進步,研究人員試圖從根本上緩解這個問題,人們想要通過加強 SNN 的手段,如改善訓練算法,來緩解這個問題。
與成熟有效的人工神經網絡 (ANN) 訓練算法:誤差反向傳播算法 (Back Propagation) 不同,神經網絡研究中最困難的問題之一是由于復雜的動力學和脈沖的不可微性質導致的訓練困難。
為了提升脈沖神經網絡的精度,已有一些前人的工作做出了探索,如:
- Spike timing dependent plasticity (STDP) :無監督學習方法
1 Unsupervised learning of digit recognition using spike-timing-dependent plasticity
- 添加獎勵機制
2 Combining stdp and reward-modulated stdp in deep convolutional spiking neural networks for digit recognition
- 把預訓練好的 ANN 轉化為 SNN
3 Spiking deep convolutional neural networks for energy-efficient object recognition
4 Spiking deep residual network
5 Fast-classifying, high-accuracy spiking deep networks through weight and threshold balancing
6 Training spiking deep networks for neuromorphic hardware
7 Conversion of continuous-valued deep networks to efficient event-driven networks for image classification
為了提升 ANN 與 SNN 的兼容性,通常把 bias 去掉,使用 ReLU 激活函數,把 max-pool 換成 average-pool 等。把 ANN 轉化成 SNN 時,通常包括 weight/activation normalization,threshold tuning, sampling error compensation 等操作以維持精度。
- 脈沖神經網絡使用 BP 算法訓練
8 Hybrid macro/micro level backpropagation for training deep spiking neural networks
9 Training deep spiking neural networks using backpropagation
10 Spatio-temporal backpropagation for training high-performance spiking neural networks
11 Direct training for spiking neural networks: Faster, larger, better
在執行反向傳播時,梯度可以沿著空間維度通過聚合脈沖傳播,也可以沿著時間和空間2個維度通過計算膜電勢的梯度傳播。
簡而言之,通過上述努力,SNN 在視覺識別任務中的應用精度逐漸接近 ANN。
由于 SNN 缺乏專門的benchmark,許多工作直接使用 ANN 的 benchmark 來驗證 SNN 模型。例如,用于 ANN 驗證的圖像數據集被簡單地轉換為 Spike 版本,用于 SNN 訓練和測試。 此外,網絡的準確性仍然是主要的評估指標,但眾所周知,我們的大腦在絕對識別準確性方面,通常比現有的人工智能機器表現得差。這反映了我們需要更全面和公平的衡量標準來評估和模擬生物大腦工作方式的 SNN。簡而言之,由于不適當的評估指標,目前的 SNN 無法擊敗 ANN。因此,出現了1個開放的問題,即:
如何評估 SNN 是有意義的?
Training spiking deep networks for neuromorphic hardware
這篇文章將預訓練好的 ANN 轉化成 SNN,在這個工作里面作者考慮到了 SNN 網絡的 Efficiency,而不僅僅是 Accuracy。評價一個 SNN 時要從多個角度考量,比如:application accuracy,memory cost, compute cost 。
在以 ANN 主導的評價指標和任務中,相同大小的 SNN 無法打敗 ANN。但是在以 SNN 主導的評價指標和任務中,SNN 的表現會更好。
2 脈沖神經網絡原理
如下圖1所示是ANN 和 SNN 的單個基本神經元。
(a) 圖是典型的單個 ANN 神經元,ANN 的計算方法是:
y=?(b+∑jxjwj)(1)y=\phi (b+\sum_j x_jw_j)\tag{1} y=?(b+j∑?xj?wj?)(1)
式中, ?(?)\phi(\cdot)?(?) 是非線性的激活函數。
X0X_0X0? 代表上個神經元過來的連續的激活值 (Pre-activation),通過突觸 (Synapse) 傳遞到樹突的位置 (Dendrite),并且最終由細胞體 (Soma) 來處理這個激活值 (具體處理方法就是1式)。
ANN 中的神經元使用高精度和連續值編碼的激活值進行相互通信,并且只在空間域 (spatial domain,即 layer by layer) 傳播信息。從上述方程可以看出,輸入和權重的相乘和累加 (MAC) 是網絡的主要操作。
**(b) 圖是典型的單個 SNN 神經元,**它的結構與 ANN 神經元相似,但行為不同。脈沖神經元之間的交流通過 binary 的 events,而不是連續的激活值。
S0S_0S0? 代表上個神經元過來的一個一個的脈沖 (Spike),通過突觸 (Synapse) 傳遞到樹突的位置 (Dendrite),并且最終由細胞體 (Soma) 來處理這些脈沖 (具體處理方法就是2式)。
這個式子看起來很麻煩,我們先來理解下每個變量的含義。
式中 ttt 代表時間步長, τ\tauτ 是常數, uuu 和 sss 代表膜電位和輸出峰值。
ur1u_{r_1}ur1?? 和 ur2u_{r_2}ur2?? 分別是靜息電位和重置電位。
wjw_jwj? 是第 jjj 個輸入突觸的權重。
tjkt_j^ktjk? 是當第 jjj 個輸入突觸的第 kkk 個脈沖在 TwT_wTw? 這個積分時間窗口內激發了 (即狀態為1) 的時刻。
K(?)K(\cdot)K(?) 是代表延時效應的核函數。
TwT_wTw? 是積分時間窗口。
uthu_{th}uth? 是個閾值,代表要不要點火 (Fire) 一次。
接下來我們用人話解釋一下2式是什么意思:
1 當膜電位 u(t)u(t)u(t) (也就是細胞體 Soma 這個隱含電位) 高于閾值 uthu_{th}uth? 時,脈沖神經元看做一次點火,此時輸出電位 s(t)s(t)s(t) 置為1,同時膜電位 u(t)u(t)u(t) 回歸到重置電位 ur2u_{r_2}ur2?? 。
2 當膜電位 u(t)u(t)u(t) (也就是細胞體 Soma 這個隱含電位) 低于閾值 uthu_{th}uth? 時,不點火,此時輸出電位 s(t)s(t)s(t) 保持為0。
3 在每個 time step,膜電位 u(t)u(t)u(t) 的更新過程滿足一個微分方程,即2.1式。
4 在每個 time step,膜電位 u(t)u(t)u(t) 值應下降 u(t)?ur1u(t)-u_{r_1}u(t)?ur1?? 這么大的值,其中 ur1u_{r_1}ur1?? 是靜息電位。
5 同時在每個 time step,膜電位 u(t)u(t)u(t) 值應上升一個值,這個值來的大小與這個神經元的 jjj 個輸入突觸有關,每個輸入突觸的權值是 wjw_jwj? ,這個突觸對膜電位上升的貢獻值是 ∑tjk∈SjTwK(t?tjk)\sum_{t_j^k\in S_j^{T_w}}K(t-t_j^k)∑tjk?∈SjTw???K(t?tjk?) ,即在 SjTwS_j^{T_w}SjTw?? 個脈沖中,如果 tjkt_j^ktjk? 時刻的輸入脈沖是點火狀態 (即1狀態),那么計算一次 K(t?tjk)K(t-t_j^k)K(t?tjk?) 并累積起來。
與 ANN 不同的是,SNN 使用脈沖的序列來傳遞信息,每個脈沖神經元都經歷著豐富的動態行為。 具體而言,除了空間域中的信息傳播外,時間域中的過去歷史也會對當前狀態產生緊密的影響。 因此,與主要通過空間傳播和連續激活的神經網絡相比,神經網絡通常具有更多的時間通用性,但精度較低。 由于只有當膜電位超過一個閾值時才會激發尖峰信號,因此整個尖峰信號通常很稀疏。 此外,由于尖峰值 (Spike) 是二進制的,即0或1,如果積分時間窗口 TwT_wTw? 調整為1,輸入和權重之間的乘法運算就可以消除。由于上述原因,與計算量較大的 ANN 網絡相比,SNN 網絡通常可以獲得較低的功耗。
3 脈沖神經網絡數據集
這一節介紹下脈沖神經網絡的基本數據集。
像 MNIST,CIFAR10 這類基于幀的靜態圖像,廣泛應用于 ANN 中,我們稱之為 ANN-oriented dataset,如下圖2的前2行所示。
**CIFAR-10:**32×32×3 RGB image,Training set:50000,Testing set:10000
**MNIST:**28×28×1 grayscale image,Training set:60000,Testing set:10000
圖2的后2行 N-MNIST 和 DVS-CIFAR10 叫做 SNN-oriented dataset。這里的 DVS 叫做 dynamic vision sensor,代表使用了動態視覺傳感器掃描每張 images 得到的 spike 數據。它除了具有與 ANN-oriented dataset 相似的空間信息外,還包含更多的動態時間信息,而且尖峰事件與神經網絡中的信號格式自然兼容,因此我們稱之為 SNN-oriented dataset。
DVS 產生兩個通道的脈沖事件,命名為 On 和Off 事件 (分別如圖2中紅色和藍色所示)。因此,DVS 將每個圖像轉換為 row×column×2×Trow\times column\times 2\times Trow×column×2×T 的脈沖模式。
**N-MNIST:**34×34×2×T spatio-temporal spike pattern,Training set:60000,Testing set:10000
**DVS-CIFAR-10:**128×128×2×T spatio-temporal spike pattern,Training set:9000,Testing set:1000
一般來說,ANN 接收幀為基礎的圖像,而 SNN 接收事件驅動的脈沖信號。因此,有時需要將相同的數據轉換為另一個域中的不同形式來處理。本文以視覺識別任務為例,主要介紹了四種信號轉換方法,如下圖3所示。
Image to spike pattern
由圖片信號轉化為脈沖信號的方法比較直觀。
一種方法是:如圖3 (a) 所示。 在每一個時間步驟,采樣的原始像素強度 (pixel intensity) 到一個二進制值 (通常歸一化為[0,1]),其中的這個強度值就等于發射一個脈沖的概率。這個采樣樣遵循一個特定的概率分布,例如伯努利分布或泊松分布。
例如,圖3(a) 中的 i1i_1i1? 神經元,對應于標準化強度為 0.8 的 intensity,產生一個二進制尖峰序列,跟隨著伯努利分布 B(0.8,T)B(0.8,T)B(0.8,T) 。這里 TTT 是取樣的時間窗口。
再例如,圖3(a) 中的 i2i_2i2? 神經元,對應于標準化強度為 0.1 的 intensity,產生一個二進制尖峰序列,跟隨著伯努利分布 B(0.1,T)B(0.1,T)B(0.1,T) 。這里 TTT 是取樣的時間窗口。
這種方法在取樣的時間窗口 TTT 比較短時有一個較大的精度損失。
另一種方法是: 如圖3 (b) 所示。使用一個編碼器來產生全局的脈沖信號。這個編碼器的每個神經元接受圖片多個像素的強度值intensity 信號作為輸入, 而產生脈沖作為輸出。 雖然編碼層是 ANN-SNN 混合層,而不是像網絡中的其他層那樣的完整 SNN 層,但它的權重是可訓練的,因為我們的訓練方法也是 BP 兼容的。由于神經元的數量可以靈活定制,參數也可以調整,因此它可以適應整體最佳化問題,從而獲得更高的精確度。
Spike pattern to image
由脈沖信號轉化為圖片信號的輸出主要有2種:
如圖3(c) 所示,代表把脈沖pattern轉化為二值圖片。2D 脈沖 pattern 可以直接看做一個二值圖像 (每個脈沖 Event 代表像素強度為1,否則像素強度為0)。 為了轉換為強度圖像 (Intensity image),需要在一個時間窗 TTT 內隨時間對脈沖時間的累積。
如圖3(d)所示,代表把脈沖pattern轉化為強度圖片。描述了100毫秒內脈沖事件的累積過程,累積脈沖數將被歸一化為具有適當強度值的像素。由于 DVS 的相對運動和固有噪聲,使得圖像常常模糊,邊緣特征模糊。這種轉換只允許一個強大的假設,每個脈沖位置不應該移動,否則將嚴重損害生成的圖像質量。
- ANN-oriented workloads
ANN-oriented workloads 的含義是目標是識別在 ANN 中經常使用的基于幀的數據集 (如 MNIST 和 CIFAR10)。有3種基準模型:
1 如下圖4(a) 所示,最直接的解決辦法是 ANN 訓練 + ANN 推理。
2 如下圖4(b) 所示,這種方案是先在 ANN 數據集上使用 BP 算法訓練一個 ANN,再把這個訓練好的 ANN 轉化成 SNN。這個 SNN 與 ANN 擁有相同的結構,但是不同的神經元。這個 SNN 在推理時使用的是 ANN 數據集轉化得到的 SNN-oriented dataset。
3 如下圖4(c) 所示,這種方案是直接使用 SNN-oriented dataset 訓練一個 SNN,訓練方法是 BP-inspired Training。在每個時刻和位置的梯度直接由 spatio-temporal backpropagation (STBP) 方法得到。
- SNN-oriented workloads
SNN-oriented workloads 的含義是目標是識別在 SNN 中經常使用的脈沖數據集 (如 N-MNIST 和 DVS-CIFAR10)。有2種基準模型:
1 如下圖5(a) 所示,把脈沖數據集轉化成圖片,即 ANN-oriented dataset,然后使用 BP 算法訓練 ANN 并推理。脈沖數據集轉化成圖片的方法就是圖3的 (c)(d) 所示。
2 如下圖5(b) 所示,這種方案是直接使用 SNN-oriented dataset 訓練一個 SNN,訓練方法是 BP-inspired Training。在每個時刻和位置的梯度直接由 spatio-temporal backpropagation (STBP) 方法得到。
4 脈沖神經網絡訓練方法
- ANN 的 BP 訓練方法
可以用下式表示:
式中, φj′n+1\varphi_j^{'n+1}φj′n+1? 是 n+1n+1n+1 層的第 jjj 個神經元的激活函數的導數。 LLL 是損失函數,比如可以是 MSE Loss: L=12∣∣Y?Ylabel∣∣22L=\frac{1}{2}||Y-Y_{\text{label}}||_2^2L=21?∣∣Y?Ylabel?∣∣22? 。
- SNN 的 STBP (時空反向傳播) 訓練方法
基于的前向模型是2式的 LIF 的 SNN 模型,為了閱讀的方便再把2式寫一遍。
LIF 模型的迭代版本可以用下式表示:
式中, ooo 代表脈沖輸出, ttt 代表 time step, nnn 代表 layer index。 e?dtτe^{-\frac{dt}{\tau}}e?τdt? 代表膜電位的延遲效應。 f(?)f(\cdot)f(?) 是階躍函數 (step function)。 這種迭代的 LIF 模型包含了原始神經元模型中的所有行為,包括集成 (integration),觸發 (fire) 和重置 (reset)。
注意,為了簡單起見,我們在原來的 LIF 模型中設置了 ur1=ur2=0,Tw=1,K(?)=1u_{r_1}=u_{r_2}=0,T_w=1,K(\cdot)=1ur1??=ur2??=0,Tw?=1,K(?)=1 。給定迭代 LIF 模型,梯度沿著時間和空間維度傳播,LIF 模型的迭代版本的參數更新可以按照如下方式進行:
從膜電位 uuu 到輸出 ooo 是個階躍函數,它是不可導的。為了解決這個問題,有下面這個輔助函數計算輸出 ooo 到膜電位 uuu 的導數值:
?o?u=1asign(∣u?uth∣<a2)(4)\frac{\partial o}{\partial u}=\frac{1}{a}\text{sign}(|u-u_{th}|<\frac{a}{2})\tag{4} ?u?o?=a1?sign(∣u?uth?∣<2a?)(4)
式中,參數 aaa 決定了梯度寬度。
LLL 是損失函數,比如可以是 MSE Loss: L=12∣∣1T∑t=1TOt,N?Ylabel∣∣22L=\frac{1}{2}||\frac{1}{T}\sum_{t=1}^{T}{O^{t,N}}-Y_{\text{label}}||_2^2L=21?∣∣T1?∑t=1T?Ot,N?Ylabel?∣∣22? 。
5 脈沖神經網絡評價指標
眾所周知,基于 SNN 的模型通常無法在絕對識別準確性方面擊敗當前基于 ANN 的 AI 系統,而真正的大腦在其他指標上表現更好,比如操作效率。然而,在最近的研究中,識別精度仍然是判斷哪個模型 (ANN 或 SNN) 更好的主流指標,特別是在算法研究中。這是不公平的,因為 ANN 和 SNN 有非常不同的特點。例如,數據的精度 ANN 比 SNN 更高,這就使得在網絡大小相同的情況下,ANN 通常比 SNN 更容易獲得更好的識別精度。所有這些都表明模型評估需要更全面的度量。除了通常的精度比較,這里我們進一步介紹了內存和計算成本作為互補的評估指標。
- 識別精度 (Recognition accuracy)
在 ANN 中,這個精確度意味著正確識別樣本的百分比。如果標簽類別與模型預測的最大激活值相同,則識別結果對當前樣本是正確的。
在 SNN 中,我們首先計算每一個輸出神經元的 fire rate,即脈沖率,當然是在給定的時間窗 TTT 內。然后取 fire rate 最高的那個神經元作為輸出,寫成公式就是:
C^=arg?max?i{1T∑t=1Toit,N}(5)\hat C=\arg\max_i \left\{ \frac{1}{T}\sum_{t=1}^{T}{o_i^{t,N}} \right\}\tag{5} C^=argimax?{T1?t=1∑T?oit,N?}(5)
式中, oit,No_i^{t,N}oit,N? 代表網絡的第 NNN 層,第 iii 個神經元在第 ttt 時刻的輸出。
下面介紹的內存花銷和計算花銷都是指推理過程。原因有2點,一方面, spatio-temporal gradient propagation 相對于推理過程來講非常復雜。另一方面, 大多數支持 SNN 的神經形態學設備只執行推理階段 (inference phase)。
- 內存花銷 (Memory cost)
通常,在嵌入式設備上部署模型時,內存占用 (Memory cost) 非常重要。
在 ANN 中,存儲器成本包括 權重內存 (weight memory) 和激活值內存 (activation memory)。activation memory 的開銷被忽略,但是如果使用查找表來實現的話應該被計算在內。
在 SNN 中,內存成本包括 權重內存 (weight memory),膜電位內存 (membrane potential memory) 和脈沖內存 (spike memory)。其他參數如點火閾值 uthu_{th}uth? 和時間常數 τ\tauτ 等可以忽略,因為它們可以被同一層或整個神經網絡的所有神經元共享。只有當脈沖觸發時,脈沖內存 (spike memory) 開銷才會出現。總之,內存開銷可以通過下式計算:
ANN:M=Mw+MaSNN:M=Mw+Mp+Ms(6)\begin{aligned} &A N N: M=M_{w}+M_{a} \\ &S N N: M=M_{w}+M_{p}+M_{s} \end{aligned} \tag{6}?ANN:M=Mw?+Ma?SNN:M=Mw?+Mp?+Ms??(6)
式中, Mw,Ma,MpM_w,M_a,M_pMw?,Ma?,Mp? 由網絡結構決定,而 MsM_sMs? 由每個時間戳最大脈沖數動態地決定。
- 計算花銷 (Compute cost)
計算開銷對于運行延遲和能量消耗是至關重要的。
在 ANN 中,計算開銷主要由方程中的 MAC 運算決定。
在 SNN 中,主要的計算成本來自脈沖輸入的這個積分的過程。與 ANN 有兩點不同:
計算開銷可以通過下式計算:
ANN:C=Cmul+CaddSNN:C=Cadd(7)\begin{aligned} &A N N: C=C_{m u l}+C_{a d d} \\ &S N N: C=C_{a d d} \end{aligned} \tag{7}?ANN:C=Cmul?+Cadd?SNN:C=Cadd??(7)
在細胞體中的計算開銷 (例如 ANN 中的激活函數和 SNN 中的膜電位更新和觸發活動) 被忽略,這是神經網絡設備中的一種常見方式。
注意,在 SNN 中, CaddC_{add}Cadd? 與 Spike 事件的總數成正比。
總結
以上是生活随笔為你收集整理的如何看待第三代神经网络SNN?详解脉冲神经网络的架构原理、数据集和训练方法 原创的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文看尽 CVPR2022 最新 22
- 下一篇: 2018到2008,10年CVPR/NI