微信公众号:【事件相机】,交流事件相机的相关科研与应用。欢迎大家关注
最近了解了一下脉冲神经网络(Spiking Netrual Network, SNN)在Event Camera中的一些应用。在此稍作整理。由于本人对神经网络了解不多,难免存在理解错误,欢迎大家积极指正。转载请注明出处
1. 脉冲神经网络
脉冲神经网络是1997年[1]提出的一种人工神经网络(Artificial NN, ANN),受生物领域研究的启发,神经网络由多层、每层多个神经元相连。为与CNN(卷积神经网络)等其他ANN进行区分,采用“突触(synaptic)”这个词进行表示。
突触由一个前突触神经元(presynaptic neuron)和后突触神经元(postsynaptic neuron)构成。当前突触兴奋(excitatory)时,会产生一个膜电位(membrance potential),传递一些神经递质给后突触。当膜电位达到一定强度,到达后突触的激活阈值时,后突触会兴奋,产生膜电位,并向后传递。形成了一个完整的SNN。
具体后突触神经元接收到的膜电位强度,有多种模型。一般采用 leaky integrate-and-fire (LIF) 模型,即当到来脉冲时,会累积(integrate)强度,但强度会随着时间进行衰减(leaky),当达到阈值时会激活(fire)。在激活后,产生的膜电位也有多种模型,在论文中称作post-synaptic potential(PSP),一般用kernel形式进行表示。一种常见的Kernel表达式为: K ( t − t i ) = V 0 ( e x p ( − ( t − t i ) τ ) − e x p ( − ( t − t i ) τ s ) ) , K(t-t_i)=V_0(exp(\frac{-(t-t_i)}{\tau})-exp(\frac{-(t-t_i)}{\tau_s})), K(t−ti)=V0(exp(τ−(t−ti))−exp(τs−(t−ti))), 画出的曲线见下图最上方(图中还加入了一个延迟,即刚激活一小段儿时间内没有输出,但简化时可以不考虑)。简化一些的例如指数衰减模型 D ( t ) = H ( t ) e x p ( − t τ u ) D(t) = H(t)exp(\frac{-t}{\tau_u}) D(t)=H(t)exp(τu−t) ,或再简化为线性衰减。具体的模型应该是与芯片相关的,例如TrueNorth采用的是线性衰减。
图片来源:[2]
coding
SNN的编码方式,主要分为两大类:rate coding 和 temporal coding。前者将脉冲的强度转化为一定时间窗口内的输出脉冲的数量,后者编码考虑了时间的信息。事件相机常用的是temporal coding,毕竟时间信息是非常重要的。具体的膜电位的表达式为:
τ
d
u
(
t
)
d
t
=
−
(
u
(
t
)
−
u
r
e
s
t
)
+
K
S
,
\tau \frac{du(t)}{dt}=-(u(t)-u_{rest})+KS,
τdtdu(t)=−(u(t)−urest)+KS,其中
S
=
∑
i
δ
(
t
−
S
i
)
S=\sum_i\delta(t-S_i)
S=∑iδ(t−Si)为每个事件的时间戳对应的狄拉克脉冲和;
K
K
K是每个脉冲spike带来的膜电位强度,
τ
\tau
τ是膜电位时间常数。这个式子可以理解为:在没有脉冲到来时,膜电压是不断衰减的,衰减速率和时间常数以及当前电压大小有关,当有脉冲到来时,会突然提升膜电位。写成积分形式是:
u
(
t
)
=
∑
i
Δ
u
⋅
e
x
p
(
(
t
−
S
i
)
/
τ
)
⋅
H
(
t
−
t
i
)
,
u(t)=\sum_i \Delta u \cdot exp((t-S_i)/\tau)\cdot H(t-t_i),
u(t)=i∑Δu⋅exp((t−Si)/τ)⋅H(t−ti),可以看出是指数衰减。而
H
(
t
−
t
i
)
=
1
,
(
i
f
t
>
=
t
i
)
;
o
r
H
(
t
−
t
i
)
=
0
(
i
f
t
<
t
i
)
H(t-t_i)=1 ,\ (if \ t>=t_i); \ or \ H(t-t_i)=0 \ (if \ t<t_i)
H(t−ti)=1, (if t>=ti); or H(t−ti)=0 (if t<ti)。为什么说这种方式编码进了时间信息?可以看出,当经过一些脉冲后,每个脉冲对膜电位的贡献与时间有关,所以膜电位与脉冲到来的时间是相关的,即引入了时间的信息。
learning
以上部分基本介绍的是SNN如何进行编码(codes),其实编码方式有多种,请查看参考文献[2]。之后我们关心SNN网络如何进行训练。所谓训练,就是加强或减弱前后两个神经元之间的权重。一种常见训练模型,称作 tempotron learning rules,表示了后神经元刺激强度的组成,表达式为:
V
(
t
)
=
∑
i
ω
i
∑
t
i
K
(
t
−
t
i
)
+
V
r
e
s
e
t
,
V(t)=\sum_i \omega_i \sum_{t_i}K(t-t_i)+V_{reset},
V(t)=i∑ωiti∑K(t−ti)+Vreset, 即膜电位是前面所有前突触神经元的加权和。在训练时,我们要调整的就是他们之间的权重
ω
i
\omega_i
ωi。
训练也可以分为有监督和无监督两大类,无监督更适用于聚类,一种简单的训练思路是,当前后两个神经元激活顺序是“前-后”时,如果分类结果正确,则加强这两个之间的权重。如果激活顺序是反的,则意味着前神经元对后神经元起抑制作用或不相关,则减少权重。这种方法被称作:Spike-timing-dependent plasticity(STDP),
对于有监督的训练,我们知道对应的标签,所以当标签正确是,进行加强;标签错误时,减小权重。一种权重更新方式见下图:
图片来源:[3]
在搞清楚基本原理之后,我们分析一种常见的思路。
2. 基于SNN的事件相机目标识别
这里通过[4]这种方法,介绍SNN如何进行目标识别。这种方法被后面论文反复提到,称作HFirst。同时HOTS[5]也是一种反复被提到的方法。总得来说,这些方法大思路基本相同。
图片来源:[6]。这种方法是[4][5]的结合。由于配图比较清楚,所以用了[6]的配图。
总得来说,从图像到分类结果,主要有两部分:feature extraction(或encoding)和classifier(或learning)。前者负责从event的数据中提出特征(脉冲信号),后面识别脉冲信号的模式,进行分类。
常用的脉冲信号提取的方法是采用Gabor filter。在[1]中作者表示,对于一个回形针,摆放不同角度时,对不同神经元激活程度不同,大概是15°能够明显区分不同神经元活跃程度。所以Gabor filter也是以15°进行划分。以7*7为例,event图像中每个像素都经过7*7的Gabor filter进行处理,输出就是信号的强度。每个像素对应了12个Gabor filter的结果。当某一个的强度累积到阈值后,对应的突触神经元被激活,同时重置掉其他Gabor filter的累积。这一层被称作S1层(Simple 1)。这一层通过类似于池化连接到C1层(Complex 1)。关于S1,C1是SNN中的概念,之前的研究表明貌似人感知就是这种结构。[6]指出,C1的存在降低了Spiking的频率,而[6]又经过了一次S2C2,完成特征提取部分。至于需要经过几次S和C层我目前看到最多也就2层。
提取之后的结果通过Classifier进行分类。学习过程类似于第1章提到的。根据标签和对应类别输出的脉冲频率,调整对应的权重。具体涉及内容较多,不做展开。
3. SNN与CNN在Event Camera中的比较
这里就不得不说一说CNN在EB中的使用。由于CNN是卷积的形式,所以需要有完整的图像。event的图像由两种获得方式:一种是使用重建,得到重建灰度图;另一种是进行累积,固定数量/固定频率/衰减积分等方式得到图像,再进行CNN。
传统的CNN方法也经过了一些改进,例如异步CNN方法(论文忘了名字,待补充参考文献),提出了根据event的异步数据更新CNN的思路;稀疏CNN方法,对于稀疏的累积图进行卷积,提高了效率[7]。
但总得来说,CNN的方法不能充分利用时间信息,而时间信息是事件流的重要信息,而SNN也将脉冲的时间信息进行了编码,所以SNN能够更加充分的利用时间这个信息。但SNN的方法,目前不能够像CNN一样得到bounding box一类的检测结果,暂时只看到了全图的分类与模式识别等应用。所以CNN和SNN的方法各有优劣。
参考文献
- Networks of Spiking Neurons. The Third Generation of Neural Network Models
- Spiking Neural Networks: Principles and Challenges
- An Event-based Hierarchy Model for Object Recognition
- HFirst: A Temporal Approach to Object Recognition
- HOTS: A Hierarchy of Event-Based Time-Surfaces for Pattern Recognition
- An Event-based Hierarchy Model for Object Recognition
- Event-based Asynchronous Sparse Convolutional Networks