前言

脉冲神经网络不像深度神经网络那样,有非常成熟的训练框架如torchtensorflow或者国内如oneflowpaddle等,在不带其他依赖包的前提下可以完成独立训练、推理以至部署。本博客的目的在于,收集整理现有的全部脉冲神经网络(说是全部其实言过其实,我压根就没看过几篇),从这些网络的搭建中学习设计思想,运用这部分网络完成自己的研究工作,或是为将来的框架发展做出自己的贡献。

目录

SLAYER框架

由新加坡国立大学Garrick Orchard团队设计搭建的脉冲神经网络,目前已经迭代两个版本,首先介绍版本1。

Version 1

本框架的基本原理是:使用替代梯度完成对脉冲网络的训练。文献名:SLAYER: Spike Layer Error Reassignment in Time

神经元模型

本文选用的脉冲神经元模型是脉冲响应模型Spike Response Model(SRM),其核心的数学表达式为:输入至膜上的电位脉冲ai(t)a_i(t)等于输入脉冲si(t)s_i(t)与膜响应函数ε(t)\varepsilon(t)的时域卷积,即有:
ai(t)=ε(t)si(t)a_i(t)=\varepsilon(t)*s_i(t);同理,膜电位的另一个组成部分,即不应期电位(前一个时刻残余下来的电位)b(t)b(t),也是经过卷积算得,区别在于,不应期电位是将输出脉冲(即后突触电位)与不应期响应函数v(t)v(t)的卷积。因此,膜电位的总体表达式为:

u(t)=i=1nwiai(t)+b(t)=i=1nwiε(t)si(t)+v(t)s(t)u(t)=\sum\limits_{i=1}^nw_ia_i(t)+b(t)=\sum\limits_{i=1}^nw_i\varepsilon(t)*s_i(t)+v(t)*s(t)

这里与常规的神经网络一样,输入脉冲经过一次加权wiw_i后对膜电位产生影响。

神经元产生输出信号,同样是使用了LIF模型,即当某时刻的膜电位高于阈值电位ϑ\vartheta时,产生一个后向脉冲,同时将膜电位置回初值。简单地写为:

s(t)=fs(u(t))s(t)=f_s(u(t))

其中,激活函数fs()f_s(\bullet)是LF的,即满足阈值放电,否则保持现状。

网络模型

本文献选用的网络模型是传统的多层感知机,即每一层的输出是下一层的输入,在输入前引入了脉冲神经元特有的脉冲响应过程,以此替代传统神经元的直接赋值。如果以上标ll标记第l层的神经元,则神经网络的结构表达式可以写为:

