原文链接:https://blog.csdn.net/qq_43622216/article/details/123739672
Spatio-Temporal Backpropagation for Training High-Performance Spiking Neural Networks
目录
说明
准备将自己读的一些和SNN(脉冲神经网络)相关的一些论文记录下来,方便自己以后回看也希望能够帮到有需要的人。
删除了文中一些自认为不重要的内容而用自己的话进行简洁描述(很少,比如引言的一些内容),其他部分尽量使用专业用语进行翻译,如果有什么出错或不恰当的地方希望各位批评指出。
相关信息
论文地址: Spatio-Temporal Backpropagation for Training High-Performance Spiking Neural Networks
论文于2018年5月23日发表在frontiers in Neuroscience,与第一篇文章一样由清华大学李国齐老师组完成。
frontiers in Neuroscience虽然目前只是二区期刊,但SNN领域很多经典文献都发表在这个期刊。
主要贡献
论文提出了spatio-temporal backpropagation (STBP) algorithm,构建了迭代的LIF模型能够同时利用空间域和时间域信息对网络进行训练,又介绍了四种近似脉冲活动导数的曲线来进行误差的反向传播。不使用任何复杂的训练技巧(如正则化、归一化等)就能取得很好的效果。
启发
基于本文提出的STBN算法以及梯度近似曲线,可以用其进行训练SNN网络并取得更好的性能。
Abstract
脉冲神经网络(SNN)具有编码时空信息的能力,在识别类脑行为方面具有广阔的应用前景。最近的方案,如人工神经网络(ANN)的预训练或基于反向传播(BP)的直接训练,使SNN的高性能监督训练成为可能。然而这些方法主要关注其空间域的信息而不太关注时间域的动态信息,从而会导致性能瓶颈问题。另一个潜在的问题是脉冲活动是不可微分的,这增加了对SNN进行监督训练的难度。在本文中,我们提出了一种用于训练高性能SNN的时空反向传播(STBP)算法。为了解决SNN中不可微分的问题,提出了用于梯度下降训练的脉冲活动近似导数(approximated derivative)。STBP算法结合了逐层空间域(SD)和时间域(TD),并且在训练时不需要任何额外的复杂技巧。通过静态的MNIST数据集、定制目标检测数据集以及动态的N-MNIST数据集对STBP算法进行了评估,结果显示我们的方法达到了SOTA (文章发表于2018年,实验应该是在2017年做的) 。这项工作为未来具有丰富时空动态的类脑计算范式的高性能SNN研究提供了一个新的视角。
1. Introduction
SNN的优势主要在以下两点:
- SNN中的脉冲序列包含有相对于人工神经网络更多的时空信息;
- SNN的事件驱动特性能够在硬件上有更好的效果。
虽然SNN有这样一些优点但由于其较复杂的动力学和脉冲活动的不可微分特性,SNN的训练还面临着很多挑战。目前的SNN训练方法主要分为以下三种:
- 无监督训练。无监督训练方法主要来源于生物突触的权重调整如spike timing dependent plasticity (脉冲时序依赖可塑性,STDP),由于其主要依赖局部的神经元活动而缺少全局的监督,因此难以实现高性能。
- 间接的监督训练。这种方式主要是先训练一个ANN再将其转化为SNN。
- 直接监督训练。梯度下降方法是一类流行的监督学习优化算法,研究人员最初使用Spikeprop使用梯度下降方法设计多层SNN进行监督学习。它利用第一次脉冲时间对输入信号进行编码,使网络输出信号与期望信号之间的差值最小,整个过程与传统的反向传播(BP)相似。Lee1等人将膜电位做为可微信号来解决脉冲不可微分的问题,并提出了一种直接BP算法来训练深层SNN。许多新兴的SNN监督训练方法都考虑了基于脉冲的神经元的时空动力学(spatial-temporal dynamic),但大多数方法都是将注意力集中在空间特征或时间特征一个方面,本质上并没有发挥SNN的优势,而且必须利用几种复杂的技巧来提高性能,如误差归一化(error normalization)、权值/阈值正则化(weight/threshold regularization)、特定的重置机制( specific reset mechanism)等。
因此,设计一个更加通用的SNN动力学模型(dynamic model)和学习算法(learning algorithm)是很有意义的。
本文提出了一种用于直接对SNN进行监督学习的方法,在训练阶段结合了空间域(spatial domain,SD)和时间域(temporal domain,TD)的信息。首先建立了适用于梯度下降训练的动力学迭代LIF模型,在此基础上,误差反传(BP)的过程中同时考虑了空间域维度和时间域维度,显著提高了网络的精度。为了解决脉冲活动不可微的问题,又引入了近似导数。经过测试,我们的方法可以充分利用捕捉SNN本质的时空域(STD)信息,从而避免任何复杂的训练技巧。实验结果表明,与现有算法相比,该方法在静态和动态数据集上都能获得最佳的精度。本文也系统地分析了TD动力学和不同方法对导数逼近的影响。这项工作使我们能够为未来具有丰富STD动态的类似大脑的计算范例探索高性能的SNN。
2. METHODS AND MATERIALS
我们专注于如何充分利用时空动态来有效地训练SNN。在本节中,我们提出一种学习算法,使我们能够应用时空BP来训练脉冲神经网络。为此,第2.1小节首先引入了适用于误差BP算法的迭代LIF模型;2.2小节给出了提出的STBP算法的细节;2.3小节提出了导数的近似来解决不可微问题。
2.1 SNN中的迭代LIF模型:
LIF(Leaky Integrate-and-Fire)模型是目前最常用的描述SNN神经元动力学的模型,它可以由如下方程来描述:
τ
d
u
(
t
)
d
t
=
−
u
(
t
)
+
I
(
t
)
(1)
\tau \frac{du(t)}{dt} = -u(t) + I(t) \tag{1}
τdtdu(t)=−u(t)+I(t)(1)
其中
u
(
t
)
u(t)
u(t)是在
t
t
t时刻的神经元膜电位(膜电势),
τ
\tau
τ是时间常数(time constant),
I
(
t
)
I(t)
I(t)表示由前一个神经元的脉冲活动或外部刺激和突触权值决定的突触前输入。当膜电势
u
u
u超过指定的阈值
V
t
h
V_{th}
Vth时神经元会发放一个脉冲并将其膜电势重置为
u
r
e
s
e
t
u_{reset}
ureset。如图1所示,SNN的前向数据流像DNN(深度神经网络)一样在逐层SD中传播,每个神经元节点的自反馈注入在TD中产生非易失性集成(这句话没太读懂)。这样,SNN运行时就具有复杂的时空域动态并且将时空信息编码为脉冲模式(spike pattern)。现有的SNN训练算法要么只考虑SD(如BP的有监督训练),要么只考虑TD(如基于时间可塑性的无监督训练),这可能会导致性能瓶颈。因此,如何充分利用时空域(STD)构建学习模型是本文研究的主要动力。
但是,由于在连续的TD中整个网络呈现出复杂的动力学,直接得到式(1)中LIF模型的解析解会使得基于离散数据流的BP神经网络训练不方便。为了解决这一问题,首先求解初始条件为
u
(
t
)
∣
t
=
t
i
−
1
=
u
(
t
i
−
1
)
u(t)|_{t=t_{i-1}} = u(t_{i-1})
u(t)∣t=ti−1=u(ti−1)的线性微分方程(1),得到如下迭代更新规则:
u
(
t
)
=
u
(
t
i
−
1
)
e
t
i
−
1
−
t
τ
+
I
^
(
t
)
(2)
u(t) = u(t_{i-1})e^{\frac{t_{i-1}-t}{\tau}} + \hat{I}(t) \tag{2}
u(t)=u(ti−1)eτti−1−t+I^(t)(2)
其中的神经元电位 u ( t ) u(t) u(t)依赖于时间 t i − 1 t_{i-1} ti−1的电位和一般的突触前输入 t ^ ( t ) \hat{t}(t) t^(t)。在神经元接收到新的输入之前,细胞膜电位呈指数衰减,一旦神经元发出脉冲,新一轮更新就会开始。也就是说,神经元的状态是由 t ^ ( t ) \hat{t}(t) t^(t)的空间累积和 u ( t i − 1 ) u(t_{i-1}) u(ti−1)的泄露空间记忆( leaky temporal memory)共同决定的。
正如我们所知,误差BP训练DNN的效率很大程度上得益于梯度下降的迭代表示,它使得在SD中误差能够链式规则逐层传播。这促使我们提出一种基于迭代LIF的SNN,迭代发生在SD和TD中,如下所示:
x
i
t
+
1
,
n
=
∑
j
=
1
l
(
n
−
1
)
w
i
j
n
o
j
t
+
1
,
n
−
1
(3)
x_i^{t+1,n} = \sum_{j=1}^{l(n-1)}w_{ij}^no_j^{t+1,n-1} \tag{3}
xit+1,n=j=1∑l(n−1)wijnojt+1,n−1(3)
u
i
t
+
1
,
n
=
u
i
t
,
n
f
(
o
i
t
,
n
)
+
x
i
t
+
1
,
n
+
b
i
n
(4)
u_i^{t+1,n} = u_i^{t,n}f(o_i^{t,n}) + x_i^{t+1,n} + b_i^n \tag{4}
uit+1,n=uit,nf(oit,n)+xit+1,n+bin(4)
o
i
t
+
1
,
n
=
g
(
u
i
t
+
1
,
n
)
(5)
o_i^{t+1,n} = g(u_i^{t+1,n}) \tag{5}
oit+1,n=g(uit+1,n)(5)
其中
f
(
x
)
=
τ
e
−
x
τ
(6)
f(x) = \tau e^{-\frac{x}{\tau}} \tag{6}
f(x)=τe−τx(6)
g
(
x
)
=
{
1
,
x
≥
V
t
h
0
,
x
<
V
t
h
(7)
g(x) = \begin{cases}1,&x \geq V_{th}\\ 0, &x<V_{th} \end{cases} \tag{7}
g(x)={1,0,x≥Vthx<Vth(7)
上式中,上标
t
t
t表示时间步长(time step)
t
t
t,
n
n
n和
l
(
n
)
l(n)
l(n)分别表示第
n
n
n层和第
n
n
n层的神经元数量。
W
i
j
W_{ij}
Wij是前一层第
j
j
j个神经元和当前层第
i
i
i个神经元之间的突触权重,
0
j
∈
(
0
,
1
)
0_j \in (0,1)
0j∈(0,1)是第
j
j
j个神经元的输出,其中
o
i
=
1
o_i = 1
oi=1表示发放脉冲而
o
j
=
0
o_j=0
oj=0表示不发放脉冲。式(4)是式(2)的LIF模型中膜电势迭代更新的版本。式(4)中右边的第一项为式(2)中
u
(
t
i
−
1
)
e
t
i
−
1
−
t
τ
u(t_{i-1})e^{\frac{t_{i-1}-t}{\tau}}
u(ti−1)eτti−1−t对应的神经元点位的衰减分量,第二项
x
i
x_i
xi是式(2)中第
i
i
i个神经元的突触前输入
I
^
(
t
)
\hat{I}(t)
I^(t)的简化表示,第三项
b
i
b_i
bi是发放阈值的一个等效变量。具体来说,
u
i
t
+
1
,
n
=
u
i
t
,
n
f
(
o
i
t
,
n
)
+
x
i
t
+
1
,
n
+
b
i
n
>
V
t
h
u_i^{t+1,n} = u_i^{t,n}f(o_i^{t,n}) + x_i^{t+1,n} + b_i^n > V_{th}
uit+1,n=uit,nf(oit,n)+xit+1,n+bin>Vth等同于
u
i
t
+
1
,
n
=
u
i
t
,
n
f
(
o
i
t
,
n
)
+
x
i
t
+
1
,
n
>
V
t
h
−
b
i
n
u_i^{t+1,n} = u_i^{t,n}f(o_i^{t,n}) + x_i^{t+1,n} > V_{th} - b_i^n
uit+1,n=uit,nf(oit,n)+xit+1,n>Vth−bin。因此,可以利用可调节偏差
b
b
b来模拟阈值行为。
实际上,公式(4)-(5)也是受到LSTM的启发,通过使用遗忘门
f
(
.
)
f(.)
f(.)来控制TD记忆,使用输出门
g
(
.
)
g(.)
g(.)发放脉冲。具体来说,对于较小的正时间常数
τ
\tau
τ,
f
(
.
)
f(.)
f(.)可近似为:
f
(
o
i
t
,
n
)
≈
{
τ
,
o
i
t
,
n
=
0
0
,
o
i
t
,
n
=
1
(8)
f(o_i^{t,n}) \approx\begin{cases} \tau, &o_i^{t,n} = 0 \\ 0, &o_i^{t,n} =1 \end{cases} \tag{8}
f(oit,n)≈{τ,0,oit,n=0oit,n=1(8)
因此当
τ
\tau
τ是一个很小的正数时,
τ
e
−
1
τ
≈
0
\tau e^{-\frac{1}{\tau}} \approx 0
τe−τ1≈0。这样就可以将LIF模型转化为一个迭代版本,其中SD和TD的递归关系都得到了清晰的描述,适合在STD(时空域)中进行梯度下降训练。
2.2 STBP训练框架
为了介绍STBP训练框架,首先定义如下的损失函数
L
L
L,使所有样本在给定时间窗口
T
T
T下的均方误差(MSE)最小化:
L
=
1
2
S
∑
s
=
1
S
∥
y
s
−
1
T
∑
t
=
1
T
o
s
t
,
N
∥
2
2
(9)
L = \frac{1}{2S}\sum_{s=1}^S\Vert y_s-\frac{1}{T}\sum_{t=1}^To_s^{t,N}\Vert_2^2 \tag{9}
L=2S1s=1∑S∥ys−T1t=1∑Tost,N∥22(9)
其中
y
s
y_s
ys和
o
s
o_s
os分别表示第
s
s
s个样本的标签向量和SNN最后一层神经元的输出向量。
通过结合等式(3)-(9),可以看出
L
L
L是
W
\boldsymbol{W}
W和
b
\boldsymbol{b}
b的函数,因此,要使用梯度下降就要求出
L
L
L对
W
\boldsymbol{W}
W和
b
\boldsymbol{b}
b的导数。假设在
t
t
t时刻,我们已经得到了
∂
L
∂
o
i
\frac{\partial L}{\partial o_i}
∂oi∂L和
∂
L
∂
u
i
\frac{\partial L}{\partial u_i}
∂ui∂L在每一层(第
n
n
n层)上的导数,图2描述了在单一神经元水平上(图2-A)和整个网络水平上(图2-B)SD和TD中误差的传播(依赖于导数)。
在单神经元层面,传播被分解为SD的垂直路径和TD的水平路径,SD中的误差传播的数据流与典型的DNN中的BP相似,即每个神经元对来自上层的加权误差信号进行累加,并在不同层迭代更新参数。而TD中的数据流具有相同的神经元状态,这使得直接得到解析解相当复杂。为了解决这一问题,我们利用所提出的迭代LIF模型分别在SD和TD方向展开状态空间,从而区分TD在不同时间步长的状态,从而实现了迭代传播的链式规则。类似的思想可以在训练RNN的BPTT算法中找到。
现在,我们讨论如何在以下四种情况下获得完整的梯度下降。首先,我们有如下的表示:
δ
i
t
,
n
=
∂
L
∂
o
i
t
,
n
(11)
\delta_i^{t,n} = \frac{\partial L}{\partial o_i^{t,n}} \tag{11}
δit,n=∂oit,n∂L(11)
情况1:在输出层
n
=
N
n=N
n=N且
t
=
T
t=T
t=T:
在这种情况下,可以直接由方程(9)中的损失函数得到导数
∂
L
∂
o
i
T
,
N
\frac{\partial L}{\partial o_i^{T,N}}
∂oiT,N∂L,求导得到:
∂
L
∂
o
i
T
,
N
=
−
1
T
S
(
y
i
−
1
T
∑
k
=
1
T
o
i
k
,
N
)
.
(11)
\frac{\partial L}{\partial o_i^{T,N}} = - \frac{1}{TS}(y_i-\frac{1}{T}\sum_{k=1}^To_i^{k,N}). \tag{11}
∂oiT,N∂L=−TS1(yi−T1k=1∑Toik,N).(11)
L
L
L相对于
u
i
T
,
N
u_i^{T,N}
uiT,N的导数可以根据
o
i
T
,
N
o_i^{T,N}
oiT,N得到:
∂
L
∂
u
i
T
,
N
=
∂
L
∂
o
i
T
,
N
∂
o
i
T
,
N
∂
u
i
T
,
N
=
δ
i
T
,
N
∂
o
i
T
,
N
∂
u
i
T
,
N
(12)
\frac{\partial L}{\partial u_i^{T,N}} = \frac{\partial L}{\partial o_i^{T,N}} \frac{\partial o_i^{T,N}}{\partial u_i^{T,N}} = \delta_i^{T,N}\frac{\partial o_i^{T,N}}{\partial u_i^{T,N}} \tag{12}
∂uiT,N∂L=∂oiT,N∂L∂uiT,N∂oiT,N=δiT,N∂uiT,N∂oiT,N(12)
情况2:层数
n
<
N
n<N
n<N且
t
=
T
t=T
t=T:
这种情况下,
∂
L
∂
o
i
T
,
n
\frac{\partial L}{\partial o_i^{T,n}}
∂oiT,n∂L迭代地依赖于
T
T
T时刻SD中的误差传播,可以得到:
∂
L
∂
o
i
T
,
n
=
∑
j
=
1
l
(
n
+
1
)
δ
j
T
,
n
+
1
∂
o
j
T
,
n
+
1
∂
o
i
T
,
n
=
∑
j
=
1
l
(
n
+
1
)
δ
j
T
,
n
+
1
∂
g
∂
u
i
T
,
n
w
j
i
(13)
\frac{\partial L}{\partial o_i^{T,n}} = \sum_{j=1}^{l(n+1)}\delta_j^{T,n+1}\frac{\partial o_j^{T,n+1}}{\partial o_i^{T,n}} = \sum_{j=1}^{l(n+1)}\delta_j^{T,n+1}\frac{\partial g}{\partial u_i^{T,n}}w_{ji} \tag{13}
∂oiT,n∂L=j=1∑l(n+1)δjT,n+1∂oiT,n∂ojT,n+1=j=1∑l(n+1)δjT,n+1∂uiT,n∂gwji(13)
类似地,
∂
L
∂
u
i
T
,
n
\frac{\partial L}{\partial u_i^{T,n}}
∂uiT,n∂L可以计算为:
∂
L
∂
u
i
T
,
n
=
∂
L
∂
o
i
T
,
n
∂
o
i
T
,
n
∂
u
i
T
,
n
=
δ
i
T
,
n
∂
g
∂
u
i
T
,
n
(14)
\frac{\partial L}{\partial u_i^{T,n}} = \frac{\partial L}{\partial o_i^{T,n}} \frac{\partial o_i^{T,n}}{\partial u_i^{T,n}} = \delta_i^{T,n} \frac{\partial g}{\partial u_i^{T,n}} \tag{14}
∂uiT,n∂L=∂oiT,n∂L∂uiT,n∂oiT,n=δiT,n∂uiT,n∂g(14)
情况3:层数
n
=
N
n=N
n=N且
t
<
T
t<T
t<T:
这种情况下的
∂
L
∂
o
i
t
,
N
\frac{\partial L}{\partial o_i^{t,N}}
∂oit,N∂L依赖于在TD中的误差传播,通过展开TD内的状态空间,利用式(3)-(5)所提出的迭代LIF模型,根据TD内的链式法则求出所需导数如下:
∂
L
∂
o
i
t
,
N
=
δ
i
t
+
1
,
N
∂
o
i
t
+
1
,
N
∂
o
i
t
,
N
+
∂
L
∂
o
i
T
,
N
=
δ
i
t
+
1
,
N
∂
g
∂
u
i
t
+
1
,
N
u
i
t
,
N
∂
f
∂
o
i
t
,
N
+
∂
L
∂
o
i
T
,
N
(15)
\begin{aligned} \frac{\partial L}{\partial o_i^{t,N}} &= \delta_i^{t+1,N} \frac{\partial o_i^{t+1,N}}{\partial o_i^{t,N}} + \frac{\partial L}{\partial o_i^{T,N}} \\ &= \delta_i^{t+1,N} \frac{\partial g}{\partial u_i^{t+1,N}}u_i^{t,N}\frac{\partial f}{\partial o_i^{t,N}} + \frac{\partial L}{\partial o_i^{T,N}} \tag{15} \end{aligned}
∂oit,N∂L=δit+1,N∂oit,N∂oit+1,N+∂oiT,N∂L=δit+1,N∂uit+1,N∂guit,N∂oit,N∂f+∂oiT,N∂L(15)
∂
L
∂
u
i
t
,
N
=
∂
L
∂
o
i
t
+
1
,
N
∂
o
i
t
+
1
,
N
∂
u
i
t
+
1
,
N
∂
u
i
t
+
1
,
N
∂
u
i
t
,
N
=
δ
i
t
+
1
,
N
∂
g
∂
u
i
t
+
1
,
N
f
(
o
i
t
,
n
)
,
(16)
\frac{\partial L}{\partial u_i^{t,N}} = \frac{\partial L}{\partial o_i^{t+1,N}} \frac{\partial o_i^{t+1,N}}{\partial u_i^{t+1,N}} \frac{\partial u_i^{t+1,N}}{\partial u_i^{t,N}} = \delta_i^{t+1,N}\frac{\partial g}{\partial u_i^{t+1,N}}f(o_i^{t,n}), \tag{16}
∂uit,N∂L=∂oit+1,N∂L∂uit+1,N∂oit+1,N∂uit,N∂uit+1,N=δit+1,N∂uit+1,N∂gf(oit,n),(16)
其中,
∂
L
∂
o
i
T
,
N
\frac{\partial L}{\partial o_i^{T,N}}
∂oiT,N∂L与等式1中相同。
情况4:层数
n
<
N
n<N
n<N且
t
<
T
t<T
t<T:
这种情况下
∂
L
∂
o
i
t
,
n
\frac{\partial L}{\partial o_i^{t,n}}
∂oit,n∂L同时取决于SD和TD中的误差传播。一方面,每个神经元在SD中积累来自上层的加权误差信号,如情况2;另一方面,每个神经元也通过基于链式规则的迭代展开状态空间(如情况3)来接收TD中自反馈动态的传播误差。因此可以得到:
∂
L
∂
o
i
t
,
n
=
∑
j
=
1
l
(
n
+
1
)
δ
j
t
,
n
+
1
∂
o
j
t
,
n
+
1
∂
o
i
t
,
n
+
∂
L
∂
o
i
t
+
1.
n
∂
o
i
t
+
1.
n
∂
o
i
t
.
n
=
∑
j
=
1
l
(
n
+
1
)
δ
j
t
,
n
+
1
∂
g
∂
u
i
t
,
n
w
j
i
+
δ
i
t
+
1
,
n
∂
g
∂
u
i
t
+
1
,
n
u
i
t
,
n
∂
f
∂
o
i
t
,
n
(
18
)
(17)
\begin{aligned} \frac{\partial L}{\partial o_i^{t,n}} &= \sum_{j=1}^{l(n+1)}\delta_j^{t,n+1}\frac{\partial o_j^{t,n+1}}{\partial o_i^{t,n}} + \frac{\partial L}{\partial o_i^{t+1.n}}\frac{\partial o_i^{t+1.n}}{\partial o_i^{t.n}} \\ &= \sum_{j=1}^{l(n+1)}\delta_j^{t,n+1} \frac{\partial g}{\partial u_i^{t,n}}w_{ji} + \delta_i^{t+1,n} \frac{\partial g}{\partial u_i^{t+1,n}} u_i^{t,n} \frac{\partial f}{\partial o_i^{t,n}} (18) \tag{17} \end{aligned}
∂oit,n∂L=j=1∑l(n+1)δjt,n+1∂oit,n∂ojt,n+1+∂oit+1.n∂L∂oit.n∂oit+1.n=j=1∑l(n+1)δjt,n+1∂uit,n∂gwji+δit+1,n∂uit+1,n∂guit,n∂oit,n∂f(18)(17)
∂
L
∂
u
i
t
,
n
=
∂
L
∂
o
i
t
,
n
∂
o
i
t
,
n
∂
u
i
t
,
n
+
∂
L
∂
o
i
t
+
1
,
n
∂
o
i
t
+
1
,
n
∂
u
i
t
,
n
=
δ
i
t
,
n
∂
g
u
i
t
,
n
+
δ
i
t
+
1
,
n
∂
g
∂
u
i
t
+
1
,
n
f
(
o
i
t
,
n
)
(
20
)
(19)
\begin{aligned} \frac{\partial L}{\partial u_i^{t,n}} &= \frac{\partial L}{\partial o_i^{t,n}}\frac{\partial o_i^{t,n}}{\partial u_i^{t,n}} + \frac{\partial L}{\partial o_i^{t+1,n}}\frac{\partial o_i^{t+1,n}}{\partial u_i^{t,n}} \\ &= \delta_i^{t,n} \frac{\partial g}{u_i^{t,n}} + \delta_i^{t+1,n} \frac{\partial g}{\partial u_i^{t+1,n}}f(o_i^{t,n}) (20) \tag{19} \end{aligned}
∂uit,n∂L=∂oit,n∂L∂uit,n∂oit,n+∂oit+1,n∂L∂uit,n∂oit+1,n=δit,nuit,n∂g+δit+1,n∂uit+1,n∂gf(oit,n)(20)(19)
基于这四种情况,误差传播过程(取决于上述导数)如图2所示。在单神经元层面(图2 A),将传播分解为SD的垂直路径和TD的水平路径。在网络层面(图2 B),误差在SD的传播数据流与典型的DNN中的BP相似,即每个神经元对来自上层的加权误差信号进行累加,并在不同层迭代更新参数;在TD中,神经元状态在时间维度迭代展开,使链式规则传播成为可能。最后,得到对
W
\boldsymbol{W}
W和
b
\boldsymbol{b}
b的导数为:
∂
L
∂
b
n
=
∑
t
=
1
T
∂
L
∂
u
t
,
n
∂
u
t
,
n
∂
b
n
=
∑
t
=
1
T
∂
L
∂
u
t
,
n
(21)
\frac{\partial L}{\partial \boldsymbol{b^n}} = \sum_{t=1}^T \frac{\partial L}{\partial \boldsymbol{u^{t,n}}} \frac{\partial \boldsymbol{u^{t,n}}}{\partial \boldsymbol{b^n}} = \sum_{t=1}^T \frac{\partial L}{\partial \boldsymbol{u^{t,n}}} \tag{21}
∂bn∂L=t=1∑T∂ut,n∂L∂bn∂ut,n=t=1∑T∂ut,n∂L(21)
∂
L
∂
W
n
=
∑
t
=
1
T
∂
L
∂
u
t
,
n
∂
u
t
,
n
∂
W
n
=
∑
t
=
1
T
∂
L
∂
u
t
,
n
∂
u
t
,
n
∂
x
t
,
n
∂
x
t
,
n
∂
W
n
=
∑
t
=
1
T
∂
L
∂
u
t
,
n
o
t
,
n
−
1
T
,
(22)
\begin{aligned} \frac{\partial L}{\partial \boldsymbol{W^n}} &= \sum_{t=1}^T \frac{\partial L}{\partial \boldsymbol{u^{t,n}}} \frac{\partial \boldsymbol{u^{t,n}}}{\partial \boldsymbol{W^n}} \\ &= \sum_{t=1}^T \frac{\partial L}{\partial \boldsymbol{u^{t,n}}} \frac{\partial \boldsymbol{u^{t,n}}}{\partial \boldsymbol{x^{t,n}}} \frac{\partial \boldsymbol{x^{t,n}}}{\partial \boldsymbol{W^n}} = \sum_{t=1}^T \frac{\partial L}{\partial \boldsymbol{u^{t,n}}} {\boldsymbol{o^{t,n-1}}}^T, \tag{22} \end{aligned}
∂Wn∂L=t=1∑T∂ut,n∂L∂Wn∂ut,n=t=1∑T∂ut,n∂L∂xt,n∂ut,n∂Wn∂xt,n=t=1∑T∂ut,n∂Lot,n−1T,(22)
其中的
∂
L
∂
u
t
,
n
\frac{\partial L}{\partial \boldsymbol{u^{t,n}}}
∂ut,n∂L可以从式(11)-(17)得到,
o
t
,
n
−
1
T
{\boldsymbol{o^{t,n-1}}}^T
ot,n−1T中的
T
T
T表示矩阵的转置。给定STBP中的
W
\boldsymbol{W}
W和
b
\boldsymbol{b}
b,我们可以就使用梯度下降优化算法来有效地训练SNN以达到较高性能。
2.3 不可微分脉冲活动的导数近似
在前几节中,已经介绍了如何基于STBP获取梯度信息,但是在每个脉冲时间点不可微分的问题还没有解决。事实上,式(11)-(21)的STBP训练需要得到输出门(putput gate)
g
(
u
)
g(u)
g(u)的导数。理论上,
g
(
u
)
g(u)
g(u)的导数是一个不可微分的
δ
(
u
)
\delta(u)
δ(u)Dirac 函数,这极大地影响了SNN的有效学习。
δ
(
u
)
\delta(u)
δ(u)除了在
u
=
0
u=0
u=0的时候无穷大之外,在任何别的地方都是0,这回导致梯度消失或者爆炸问题影响梯度的传播。现有的方法之一是将电位在脉冲时刻的不连续点视为噪声,并认为这有利于模型的鲁棒性,但事实上还是没有解决脉冲活动不可微分的问题。为了解决这个问题,我们在图3-B中引入四种曲线来近似脉冲活动的导数,分别使用
h
1
,
h
2
,
h
3
,
h
4
h1,h2,h3,h4
h1,h2,h3,h4来表示:
h
1
(
u
)
=
1
a
1
s
i
g
n
(
∣
u
−
V
t
h
∣
<
a
1
2
)
,
(23)
h_1(u) = \frac{1}{a_1} sign(|u-V_{th}| < \frac {a_1}{2}), \tag{23}
h1(u)=a11sign(∣u−Vth∣<2a1),(23)
h
2
(
u
)
=
(
a
2
2
−
a
2
4
∣
u
−
V
t
h
∣
)
s
i
g
n
(
2
a
2
−
∣
u
−
V
t
h
∣
)
,
(24)
h_2(u) = (\frac{\sqrt{a_2}}{2} - \frac{a_2}{4} |u-V_{th}|) sign(\frac {2}{\sqrt a_2} - |u-V_{th}|), \tag{24}
h2(u)=(2a2−4a2∣u−Vth∣)sign(a22−∣u−Vth∣),(24)
h
3
(
u
)
=
1
a
3
e
V
t
h
−
u
a
3
(
1
+
e
V
t
h
−
u
a
3
)
2
,
(25)
h_3(u) = \frac{1}{a_3} \frac{e^{\frac{V_{th}-u}{a_3}}}{(1+e^{\frac{V_{th}-u}{a_3}})^2}, \tag{25}
h3(u)=a31(1+ea3Vth−u)2ea3Vth−u,(25)
h
4
(
u
)
=
1
2
π
a
4
e
−
(
u
−
V
t
h
)
2
2
a
4
,
(26)
h_4(u) = \frac{1}{\sqrt {2 \pi a_4}} e^{- \frac{(u-V_{th})^2}{2a_4}}, \tag{26}
h4(u)=2πa41e−2a4(u−Vth)2,(26)
其中
a
i
(
i
=
1
,
2
,
3
,
4
)
a_i(i=1,2,3,4)
ai(i=1,2,3,4)决定曲线的陡度(steepness),即峰宽(peak width)。事实上,
h
1
,
h
2
,
h
3
,
h
4
h_1,h_2,h_3,h_4
h1,h2,h3,h4分别是矩形函数(rectangular function)、多项式函数(polynomial function)、sigmoid函数和高斯累积分布函数(Gaussian cumulative distribution function)的导数。为了与Dirac函数
δ
(
u
)
\delta(u)
δ(u)一致,引入系数
a
i
a_i
ai来确保每个函数的积分为1。可以证明以上候选曲线均满足下式:
lim
a
i
→
0
+
h
i
(
u
)
=
d
g
d
u
,
i
=
1
,
2
,
3
,
4.
(27)
\lim_{a_i \to 0^+} h_i(u) = \frac{dg}{du},i=1,2,3,4. \tag{27}
ai→0+limhi(u)=dudg,i=1,2,3,4.(27)
因此,式(11)-(21)中的
∂
g
∂
u
\frac {\partial g}{\partial u}
∂u∂g可以近似为:
∂
g
∂
u
≈
h
i
(
u
)
,
i
=
1
,
2
,
3
,
4.
(28)
\frac {\partial g}{\partial u} \approx h_i(u),i=1,2,3,4. \tag{28}
∂u∂g≈hi(u),i=1,2,3,4.(28)
在3.3小节,将分析不同曲线和不同
a
i
a_i
ai值对SNN性能的影响。
3. RESULTS
3.1 参数初始化
参数的初始化对稳定整个网络的脉冲发放活动非常重要,要在确保及时响应突触前刺激的同时又能够避免发放太多脉冲而降低神经元的选择性。众所周知,前向传递的两个关键计算步骤是突触前神经元发放的脉冲和权重的乘积累加操作以及膜电势和阈值的比较,这表明权重和阈值之间的相对大小决定了参数初始化的有效性。在本文中,我们将每个神经元的阈值固定为常数进行简化,只调整权重来控制脉冲活动的平衡。
首先从一个标准的均匀分布中采样得到所有的权重参数:
W
∼
u
[
−
1
,
1
]
(29)
\boldsymbol{W} \sim u[-1,1] \tag{29}
W∼u[−1,1](29)
然后通过下式归一化这些参数:
W
i
j
n
=
W
i
j
n
∑
j
=
1
l
(
n
−
1
)
w
i
j
n
2
,
i
=
1
,
2
,
.
.
.
,
l
(
n
)
(30)
W_{ij}^n = \frac {W_{ij}^n} {\sqrt {\sum_{j=1}^{l(n-1)}{w_{ij}^n}^2}},i=1,2,...,l(n) \tag{30}
Wijn=∑j=1l(n−1)wijn2Wijn,i=1,2,...,l(n)(30)
其他参数在表1中列出。其中Adam是一种流行的优化方法,能够加快梯度下降的收敛速度,这里也使用Adam对参数
W
\boldsymbol W
W和
b
\boldsymbol b
b进行更新。实际上,Adam并不影响梯度获取过程,只是用于参数更新。在所有实验中,如误差归一化、权值/阈值归一化、固定量-比例复位机制(fixed-amount-proportional reset mechanism)等技巧都不再需要。
3.2 数据集实验
我们在多个数据集上测试了STBP训练框架,包括静态MNIST数据集、自定义目标检测数据集和动态的N-MNIST数据集。
3.2.1 时空全连接神经网络(Spatio-Temporal Fully Connected Neural Network)
3.2.1.1 静态数据集
这里使用MNIST(图4-B)和一个自定义的目标检测数据集(图4-A)来测试我们提出的方法。(数据集的相关介绍这里不再描述,感兴趣的读者可以阅读原文。)
SNN第一层的输入应该是一个脉冲序列,故本文采用伯努利(Bernoulli)采样将原始像素强度转换为脉冲序列。具体来说就是通过使用独立同分布的伯努利抽样,将每个归一化后的像素在每个时间步上概率地转换为一个spike事件(“1”),生成“1”的概率,也就是脉冲事件,正比于归一化后的像素值。例如,当像素强度为0.8时,可以在每个时间步长产生概率为0.8的脉冲事件(“1”),而概率为0.2会不产生脉冲。然后,在一定时间窗口内的脉冲事件形成一个脉冲序列。图4-C里的上下两个子图分别是一个样本的5×5像素的中心patch在目标检测数据集和MNIST上转换的25个输入神经元的脉冲序列。图4-D举例说明了在数字9的刺激上进行STBP训练前后15ms内输出层的脉冲序列。开始时,输出层神经元随机触发,训练后编码数字9的第10个神经元触发最强烈,表明实现了正确的推理。
表2将我们的方法与其他几个使用类似多层感知器(MLP)结构的较为突出的结果进行了比较。虽然我们没有使用任何复杂的技能,提出的STBP训练方法也优于所有报告的结果,我们的的检测准确率达到98.89%,表现最佳。
表3将我们的模型与目标检测数据集上的典型MLP进行了比较。基线模型(baseline model)是一个典型的人工神经网络(ANN),而不是SNN,下面我们使用“非脉冲网络”来区分它们。我们的模型和非脉冲MLP具有相当的性能。值得注意的是,来自目标检测数据集的输入脉冲序列的总体发放率高于来自MNIST数据集的输入脉冲序列,因此在仿真实验中我们将其阈值提高到2.0。
3.2.1.2 动态数据集
与静态数据集相比,动态数据集如N-MNIST包含更丰富的时间特征,因此更适合挖掘SNN的潜在能力。本文以N-MNIST为例,分析STBP算法在动态数据集上的性能。
表4比较了我们的STBP方法和一些在N-MNIST数据集上的SOTA结果。上面5个结果是基于ANN的,下面4个结果包括我们的方法使用SNN。从表4可以看出,ANN的模型普遍比SNN的模型差,我们提出的STBP方法在所有已报道的ANN和SNN方法的比较中达到了最好的准确率98.78%。我们的方法最大的优点是我们没有使用任何复杂的训练技巧,这有利于以后的硬件实现。
3.2.2 时空卷积神经网络(Spatio-Temporal Convolution Neural Network)
将我们的框架扩展到卷积神经网络结构,使网络更深并赋予网络更强大的SD信息。在这里,我们使用我们的STBP框架建立时空卷积神经网络。与我们的时空全连接网络相比,主要的区别在于对输入图像的处理,我们使用卷积代替了加权求和。具体来说,在卷积层,每个卷积神经元接收卷积的结果作为输入,并根据LIF模型更新其状态。在池化层,由于SNN的二进制编码不适合标准的最大池化,所以我们使用平均池化。
我们在MNIST数据集和目标检测数据集上对脉冲CNN模型进行了测试。在MNIST中,我们的网络包含两个核大小为5 × 5的卷积层和两个平均池化层,然后是一个全连接层。和传统的CNN一样,我们使用弹性失真(elastic distortion)对数据集进行预处理。表5记录了脉冲卷积神经网络在MNIST数据集上的最新性能。我们提出的脉冲CNN模型获得了98.42%的准确率,比其他报道的脉冲CNN模型具有更轻量化的结构和更好的性能。此外,我们在一个自定义的对象检测数据库上配置相同的网络结构,以评估所提出的模型性能。训练200个epoch后报告测试精度。从表6可以看出,我们的脉冲CNN模型可以达到与非脉冲CNN相比的性能。
3.3 性能分析
3.3.1 导数近似曲线的影响
在2.3小节中,我们引入了不同的曲线来近似脉冲活动的理想导数,本小节分析不同近似曲线对测试精度的影响。
实验在MNIST数据集上展开,网络结构是784-400-10,训练200个epoch后报告测试精度。
首先,比较不同曲线形状对模型性能的影响,在模拟中我们使用图3-B中提到的
h
1
h_1
h1、
h
2
h_2
h2、
h
3
h_3
h3和
h
4
h_4
h4,图6-A展示了不同形状的近似结果,可以看到不同的非线性曲线在性能上只有很小的差别。
此外,我们以矩形近似(rectangular approximation, h 1 h_1 h1)为例来探讨曲线陡度对实验结果的影响。设置 a 1 = 0.1 , 1.0 , 2.5 , 5.0 , 7.5 , 10 a_1 = 0.1,1.0,2.5,5.0,7.5,10 a1=0.1,1.0,2.5,5.0,7.5,10,相应结果如图6-B所示,不同的颜色表示不同的 a 1 a_1 a1值。可以得到, a 1 a_1 a1在0.5-5.0范围内可以实现不错的收敛,当太大( a 1 = 10 a_1=10 a1=10)或太小( a 1 = 0.1 a_1=0.1 a1=0.1)时性能会更差。结合图6A、B可以看出,拟合脉冲活动导数的关键是捕捉其非线性的性质和适当的曲线陡度,而具体的曲线形状则不那么关键。
3.3.2时间域的影响
本文的主要贡献在于将时间域引入到现有的基于空间域的BP训练方法中,充分利用了SNN的时空动态特性,实现了高性能的训练,现在我们定量分析时间域的影响。实验配置与前一小节(784−400−10)保持一致,在训练200 epoch后给出测试结果。在这里,现有的基于SD的BP称为SDBP。
测试结果如表7所示。在不同的数据集上,SDBP的测试精度都低于STBP的测试精度,说明时间信息对模型性能有好处。结果还表明,SDBP的性能不够稳定。除了数据集本身的干扰外,这种变化的原因可能是SNN训练方法的不稳定性。实际上,SNN的训练很大程度上依赖于参数的初始化,这对SNN的应用来说也是一个很大的挑战。在许多报道的工作中,研究者通常利用一些特殊的技巧或机制来提高训练性能,如正则化、规范化等。相比之下,使用我们的STBP训练方法可以在相同的网络上获得更高的性能(在MNIST上为98.48%,在目标检测数据集上为98.32%)而且没有使用任何复杂的训练技巧。这种稳定性和鲁棒性表明,TD中的动力学(dynamics)包含有SNN计算的巨大潜力,这项工作为此提供了一个有力的证据。
DISCUSSION
本文中提出了STBP算法,在MPl和CNN架构上均对STBP进行实现并测试,测试结果取得了SOTA性能。
文章又引入了近似导数曲线来解决脉冲活动不可微分的问题,实验结果显示近似曲线的陡度和宽度会对学习性能产生影响而具体的曲线状倒不是很重要。
部分参考文献
Lee J H, Delbruck T, Pfeiffer M. Training deep spiking neural networks using backpropagation[J]. Frontiers in neuroscience, 2016, 10: 508. ↩︎