{a(l)(t)=ε(t)s(l)(t)u(l+1)(t)=W(l)a(l)(t)+v(t)s(l+1)(t)s(l+1)(t)=fs(u(l+1)(t))\left\{ \begin{aligned} \mathbf{a}^{(l)}(t)&=\varepsilon(t)*\mathbf{s}^{(l)}(t)\\ \mathbf{u}^{(l+1)}(t)&=\mathbf{W}^{(l)}\mathbf{a}^{(l)}(t)+v(t)*\mathbf{s}^{(l+1)}(t)\\ \mathbf{s}^{(l+1)}(t)&=f_s(\mathbf{u}^{(l+1)}(t)) \end{aligned} \right.

其中,a(l)(t)\mathbf{a}^{(l)}(t)是第ll层的膜电位,u(l+1)(t)\mathbf{u}^{(l+1)}(t)是第l+1l+1层的输入,s(l+1)(t)\mathbf{s}^{(l+1)}(t)是第l+1l+1层的输出,W(l)\mathbf{W}^{(l)}是第ll层的权重矩阵,v(t)v(t)是不应期响应函数,fs()f_s(\bullet)是激活函数。

上式也是网络的前向传播过程。

误差与损失函数

本文提供的损失函数是按欧氏距离的损失函数,即:

E=120Te(nl)(s(nl)(t),s^(t))2dtE=\frac{1}{2}\int\limits_{0}^T\Big\|e^{(n_l)}\big(s^{(n_l)}(t),\hat{s}(t)\big)\Big\|^2\mathrm{d}t

但是误差函数e(nl)()e^{(n_l)}(\bullet)形式可以自行设定,本文提供了两种内置的误差函数,一种是van-Rossum distance误差,是用于严格比较两个脉冲序列差异的误差函数,即:

e(nl)(s(nl)(t),s^(t))=s(nl)(t)s^(t)e^{(n_l)}\big(s^{(n_l)}(t),\hat{s}(t)\big)=s^{(n_l)}(t)-\hat{s}(t)

另一种是计数误差,仅比较在相同的时间间隔内输出的脉冲频数是否相同,即:

e(nl)(s(nl)(t),s^(t))=tTt(s(nl)(t)s^(t))dte^{(n_l)}\big(s^{(n_l)}(t),\hat{s}(t)\big)=\int\limits_{t-T}^t\big(s^{(n_l)}(t)-\hat{s}(t)\big)\mathrm{d}t

原文使用的是tTintt\in T_\mathrm{int},即这个时间间隔的形式可以自行设定。

时间相关性

本文一个观点:当前其他模型均不同程度地忽略了脉冲序列在前后时间上的相关性,仅仅考虑了当前时刻的脉冲特性。而脉冲时刻相关性是SNN区别传统网络的重要特性,所以现行模型的仿真效果不比传统的好。这里,时间相关性定义为:任意时刻的神经元参数(如膜电位、电位脉冲等)均会影响未来所有时刻的神经元行为,从数学上来看,求权重的导数,就不应只单求某时刻的导数,而应该把之前所有时刻的导数均求解并按某种方式叠加起来。例如:最后一层神经元的误差函数对权重的导数,应该是:

wi(l)E=0tE(τ)wi(l)dτ=Tsm=0Nsa(l)[m]n=mNsL[n]ui(l+1)[m]\nabla_{w_i^{(l)}}E=\int\limits_{0}^t\frac{\partial E(\tau)}{\partial w_i^{(l)}}\mathrm{d}\tau=T_s\sum\limits_{m=0}^{N_s} a^{(l)}[m]\sum\limits_{n=m}^{N_s}\frac{\partial L[n]}{\partial u_i^{(l+1)}[m]}

对上式按采样周期TsT_s离散化t=nTs,n=0,1,.Nst=nT_s,n=0,1,\cdots.N_s,并使用膜电位代替梯度求导,记后半项和式为反向传播的误差,即:

δ(l+1)[m]=n=mNsL[n]ui(l+1)[m]=fs(u(l)[m])(ε[m]e(l)[m])\delta^{(l+1)}[m]=\sum\limits_{n=m}^{N_s}\frac{\partial L[n]}{\partial u_i^{(l+1)}[m]}=f_s'(u^{(l)}[m])\cdot(\varepsilon[m]*e^{(l)}[-m])

则后向传播的误差等于膜响应函数与误差的互相关与激活函数梯度的乘积。而误差项的计算与传统神经网络类似,也是对电位脉冲求导,得到:

e(l)[m]=n=mNsL[n]a(l)[n]=W(l)Tδ(l+1)[m]e^{(l)}[m]=\sum\limits_{n=m}^{N_s}\frac{\partial L[n]}{\partial a^{(l)}[n]}=\mathbf{W^{(l)T}}\cdot\delta^{(l+1)}[m]

梯度计算

这一部分我认为是本文的核心,即如何求取替代梯度(其他文献可能使用了类似relu等函数的梯度),但是本文是从概率上推导出了梯度的表达式,并使用频率完成了对梯度的现场估计。

本文考察了在某一摄动的作用下,某个神经元是否产生fire的概率分布,即fΔζf\sim \Delta\zeta,其分布的形状应该是类似如下图:
摄动与激活的概率分布
图中的ϑ\varthetafire的门槛,uu是当前的膜电位。如果能够使得脉冲δ(tτ)\delta(t-\tau)产生,可以定义使得脉冲产生的梯度为:

Δfs(τ)Δu(τ)=Δs(τ)Δu(τ)={δ(tτ)Δζ,ifΔζ>u(τ)ϑ0,otherwise\frac{\Delta f_s(\tau)}{\Delta u(\tau)}=\frac{\Delta s(\tau)}{\Delta u(\tau)}=\begin{cases} \frac{\delta(t-\tau)}{\Delta\zeta},&\text{if}\quad\Delta\zeta>|u(\tau)-\vartheta|\\ 0,&\text{otherwise} \end{cases}

注意这个梯度的量纲是电压的倒数。

这里特别就特别在,本文定义的梯度里面带有冲激函数,因此不能直接使用,必须想办法将其消去。本文采用了一个非常聪明的做法,考虑激活函数fs(τ)f_s(\tau)差分的期望(理论上不存在导数,原文中虽然使用的是导数,我认为更合理的解释应该是差分),即当已经激活时,输出前后的差分为某一尖峰,否则输出结果为0:

E[Δfs(τ)Δu(τ)]=ρ(τ)Δζδ(tτ)Δζ+[1ρ(τ)Δζ]0=ρ(τ)δ(tτ)\begin{aligned} \mathbf{E}\Big[\frac{\Delta f_s(\tau)}{\Delta u(\tau)}\Big]&=\rho(\tau)\Delta\zeta\frac{\delta(t-\tau)}{\Delta\zeta}+[1-\rho(\tau)\Delta\zeta]\cdot 0\\ &=\rho(\tau)\delta(t-\tau) \end{aligned}

这里与原文推导得到的结果有不同,是因为我认为原文的量纲不对。这个结果对于最终的使用也是没有影响的,在使用梯度时,不需要考虑冲激,而是幅度值,即这里的概率密度函数ρ(τ)\rho(\tau)。实际网络的梯度计算,需要指定某种类型的摄动分布(原文指定的是指数分布,即ρ(τ)=αexp(βu(t)ϑ)\rho(\tau)=\alpha\exp(-\beta|u(t)-\vartheta|)),由此式可以推算某时刻的激活函数梯度,从而实现反向传播。

反向传播

大体上与一般的网络一致。唯一注意就是使用预定义的摄动分布计算梯度,其余的与传统网络一致。

方法评价

本文的亮点在于梯度替换,使用的是基于概率的模型,因此在预测上将优于基于平方误差的模型,同时这个概率模型不需要记忆前向传播值,简化了网络设计和显存占用等情况,能够取得较好的分类效果。本文的另一亮点是时间相关性的考虑,即在某一个小时间窗口内,计算了全部的误差项并将其求和作为当前时间戳的误差,较好地兼顾了计算效率和时间相关性的模型要求,因此收敛速度快于其他模型。

本文的缺点在于,替代梯度过程中的近似,使用的概率分布模型仍然是凭空增加的,尚未得到验证和统计学证明(为什么摄动的分布就一定集中在0附近?)这个问题还比较麻烦,至少需要参考生物医学期刊可能才有答案,还有就是分布模型的参数怎么选取?会对模型有怎样的影响,本文没有实验,我反而觉得这个是很关键的一点。

Version 2